Version 1.3.0-dev.5.0
svn merge -r 33684:34105 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
git-svn-id: http://dart.googlecode.com/svn/trunk@34106 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index 9079b82..fe96224 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -22,14 +22,14 @@
if (options.shouldBatch) {
BatchRunner.runAsBatch(args, (List<String> args) {
CommandLineOptions options = CommandLineOptions.parse(args);
- _runAnalyzer(options);
+ return _runAnalyzer(options, false);
});
} else {
_runAnalyzer(options);
}
}
-void _runAnalyzer(CommandLineOptions options) {
+_runAnalyzer(CommandLineOptions options, [bool async = true]) {
int startTime = JavaSystem.currentTimeMillis();
if (!options.machineFormat) {
stdout.writeln("Analyzing ${options.sourceFiles}...");
@@ -41,17 +41,21 @@
if (!new File(sourcePath).existsSync()) {
print('File not found: $sourcePath');
exitCode = ErrorSeverity.ERROR.ordinal;
- return;
+ return ErrorSeverity.ERROR;
}
// check that file is Dart file
if (!AnalysisEngine.isDartFileName(sourcePath)) {
print('$sourcePath is not a Dart file');
exitCode = ErrorSeverity.ERROR.ordinal;
- return;
+ return ErrorSeverity.ERROR;
}
// do analyze
AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
- analyzer.analyze();
+ if (async) {
+ return analyzer.analyzeAsync();
+ } else {
+ return analyzer.analyzeSync();
+ }
}
typedef ErrorSeverity BatchRunnerHandler(List<String> args);
@@ -89,8 +93,6 @@
args.addAll(lineArgs);
args.remove('-b');
args.remove('--batch');
- // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
- args.remove('-batch');
}
// analyze single set of arguments
try {
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 38942e3..fc9cfa1 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -52,7 +52,8 @@
///
/// If [name] is passed, it's used in error messages as the name of the code
/// being parsed.
-CompilationUnit parseCompilationUnit(String contents, {String name}) {
+CompilationUnit parseCompilationUnit(String contents,
+ {String name, bool suppressErrors: false}) {
if (name == null) name = '<unknown source>';
var source = new StringSource(contents, name);
var errorCollector = new _ErrorCollector();
@@ -63,7 +64,7 @@
var unit = parser.parseCompilationUnit(token);
unit.lineInfo = new LineInfo(scanner.lineStarts);
- if (errorCollector.hasErrors) throw errorCollector.group;
+ if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
return unit;
}
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 69685d2..efc97a1 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -10,15 +10,18 @@
import 'package:path/path.dart' as pathos;
-import 'generated/java_io.dart';
+import 'generated/ast.dart';
import 'generated/engine.dart';
+import 'generated/element.dart';
import 'generated/error.dart';
-import 'generated/source_io.dart';
+import 'generated/java_io.dart';
import 'generated/sdk.dart';
import 'generated/sdk_io.dart';
-import 'generated/element.dart';
+import 'generated/source_io.dart';
import '../options.dart';
+import 'dart:collection';
+
import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
import 'package:analyzer/src/error_formatter.dart';
@@ -38,6 +41,7 @@
ContentCache contentCache = new ContentCache();
SourceFactory sourceFactory;
AnalysisContext context;
+ Source librarySource;
/// All [Source]s references by the analyzed library.
final Set<Source> sources = new Set<Source>();
@@ -45,6 +49,9 @@
/// All [AnalysisErrorInfo]s in the analyzed library.
final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
+ /// [HashMap] between sources and analysis error infos.
+ final HashMap<Source, AnalysisErrorInfo> sourceErrorsMap = new HashMap<Source, AnalysisErrorInfo>();
+
AnalyzerImpl(this.sourcePath, this.options, this.startTime) {
if (sdk == null) {
sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
@@ -52,9 +59,27 @@
}
/**
- * Treats the [sourcePath] as the top level library and analyzes it.
+ * Treats the [sourcePath] as the top level library and analyzes it using a
+ * synchronous algorithm over the analysis engine.
*/
- void analyze() {
+ ErrorSeverity analyzeSync() {
+ setupForAnalysis();
+ return _analyzeSync();
+ }
+
+ /**
+ * Treats the [sourcePath] as the top level library and analyzes it using a
+ * asynchronous algorithm over the analysis engine.
+ */
+ void analyzeAsync() {
+ setupForAnalysis();
+ _analyzeAsync();
+ }
+
+ /**
+ * Setup local fields such as the analysis context for analysis.
+ */
+ void setupForAnalysis() {
sources.clear();
errorInfos.clear();
if (sourcePath == null) {
@@ -62,34 +87,68 @@
}
JavaFile sourceFile = new JavaFile(sourcePath);
UriKind uriKind = getUriKind(sourceFile);
- Source librarySource = new FileBasedSource.con2(sourceFile, uriKind);
+ librarySource = new FileBasedSource.con2(sourceFile, uriKind);
// prepare context
prepareAnalysisContext(sourceFile, librarySource);
-
- // async perform all tasks in context
- _analyze();
}
- void _analyze() {
+ /// The sync version of analysis
+ ErrorSeverity _analyzeSync() {
+ // don't try to analyzer parts
+ var unit = context.parseCompilationUnit(librarySource);
+ var hasLibraryDirective = false;
+ var hasPartOfDirective = false;
+ for (var directive in unit.directives) {
+ if (directive is LibraryDirective) hasLibraryDirective = true;
+ if (directive is PartOfDirective) hasPartOfDirective = true;
+ }
+ if (hasPartOfDirective && !hasLibraryDirective) {
+ print("Only libraries can be analyzed.");
+ print("$sourcePath is a part and can not be analyzed.");
+ return ErrorSeverity.ERROR;
+ }
+ // resolve library
+ var libraryElement = context.computeLibraryElement(librarySource);
+ // prepare source and errors
+ prepareSources(libraryElement);
+ prepareErrors();
+
+ // print errors and performance numbers
+ _printErrorsAndPerf();
+
+ // compute max severity and set exitCode
+ ErrorSeverity status = maxErrorSeverity;
+ if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
+ status = ErrorSeverity.ERROR;
+ }
+ return status;
+ }
+
+ /// The async version of the analysis
+ void _analyzeAsync() {
new Future(context.performAnalysisTask).then((AnalysisResult result) {
List<ChangeNotice> notices = result.changeNotices;
- // TODO(jwren) change 'notices != null' to 'result.hasMoreWork()' after
- // next dart translation is landed for the analyzer
- if (notices != null) {
+ if (result.hasMoreWork) {
// There is more work, record the set of sources, and then call self
// again to perform next task
for (ChangeNotice notice in notices) {
sources.add(notice.source);
+ sourceErrorsMap[notice.source] = notice;
}
- return _analyze();
+ return _analyzeAsync();
}
//
// There are not any more tasks, set error code and print performance
// numbers.
//
// prepare errors
- prepareErrors();
+ sourceErrorsMap.forEach((k,v) {
+ errorInfos.add(sourceErrorsMap[k]);
+ });
+
+ // print errors and performance numbers
+ _printErrorsAndPerf();
// compute max severity and set exitCode
ErrorSeverity status = maxErrorSeverity;
@@ -97,38 +156,48 @@
status = ErrorSeverity.ERROR;
}
exitCode = status.ordinal;
-
- // print errors
- ErrorFormatter formatter = new ErrorFormatter(stdout, options);
- formatter.formatErrors(errorInfos);
-
- // print performance numbers
- if (options.perf) {
- int totalTime = JavaSystem.currentTimeMillis() - startTime;
- int ioTime = PerformanceStatistics.io.result;
- int scanTime = PerformanceStatistics.scan.result;
- int parseTime = PerformanceStatistics.parse.result;
- int resolveTime = PerformanceStatistics.resolve.result;
- int errorsTime = PerformanceStatistics.errors.result;
- int hintsTime = PerformanceStatistics.hints.result;
- int angularTime = PerformanceStatistics.angular.result;
- stdout.writeln("io:$ioTime");
- stdout.writeln("scan:$scanTime");
- stdout.writeln("parse:$parseTime");
- stdout.writeln("resolve:$resolveTime");
- stdout.writeln("errors:$errorsTime");
- stdout.writeln("hints:$hintsTime");
- stdout.writeln("angular:$angularTime");
- stdout.writeln("other:${totalTime
- - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
- + angularTime)}");
- stdout.writeln("total:$totalTime");
- }
}).catchError((ex, st) {
AnalysisEngine.instance.logger.logError("${ex}\n${st}");
});
}
+ _printErrorsAndPerf() {
+ // The following is a hack. We currently print out to stderr to ensure that
+ // when in batch mode we print to stderr, this is because the prints from
+ // batch are made to stderr. The reason that options.shouldBatch isn't used
+ // is because when the argument flags are constructed in BatchRunner and
+ // passed in from batch mode which removes the batch flag to prevent the
+ // "cannot have the batch flag and source file" error message.
+ IOSink sink = options.machineFormat ? stderr : stdout;
+
+ // print errors
+ ErrorFormatter formatter = new ErrorFormatter(sink, options);
+ formatter.formatErrors(errorInfos);
+
+ // print performance numbers
+ if (options.perf) {
+ int totalTime = JavaSystem.currentTimeMillis() - startTime;
+ int ioTime = PerformanceStatistics.io.result;
+ int scanTime = PerformanceStatistics.scan.result;
+ int parseTime = PerformanceStatistics.parse.result;
+ int resolveTime = PerformanceStatistics.resolve.result;
+ int errorsTime = PerformanceStatistics.errors.result;
+ int hintsTime = PerformanceStatistics.hints.result;
+ int angularTime = PerformanceStatistics.angular.result;
+ stdout.writeln("io:$ioTime");
+ stdout.writeln("scan:$scanTime");
+ stdout.writeln("parse:$parseTime");
+ stdout.writeln("resolve:$resolveTime");
+ stdout.writeln("errors:$errorsTime");
+ stdout.writeln("hints:$hintsTime");
+ stdout.writeln("angular:$angularTime");
+ stdout.writeln("other:${totalTime
+ - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
+ + angularTime)}");
+ stdout.writeln("total:$totalTime");
+ }
+ }
+
/// Returns the maximal [ErrorSeverity] of the recorded errors.
ErrorSeverity get maxErrorSeverity {
var status = ErrorSeverity.NONE;
@@ -213,6 +282,13 @@
}
}
+ /// Fills [sources].
+ void prepareSources(LibraryElement library) {
+ var units = new Set<CompilationUnitElement>();
+ var libraries = new Set<LibraryElement>();
+ addLibrarySources(library, libraries, units);
+ }
+
/// Fills [errorInfos] using [sources].
void prepareErrors() {
for (Source source in sources) {
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 58ce80b..ce52c18 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -270,8 +270,10 @@
* @param arguments the arguments to the constructor being invoked, or `null` if this
* annotation is not the invocation of a constructor
*/
- Annotation(this.atSign, Identifier name, this.period, SimpleIdentifier constructorName, ArgumentList arguments) {
+ Annotation(Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments) {
+ this.atSign = atSign;
this._name = becomeParentOf(name);
+ this.period = period;
this._constructorName = becomeParentOf(constructorName);
this._arguments = becomeParentOf(arguments);
}
@@ -402,7 +404,8 @@
* @param question the token representing the question mark
* @param identifier the identifier representing the argument being tested
*/
- ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
+ ArgumentDefinitionTest(Token question, SimpleIdentifier identifier) {
+ this.question = question;
this._identifier = becomeParentOf(identifier);
}
@@ -772,8 +775,12 @@
* @param rightParenthesis the right parenthesis
* @param semicolon the semicolon terminating the statement
*/
- AssertStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, this.semicolon) {
+ AssertStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+ this.keyword = keyword;
+ this.leftParenthesis = leftParenthesis;
this._condition = becomeParentOf(condition);
+ this.rightParenthesis = rightParenthesis;
+ this.semicolon = semicolon;
}
@override
@@ -852,8 +859,9 @@
* @param operator the assignment operator being applied
* @param rightHandSide the expression used to compute the right hand side
*/
- AssignmentExpression(Expression leftHandSide, this.operator, Expression rightHandSide) {
+ AssignmentExpression(Expression leftHandSide, Token operator, Expression rightHandSide) {
this._leftHandSide = becomeParentOf(leftHandSide);
+ this.operator = operator;
this._rightHandSide = becomeParentOf(rightHandSide);
}
@@ -1498,8 +1506,9 @@
* @param operator the binary operator being applied
* @param rightOperand the expression used to compute the right operand
*/
- BinaryExpression(Expression leftOperand, this.operator, Expression rightOperand) {
+ BinaryExpression(Expression leftOperand, Token operator, Expression rightOperand) {
this._leftOperand = becomeParentOf(leftOperand);
+ this.operator = operator;
this._rightOperand = becomeParentOf(rightOperand);
}
@@ -1683,9 +1692,11 @@
* @param statements the statements contained in the block
* @param rightBracket the right curly bracket
*/
- Block(this.leftBracket, List<Statement> statements, this.rightBracket) {
+ Block(Token leftBracket, List<Statement> statements, Token rightBracket) {
this._statements = new NodeList<Statement>(this);
+ this.leftBracket = leftBracket;
this._statements.addAll(statements);
+ this.rightBracket = rightBracket;
}
@override
@@ -1790,7 +1801,10 @@
* @param literal the token representing the literal
* @param value the value of the literal
*/
- BooleanLiteral(this.literal, this.value);
+ BooleanLiteral(Token literal, bool value) {
+ this.literal = literal;
+ this.value = value;
+ }
@override
accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
@@ -1840,8 +1854,10 @@
* @param label the label associated with the statement
* @param semicolon the semicolon terminating the statement
*/
- BreakStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+ BreakStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+ this.keyword = keyword;
this._label = becomeParentOf(label);
+ this.semicolon = semicolon;
}
@override
@@ -2032,10 +2048,13 @@
* @param rightParenthesis the right parenthesis
* @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) {
+ CatchClause(Token onKeyword, TypeName exceptionType, Token catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, Token comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
+ this.onKeyword = onKeyword;
this.exceptionType = becomeParentOf(exceptionType);
+ this.catchKeyword = catchKeyword;
this._leftParenthesis = leftParenthesis;
this._exceptionParameter = becomeParentOf(exceptionParameter);
+ this.comma = comma;
this._stackTraceParameter = becomeParentOf(stackTraceParameter);
this._rightParenthesis = rightParenthesis;
this._body = becomeParentOf(body);
@@ -2232,14 +2251,18 @@
* @param members the members defined by the class
* @param rightBracket the right curly bracket
*/
- 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) {
+ ClassDeclaration(Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket) : super(comment, metadata) {
this._members = new NodeList<ClassMember>(this);
+ this.abstractKeyword = abstractKeyword;
+ this.classKeyword = classKeyword;
this._name = becomeParentOf(name);
this.typeParameters = becomeParentOf(typeParameters);
this._extendsClause = becomeParentOf(extendsClause);
this._withClause = becomeParentOf(withClause);
this._implementsClause = becomeParentOf(implementsClause);
+ this.leftBracket = leftBracket;
this._members.addAll(members);
+ this.rightBracket = rightBracket;
}
@override
@@ -2486,9 +2509,11 @@
* @param implementsClause the implements clause for this class
* @param semicolon the semicolon terminating the declaration
*/
- ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, this.equals, this.abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
+ ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
this._name = becomeParentOf(name);
this._typeParameters = becomeParentOf(typeParameters);
+ this.equals = equals;
+ this.abstractKeyword = abstractKeyword;
this._superclass = becomeParentOf(superclass);
this._withClause = becomeParentOf(withClause);
this._implementsClause = becomeParentOf(implementsClause);
@@ -2614,7 +2639,9 @@
* @param keyword the keyword specifying what kind of processing is to be done on the imported
* names
*/
- Combinator(this.keyword);
+ Combinator(Token keyword) {
+ this.keyword = keyword;
+ }
@override
Token get beginToken => keyword;
@@ -2677,7 +2704,7 @@
/**
* The tokens representing the comment.
*/
- final List<Token> tokens;
+ List<Token> tokens;
/**
* The type of the comment.
@@ -2697,8 +2724,9 @@
* @param type the type of the comment
* @param references the references embedded within the documentation comment
*/
- Comment(this.tokens, CommentType type, List<CommentReference> references) {
+ Comment(List<Token> tokens, CommentType type, List<CommentReference> references) {
this._references = new NodeList<CommentReference>(this);
+ this.tokens = tokens;
this._type = type;
this._references.addAll(references);
}
@@ -2797,7 +2825,8 @@
* @param newKeyword the token representing the 'new' keyword
* @param identifier the identifier being referenced
*/
- CommentReference(this.newKeyword, Identifier identifier) {
+ CommentReference(Token newKeyword, Identifier identifier) {
+ this.newKeyword = newKeyword;
this._identifier = becomeParentOf(identifier);
}
@@ -2860,7 +2889,7 @@
/**
* The first token in the token stream that was parsed to form this compilation unit.
*/
- final Token beginToken;
+ Token beginToken;
/**
* The script tag at the beginning of the compilation unit, or `null` if there is no script
@@ -2882,7 +2911,7 @@
* The last token in the token stream that was parsed to form this compilation unit. This token
* should always have a type of [TokenType.EOF].
*/
- final Token endToken;
+ Token endToken;
/**
* The element associated with this compilation unit, or `null` if the AST structure has not
@@ -2904,12 +2933,14 @@
* @param declarations the declarations contained in this compilation unit
* @param endToken the last token in the token stream
*/
- CompilationUnit(this.beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, this.endToken) {
+ CompilationUnit(Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken) {
this._directives = new NodeList<Directive>(this);
this._declarations = new NodeList<CompilationUnitMember>(this);
+ this.beginToken = beginToken;
this._scriptTag = becomeParentOf(scriptTag);
this._directives.addAll(directives);
this._declarations.addAll(declarations);
+ this.endToken = endToken;
}
@override
@@ -3071,9 +3102,11 @@
* @param elseExpression the expression that is executed if the condition evaluates to
* `false`
*/
- ConditionalExpression(Expression condition, this.question, Expression thenExpression, this.colon, Expression elseExpression) {
+ ConditionalExpression(Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression) {
this._condition = becomeParentOf(condition);
+ this.question = question;
this._thenExpression = becomeParentOf(thenExpression);
+ this.colon = colon;
this._elseExpression = becomeParentOf(elseExpression);
}
@@ -3257,11 +3290,16 @@
* redirected
* @param body the body of the constructor
*/
- ConstructorDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.constKeyword, this.factoryKeyword, Identifier returnType, this.period, SimpleIdentifier name, FormalParameterList parameters, this.separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
+ ConstructorDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
this._initializers = new NodeList<ConstructorInitializer>(this);
+ this.externalKeyword = externalKeyword;
+ this.constKeyword = constKeyword;
+ this.factoryKeyword = factoryKeyword;
this._returnType = becomeParentOf(returnType);
+ this.period = period;
this._name = becomeParentOf(name);
this._parameters = becomeParentOf(parameters);
+ this.separator = separator;
this._initializers.addAll(initializers);
this._redirectedConstructor = becomeParentOf(redirectedConstructor);
this._body = becomeParentOf(body);
@@ -3458,8 +3496,11 @@
* @param equals the token for the equal sign between the field name and the expression
* @param expression the expression computing the value to which the field will be initialized
*/
- ConstructorFieldInitializer(this.keyword, this.period, SimpleIdentifier fieldName, this.equals, Expression expression) {
+ ConstructorFieldInitializer(Token keyword, Token period, SimpleIdentifier fieldName, Token equals, Expression expression) {
+ this.keyword = keyword;
+ this.period = period;
this._fieldName = becomeParentOf(fieldName);
+ this.equals = equals;
this._expression = becomeParentOf(expression);
}
@@ -3570,8 +3611,9 @@
* @param period the token for the period before the constructor name
* @param name the name of the constructor
*/
- ConstructorName(TypeName type, this.period, SimpleIdentifier name) {
+ ConstructorName(TypeName type, Token period, SimpleIdentifier name) {
this._type = becomeParentOf(type);
+ this.period = period;
this._name = becomeParentOf(name);
}
@@ -3679,8 +3721,10 @@
* @param label the label associated with the statement
* @param semicolon the semicolon terminating the statement
*/
- ContinueStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+ ContinueStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+ this.keyword = keyword;
this._label = becomeParentOf(label);
+ this.semicolon = semicolon;
}
@override
@@ -3772,7 +3816,8 @@
* @param type the name of the declared type of the parameter
* @param identifier the name of the parameter being declared
*/
- DeclaredIdentifier(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+ DeclaredIdentifier(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+ this.keyword = keyword;
this._type = becomeParentOf(type);
this._identifier = becomeParentOf(identifier);
}
@@ -3894,8 +3939,10 @@
* @param separator the token separating the parameter from the default value
* @param defaultValue the expression computing the default value for the parameter
*/
- DefaultFormalParameter(NormalFormalParameter parameter, this.kind, this.separator, Expression defaultValue) {
+ DefaultFormalParameter(NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue) {
this._parameter = becomeParentOf(parameter);
+ this.kind = kind;
+ this.separator = separator;
this._defaultValue = becomeParentOf(defaultValue);
}
@@ -4072,11 +4119,14 @@
* @param rightParenthesis the right parenthesis
* @param semicolon the semicolon terminating the statement
*/
- DoStatement(this.doKeyword, Statement body, this.whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, this.semicolon) {
+ DoStatement(Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+ this.doKeyword = doKeyword;
this._body = becomeParentOf(body);
+ this.whileKeyword = whileKeyword;
this._leftParenthesis = leftParenthesis;
this._condition = becomeParentOf(condition);
this._rightParenthesis = rightParenthesis;
+ this.semicolon = semicolon;
}
@override
@@ -4188,7 +4238,10 @@
* @param literal the token representing the literal
* @param value the value of the literal
*/
- DoubleLiteral(this.literal, this.value);
+ DoubleLiteral(Token literal, double value) {
+ this.literal = literal;
+ this.value = value;
+ }
@override
accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
@@ -4224,7 +4277,9 @@
*
* @param semicolon the token representing the semicolon that marks the end of the function body
*/
- EmptyFunctionBody(this.semicolon);
+ EmptyFunctionBody(Token semicolon) {
+ this.semicolon = semicolon;
+ }
@override
accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
@@ -4259,7 +4314,9 @@
*
* @param semicolon the semicolon terminating the statement
*/
- EmptyStatement(this.semicolon);
+ EmptyStatement(Token semicolon) {
+ this.semicolon = semicolon;
+ }
@override
accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
@@ -4517,8 +4574,10 @@
* @param expression the expression representing the body of the function
* @param semicolon the semicolon terminating the statement
*/
- ExpressionFunctionBody(this.functionDefinition, Expression expression, this.semicolon) {
+ ExpressionFunctionBody(Token functionDefinition, Expression expression, Token semicolon) {
+ this.functionDefinition = functionDefinition;
this._expression = becomeParentOf(expression);
+ this.semicolon = semicolon;
}
@override
@@ -4583,8 +4642,9 @@
* @param expression the expression that comprises the statement
* @param semicolon the semicolon terminating the statement
*/
- ExpressionStatement(Expression expression, this.semicolon) {
+ ExpressionStatement(Expression expression, Token semicolon) {
this._expression = becomeParentOf(expression);
+ this.semicolon = semicolon;
}
@override
@@ -4652,7 +4712,8 @@
* @param keyword the token representing the 'extends' keyword
* @param superclass the name of the class that is being extended
*/
- ExtendsClause(this.keyword, TypeName superclass) {
+ ExtendsClause(Token keyword, TypeName superclass) {
+ this.keyword = keyword;
this._superclass = becomeParentOf(superclass);
}
@@ -4721,8 +4782,10 @@
* @param fieldList the fields being declared
* @param semicolon the semicolon terminating the declaration
*/
- FieldDeclaration(Comment comment, List<Annotation> metadata, this.staticKeyword, VariableDeclarationList fieldList, this.semicolon) : super(comment, metadata) {
+ FieldDeclaration(Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon) : super(comment, metadata) {
+ this.staticKeyword = staticKeyword;
this._fieldList = becomeParentOf(fieldList);
+ this.semicolon = semicolon;
}
@override
@@ -4822,8 +4885,11 @@
* @param parameters the parameters of the function-typed parameter, or `null` if this is
* not a function-typed field formal parameter
*/
- FieldFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, this.thisToken, this.period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+ FieldFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, Token thisToken, Token period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+ this.keyword = keyword;
this._type = becomeParentOf(type);
+ this.thisToken = thisToken;
+ this.period = period;
this._parameters = becomeParentOf(parameters);
}
@@ -4954,9 +5020,13 @@
* @param rightParenthesis the right parenthesis
* @param body the body of the loop
*/
- ForEachStatement.con1(this.forKeyword, this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+ ForEachStatement.con1(Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+ this.forKeyword = forKeyword;
+ this.leftParenthesis = leftParenthesis;
this._loopVariable = becomeParentOf(loopVariable);
+ this.inKeyword = inKeyword;
this._iterator = becomeParentOf(iterator);
+ this.rightParenthesis = rightParenthesis;
this._body = becomeParentOf(body);
}
@@ -4970,9 +5040,13 @@
* @param rightParenthesis the right parenthesis
* @param body the body of the loop
*/
- ForEachStatement.con2(this.forKeyword, this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+ ForEachStatement.con2(Token forKeyword, Token leftParenthesis, SimpleIdentifier identifier, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+ this.forKeyword = forKeyword;
+ this.leftParenthesis = leftParenthesis;
this._identifier = becomeParentOf(identifier);
+ this.inKeyword = inKeyword;
this._iterator = becomeParentOf(iterator);
+ this.rightParenthesis = rightParenthesis;
this._body = becomeParentOf(body);
}
@@ -5144,12 +5218,17 @@
* @param rightParenthesis the right parenthesis
* @param body the body of the loop
*/
- ForStatement(this.forKeyword, this.leftParenthesis, VariableDeclarationList variableList, Expression initialization, this.leftSeparator, Expression condition, this.rightSeparator, List<Expression> updaters, this.rightParenthesis, Statement body) {
+ ForStatement(Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body) {
this._updaters = new NodeList<Expression>(this);
+ this.forKeyword = forKeyword;
+ this.leftParenthesis = leftParenthesis;
this._variableList = becomeParentOf(variableList);
this._initialization = becomeParentOf(initialization);
+ this.leftSeparator = leftSeparator;
this._condition = becomeParentOf(condition);
+ this.rightSeparator = rightSeparator;
this._updaters.addAll(updaters);
+ this.rightParenthesis = rightParenthesis;
this._body = becomeParentOf(body);
}
@@ -5548,8 +5627,10 @@
* @param name the name of the function
* @param functionExpression the function expression being wrapped
*/
- FunctionDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, TypeName returnType, this.propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+ FunctionDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+ this.externalKeyword = externalKeyword;
this._returnType = becomeParentOf(returnType);
+ this.propertyKeyword = propertyKeyword;
this._name = becomeParentOf(name);
this._functionExpression = becomeParentOf(functionExpression);
}
@@ -6331,9 +6412,13 @@
* @param elseKeyword the token representing the 'else' keyword
* @param elseStatement the statement that is executed if the condition evaluates to `false`
*/
- IfStatement(this.ifKeyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement thenStatement, this.elseKeyword, Statement elseStatement) {
+ IfStatement(Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement) {
+ this.ifKeyword = ifKeyword;
+ this.leftParenthesis = leftParenthesis;
this._condition = becomeParentOf(condition);
+ this.rightParenthesis = rightParenthesis;
this._thenStatement = becomeParentOf(thenStatement);
+ this.elseKeyword = elseKeyword;
this._elseStatement = becomeParentOf(elseStatement);
}
@@ -6437,8 +6522,9 @@
* @param keyword the token representing the 'implements' keyword
* @param interfaces the interfaces that are being implemented
*/
- ImplementsClause(this.keyword, List<TypeName> interfaces) {
+ ImplementsClause(Token keyword, List<TypeName> interfaces) {
this._interfaces = new NodeList<TypeName>(this);
+ this.keyword = keyword;
this._interfaces.addAll(interfaces);
}
@@ -6587,7 +6673,8 @@
* @param combinators the combinators used to control how names are imported
* @param semicolon the semicolon terminating the directive
*/
- ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, this.asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+ ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+ this.asToken = asToken;
this._prefix = becomeParentOf(prefix);
}
@@ -6711,7 +6798,8 @@
* @param index the expression used to compute the index
* @param rightBracket the right square bracket
*/
- IndexExpression.forCascade(this.period, Token leftBracket, Expression index, Token rightBracket) {
+ IndexExpression.forCascade(Token period, Token leftBracket, Expression index, Token rightBracket) {
+ this.period = period;
this._leftBracket = leftBracket;
this._index = becomeParentOf(index);
this._rightBracket = rightBracket;
@@ -7020,7 +7108,8 @@
* @param constructorName the name of the constructor to be invoked
* @param argumentList the list of arguments to the constructor
*/
- InstanceCreationExpression(this.keyword, ConstructorName constructorName, ArgumentList argumentList) {
+ InstanceCreationExpression(Token keyword, ConstructorName constructorName, ArgumentList argumentList) {
+ this.keyword = keyword;
this.constructorName = becomeParentOf(constructorName);
this._argumentList = becomeParentOf(argumentList);
}
@@ -7100,7 +7189,10 @@
* @param literal the token representing the literal
* @param value the value of the literal
*/
- IntegerLiteral(this.literal, this.value);
+ IntegerLiteral(Token literal, int value) {
+ this.literal = literal;
+ this.value = value;
+ }
@override
accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
@@ -7163,8 +7255,10 @@
* @param expression the expression to be evaluated for the value to be converted into a string
* @param rightBracket the right curly bracket
*/
- InterpolationExpression(this.leftBracket, Expression expression, this.rightBracket) {
+ InterpolationExpression(Token leftBracket, Expression expression, Token rightBracket) {
+ this.leftBracket = leftBracket;
this._expression = becomeParentOf(expression);
+ this.rightBracket = rightBracket;
}
@override
@@ -7318,8 +7412,10 @@
* @param notOperator the not operator, or `null` if the sense of the test is not negated
* @param type the name of the type being tested for
*/
- IsExpression(Expression expression, this.isOperator, this.notOperator, TypeName type) {
+ IsExpression(Expression expression, Token isOperator, Token notOperator, TypeName type) {
this._expression = becomeParentOf(expression);
+ this.isOperator = isOperator;
+ this.notOperator = notOperator;
this._type = becomeParentOf(type);
}
@@ -7400,8 +7496,9 @@
* @param label the label being applied
* @param colon the colon that separates the label from whatever follows
*/
- Label(SimpleIdentifier label, this.colon) {
+ Label(SimpleIdentifier label, Token colon) {
this._label = becomeParentOf(label);
+ this.colon = colon;
}
@override
@@ -7544,8 +7641,10 @@
* @param name the name of the library being defined
* @param semicolon the semicolon terminating the directive
*/
- LibraryDirective(Comment comment, List<Annotation> metadata, this.libraryToken, LibraryIdentifier name, this.semicolon) : super(comment, metadata) {
+ LibraryDirective(Comment comment, List<Annotation> metadata, Token libraryToken, LibraryIdentifier name, Token semicolon) : super(comment, metadata) {
+ this.libraryToken = libraryToken;
this._name = becomeParentOf(name);
+ this.semicolon = semicolon;
}
@override
@@ -7920,8 +8019,9 @@
* @param separator the colon that separates the key from the value
* @param value the expression computing the value that will be associated with the key
*/
- MapLiteralEntry(Expression key, this.separator, Expression value) {
+ MapLiteralEntry(Expression key, Token separator, Expression value) {
this._key = becomeParentOf(key);
+ this.separator = separator;
this._value = becomeParentOf(value);
}
@@ -8050,8 +8150,12 @@
* declares a getter
* @param body the body of the method
*/
- MethodDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.modifierKeyword, TypeName returnType, this.propertyKeyword, this.operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+ MethodDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+ this.externalKeyword = externalKeyword;
+ this.modifierKeyword = modifierKeyword;
this._returnType = becomeParentOf(returnType);
+ this.propertyKeyword = propertyKeyword;
+ this.operatorKeyword = operatorKeyword;
this._name = becomeParentOf(name);
this._parameters = becomeParentOf(parameters);
this._body = becomeParentOf(body);
@@ -8241,8 +8345,9 @@
* @param methodName the name of the method being invoked
* @param argumentList the list of arguments to the method
*/
- MethodInvocation(Expression target, this.period, SimpleIdentifier methodName, ArgumentList argumentList) {
+ MethodInvocation(Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList) {
this._target = becomeParentOf(target);
+ this.period = period;
this._methodName = becomeParentOf(methodName);
this._argumentList = becomeParentOf(argumentList);
}
@@ -8490,9 +8595,11 @@
* @param combinators the combinators used to control which names are imported or exported
* @param semicolon the semicolon terminating the directive
*/
- NamespaceDirective(Comment comment, List<Annotation> metadata, this.keyword, StringLiteral libraryUri, List<Combinator> combinators, this.semicolon) : super(comment, metadata, libraryUri) {
+ NamespaceDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super(comment, metadata, libraryUri) {
this._combinators = new NodeList<Combinator>(this);
+ this.keyword = keyword;
this._combinators.addAll(combinators);
+ this.semicolon = semicolon;
}
/**
@@ -8538,7 +8645,10 @@
* @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(Token keyword, StringLiteral name) {
+ this.keyword = keyword;
+ this.name = name;
+ }
@override
accept(AstVisitor visitor) => visitor.visitNativeClause(this);
@@ -8568,7 +8678,7 @@
/**
* The token representing 'native' that marks the start of the function body.
*/
- final Token nativeToken;
+ Token nativeToken;
/**
* The string literal, after the 'native' token.
@@ -8578,7 +8688,7 @@
/**
* The token representing the semicolon that marks the end of the function body.
*/
- final Token semicolon;
+ Token semicolon;
/**
* Initialize a newly created function body consisting of the 'native' token, a string literal,
@@ -8588,8 +8698,10 @@
* @param stringLiteral the string literal
* @param semicolon the token representing the semicolon that marks the end of the function body
*/
- NativeFunctionBody(this.nativeToken, StringLiteral stringLiteral, this.semicolon) {
+ NativeFunctionBody(Token nativeToken, StringLiteral stringLiteral, Token semicolon) {
+ this.nativeToken = nativeToken;
this._stringLiteral = becomeParentOf(stringLiteral);
+ this.semicolon = semicolon;
}
@override
@@ -8915,7 +9027,10 @@
* @param partUri the URI of the part being included
* @param semicolon the semicolon terminating the directive
*/
- PartDirective(Comment comment, List<Annotation> metadata, this.partToken, StringLiteral partUri, this.semicolon) : super(comment, metadata, partUri);
+ PartDirective(Comment comment, List<Annotation> metadata, Token partToken, StringLiteral partUri, Token semicolon) : super(comment, metadata, partUri) {
+ this.partToken = partToken;
+ this.semicolon = semicolon;
+ }
@override
accept(AstVisitor visitor) => visitor.visitPartDirective(this);
@@ -8972,8 +9087,11 @@
* @param libraryName the name of the library that the containing compilation unit is part of
* @param semicolon the semicolon terminating the directive
*/
- PartOfDirective(Comment comment, List<Annotation> metadata, this.partToken, this.ofToken, LibraryIdentifier libraryName, this.semicolon) : super(comment, metadata) {
+ PartOfDirective(Comment comment, List<Annotation> metadata, Token partToken, Token ofToken, LibraryIdentifier libraryName, Token semicolon) : super(comment, metadata) {
+ this.partToken = partToken;
+ this.ofToken = ofToken;
this._libraryName = becomeParentOf(libraryName);
+ this.semicolon = semicolon;
}
@override
@@ -9050,8 +9168,9 @@
* @param operand the expression computing the operand for the operator
* @param operator the postfix operator being applied to the operand
*/
- PostfixExpression(Expression operand, this.operator) {
+ PostfixExpression(Expression operand, Token operator) {
this._operand = becomeParentOf(operand);
+ this.operator = operator;
}
@override
@@ -9225,7 +9344,8 @@
* @param operator the prefix operator being applied to the operand
* @param operand the expression computing the operand for the operator
*/
- PrefixExpression(this.operator, Expression operand) {
+ PrefixExpression(Token operator, Expression operand) {
+ this.operator = operator;
this._operand = becomeParentOf(operand);
}
@@ -9394,8 +9514,9 @@
* @param period the period used to separate the prefix from the identifier
* @param identifier the prefix associated with the library in which the identifier is defined
*/
- PrefixedIdentifier(SimpleIdentifier prefix, this.period, SimpleIdentifier identifier) {
+ PrefixedIdentifier(SimpleIdentifier prefix, Token period, SimpleIdentifier identifier) {
this._prefix = becomeParentOf(prefix);
+ this.period = period;
this._identifier = becomeParentOf(identifier);
}
@@ -9513,8 +9634,9 @@
* @param operator the property access operator
* @param propertyName the name of the property being accessed
*/
- PropertyAccess(Expression target, this.operator, SimpleIdentifier propertyName) {
+ PropertyAccess(Expression target, Token operator, SimpleIdentifier propertyName) {
this._target = becomeParentOf(target);
+ this.operator = operator;
this._propertyName = becomeParentOf(propertyName);
}
@@ -9659,7 +9781,9 @@
* @param constructorName the name of the constructor that is being invoked
* @param argumentList the list of arguments to the constructor
*/
- RedirectingConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+ RedirectingConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+ this.keyword = keyword;
+ this.period = period;
this._constructorName = becomeParentOf(constructorName);
this._argumentList = becomeParentOf(argumentList);
}
@@ -9732,7 +9856,9 @@
*
* @param keyword the token representing the 'rethrow' keyword
*/
- RethrowExpression(this.keyword);
+ RethrowExpression(Token keyword) {
+ this.keyword = keyword;
+ }
@override
accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
@@ -9783,8 +9909,10 @@
* @param expression the expression computing the value to be returned
* @param semicolon the semicolon terminating the statement
*/
- ReturnStatement(this.keyword, Expression expression, this.semicolon) {
+ ReturnStatement(Token keyword, Expression expression, Token semicolon) {
+ this.keyword = keyword;
this._expression = becomeParentOf(expression);
+ this.semicolon = semicolon;
}
@override
@@ -9839,7 +9967,9 @@
*
* @param scriptTag the token representing this script tag
*/
- ScriptTag(this.scriptTag);
+ ScriptTag(Token scriptTag) {
+ this.scriptTag = scriptTag;
+ }
@override
accept(AstVisitor visitor) => visitor.visitScriptTag(this);
@@ -9930,7 +10060,8 @@
* @param type the name of the declared type of the parameter
* @param identifier the name of the parameter being declared
*/
- SimpleFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+ SimpleFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+ this.keyword = keyword;
this._type = becomeParentOf(type);
}
@@ -10024,7 +10155,9 @@
*
* @param token the token representing the identifier
*/
- SimpleIdentifier(this.token);
+ SimpleIdentifier(Token token) {
+ this.token = token;
+ }
@override
accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
@@ -10299,7 +10432,8 @@
* @param literal the token representing the literal
* @param value the value of the literal
*/
- SimpleStringLiteral(this.literal, String value) {
+ SimpleStringLiteral(Token literal, String value) {
+ this.literal = literal;
this._value = StringUtilities.intern(value);
}
@@ -10556,7 +10690,9 @@
* @param constructorName the name of the constructor that is being invoked
* @param argumentList the list of arguments to the constructor
*/
- SuperConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+ SuperConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+ this.keyword = keyword;
+ this.period = period;
this._constructorName = becomeParentOf(constructorName);
this._argumentList = becomeParentOf(argumentList);
}
@@ -10629,7 +10765,9 @@
*
* @param keyword the token representing the keyword
*/
- SuperExpression(this.keyword);
+ SuperExpression(Token keyword) {
+ this.keyword = keyword;
+ }
@override
accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
@@ -10770,10 +10908,12 @@
* @param colon the colon separating the keyword or the expression from the statements
* @param statements the statements that will be executed if this switch member is selected
*/
- SwitchMember(List<Label> labels, this.keyword, this.colon, List<Statement> statements) {
+ SwitchMember(List<Label> labels, Token keyword, Token colon, List<Statement> statements) {
this._labels = new NodeList<Label>(this);
this._statements = new NodeList<Statement>(this);
this._labels.addAll(labels);
+ this.keyword = keyword;
+ this.colon = colon;
this._statements.addAll(statements);
}
@@ -10863,10 +11003,15 @@
* @param members the switch members that can be selected by the expression
* @param rightBracket the right curly bracket
*/
- SwitchStatement(this.keyword, this.leftParenthesis, Expression expression, this.rightParenthesis, this.leftBracket, List<SwitchMember> members, this.rightBracket) {
+ SwitchStatement(Token keyword, Token leftParenthesis, Expression expression, Token rightParenthesis, Token leftBracket, List<SwitchMember> members, Token rightBracket) {
this._members = new NodeList<SwitchMember>(this);
+ this.keyword = keyword;
+ this.leftParenthesis = leftParenthesis;
this._expression = becomeParentOf(expression);
+ this.rightParenthesis = rightParenthesis;
+ this.leftBracket = leftBracket;
this._members.addAll(members);
+ this.rightBracket = rightBracket;
}
@override
@@ -10926,7 +11071,7 @@
/**
* The components of the literal.
*/
- final List<Token> components;
+ List<Token> components;
/**
* Initialize a newly created symbol literal.
@@ -10934,7 +11079,10 @@
* @param poundSign the token introducing the literal
* @param components the components of the literal
*/
- SymbolLiteral(this.poundSign, this.components);
+ SymbolLiteral(Token poundSign, List<Token> components) {
+ this.poundSign = poundSign;
+ this.components = components;
+ }
@override
accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
@@ -10969,7 +11117,9 @@
*
* @param keyword the token representing the keyword
*/
- ThisExpression(this.keyword);
+ ThisExpression(Token keyword) {
+ this.keyword = keyword;
+ }
@override
accept(AstVisitor visitor) => visitor.visitThisExpression(this);
@@ -11013,7 +11163,8 @@
* @param keyword the token representing the 'throw' keyword
* @param expression the expression computing the exception to be thrown
*/
- ThrowExpression(this.keyword, Expression expression) {
+ ThrowExpression(Token keyword, Expression expression) {
+ this.keyword = keyword;
this._expression = becomeParentOf(expression);
}
@@ -11085,8 +11236,9 @@
* @param variableList the top-level variables being declared
* @param semicolon the semicolon terminating the declaration
*/
- TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
+ TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon) : super(comment, metadata) {
this._variableList = becomeParentOf(variableList);
+ this.semicolon = semicolon;
}
@override
@@ -11172,10 +11324,12 @@
* @param finallyKeyword the token representing the 'finally' keyword
* @param finallyBlock the finally block contained in the try statement
*/
- TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
+ TryStatement(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock) {
this._catchClauses = new NodeList<CatchClause>(this);
+ this.tryKeyword = tryKeyword;
this._body = becomeParentOf(body);
this._catchClauses.addAll(catchClauses);
+ this.finallyKeyword = finallyKeyword;
this._finallyBlock = becomeParentOf(finallyBlock);
}
@@ -11276,7 +11430,10 @@
* @param keyword the token representing the 'typedef' keyword
* @param semicolon the semicolon terminating the declaration
*/
- TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
+ TypeAlias(Comment comment, List<Annotation> metadata, Token keyword, Token semicolon) : super(comment, metadata) {
+ this.keyword = keyword;
+ this.semicolon = semicolon;
+ }
@override
Token get endToken => semicolon;
@@ -11316,9 +11473,11 @@
* @param arguments the type arguments associated with the type
* @param rightBracket the right bracket
*/
- TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
+ TypeArgumentList(Token leftBracket, List<TypeName> arguments, Token rightBracket) {
this._arguments = new NodeList<TypeName>(this);
+ this.leftBracket = leftBracket;
this._arguments.addAll(arguments);
+ this.rightBracket = rightBracket;
}
@override
@@ -11472,8 +11631,9 @@
* @param keyword the token representing the 'extends' keyword
* @param bound the name of the upper bound for legal arguments
*/
- TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
+ TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound) : super(comment, metadata) {
this._name = becomeParentOf(name);
+ this.keyword = keyword;
this._bound = becomeParentOf(bound);
}
@@ -11547,7 +11707,7 @@
/**
* The left angle bracket.
*/
- final Token leftBracket;
+ Token leftBracket;
/**
* The type parameters in the list.
@@ -11557,7 +11717,7 @@
/**
* The right angle bracket.
*/
- final Token rightBracket;
+ Token rightBracket;
/**
* Initialize a newly created list of type parameters.
@@ -11566,9 +11726,11 @@
* @param typeParameters the type parameters in the list
* @param rightBracket the right angle bracket
*/
- TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
+ TypeParameterList(Token leftBracket, List<TypeParameter> typeParameters, Token rightBracket) {
this._typeParameters = new NodeList<TypeParameter>(this);
+ this.leftBracket = leftBracket;
this._typeParameters.addAll(typeParameters);
+ this.rightBracket = rightBracket;
}
@override
@@ -11622,7 +11784,8 @@
* @param typeArguments the type argument associated with this literal, or `null` if no type
* arguments were declared
*/
- TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
+ TypedLiteral(Token constKeyword, TypeArgumentList typeArguments) {
+ this.constKeyword = constKeyword;
this.typeArguments = becomeParentOf(typeArguments);
}
@@ -11739,8 +11902,9 @@
* @param equals the equal sign separating the variable name from the initial value
* @param initializer the expression used to compute the initial value for the variable
*/
- VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
+ VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer) : super(comment, metadata) {
this._name = becomeParentOf(name);
+ this.equals = equals;
this._initializer = becomeParentOf(initializer);
}
@@ -11883,8 +12047,9 @@
* @param type the type of the variables being declared
* @param variables a list containing the individual variables being declared
*/
- VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
+ VariableDeclarationList(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
this._variables = new NodeList<VariableDeclaration>(this);
+ this.keyword = keyword;
this._type = becomeParentOf(type);
this._variables.addAll(variables);
}
@@ -11977,8 +12142,9 @@
* @param variableList the fields being declared
* @param semicolon the semicolon terminating the statement
*/
- VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
+ VariableDeclarationStatement(VariableDeclarationList variableList, Token semicolon) {
this._variableList = becomeParentOf(variableList);
+ this.semicolon = semicolon;
}
@override
@@ -12055,8 +12221,11 @@
* @param rightParenthesis the right parenthesis
* @param body the body of the loop
*/
- WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
+ WhileStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body) {
+ this.keyword = keyword;
+ this.leftParenthesis = leftParenthesis;
this._condition = becomeParentOf(condition);
+ this.rightParenthesis = rightParenthesis;
this._body = becomeParentOf(body);
}
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 77901f8..a63eda8 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -206,7 +206,7 @@
/**
* The value of the expression.
*/
- final DartObject value;
+ DartObject value;
/**
* The errors that should be reported for the expression(s) that were evaluated.
@@ -220,7 +220,8 @@
* @param value the value of the expression
* @param errors the errors that should be reported for the expression(s) that were evaluated
*/
- EvaluationResult(this.value, List<AnalysisError> errors) {
+ EvaluationResult(DartObject value, List<AnalysisError> errors) {
+ this.value = value;
this._errors = errors;
}
@@ -1126,12 +1127,12 @@
/**
* The node against which the error should be reported.
*/
- final AstNode node;
+ AstNode node;
/**
* The error code for the error to be generated.
*/
- final ErrorCode errorCode;
+ ErrorCode errorCode;
/**
* Initialize a newly created data holder to represent the error with the given code reported
@@ -1140,7 +1141,10 @@
* @param node the node against which the error should be reported
* @param errorCode the error code for the error to be generated
*/
- ErrorResult_ErrorData(this.node, this.errorCode);
+ ErrorResult_ErrorData(AstNode node, ErrorCode errorCode) {
+ this.node = node;
+ this.errorCode = errorCode;
+ }
}
/**
@@ -1341,14 +1345,16 @@
/**
* The value of the expression.
*/
- final DartObjectImpl value;
+ DartObjectImpl value;
/**
* Initialize a newly created result to represent the given value.
*
* @param value the value of the expression
*/
- ValidResult(this.value);
+ ValidResult(DartObjectImpl value) {
+ this.value = value;
+ }
@override
EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
@@ -1786,7 +1792,7 @@
/**
* The value of this instance.
*/
- final bool value;
+ bool value = false;
/**
* An instance representing the boolean value 'false'.
@@ -1816,7 +1822,9 @@
*
* @param value the value of this instance
*/
- BoolState(this.value);
+ BoolState(bool value) {
+ this.value = value;
+ }
@override
BoolState convertToBool() => this;
@@ -1907,7 +1915,7 @@
/**
* The run-time type of this object.
*/
- final InterfaceType type;
+ InterfaceType type;
/**
* The state of the object.
@@ -1920,7 +1928,8 @@
* @param type the run-time type of this object
* @param state the state of the object
*/
- DartObjectImpl(this.type, InstanceState state) {
+ DartObjectImpl(InterfaceType type, InstanceState state) {
+ this.type = type;
this._state = state;
}
@@ -2356,7 +2365,7 @@
/**
* The value of this instance.
*/
- final double value;
+ double value = 0.0;
/**
* A state that can be used to represent a double whose value is not known.
@@ -2368,7 +2377,9 @@
*
* @param value the value of this instance
*/
- DoubleState(this.value);
+ DoubleState(double value) {
+ this.value = value;
+ }
@override
NumState add(InstanceState rightOperand) {
@@ -2844,14 +2855,16 @@
/**
* The error code associated with the exception.
*/
- final ErrorCode errorCode;
+ ErrorCode errorCode;
/**
* Initialize a newly created exception to have the given error code.
*
* @param errorCode the error code associated with the exception
*/
- EvaluationException(this.errorCode);
+ EvaluationException(ErrorCode errorCode) {
+ this.errorCode = errorCode;
+ }
}
/**
@@ -3387,7 +3400,7 @@
/**
* The value of this instance.
*/
- final int value;
+ int value = 0;
/**
* A state that can be used to represent an int whose value is not known.
@@ -3399,7 +3412,9 @@
*
* @param value the value of this instance
*/
- IntState(this.value);
+ IntState(int value) {
+ this.value = value;
+ }
@override
NumState add(InstanceState rightOperand) {
@@ -4171,7 +4186,7 @@
/**
* The value of this instance.
*/
- final String value;
+ String value;
/**
* A state that can be used to represent a double whose value is not known.
@@ -4183,7 +4198,9 @@
*
* @param value the value of this instance
*/
- StringState(this.value);
+ StringState(String value) {
+ this.value = value;
+ }
@override
StringState concatenate(InstanceState rightOperand) {
@@ -4250,14 +4267,16 @@
/**
* The value of this instance.
*/
- final String value;
+ String value;
/**
* Initialize a newly created state to represent the given value.
*
* @param value the value of this instance
*/
- SymbolState(this.value);
+ SymbolState(String value) {
+ this.value = value;
+ }
@override
StringState convertToString() {
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9f273be..4cd44d6 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -603,6 +603,8 @@
* This method is expensive, because resolved AST might be evicted from cache, so parsing and
* resolving will be performed.
*
+ * <b>Note:</b> This method cannot be used in an async environment.
+ *
* @return the resolved [AstNode], maybe `null` if [Element] is synthetic or
* isn't contained in a compilation unit, such as a [LibraryElement].
*/
@@ -847,14 +849,16 @@
/**
* The name displayed in the UI for this kind of element.
*/
- final String displayName;
+ String displayName;
/**
* Initialize a newly created element kind to have the given display name.
*
* @param displayName the name displayed in the UI for this kind of element
*/
- ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
+ ElementKind(String name, int ordinal, String displayName) : super(name, ordinal) {
+ this.displayName = displayName;
+ }
}
/**
@@ -1750,7 +1754,7 @@
int get uriEnd;
/**
- * Return the offset of the URU in the file, or `-1` if this element is synthetic.
+ * Return the offset of the URI in the file, or `-1` if this element is synthetic.
*
* @return the offset of the URI
*/
@@ -2563,13 +2567,13 @@
* The element based on propagated type information, or `null` if the AST structure has not
* been resolved or if this identifier could not be resolved.
*/
- final ExecutableElement propagatedElement;
+ ExecutableElement propagatedElement;
/**
* The element associated with this identifier based on static type information, or `null`
* if the AST structure has not been resolved or if this identifier could not be resolved.
*/
- final ExecutableElement staticElement;
+ ExecutableElement staticElement;
/**
* Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
@@ -2577,7 +2581,10 @@
* @param staticElement the static element
* @param propagatedElement the propagated element
*/
- AuxiliaryElements(this.staticElement, this.propagatedElement);
+ AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagatedElement) {
+ this.staticElement = staticElement;
+ this.propagatedElement = propagatedElement;
+ }
}
/**
@@ -3661,7 +3668,7 @@
/**
* The element representing the field, variable, or constructor being used as an annotation.
*/
- final Element element;
+ Element element;
/**
* An empty array of annotations.
@@ -3695,7 +3702,9 @@
* @param element the element representing the field, variable, or constructor being used as an
* annotation
*/
- ElementAnnotationImpl(this.element);
+ ElementAnnotationImpl(Element element) {
+ this.element = element;
+ }
@override
bool get isDeprecated {
@@ -3796,8 +3805,9 @@
* @param nameOffset the offset of the name of this element in the file that contains the
* declaration of this element
*/
- ElementImpl(String name, this.nameOffset) {
+ ElementImpl(String name, int nameOffset) {
this._name = StringUtilities.intern(name);
+ this.nameOffset = nameOffset;
}
@override
@@ -4945,7 +4955,7 @@
/**
* The analysis context in which this library is defined.
*/
- final AnalysisContext context;
+ AnalysisContext context;
/**
* The scripts contained in or referenced from script tags in the HTML file.
@@ -4969,7 +4979,9 @@
* @param context the analysis context in which the HTML file is defined
* @param name the name of this element
*/
- HtmlElementImpl(this.context, String name) : super(name, -1);
+ HtmlElementImpl(AnalysisContext context, String name) : super(name, -1) {
+ this.context = context;
+ }
@override
accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
@@ -5205,7 +5217,7 @@
/**
* The analysis context in which this library is defined.
*/
- final AnalysisContext context;
+ AnalysisContext context;
/**
* The compilation unit that defines this library.
@@ -5244,7 +5256,9 @@
* @param context the analysis context in which the library is defined
* @param name the name of this element
*/
- LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
+ LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.forNode(name) {
+ this.context = context;
+ }
@override
accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
@@ -5869,7 +5883,7 @@
/**
* The analysis context in which the multiply defined elements are defined.
*/
- final AnalysisContext context;
+ AnalysisContext context;
/**
* The name of the conflicting elements.
@@ -5879,7 +5893,7 @@
/**
* A list containing all of the elements that conflict.
*/
- final List<Element> conflictingElements;
+ List<Element> conflictingElements;
/**
* Initialize a newly created element to represent a list of conflicting elements.
@@ -5887,8 +5901,10 @@
* @param context the analysis context in which the multiply defined elements are defined
* @param conflictingElements the elements that conflict
*/
- MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
+ MultiplyDefinedElementImpl(AnalysisContext context, List<Element> conflictingElements) {
+ this.context = context;
_name = conflictingElements[0].name;
+ this.conflictingElements = conflictingElements;
}
@override
@@ -6595,7 +6611,7 @@
*/
abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
/**
- * The offset of the URU in the file, may be `-1` if synthetic.
+ * The offset of the URI in the file, may be `-1` if synthetic.
*/
int uriOffset = -1;
@@ -6752,16 +6768,19 @@
* Information about Angular application.
*/
class AngularApplication {
- final Source entryPoint;
+ Source entryPoint;
Set<Source> _librarySources;
- final List<AngularElement> elements;
+ List<AngularElement> elements;
- final List<Source> elementSources;
+ List<Source> elementSources;
- AngularApplication(this.entryPoint, Set<Source> librarySources, this.elements, this.elementSources) {
+ AngularApplication(Source entryPoint, Set<Source> librarySources, List<AngularElement> elements, List<Source> elementSources) {
+ this.entryPoint = entryPoint;
this._librarySources = librarySources;
+ this.elements = elements;
+ this.elementSources = elementSources;
}
/**
@@ -7111,7 +7130,7 @@
/**
* The type of the property
*/
- final DartType type;
+ DartType type;
/**
* Initialize a newly created Angular scope property to have the given name.
@@ -7120,7 +7139,9 @@
* @param nameOffset the offset of the name of this element in the file that contains the
* declaration of this element
*/
- AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
+ AngularScopePropertyElementImpl(String name, int nameOffset, DartType type) : super(name, nameOffset) {
+ this.type = type;
+ }
@override
accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
@@ -7172,12 +7193,12 @@
/**
* The HTML template URI.
*/
- final String templateUri;
+ String templateUri;
/**
* The offset of the [templateUri] in the [getSource].
*/
- final int templateUriOffset;
+ int templateUriOffset = 0;
/**
* The HTML template source.
@@ -7187,7 +7208,10 @@
/**
* Initialize a newly created Angular view.
*/
- AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
+ AngularViewElementImpl(String templateUri, int templateUriOffset) : super(null, -1) {
+ this.templateUri = templateUri;
+ this.templateUriOffset = templateUriOffset;
+ }
@override
accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
@@ -7223,11 +7247,14 @@
* Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
*/
class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
- final String tagName;
+ String tagName;
- final String attributeName;
+ String attributeName;
- IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
+ IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super(null, -1) {
+ this.tagName = tagName;
+ this.attributeName = attributeName;
+ }
@override
bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
@@ -9501,7 +9528,7 @@
/**
* The name of this type, or `null` if the type does not have a name.
*/
- final String name;
+ String name;
/**
* An empty array of types.
@@ -9514,8 +9541,9 @@
* @param element the element representing the declaration of the type
* @param name the name of the type
*/
- TypeImpl(Element element, this.name) {
+ TypeImpl(Element element, String name) {
this._element = element;
+ this.name = name;
}
@override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 9fa7af5..be82258 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -212,6 +212,8 @@
* 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.
+ *
* @param element the element whose documentation comment is to be returned
* @return the element's documentation comment
* @throws AnalysisException if the documentation comment could not be determined because the
@@ -224,7 +226,7 @@
* are not already known then the source will be analyzed in order to determine the errors
* associated with it.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the source whose errors are to be returned
* @return all of the errors associated with the given source
@@ -241,7 +243,7 @@
* libraries that are defined in it (via script tags) that also need to have a model built for
* them.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the source defining the HTML file whose element model is to be returned
* @return the element model corresponding to the HTML file defined by the given source
@@ -255,7 +257,7 @@
* Return the kind of the given source, computing it's kind if it is not already known. Return
* [SourceKind#UNKNOWN] if the source is not contained in this context.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the source whose kind is to be returned
* @return the kind of the given source
@@ -269,6 +271,8 @@
* for a library can long-running, depending on the size of the library and the number of
* libraries that are imported into it that also need to have a model built for them.
*
+ * <b>Note:</b> This method cannot be used in an async environment.
+ *
* @param source the source defining the library whose element model is to be returned
* @return the element model corresponding to the library defined by the given source
* @throws AnalysisException if the element model could not be determined because the analysis
@@ -283,7 +287,7 @@
* known it will be created. The line information is used to map offsets from the beginning of the
* source to line and column pairs.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the source whose line information is to be returned
* @return the line information for the given source
@@ -603,7 +607,7 @@
* Parse a single source to produce an AST structure. The resulting AST structure may or may not
* be resolved, and may have a slightly different structure depending upon whether it is resolved.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the source to be parsed
* @return the AST structure representing the content of the source
@@ -616,7 +620,7 @@
* may not be resolved, and may have a slightly different structure depending upon whether it is
* resolved.
*
- * <b>Note:</b> This method cannot be used in an async environment
+ * <b>Note:</b> This method cannot be used in an async environment.
*
* @param source the HTML source to be parsed
* @return the parse result (not `null`)
@@ -855,17 +859,17 @@
/**
* The number of milliseconds required to determine which task was to be performed.
*/
- final int getTime;
+ int getTime = 0;
/**
* The name of the class of the task that was performed.
*/
- final String taskClassName;
+ String taskClassName;
/**
* The number of milliseconds required to perform the task.
*/
- final int performTime;
+ int performTime = 0;
/**
* Initialize a newly created analysis result to have the given values.
@@ -875,8 +879,11 @@
* @param taskClassName the name of the class of the task that was performed
* @param performTime the number of milliseconds required to perform the task
*/
- AnalysisResult(List<ChangeNotice> notices, this.getTime, this.taskClassName, this.performTime) {
+ AnalysisResult(List<ChangeNotice> notices, int getTime, String taskClassName, int performTime) {
this._notices = notices;
+ this.getTime = getTime;
+ this.taskClassName = taskClassName;
+ this.performTime = performTime;
}
/**
@@ -1377,11 +1384,6 @@
static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
/**
- * The data descriptor representing the errors reported during the resolution of directives.
- */
- static final DataDescriptor<List<AnalysisError>> DIRECTIVE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.DIRECTIVE_ERRORS");
-
- /**
* The data descriptor representing the library element for the library. This data is only
* available for Dart files that are the defining compilation unit of a library.
*/
@@ -1528,6 +1530,15 @@
bool hasInvalidData(DataDescriptor descriptor);
/**
+ * Return `true` if this entry has an AST structure that can be resolved (even if it needs
+ * to be copied).
+ *
+ * @return `true` if the method [DartEntryImpl#getResolvableCompilationUnit] will
+ * return a non-`null` result
+ */
+ bool get hasResolvableCompilationUnit;
+
+ /**
* Return `true` if this data is safe to use in refactoring.
*/
bool get isRefactoringSafe;
@@ -1630,17 +1641,6 @@
List<Source> _includedParts = Source.EMPTY_ARRAY;
/**
- * The state of the cached directive errors.
- */
- CacheState _directiveErrorsState = CacheState.INVALID;
-
- /**
- * The errors produced while resolving the directives, or an empty array if the errors are not
- * currently cached.
- */
- List<AnalysisError> _directiveErrors = AnalysisError.NO_ERRORS;
-
- /**
* The list of libraries that contain this compilation unit. The list will be empty if there are
* no known libraries that contain this compilation unit.
*/
@@ -1737,7 +1737,6 @@
List<AnalysisError> errors = new List<AnalysisError>();
ListUtilities.addAll(errors, _scanErrors);
ListUtilities.addAll(errors, _parseErrors);
- ListUtilities.addAll(errors, _directiveErrors);
DartEntryImpl_ResolutionState state = _resolutionState;
while (state != null) {
ListUtilities.addAll(errors, state._resolutionErrors);
@@ -1822,9 +1821,7 @@
@override
CacheState getState(DataDescriptor descriptor) {
- if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
- return _directiveErrorsState;
- } else if (identical(descriptor, DartEntry.ELEMENT)) {
+ if (identical(descriptor, DartEntry.ELEMENT)) {
return _elementState;
} else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
return _exportedLibrariesState;
@@ -1886,8 +1883,6 @@
return _angularErrors;
} else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
return new List.from(_containingLibraries);
- } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
- return _directiveErrors;
} else if (identical(descriptor, DartEntry.ELEMENT)) {
return _element;
} else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -1955,9 +1950,7 @@
@override
bool hasInvalidData(DataDescriptor descriptor) {
- if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
- return identical(_directiveErrorsState, CacheState.INVALID);
- } else if (identical(descriptor, DartEntry.ELEMENT)) {
+ if (identical(descriptor, DartEntry.ELEMENT)) {
return identical(_elementState, CacheState.INVALID);
} else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
return identical(_exportedLibrariesState, CacheState.INVALID);
@@ -2001,6 +1994,22 @@
}
@override
+ bool get hasResolvableCompilationUnit {
+ if (identical(_parsedUnitState, CacheState.VALID)) {
+ return true;
+ }
+ DartEntryImpl_ResolutionState state = _resolutionState;
+ while (state != null) {
+ if (identical(state._resolvedUnitState, CacheState.VALID)) {
+ return true;
+ }
+ state = state._nextState;
+ }
+ ;
+ return false;
+ }
+
+ @override
void invalidateAllInformation() {
super.invalidateAllInformation();
_scanErrors = AnalysisError.NO_ERRORS;
@@ -2014,6 +2023,12 @@
_parsedUnit = null;
_parsedUnitAccessed = false;
_parsedUnitState = CacheState.INVALID;
+ _importedLibraries = Source.EMPTY_ARRAY;
+ _importedLibrariesState = CacheState.INVALID;
+ _exportedLibraries = Source.EMPTY_ARRAY;
+ _exportedLibrariesState = CacheState.INVALID;
+ _includedParts = Source.EMPTY_ARRAY;
+ _includedPartsState = CacheState.INVALID;
_discardCachedResolutionInformation();
}
@@ -2056,59 +2071,6 @@
}
/**
- * Record that an error occurred while attempting to resolve the directives in the source
- * represented by this entry.
- */
- void recordDependencyError() {
- _exportedLibraries = Source.EMPTY_ARRAY;
- _exportedLibrariesState = CacheState.ERROR;
- _importedLibraries = Source.EMPTY_ARRAY;
- _importedLibrariesState = CacheState.ERROR;
- _includedParts = Source.EMPTY_ARRAY;
- _includedPartsState = CacheState.ERROR;
- _directiveErrors = AnalysisError.NO_ERRORS;
- _directiveErrorsState = CacheState.ERROR;
- }
-
- /**
- * Record that the information related to resolving dependencies for the associated source is
- * about to be computed by the current thread.
- */
- void recordDependencyInProcess() {
- if (_exportedLibrariesState != CacheState.VALID) {
- _exportedLibrariesState = CacheState.IN_PROCESS;
- }
- if (_importedLibrariesState != CacheState.VALID) {
- _importedLibrariesState = CacheState.IN_PROCESS;
- }
- if (_includedPartsState != CacheState.VALID) {
- _includedPartsState = CacheState.IN_PROCESS;
- }
- if (_directiveErrorsState != CacheState.VALID) {
- _directiveErrorsState = CacheState.IN_PROCESS;
- }
- }
-
- /**
- * Record that an in-process dependency resolution has stopped without recording results because
- * the results were invalidated before they could be recorded.
- */
- void recordDependencyNotInProcess() {
- if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
- _exportedLibrariesState = CacheState.INVALID;
- }
- if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
- _importedLibrariesState = CacheState.INVALID;
- }
- if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
- _includedPartsState = CacheState.INVALID;
- }
- if (identical(_directiveErrorsState, CacheState.IN_PROCESS)) {
- _directiveErrorsState = CacheState.INVALID;
- }
- }
-
- /**
* Record that an error occurred while attempting to scan or parse the entry represented by this
* entry. This will set the state of all information, including any resolution-based information,
* as being in error.
@@ -2121,7 +2083,12 @@
_parsedUnit = null;
_parsedUnitAccessed = false;
_parsedUnitState = CacheState.ERROR;
- recordDependencyError();
+ _exportedLibraries = Source.EMPTY_ARRAY;
+ _exportedLibrariesState = CacheState.ERROR;
+ _importedLibraries = Source.EMPTY_ARRAY;
+ _importedLibrariesState = CacheState.ERROR;
+ _includedParts = Source.EMPTY_ARRAY;
+ _includedPartsState = CacheState.ERROR;
recordResolutionError();
}
@@ -2139,6 +2106,15 @@
if (_parsedUnitState != CacheState.VALID) {
_parsedUnitState = CacheState.IN_PROCESS;
}
+ if (_exportedLibrariesState != CacheState.VALID) {
+ _exportedLibrariesState = CacheState.IN_PROCESS;
+ }
+ if (_importedLibrariesState != CacheState.VALID) {
+ _importedLibrariesState = CacheState.IN_PROCESS;
+ }
+ if (_includedPartsState != CacheState.VALID) {
+ _includedPartsState = CacheState.IN_PROCESS;
+ }
}
/**
@@ -2158,6 +2134,15 @@
if (identical(_parsedUnitState, CacheState.IN_PROCESS)) {
_parsedUnitState = CacheState.INVALID;
}
+ if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
+ _exportedLibrariesState = CacheState.INVALID;
+ }
+ if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
+ _importedLibrariesState = CacheState.INVALID;
+ }
+ if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
+ _includedPartsState = CacheState.INVALID;
+ }
}
/**
@@ -2295,10 +2280,7 @@
@override
void setState(DataDescriptor descriptor, CacheState state) {
- if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
- _directiveErrors = updatedValue(state, _directiveErrors, null);
- _directiveErrorsState = state;
- } else if (identical(descriptor, DartEntry.ELEMENT)) {
+ if (identical(descriptor, DartEntry.ELEMENT)) {
_element = updatedValue(state, _element, null);
_elementState = state;
} else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -2375,9 +2357,6 @@
void setValue(DataDescriptor descriptor, Object value) {
if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
_angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
- } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
- _directiveErrors = value as List<AnalysisError>;
- _directiveErrorsState = CacheState.VALID;
} else if (identical(descriptor, DartEntry.ELEMENT)) {
_element = value as LibraryElement;
_elementState = CacheState.VALID;
@@ -2467,8 +2446,6 @@
_exportedLibraries = other._exportedLibraries;
_importedLibrariesState = other._importedLibrariesState;
_importedLibraries = other._importedLibraries;
- _directiveErrorsState = other._directiveErrorsState;
- _directiveErrors = other._directiveErrors;
_containingLibraries = new List<Source>.from(other._containingLibraries);
_resolutionState.copyFrom(other._resolutionState);
_elementState = other._elementState;
@@ -2482,7 +2459,7 @@
}
@override
- bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_directiveErrorsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
+ bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
@override
void writeOn(JavaStringBuilder builder) {
@@ -2506,8 +2483,6 @@
builder.append(_importedLibrariesState);
builder.append("; includedParts = ");
builder.append(_includedPartsState);
- builder.append("; directiveErrors = ");
- builder.append(_directiveErrorsState);
builder.append("; element = ");
builder.append(_elementState);
builder.append("; publicNamespace = ");
@@ -2526,14 +2501,6 @@
void _discardCachedResolutionInformation() {
_element = null;
_elementState = CacheState.INVALID;
- _includedParts = Source.EMPTY_ARRAY;
- _includedPartsState = CacheState.INVALID;
- _exportedLibraries = Source.EMPTY_ARRAY;
- _exportedLibrariesState = CacheState.INVALID;
- _importedLibraries = Source.EMPTY_ARRAY;
- _importedLibrariesState = CacheState.INVALID;
- _directiveErrors = AnalysisError.NO_ERRORS;
- _directiveErrorsState = CacheState.INVALID;
_bitmask = 0;
_clientServerState = CacheState.INVALID;
_launchableState = CacheState.INVALID;
@@ -3668,7 +3635,7 @@
}
class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
- final String name;
+ String name;
int _errorCount = 0;
@@ -3680,7 +3647,9 @@
int _validCount = 0;
- AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
+ AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
+ this.name = name;
+ }
@override
bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
@@ -3965,13 +3934,13 @@
}
@override
- List<Source> computeExportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+ List<Source> computeExportedLibraries(Source source) => _getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
@override
HtmlElement computeHtmlElement(Source source) => _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
@override
- List<Source> computeImportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+ List<Source> computeImportedLibraries(Source source) => _getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
@override
SourceKind computeKindOf(Source source) {
@@ -4019,7 +3988,7 @@
throw new AnalysisException.con2("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", dartEntry.exception);
}
_cache.put(source, dartCopy);
- return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
+ return new ResolvableCompilationUnit.con1(dartCopy.modificationTime, unit);
}
@override
@@ -4292,35 +4261,6 @@
}
@override
- Namespace getPublicNamespace2(Source source) {
- // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
- // API of the interface.
- DartEntry dartEntry = _getReadableDartEntry(source);
- if (dartEntry == null) {
- return null;
- }
- Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
- if (namespace == null) {
- LibraryElement library = computeLibraryElement(source);
- if (library == null) {
- return null;
- }
- NamespaceBuilder builder = new NamespaceBuilder();
- namespace = builder.createPublicNamespaceForLibrary(library);
- dartEntry = _getReadableDartEntry(source);
- if (dartEntry == null) {
- throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
- }
- if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
- DartEntryImpl dartCopy = _getReadableDartEntry(source).writableCopy;
- dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
- _cache.put(source, dartCopy);
- }
- }
- return namespace;
- }
-
- @override
List<Source> get refactoringUnsafeSources {
List<Source> sources = new List<Source>();
for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
@@ -4869,42 +4809,6 @@
}
/**
- * Given a source for a Dart file, return a cache entry in which the state of the data represented
- * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
- * method assumes that the data can be produced by resolving the directives in the source if they
- * are not already cached.
- *
- * <b>Note:</b> This method cannot be used in an async environment
- *
- * @param source the source representing the Dart file
- * @param dartEntry the cache entry associated with the Dart file
- * @param descriptor the descriptor representing the data to be returned
- * @return a cache entry containing the required data
- * @throws AnalysisException if data could not be returned because the source could not be
- * resolved
- */
- DartEntry _cacheDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
- //
- // Check to see whether we already have the information being requested.
- //
- CacheState state = dartEntry.getState(descriptor);
- while (state != CacheState.ERROR && state != CacheState.VALID) {
- //
- // If not, compute the information. Unless the modification date of the source continues to
- // change, this loop will eventually terminate.
- //
- dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
- CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
- if (unit == null) {
- throw new AnalysisException.con2("Could not cache Dart dependency data: no parse unit", dartEntry.exception);
- }
- dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, unit).perform(_resultRecorder) as DartEntry;
- state = dartEntry.getState(descriptor);
- }
- return dartEntry;
- }
-
- /**
* Given a source for a Dart file and the library that contains it, return a cache entry in which
* the state of the data represented by the given descriptor is either [CacheState#VALID] or
* [CacheState#ERROR]. This method assumes that the data can be produced by generating hints
@@ -4963,7 +4867,7 @@
// change, this loop will eventually terminate.
//
dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
- dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM)).perform(_resultRecorder) as DartEntry;
+ dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM), dartEntry.getValue(SourceEntry.LINE_INFO)).perform(_resultRecorder) as DartEntry;
state = dartEntry.getState(descriptor);
}
return dartEntry;
@@ -5045,6 +4949,8 @@
* [CacheState#ERROR]. This method assumes that the data can be produced by verifying the
* source in the given library if the data is not already cached.
*
+ * <b>Note:</b> This method cannot be used in an async environment.
+ *
* @param unitSource the source representing the Dart file
* @param librarySource the source representing the library containing the Dart file
* @param dartEntry the cache entry associated with the Dart file
@@ -5197,7 +5103,7 @@
SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS);
_cache.put(source, sourceCopy);
- return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false, null);
+ return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false);
}
/**
@@ -5209,7 +5115,7 @@
* @return task data representing the created task
*/
AnalysisContextImpl_TaskData _createParseDartTask(Source source, DartEntry dartEntry) {
- if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID) {
+ if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
return _createScanDartTask(source, dartEntry);
}
Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
@@ -5217,7 +5123,7 @@
dartCopy.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
_cache.put(source, dartCopy);
- return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream), false, null);
+ return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream, dartEntry.getValue(SourceEntry.LINE_INFO)), false);
}
/**
@@ -5237,26 +5143,45 @@
htmlCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
htmlCopy.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
_cache.put(source, htmlCopy);
- return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false, null);
+ return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false);
}
/**
- * Create a [ResolveDartDependenciesTask] for the given source, marking the exported
- * libraries as being in-process.
+ * Create a [ResolveAngularComponentTemplateTask] for the given source, marking the angular
+ * errors as being in-process.
*
- * @param source the source whose content is to be used to resolve dependencies
- * @param dartEntry the entry for the source
+ * @param source the source whose content is to be resolved
+ * @param htmlEntry the entry for the source
* @return task data representing the created task
*/
- AnalysisContextImpl_TaskData _createResolveDartDependenciesTask(Source source, DartEntry dartEntry) {
- CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
- if (unit == null) {
- return _createParseDartTask(source, dartEntry);
+ AnalysisContextImpl_TaskData _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) {
+ if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+ return _createResolveHtmlTask(source, htmlEntry);
}
- DartEntryImpl dartCopy = dartEntry.writableCopy;
- dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.IN_PROCESS);
- _cache.put(source, dartCopy);
- return new AnalysisContextImpl_TaskData(new ResolveDartDependenciesTask(this, source, dartCopy.modificationTime, unit), false, null);
+ AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
+ AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
+ HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+ htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
+ _cache.put(source, htmlCopy);
+ return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false);
+ }
+
+ /**
+ * Create a [ResolveAngularEntryHtmlTask] for the given source, marking the angular entry as
+ * being in-process.
+ *
+ * @param source the source whose content is to be resolved
+ * @param htmlEntry the entry for the source
+ * @return task data representing the created task
+ */
+ AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source, HtmlEntry htmlEntry) {
+ if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+ return _createResolveHtmlTask(source, htmlEntry);
+ }
+ HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+ htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
+ _cache.put(source, htmlCopy);
+ return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false);
}
/**
@@ -5274,7 +5199,7 @@
HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS);
_cache.put(source, htmlCopy);
- return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false, null);
+ return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false);
}
/**
@@ -5294,7 +5219,7 @@
dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
dartCopy.setState(DartEntry.SCAN_ERRORS, CacheState.IN_PROCESS);
_cache.put(source, dartCopy);
- return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false, null);
+ return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false);
}
/**
@@ -5349,47 +5274,6 @@
}
/**
- * Given a source for a Dart file, return the data represented by the given descriptor that is
- * associated with that source. This method assumes that the data can be produced by resolving the
- * directives in the source if they are not already cached.
- *
- * @param source the source representing the Dart file
- * @param dartEntry the cache entry associated with the Dart file
- * @param descriptor the descriptor representing the data to be returned
- * @return the requested data about the given source
- * @throws AnalysisException if data could not be returned because the source could not be parsed
- */
- Object _getDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
- dartEntry = _cacheDartDependencyData(source, dartEntry, descriptor);
- return dartEntry.getValue(descriptor);
- }
-
- /**
- * Given a source for a Dart file, return the data represented by the given descriptor that is
- * associated with that source, or the given default value if the source is not a Dart file. This
- * method assumes that the data can be produced by resolving the directives in the source if they
- * are not already cached.
- *
- * @param source the source representing the Dart file
- * @param descriptor the descriptor representing the data to be returned
- * @param defaultValue the value to be returned if the source is not a Dart file
- * @return the requested data about the given source
- * @throws AnalysisException if data could not be returned because the source could not be parsed
- */
- Object _getDartDependencyData2(Source source, DataDescriptor descriptor, Object defaultValue) {
- DartEntry dartEntry = _getReadableDartEntry(source);
- if (dartEntry == null) {
- return defaultValue;
- }
- try {
- return _getDartDependencyData(source, dartEntry, descriptor);
- } on ObsoleteSourceAnalysisException catch (exception) {
- AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
- return defaultValue;
- }
- }
-
- /**
* Given a source for a Dart file and the library that contains it, return the data represented by
* the given descriptor that is associated with that source. This method assumes that the data can
* be produced by generating hints for the library if it is not already cached.
@@ -5558,6 +5442,8 @@
* the given descriptor that is associated with that source. This method assumes that the data can
* be produced by verifying the source within the given library if it is not already cached.
*
+ * <b>Note:</b> This method cannot be used in an async environment.
+ *
* @param unitSource the source representing the Dart file
* @param librarySource the source representing the library containing the Dart file
* @param dartEntry the entry representing the Dart file
@@ -5669,7 +5555,7 @@
// Look for a priority source that needs to be analyzed.
//
for (Source source in _priorityOrder) {
- AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, true, hintsEnabled, sdkErrorsEnabled);
+ AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled, sdkErrorsEnabled);
AnalysisTask task = taskData.task;
if (task != null) {
return task;
@@ -5680,18 +5566,23 @@
//
// Look for a non-priority source that needs to be analyzed.
//
- Source source = _workManager.nextSource;
- while (source != null) {
- AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, false, hintsEnabled, sdkErrorsEnabled);
+ List<Source> sourcesToRemove = new List<Source>();
+ WorkManager_WorkIterator sources = _workManager.iterator();
+ while (sources.hasNext) {
+ Source source = sources.next();
+ AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled, sdkErrorsEnabled);
AnalysisTask task = taskData.task;
if (task != null) {
return task;
} else if (taskData.isBlocked) {
hasBlockedTask = true;
} else {
- _workManager.remove(source);
+ sourcesToRemove.add(source);
}
- source = _workManager.nextSource;
+ }
+ int count = sourcesToRemove.length;
+ for (int i = 0; i < count; i++) {
+ _workManager.remove(sourcesToRemove[i]);
}
// //
// // Look for a non-priority source that needs to be analyzed and was missed by the loop above.
@@ -5706,6 +5597,7 @@
// }
// }
if (hasBlockedTask) {
+ // All of the analysis work is blocked waiting for an asynchronous task to complete.
return WaitForAsyncTask.instance;
}
return null;
@@ -5728,7 +5620,7 @@
*/
AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
if (sourceEntry == null) {
- return new AnalysisContextImpl_TaskData(null, false, null);
+ return new AnalysisContextImpl_TaskData(null, false);
}
CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
if (identical(contentState, CacheState.INVALID)) {
@@ -5736,7 +5628,10 @@
} else if (identical(contentState, CacheState.IN_PROCESS)) {
// We are already in the process of getting the content. There's nothing else we can do with
// this source until that's complete.
- return new AnalysisContextImpl_TaskData(null, true, null);
+ return new AnalysisContextImpl_TaskData(null, true);
+ } else if (identical(contentState, CacheState.ERROR)) {
+ // We have done all of the analysis we can for this source because we cannot get its content.
+ return new AnalysisContextImpl_TaskData(null, false);
}
if (sourceEntry is DartEntry) {
DartEntry dartEntry = sourceEntry;
@@ -5754,10 +5649,6 @@
return _createParseDartTask(source, dartEntry);
}
}
- CacheState exportState = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
- if (identical(exportState, CacheState.INVALID) || (isPriority && identical(exportState, CacheState.FLUSHED))) {
- return _createResolveDartDependenciesTask(source, dartEntry);
- }
List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
for (Source librarySource in librariesContaining) {
SourceEntry libraryEntry = _cache.get(librarySource);
@@ -5767,7 +5658,7 @@
DartEntryImpl libraryCopy = libraryEntry.writableCopy;
libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
_cache.put(librarySource, libraryCopy);
- return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+ return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
}
CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
@@ -5782,7 +5673,7 @@
dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS);
_cache.put(source, dartCopy);
//return new ResolveDartUnitTask(this, source, libraryElement);
- return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+ return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
}
if (sdkErrorsEnabled || !source.isInSystemLibrary) {
CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
@@ -5792,7 +5683,7 @@
DartEntryImpl dartCopy = dartEntry.writableCopy;
dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
_cache.put(source, dartCopy);
- return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false, null);
+ return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false);
}
}
if (hintsEnabled) {
@@ -5803,7 +5694,7 @@
DartEntryImpl dartCopy = dartEntry.writableCopy;
dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS);
_cache.put(source, dartCopy);
- return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false, null);
+ return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false);
}
}
}
@@ -5826,50 +5717,23 @@
if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
return _createResolveHtmlTask(source, htmlEntry);
}
+ //
// Angular support
+ //
if (_options.analyzeAngular) {
- // try to resolve as an Angular entry point
+ // Try to resolve the HTML as an Angular entry point.
CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
if (identical(angularEntryState, CacheState.INVALID)) {
- if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
- return _createResolveHtmlTask(source, htmlEntry);
- }
- HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
- htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
- _cache.put(source, htmlCopy);
- return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false, null);
+ return _createResolveAngularEntryHtmlTask(source, htmlEntry);
}
- // try to resolve as an Angular application part
+ // Try to resolve the HTML as an Angular application part.
CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
if (identical(angularErrorsState, CacheState.INVALID)) {
- if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
- return _createResolveHtmlTask(source, htmlEntry);
- }
- AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
- // try to resolve as an Angular template
- AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
- HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
- htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
- _cache.put(source, htmlCopy);
- return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false, null);
+ return _createResolveAngularComponentTemplateTask(source, htmlEntry);
}
}
}
- return new AnalysisContextImpl_TaskData(null, false, null);
- }
-
- AnalysisContextImpl_TaskData _getNextNondependentAnalysisTask(Source source, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
- AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
- if (taskData.task != null || taskData.isBlocked) {
- return taskData;
- }
- while (taskData.dependentSource != null) {
- taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
- if (taskData.task != null || taskData.isBlocked) {
- return taskData;
- }
- }
- return new AnalysisContextImpl_TaskData(null, false, null);
+ return new AnalysisContextImpl_TaskData(null, false);
}
/**
@@ -6594,6 +6458,7 @@
throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
}
}
+ _removeFromParts(source, dartEntry);
DartEntryImpl dartCopy = dartEntry.writableCopy;
if (thrownException == null) {
if (task.hasPartOfDirective && !task.hasLibraryDirective) {
@@ -6605,8 +6470,21 @@
dartCopy.containingLibrary = source;
_workManager.add(source, SourcePriority.LIBRARY);
}
+ List<Source> newParts = task.includedSources;
+ for (int i = 0; i < newParts.length; i++) {
+ Source partSource = newParts[i];
+ DartEntry partEntry = _getReadableDartEntry(partSource);
+ if (partEntry != null && partEntry != dartEntry) {
+ DartEntryImpl partCopy = partEntry.writableCopy;
+ partCopy.addContainingLibrary(source);
+ _cache.put(partSource, partCopy);
+ }
+ }
dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors);
+ dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
+ dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
+ dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
_cache.storedAst(source);
ChangeNoticeImpl notice = _getNotice(source);
notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
@@ -6908,95 +6786,6 @@
}
/**
- * Record the results produced by performing a [ResolveDartDependenciesTask]. If the results
- * were computed from data that is now out-of-date, then the results will not be recorded.
- *
- * @param task the task that was performed
- * @return an entry containing the computed results
- * @throws AnalysisException if the results could not be recorded
- */
- DartEntry _recordResolveDartDependenciesTaskResults(ResolveDartDependenciesTask task) {
- Source source = task.source;
- AnalysisException thrownException = task.exception;
- DartEntry dartEntry = null;
- SourceEntry sourceEntry = _cache.get(source);
- if (sourceEntry == null) {
- throw new ObsoleteSourceAnalysisException(source);
- } else if (sourceEntry is! DartEntry) {
- // This shouldn't be possible because we should never have performed the task if the source
- // didn't represent a Dart file, but check to be safe.
- throw new AnalysisException.con1("Internal error: attempting to resolve Dart dependencies in a non-Dart file: ${source.fullName}");
- }
- dartEntry = sourceEntry as DartEntry;
- int sourceTime = getModificationStamp(source);
- int resultTime = task.modificationTime;
- if (sourceTime == resultTime) {
- if (dartEntry.modificationTime != sourceTime) {
- // The source has changed without the context being notified. Simulate notification.
- _sourceChanged(source);
- dartEntry = _getReadableDartEntry(source);
- if (dartEntry == null) {
- throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
- }
- }
- _removeFromParts(source, dartEntry);
- DartEntryImpl dartCopy = dartEntry.writableCopy;
- if (thrownException == null) {
- List<Source> newParts = task.includedSources;
- for (int i = 0; i < newParts.length; i++) {
- Source partSource = newParts[i];
- DartEntry partEntry = _getReadableDartEntry(partSource);
- if (partEntry != null && partEntry != dartEntry) {
- DartEntryImpl partCopy = partEntry.writableCopy;
- partCopy.addContainingLibrary(source);
- _cache.put(partSource, partCopy);
- }
- }
- dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
- dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
- dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
- dartCopy.setValue(DartEntry.DIRECTIVE_ERRORS, task.errors);
- } else {
- dartCopy.recordDependencyError();
- }
- dartCopy.exception = thrownException;
- _cache.put(source, dartCopy);
- dartEntry = dartCopy;
- } else {
- _logInformation2("Dependency resolution results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
- DartEntryImpl dartCopy = dartEntry.writableCopy;
- if (thrownException == null || resultTime >= 0) {
- //
- // The analysis was performed on out-of-date sources. Mark the cache so that the sources
- // will be re-analyzed using the up-to-date sources.
- //
- // dartCopy.recordDependencyNotInProcess();
- _removeFromParts(source, dartEntry);
- dartCopy.invalidateAllInformation();
- dartCopy.modificationTime = sourceTime;
- _cache.removedAst(source);
- _workManager.add(source, SourcePriority.UNKNOWN);
- } else {
- //
- // We could not determine whether the sources were up-to-date or out-of-date. Mark the
- // cache so that we won't attempt to re-analyze the sources until there's a good chance
- // that we'll be able to do so without error.
- //
- dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.ERROR);
- dartCopy.setState(DartEntry.IMPORTED_LIBRARIES, CacheState.ERROR);
- dartCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.ERROR);
- }
- dartCopy.exception = thrownException;
- _cache.put(source, dartCopy);
- dartEntry = dartCopy;
- }
- if (thrownException != null) {
- throw thrownException;
- }
- return dartEntry;
- }
-
- /**
* Record the results produced by performing a [ResolveDartUnitTask]. If the results were
* computed from data that is now out-of-date, then the results will not be recorded.
*
@@ -7479,9 +7268,6 @@
HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
@override
- DartEntry visitResolveDartDependenciesTask(ResolveDartDependenciesTask task) => AnalysisContextImpl_this._recordResolveDartDependenciesTaskResults(task);
-
- @override
DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
@override
@@ -7533,7 +7319,7 @@
/**
* The task that is to be performed.
*/
- final AnalysisTask task;
+ AnalysisTask task;
/**
* A flag indicating whether the associated source is blocked waiting for its contents to be
@@ -7542,20 +7328,14 @@
bool _blocked = false;
/**
- * The source that needs to be analyzed before further progress can be made on the associated
- * source.
- */
- final Source dependentSource;
-
- /**
* Initialize a newly created data holder.
*
* @param task the task that is to be performed
* @param blocked `true` if the associated source is blocked waiting for its contents to
* be loaded
- * @param dependentSource t
*/
- AnalysisContextImpl_TaskData(this.task, bool blocked, this.dependentSource) {
+ AnalysisContextImpl_TaskData(AnalysisTask task, bool blocked) {
+ this.task = task;
this._blocked = blocked;
}
@@ -7577,12 +7357,12 @@
/**
* The analysis errors associated with a source, or `null` if there are no errors.
*/
- final List<AnalysisError> errors;
+ List<AnalysisError> errors;
/**
* The line information associated with the errors, or `null` if there are no errors.
*/
- final LineInfo lineInfo;
+ LineInfo lineInfo;
/**
* Initialize an newly created error info with the errors and line information
@@ -7590,7 +7370,10 @@
* @param errors the errors as a result of analysis
* @param lineinfo the line info for the errors
*/
- AnalysisErrorInfoImpl(this.errors, this.lineInfo);
+ AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) {
+ this.errors = errors;
+ this.lineInfo = lineInfo;
+ }
}
/**
@@ -7686,7 +7469,7 @@
/**
* The source for which the result is being reported.
*/
- final Source source;
+ Source source;
/**
* The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
@@ -7721,7 +7504,9 @@
*
* @param source the source for which the change is being reported
*/
- ChangeNoticeImpl(this.source);
+ ChangeNoticeImpl(Source source) {
+ this.source = source;
+ }
@override
List<AnalysisError> get errors => _errors;
@@ -7930,15 +7715,6 @@
}
@override
- Namespace getPublicNamespace2(Source source) {
- if (source.isInSystemLibrary) {
- return _sdkAnalysisContext.getPublicNamespace2(source);
- } else {
- return super.getPublicNamespace2(source);
- }
- }
-
- @override
CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
if (unitSource.isInSystemLibrary) {
return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
@@ -8183,13 +7959,13 @@
return cache;
}
- final Source librarySource;
+ Source librarySource;
- final Source source;
+ Source source;
- final String oldContents;
+ String oldContents;
- final CompilationUnit resolvedUnit;
+ CompilationUnit resolvedUnit;
String _newContents;
@@ -8199,7 +7975,11 @@
int _newLength = 0;
- IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, this.oldContents, String newContents, int offset, int oldLength, int newLength) {
+ IncrementalAnalysisCache(Source librarySource, Source source, CompilationUnit resolvedUnit, String oldContents, String newContents, int offset, int oldLength, int newLength) {
+ this.librarySource = librarySource;
+ this.source = source;
+ this.resolvedUnit = resolvedUnit;
+ this.oldContents = oldContents;
this._newContents = newContents;
this._offset = offset;
this._oldLength = oldLength;
@@ -8679,9 +8459,6 @@
Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
@override
- Namespace getPublicNamespace2(Source source) => _basis.getPublicNamespace2(source);
-
- @override
List<Source> get refactoringUnsafeSources {
InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getRefactoringUnsafeSources");
_checkThread(instrumentation);
@@ -9027,16 +8804,6 @@
Namespace getPublicNamespace(LibraryElement library);
/**
- * Return a namespace containing mappings for all of the public names defined by the library
- * defined by the given source.
- *
- * @param source the source defining the library whose public namespace is to be returned
- * @return the public namespace corresponding to the library defined by the given source
- * @throws AnalysisException if the public namespace could not be computed
- */
- Namespace getPublicNamespace2(Source source);
-
- /**
* Returns a statistics about this context.
*/
AnalysisContentStatistics get statistics;
@@ -9298,12 +9065,28 @@
*/
class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
/**
+ * The source of the compilation unit.
+ */
+ Source _source;
+
+ /**
* Initialize a newly created holder to hold the given values.
*
* @param modificationTime the modification time of the source from which the AST was created
* @param unit the AST that was created from the source
*/
- ResolvableCompilationUnit(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+ ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+
+ /**
+ * Initialize a newly created holder to hold the given values.
+ *
+ * @param modificationTime the modification time of the source from which the AST was created
+ * @param unit the AST that was created from the source
+ * @param source the source of the compilation unit
+ */
+ ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, Source source) : super(modificationTime, unit) {
+ this._source = source;
+ }
/**
* Return the AST that was created from the source.
@@ -9311,6 +9094,13 @@
* @return the AST that was created from the source
*/
CompilationUnit get compilationUnit => data;
+
+ /**
+ * Return the source of the compilation unit.
+ *
+ * @return the source of the compilation unit
+ */
+ Source get source => _source;
}
/**
@@ -9337,7 +9127,7 @@
/**
* The enumerated type `Priority` defines the priority levels used to return sources in an
- * optimal order.
+ * optimal order. A smaller ordinal value equates to a higher priority.
*/
class SourcePriority extends Enum<SourcePriority> {
/**
@@ -9353,22 +9143,21 @@
static final SourcePriority LIBRARY = new SourcePriority('LIBRARY', 1);
/**
- * Used for a Dart source that is known to be a part but whose library has not yet been
- * resolved.
- */
- static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 2);
-
- /**
* Used for a Dart source whose kind is unknown.
*/
- static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 3);
+ static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 2);
+
+ /**
+ * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
+ */
+ static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 3);
/**
* Used for an HTML source.
*/
static final SourcePriority HTML = new SourcePriority('HTML', 4);
- static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, NORMAL_PART, UNKNOWN, HTML];
+ static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
SourcePriority(String name, int ordinal) : super(name, ordinal);
}
@@ -9381,12 +9170,12 @@
/**
* The modification time of the source from which the data was created.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The data that was created from the source.
*/
- final E data;
+ E data;
/**
* Initialize a newly created holder to hold the given values.
@@ -9394,7 +9183,10 @@
* @param modificationTime the modification time of the source from which the data was created
* @param unit the data that was created from the source
*/
- TimestampedData(this.modificationTime, this.data);
+ TimestampedData(int modificationTime, E data) {
+ this.modificationTime = modificationTime;
+ this.data = data;
+ }
}
/**
@@ -9420,14 +9212,14 @@
/**
* Record that the given source needs to be analyzed. The priority level is used to control when
- * the source will be analyzed with respect to other sources.
+ * the source will be analyzed with respect to other sources. If the source was previously added
+ * then it's priority is updated. If it was previously added with the same priority then it's
+ * position in the queue is unchanged.
*
* @param source the source that needs to be analyzed
* @param priority the priority level of the source
*/
void add(Source source, SourcePriority priority) {
- // TODO(brianwilkerson) Optimize the order of the libraries so that libraries that depend on
- // other libraries get analyzed after the other libraries.
int queueCount = _workQueues.length;
int ordinal = priority.ordinal;
for (int i = 0; i < queueCount; i++) {
@@ -9443,22 +9235,42 @@
}
/**
- * Return the next source for which some analysis work needs to be done.
+ * Record that the given source needs to be analyzed. The priority level is used to control when
+ * the source will be analyzed with respect to other sources. If the source was previously added
+ * then it's priority is updated. In either case, it will be analyzed before other sources of the
+ * same priority.
*
- * @return the next source for which some analysis work needs to be done
+ * @param source the source that needs to be analyzed
+ * @param priority the priority level of the source
*/
- Source get nextSource {
+ void addFirst(Source source, SourcePriority priority) {
int queueCount = _workQueues.length;
+ int ordinal = priority.ordinal;
for (int i = 0; i < queueCount; i++) {
List<Source> queue = _workQueues[i];
- if (!queue.isEmpty) {
- return queue[0];
+ if (i == ordinal) {
+ queue.remove(source);
+ queue.insert(0, source);
+ } else {
+ queue.remove(source);
}
}
- return null;
}
/**
+ * Return an iterator that can be used to access the sources to be analyzed in the order in which
+ * they should be analyzed.
+ *
+ * <b>Note:</b> As with other iterators, no sources can be added or removed from this work manager
+ * while the iterator is being used. Unlike some implementations, however, the iterator will not
+ * detect when this requirement has been violated; it might work correctly, it might return the
+ * wrong source, or it might throw an exception.
+ *
+ * @return an iterator that can be used to access the next source to be analyzed
+ */
+ WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
+
+ /**
* Record that the given source is fully analyzed.
*
* @param source the source that is fully analyzed
@@ -9472,20 +9284,85 @@
}
/**
+ * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
+ * work manager in the order in which they are to be analyzed.
+ */
+class WorkManager_WorkIterator {
+ final WorkManager WorkManager_this;
+
+ /**
+ * The index of the work queue through which we are currently iterating.
+ */
+ int _queueIndex = 0;
+
+ /**
+ * The index of the next element of the work queue to be returned.
+ */
+ int _index = -1;
+
+ /**
+ * Initialize a newly created iterator to be ready to return the first element in the iteration.
+ */
+ WorkManager_WorkIterator(this.WorkManager_this) {
+ _advance();
+ }
+
+ /**
+ * Return `true` if there is another [Source] available for processing.
+ *
+ * @return `true` if there is another [Source] available for processing
+ */
+ bool get hasNext => _queueIndex < WorkManager_this._workQueues.length;
+
+ /**
+ * Return the next [Source] available for processing and advance so that the returned
+ * source will not be returned again.
+ *
+ * @return the next [Source] available for processing
+ */
+ Source next() {
+ if (!hasNext) {
+ throw new NoSuchElementException();
+ }
+ Source source = WorkManager_this._workQueues[_queueIndex][_index];
+ _advance();
+ return source;
+ }
+
+ /**
+ * Increment the [index] and [queueIndex] so that they are either indicating the
+ * next source to be returned or are indicating that there are no more sources to be returned.
+ */
+ void _advance() {
+ _index++;
+ if (_index >= WorkManager_this._workQueues[_queueIndex].length) {
+ _index = 0;
+ _queueIndex++;
+ while (_queueIndex < WorkManager_this._workQueues.length && WorkManager_this._workQueues[_queueIndex].isEmpty) {
+ _queueIndex++;
+ }
+ }
+ }
+}
+
+/**
* An [Expression] with optional [AngularFilterNode]s.
*/
class AngularExpression {
/**
* The [Expression] to apply filters to.
*/
- final Expression expression;
+ Expression expression;
/**
* The filters to apply.
*/
- final List<AngularFilterNode> filters;
+ List<AngularFilterNode> filters;
- AngularExpression(this.expression, this.filters);
+ AngularExpression(Expression expression, List<AngularFilterNode> filters) {
+ this.expression = expression;
+ this.filters = filters;
+ }
/**
* Return the offset of the character immediately following the last character of this node's
@@ -9539,19 +9416,22 @@
/**
* The [TokenType#COLON] token.
*/
- final Token token;
+ Token token;
/**
* The argument expression.
*/
- final Expression expression;
+ Expression expression;
/**
* The optional sub-[Expression]s.
*/
List<Expression> subExpressions = Expression.EMPTY_ARRAY;
- AngularFilterArgument(this.token, this.expression);
+ AngularFilterArgument(Token token, Expression expression) {
+ this.token = token;
+ this.expression = expression;
+ }
}
/**
@@ -9561,19 +9441,23 @@
/**
* The [TokenType#BAR] token.
*/
- final Token token;
+ Token token;
/**
* The name of the filter.
*/
- final SimpleIdentifier name;
+ SimpleIdentifier name;
/**
* The arguments for this filter.
*/
- final List<AngularFilterArgument> arguments;
+ List<AngularFilterArgument> arguments;
- AngularFilterNode(this.token, this.name, this.arguments);
+ AngularFilterNode(Token token, SimpleIdentifier name, List<AngularFilterArgument> arguments) {
+ this.token = token;
+ this.name = name;
+ this.arguments = arguments;
+ }
}
/**
@@ -10379,9 +10263,11 @@
/**
* The expression that is enclosed between the delimiters.
*/
- final AngularExpression expression;
+ AngularExpression expression;
- AngularXmlExpression(this.expression);
+ AngularXmlExpression(AngularExpression expression) {
+ this.expression = expression;
+ }
@override
ht.XmlExpression_Reference getReference(int offset) {
@@ -10714,7 +10600,7 @@
/**
* The context in which the task is to be performed.
*/
- final InternalAnalysisContext context;
+ InternalAnalysisContext context;
/**
* The exception that was thrown while performing this task, or `null` if the task completed
@@ -10727,7 +10613,9 @@
*
* @param context the context in which the task is to be performed
*/
- AnalysisTask(this.context);
+ AnalysisTask(InternalAnalysisContext context) {
+ this.context = context;
+ }
/**
* Use the given visitor to visit this task.
@@ -10876,15 +10764,6 @@
E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
/**
- * Visit a [ResolveDartDependenciesTask].
- *
- * @param task the task to be visited
- * @return the result of visiting the task
- * @throws AnalysisException if the visitor throws an exception for some reason
- */
- E visitResolveDartDependenciesTask(ResolveDartDependenciesTask task);
-
- /**
* Visit a [ResolveDartLibraryTask].
*
* @param task the task to be visited
@@ -10929,12 +10808,12 @@
/**
* The source for which errors and warnings are to be produced.
*/
- final Source source;
+ Source source;
/**
* The element model for the library containing the source.
*/
- final LibraryElement libraryElement;
+ LibraryElement libraryElement;
/**
* The time at which the contents of the source were last modified.
@@ -10953,7 +10832,10 @@
* @param source the source for which errors and warnings are to be produced
* @param libraryElement the element model for the library containing the source
*/
- GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.libraryElement) : super(context);
+ GenerateDartErrorsTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+ this.source = source;
+ this.libraryElement = libraryElement;
+ }
@override
accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
@@ -11012,7 +10894,7 @@
/**
* The element model for the library being analyzed.
*/
- final LibraryElement libraryElement;
+ LibraryElement libraryElement;
/**
* A table mapping the sources that were analyzed to the hints that were generated for the
@@ -11026,7 +10908,9 @@
* @param context the context in which the task is to be performed
* @param libraryElement the element model for the library being analyzed
*/
- GenerateDartHintsTask(InternalAnalysisContext context, this.libraryElement) : super(context);
+ GenerateDartHintsTask(InternalAnalysisContext context, LibraryElement libraryElement) : super(context) {
+ this.libraryElement = libraryElement;
+ }
@override
accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
@@ -11112,7 +10996,7 @@
/**
* The source to be read.
*/
- final Source source;
+ Source source;
/**
* A flag indicating whether this task is complete.
@@ -11136,10 +11020,11 @@
* @param source the source to be parsed
* @param contentData the time-stamped contents of the source
*/
- GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
+ GetContentTask(InternalAnalysisContext context, Source source) : super(context) {
if (source == null) {
throw new IllegalArgumentException("Cannot get contents of null source");
}
+ this.source = source;
}
@override
@@ -11195,7 +11080,7 @@
/**
* The information used to perform incremental analysis.
*/
- final IncrementalAnalysisCache cache;
+ IncrementalAnalysisCache cache;
/**
* The compilation unit that was produced by incrementally updating the existing unit.
@@ -11208,7 +11093,9 @@
* @param context the context in which the task is to be performed
* @param cache the incremental analysis cache used to perform the analysis
*/
- IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
+ IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
+ this.cache = cache;
+ }
@override
accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
@@ -11287,12 +11174,12 @@
/**
* The source to be parsed.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The head of the token stream used for parsing.
@@ -11300,14 +11187,19 @@
Token _tokenStream;
/**
+ * The line information associated with the source.
+ */
+ LineInfo _lineInfo;
+
+ /**
* The compilation unit that was produced by parsing the source.
*/
CompilationUnit _unit;
/**
- * The errors that were produced by scanning and parsing the source.
+ * A flag indicating whether the source contains a 'library' directive.
*/
- List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+ bool _containsLibraryDirective = false;
/**
* A flag indicating whether the source contains a 'part of' directive.
@@ -11315,9 +11207,29 @@
bool _containsPartOfDirective = false;
/**
- * A flag indicating whether the source contains a 'library' directive.
+ * A set containing the sources referenced by 'export' directives.
*/
- bool _containsLibraryDirective = false;
+ Set<Source> _exportedSources = new Set<Source>();
+
+ /**
+ * A set containing the sources referenced by 'import' directives.
+ */
+ Set<Source> _importedSources = new Set<Source>();
+
+ /**
+ * A set containing the sources referenced by 'part' directives.
+ */
+ Set<Source> _includedSources = new Set<Source>();
+
+ /**
+ * The errors that were produced by scanning and parsing the source.
+ */
+ List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+ /**
+ * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
+ */
+ static String _DART_EXT_SCHEME = "dart-ext:";
/**
* Initialize a newly created task to perform analysis within the given context.
@@ -11326,9 +11238,13 @@
* @param source the source to be parsed
* @param modificationTime the time at which the contents of the source were last modified
* @param tokenStream the head of the token stream used for parsing
+ * @param lineInfo the line information associated with the source
*/
- ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, Token tokenStream) : super(context) {
+ ParseDartTask(InternalAnalysisContext context, Source source, int modificationTime, Token tokenStream, LineInfo lineInfo) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._tokenStream = tokenStream;
+ this._lineInfo = lineInfo;
}
@override
@@ -11351,6 +11267,30 @@
List<AnalysisError> get errors => _errors;
/**
+ * Return an array containing the sources referenced by 'export' directives, or an empty array if
+ * the task has not yet been performed or if an exception occurred.
+ *
+ * @return an array containing the sources referenced by 'export' directives
+ */
+ List<Source> get exportedSources => _toArray(_exportedSources);
+
+ /**
+ * Return an array containing the sources referenced by 'import' directives, or an empty array if
+ * the task has not yet been performed or if an exception occurred.
+ *
+ * @return an array containing the sources referenced by 'import' directives
+ */
+ List<Source> get importedSources => _toArray(_importedSources);
+
+ /**
+ * Return an array containing the sources referenced by 'part' directives, or an empty array if
+ * the task has not yet been performed or if an exception occurred.
+ *
+ * @return an array containing the sources referenced by 'part' directives
+ */
+ List<Source> get includedSources => _toArray(_includedSources);
+
+ /**
* Return `true` if the source contains a 'library' directive, or `false` if the task
* has not yet been performed or if an exception occurred.
*
@@ -11376,29 +11316,93 @@
@override
void internalPerform() {
- RecordingErrorListener errorListener = new RecordingErrorListener();
- InternalAnalysisContext context = this.context;
//
// Then parse the token stream.
//
TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
try {
+ RecordingErrorListener errorListener = new RecordingErrorListener();
Parser parser = new Parser(source, errorListener);
parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
_unit = parser.parseCompilationUnit(_tokenStream);
+ _unit.lineInfo = _lineInfo;
_errors = errorListener.getErrorsForSource(source);
for (Directive directive in _unit.directives) {
- if (directive is LibraryDirective) {
+ if (directive is ExportDirective) {
+ Source exportSource = _resolveSource(source, directive, errorListener);
+ if (exportSource != null) {
+ _exportedSources.add(exportSource);
+ }
+ } else if (directive is ImportDirective) {
+ Source importSource = _resolveSource(source, directive, errorListener);
+ if (importSource != null) {
+ _importedSources.add(importSource);
+ }
+ } else if (directive is LibraryDirective) {
_containsLibraryDirective = true;
+ } else if (directive is PartDirective) {
+ Source partSource = _resolveSource(source, directive, errorListener);
+ if (partSource != null) {
+ _includedSources.add(partSource);
+ }
} else if (directive is PartOfDirective) {
_containsPartOfDirective = true;
}
}
- _unit.lineInfo = context.getLineInfo(source);
} finally {
timeCounterParse.stop();
}
}
+
+ /**
+ * Return the result of resolving the URI of the given URI-based directive against the URI of the
+ * given library, or `null` if the URI is not valid.
+ *
+ * @param librarySource the source representing the library containing the directive
+ * @param directive the directive which URI should be resolved
+ * @param errorListener the error listener to which errors should be reported
+ * @return the result of resolving the URI against the URI of the library
+ */
+ Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+ StringLiteral uriLiteral = directive.uri;
+ if (uriLiteral is StringInterpolation) {
+ errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
+ return null;
+ }
+ String uriContent = uriLiteral.stringValue.trim();
+ directive.uriContent = uriContent;
+ if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+ return null;
+ }
+ try {
+ String encodedUriContent = Uri.encodeFull(uriContent);
+ parseUriWithException(encodedUriContent);
+ AnalysisContext analysisContext = context;
+ Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
+ if (!analysisContext.exists(source)) {
+ errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+ }
+ directive.source = source;
+ return source;
+ } on URISyntaxException catch (exception) {
+ errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+ }
+ return null;
+ }
+
+ /**
+ * Efficiently convert the given set of sources to an array.
+ *
+ * @param sources the set to be converted
+ * @return an array containing all of the sources in the given set
+ */
+ List<Source> _toArray(Set<Source> sources) {
+ int size = sources.length;
+ if (size == 0) {
+ return Source.EMPTY_ARRAY;
+ }
+ return new List.from(sources);
+ }
}
/**
@@ -11408,12 +11412,12 @@
/**
* The source to be parsed.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The contents of the source.
@@ -11458,7 +11462,9 @@
* @param modificationTime the time at which the contents of the source were last modified
* @param content the contents of the source
*/
- ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+ ParseHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._content = content;
}
@@ -11572,12 +11578,12 @@
/**
* The source to be resolved.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The HTML unit to be resolved.
@@ -11614,7 +11620,9 @@
* @param component the component that uses this HTML template, not `null`
* @param application the Angular application to resolve in context of
*/
- ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+ ResolveAngularComponentTemplateTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._unit = unit;
this._component = component;
this._application = application;
@@ -11665,12 +11673,12 @@
/**
* The source to be resolved.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The HTML unit to be resolved.
@@ -11705,7 +11713,9 @@
* @param modificationTime the time at which the contents of the source were last modified
* @param unit the HTML unit to be resolved
*/
- ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+ ResolveAngularEntryHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._unit = unit;
}
@@ -11769,198 +11779,18 @@
}
/**
- * Instances of the class `ResolveDartDependenciesTask` resolve the import, export, and part
- * directives in a single source.
- */
-class ResolveDartDependenciesTask extends AnalysisTask {
- /**
- * The source containing the directives to be resolved.
- */
- final Source source;
-
- /**
- * The time at which the contents of the source were last modified.
- */
- final int modificationTime;
-
- /**
- * The compilation unit used to resolve the dependencies.
- */
- CompilationUnit _unit;
-
- /**
- * A set containing the sources referenced by 'export' directives.
- */
- Set<Source> _exportedSources = new Set<Source>();
-
- /**
- * A set containing the sources referenced by 'import' directives.
- */
- Set<Source> _importedSources = new Set<Source>();
-
- /**
- * A set containing the sources referenced by 'part' directives.
- */
- Set<Source> _includedSources = new Set<Source>();
-
- /**
- * The errors that were produced by resolving the directives.
- */
- List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
- /**
- * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
- */
- static String _DART_EXT_SCHEME = "dart-ext:";
-
- /**
- * Initialize a newly created task to perform analysis within the given context.
- *
- * @param context the context in which the task is to be performed
- * @param source the source to be parsed
- * @param modificationTime the time at which the contents of the source were last modified
- * @param unit the compilation unit used to resolve the dependencies
- */
- ResolveDartDependenciesTask(InternalAnalysisContext context, this.source, this.modificationTime, CompilationUnit unit) : super(context) {
- this._unit = unit;
- }
-
- @override
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartDependenciesTask(this);
-
- /**
- * Return the errors that were produced by resolving the directives, or an empty array if the task
- * has not yet been performed or if an exception occurred.
- *
- * @return the errors that were produced by resolving the directives.
- */
- List<AnalysisError> get errors => _errors;
-
- /**
- * Return an array containing the sources referenced by 'export' directives, or an empty array if
- * the task has not yet been performed or if an exception occurred.
- *
- * @return an array containing the sources referenced by 'export' directives
- */
- List<Source> get exportedSources => _toArray(_exportedSources);
-
- /**
- * Return an array containing the sources referenced by 'import' directives, or an empty array if
- * the task has not yet been performed or if an exception occurred.
- *
- * @return an array containing the sources referenced by 'import' directives
- */
- List<Source> get importedSources => _toArray(_importedSources);
-
- /**
- * Return an array containing the sources referenced by 'part' directives, or an empty array if
- * the task has not yet been performed or if an exception occurred.
- *
- * @return an array containing the sources referenced by 'part' directives
- */
- List<Source> get includedSources => _toArray(_includedSources);
-
- @override
- String get taskDescription {
- if (source == null) {
- return "resolve dart dependencies null source";
- }
- return "resolve dart dependencies ${source.fullName}";
- }
-
- @override
- void internalPerform() {
- TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
- try {
- RecordingErrorListener errorListener = new RecordingErrorListener();
- for (Directive directive in _unit.directives) {
- if (directive is ExportDirective) {
- Source exportSource = _resolveSource(source, directive, errorListener);
- if (exportSource != null) {
- _exportedSources.add(exportSource);
- }
- } else if (directive is ImportDirective) {
- Source importSource = _resolveSource(source, directive, errorListener);
- if (importSource != null) {
- _importedSources.add(importSource);
- }
- } else if (directive is PartDirective) {
- Source partSource = _resolveSource(source, directive, errorListener);
- if (partSource != null) {
- _includedSources.add(partSource);
- }
- }
- }
- _errors = errorListener.errors;
- } finally {
- timeCounterParse.stop();
- }
- }
-
- /**
- * Return the result of resolving the URI of the given URI-based directive against the URI of the
- * given library, or `null` if the URI is not valid.
- *
- * @param librarySource the source representing the library containing the directive
- * @param directive the directive which URI should be resolved
- * @param errorListener the error listener to which errors should be reported
- * @return the result of resolving the URI against the URI of the library
- */
- Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
- StringLiteral uriLiteral = directive.uri;
- if (uriLiteral is StringInterpolation) {
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
- return null;
- }
- String uriContent = uriLiteral.stringValue.trim();
- directive.uriContent = uriContent;
- if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
- return null;
- }
- try {
- String encodedUriContent = Uri.encodeFull(uriContent);
- parseUriWithException(encodedUriContent);
- AnalysisContext analysisContext = context;
- Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
- if (!analysisContext.exists(source)) {
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
- }
- directive.source = source;
- return source;
- } on URISyntaxException catch (exception) {
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
- }
- return null;
- }
-
- /**
- * Efficiently convert the given set of sources to an array.
- *
- * @param sources the set to be converted
- * @return an array containing all of the sources in the given set
- */
- List<Source> _toArray(Set<Source> sources) {
- int size = sources.length;
- if (size == 0) {
- return Source.EMPTY_ARRAY;
- }
- return new List.from(sources);
- }
-}
-
-/**
- * Instances of the class `ResolveDartLibraryTask` parse a specific Dart library.
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
*/
class ResolveDartLibraryTask extends AnalysisTask {
/**
* The source representing the file whose compilation unit is to be returned.
*/
- final Source unitSource;
+ Source unitSource;
/**
* The source representing the library to be resolved.
*/
- final Source librarySource;
+ Source librarySource;
/**
* The library resolver holding information about the libraries that were resolved.
@@ -11974,7 +11804,10 @@
* @param unitSource the source representing the file whose compilation unit is to be returned
* @param librarySource the source representing the library to be resolved
*/
- ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context);
+ ResolveDartLibraryTask(InternalAnalysisContext context, Source unitSource, Source librarySource) : super(context) {
+ this.unitSource = unitSource;
+ this.librarySource = librarySource;
+ }
@override
accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
@@ -12009,7 +11842,7 @@
/**
* The source that is to be resolved.
*/
- final Source source;
+ Source source;
/**
* The element model for the library containing the source.
@@ -12033,7 +11866,8 @@
* @param source the source to be parsed
* @param libraryElement the element model for the library containing the source
*/
- ResolveDartUnitTask(InternalAnalysisContext context, this.source, LibraryElement libraryElement) : super(context) {
+ ResolveDartUnitTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+ this.source = source;
this._libraryElement = libraryElement;
}
@@ -12151,12 +11985,12 @@
/**
* The source to be resolved.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The HTML unit to be resolved.
@@ -12186,7 +12020,9 @@
* @param modificationTime the time at which the contents of the source were last modified
* @param unit the HTML unit to be resolved
*/
- ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+ ResolveHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._unit = unit;
}
@@ -12238,12 +12074,12 @@
/**
* The source to be scanned.
*/
- final Source source;
+ Source source;
/**
* The time at which the contents of the source were last modified.
*/
- final int modificationTime;
+ int modificationTime = 0;
/**
* The contents of the source.
@@ -12273,7 +12109,9 @@
* @param modificationTime the time at which the contents of the source were last modified
* @param content the contents of the source
*/
- ScanDartTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+ ScanDartTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+ this.source = source;
+ this.modificationTime = modificationTime;
this._content = content;
}
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 3dc1b49..062dd0f 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -45,12 +45,12 @@
/**
* The name of the severity used when producing machine output.
*/
- final String machineCode;
+ String machineCode;
/**
* The name of the severity used when producing readable output.
*/
- final String displayName;
+ String displayName;
/**
* Initialize a newly created severity with the given names.
@@ -58,7 +58,10 @@
* @param machineCode the name of the severity used when producing machine output
* @param displayName the name of the severity used when producing readable output
*/
- ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
+ ErrorSeverity(String name, int ordinal, String machineCode, String displayName) : super(name, ordinal) {
+ this.machineCode = machineCode;
+ this.displayName = displayName;
+ }
/**
* Return the severity constant that represents the greatest severity.
@@ -376,7 +379,7 @@
/**
* The error code associated with the error.
*/
- final ErrorCode errorCode;
+ ErrorCode errorCode;
/**
* The localized error message.
@@ -419,7 +422,9 @@
* @param errorCode the error code to be associated with this error
* @param arguments the arguments used to build the error message
*/
- AnalysisError.con1(this.source, this.errorCode, List<Object> arguments) {
+ AnalysisError.con1(Source source, ErrorCode errorCode, List<Object> arguments) {
+ this.source = source;
+ this.errorCode = errorCode;
this._message = JavaString.format(errorCode.message, arguments);
}
@@ -432,9 +437,11 @@
* @param errorCode the error code to be associated with this error
* @param arguments the arguments used to build the error message
*/
- AnalysisError.con2(this.source, int offset, int length, this.errorCode, List<Object> arguments) {
+ AnalysisError.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+ this.source = source;
this._offset = offset;
this._length = length;
+ this.errorCode = errorCode;
this._message = JavaString.format(errorCode.message, arguments);
String correctionTemplate = errorCode.correction;
if (correctionTemplate != null) {
@@ -813,7 +820,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -826,7 +833,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- HintCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ HintCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -834,7 +843,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- HintCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ HintCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction3 = correction;
}
@@ -951,14 +961,16 @@
/**
* The severity of this type of error.
*/
- final ErrorSeverity severity;
+ ErrorSeverity severity;
/**
* Initialize a newly created error type to have the given severity.
*
* @param severity the severity of this type of error
*/
- ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
+ ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
+ this.severity = severity;
+ }
String get displayName => name.toLowerCase().replaceAll('_', ' ');
}
@@ -2274,7 +2286,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -2287,7 +2299,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- CompileTimeErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ CompileTimeErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -2295,7 +2309,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- CompileTimeErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ CompileTimeErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction2 = correction;
}
@@ -2347,7 +2362,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -2360,7 +2375,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- PubSuggestionCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ PubSuggestionCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -2368,7 +2385,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- PubSuggestionCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ PubSuggestionCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction5 = correction;
}
@@ -3234,7 +3252,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -3247,7 +3265,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- StaticWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ StaticWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -3255,7 +3275,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- StaticWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ StaticWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction7 = correction;
}
@@ -3321,7 +3342,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -3334,7 +3355,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- HtmlWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ HtmlWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -3342,7 +3365,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- HtmlWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ HtmlWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction4 = correction;
}
@@ -3649,7 +3673,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -3662,7 +3686,9 @@
*
* @param message the message template used to create the message to be displayed for the error
*/
- StaticTypeWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ StaticTypeWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -3670,7 +3696,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- StaticTypeWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ StaticTypeWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction6 = correction;
}
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 534083b..12d0e2e 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -144,9 +144,11 @@
* characters.
*/
class RawXmlExpression extends XmlExpression {
- final Expression expression;
+ Expression expression;
- RawXmlExpression(this.expression);
+ RawXmlExpression(Expression expression) {
+ this.expression = expression;
+ }
@override
int get end => expression.end;
@@ -682,7 +684,7 @@
/**
* The source being scanned.
*/
- final Source source;
+ Source source;
/**
* The token pointing to the head of the linked list of tokens.
@@ -709,7 +711,8 @@
*
* @param source the source being scanned
*/
- AbstractScanner(this.source) {
+ AbstractScanner(Source source) {
+ this.source = source;
_tokens = new Token.con1(TokenType.EOF, -1);
_tokens.setNext(_tokens);
_tail = _tokens;
@@ -1183,9 +1186,11 @@
* The lexeme that defines this type of token, or `null` if there is more than one possible
* lexeme for this type of token.
*/
- final String lexeme;
+ String lexeme;
- TokenType(String name, int ordinal, this.lexeme) : super(name, ordinal);
+ TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
+ this.lexeme = lexeme;
+ }
}
class TokenType_EOF extends TokenType {
@@ -1201,7 +1206,7 @@
class XmlAttributeNode extends XmlNode {
Token _name;
- final Token equals;
+ Token equals;
Token _value;
@@ -1215,8 +1220,9 @@
* @param equals the equals sign or `null` if none
* @param value the value token (not `null`)
*/
- XmlAttributeNode(Token name, this.equals, Token value) {
+ XmlAttributeNode(Token name, Token equals, Token value) {
this._name = name;
+ this.equals = equals;
this._value = value;
}
@@ -1368,7 +1374,7 @@
/**
* The source being parsed.
*/
- final Source source;
+ Source source;
/**
* The next token to be parsed.
@@ -1380,7 +1386,9 @@
*
* @param source the source being parsed
*/
- XmlParser(this.source);
+ XmlParser(Source source) {
+ this.source = source;
+ }
/**
* Create a node representing an attribute.
@@ -1636,7 +1644,7 @@
/**
* The starting [TokenType#LT] token (not `null`).
*/
- final Token nodeStart;
+ Token nodeStart;
/**
* The [TokenType#TAG] token after the starting '<' (not `null`).
@@ -1653,7 +1661,7 @@
* `null`). The token may be the same token as [nodeEnd] if there are no child
* [tagNodes].
*/
- final Token attributeEnd;
+ Token attributeEnd;
/**
* The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1669,18 +1677,18 @@
* the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
* content and the attributes ended with [TokenType#SLASH_GT].
*/
- final Token contentEnd;
+ Token contentEnd;
/**
* The closing [TokenType#TAG] after the child elements or `null` if there is no
* content and the attributes ended with [TokenType#SLASH_GT]
*/
- final Token closingTag;
+ Token closingTag;
/**
* The ending [TokenType#GT] or [TokenType#SLASH_GT] token (not `null`).
*/
- final Token nodeEnd;
+ Token nodeEnd;
/**
* The expressions that are embedded in the tag's content.
@@ -1711,10 +1719,15 @@
* @param nodeEnd the ending [TokenType#GT] or [TokenType#SLASH_GT] token (not
* `null`)
*/
- XmlTagNode(this.nodeStart, Token tag, List<XmlAttributeNode> attributes, this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd, this.closingTag, this.nodeEnd) {
+ XmlTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
+ this.nodeStart = nodeStart;
this._tag = tag;
this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
+ this.attributeEnd = attributeEnd;
this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
+ this.contentEnd = contentEnd;
+ this.closingTag = closingTag;
+ this.nodeEnd = nodeEnd;
}
@override
@@ -1978,13 +1991,13 @@
/**
* The first token in the token stream that was parsed to form this HTML unit.
*/
- final Token beginToken;
+ Token beginToken;
/**
* The last token in the token stream that was parsed to form this compilation unit. This token
* should always have a type of [TokenType.EOF].
*/
- final Token endToken;
+ Token endToken;
/**
* The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1999,8 +2012,10 @@
* @param endToken the last token in the token stream which should be of type
* [TokenType.EOF]
*/
- HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
+ HtmlUnit(Token beginToken, List<XmlTagNode> tagNodes, Token endToken) {
+ this.beginToken = beginToken;
this._tagNodes = becomeParentOfAll(tagNodes);
+ this.endToken = endToken;
}
@override
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index faeac7a..7d60cd8 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -36,7 +36,7 @@
/**
* The source being removed.
*/
- final Source source;
+ Source source;
/**
* Initialize a newly created operation that will remove the specified resource.
@@ -45,9 +45,10 @@
* @param context the [AnalysisContext] to remove source in
* @param source the [Source] to remove from index
*/
- RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, this.source) {
+ RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, Source source) {
this._indexStore = indexStore;
this._context = context;
+ this.source = source;
}
@override
@@ -610,7 +611,7 @@
/**
* The compilation unit being indexed.
*/
- final CompilationUnit unit;
+ CompilationUnit unit;
/**
* The element of the compilation unit being indexed.
@@ -629,9 +630,10 @@
* @param context the context in which compilation unit was resolved
* @param unit the fully resolved AST structure
*/
- IndexUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+ IndexUnitOperation(IndexStore indexStore, AnalysisContext context, CompilationUnit unit) {
this._indexStore = indexStore;
this._context = context;
+ this.unit = unit;
this._unitElement = unit.element;
this._source = _unitElement.source;
}
@@ -781,7 +783,7 @@
/**
* The source container to remove.
*/
- final SourceContainer container;
+ SourceContainer container;
/**
* Initialize a newly created operation that will remove the specified resource.
@@ -790,9 +792,10 @@
* @param context the [AnalysisContext] to remove container in
* @param container the [SourceContainer] to remove from index
*/
- RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, this.container) {
+ RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, SourceContainer container) {
this._indexStore = indexStore;
this._context = context;
+ this.container = container;
}
@override
@@ -2272,7 +2275,7 @@
/**
* The context being removed.
*/
- final AnalysisContext context;
+ AnalysisContext context;
/**
* Initialize a newly created operation that will remove the specified resource.
@@ -2280,8 +2283,9 @@
* @param indexStore the index store against which this operation is being run
* @param context the [AnalysisContext] to remove
*/
- RemoveContextOperation(IndexStore indexStore, this.context) {
+ RemoveContextOperation(IndexStore indexStore, AnalysisContext context) {
this._indexStore = indexStore;
+ this.context = context;
}
@override
@@ -2317,7 +2321,7 @@
/**
* The [HtmlUnit] being indexed.
*/
- final ht.HtmlUnit unit;
+ ht.HtmlUnit unit;
/**
* The element of the [HtmlUnit] being indexed.
@@ -2336,9 +2340,10 @@
* @param context the context in which [HtmlUnit] was resolved
* @param unit the fully resolved [HtmlUnit]
*/
- IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+ IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, ht.HtmlUnit unit) {
this._indexStore = indexStore;
this._context = context;
+ this.unit = unit;
this._htmlElement = unit.element;
this._source = _htmlElement.source;
}
@@ -2386,17 +2391,17 @@
/**
* The element containing this location.
*/
- final Element element;
+ Element element;
/**
* The offset of this location within the resource containing the element.
*/
- final int offset;
+ int offset = 0;
/**
* The length of this location.
*/
- final int length;
+ int length = 0;
/**
* Internal field used to hold a key that is referenced at this location.
@@ -2411,10 +2416,13 @@
* @param offset the offset of this location within the resource containing the element
* @param length the length of this location
*/
- Location(this.element, this.offset, this.length) {
+ Location(Element element, int offset, int length) {
if (element == null) {
throw new IllegalArgumentException("element location cannot be null");
}
+ this.element = element;
+ this.offset = offset;
+ this.length = length;
}
/**
@@ -2440,18 +2448,21 @@
class GetRelationshipsOperation implements IndexOperation {
IndexStore _indexStore;
- final Element element;
+ Element element;
- final Relationship relationship;
+ Relationship relationship;
- final RelationshipCallback callback;
+ RelationshipCallback callback;
/**
* Initialize a newly created operation that will access the locations that have a specified
* relationship with a specified element.
*/
- GetRelationshipsOperation(IndexStore indexStore, this.element, this.relationship, this.callback) {
+ GetRelationshipsOperation(IndexStore indexStore, Element element, Relationship relationship, RelationshipCallback callback) {
this._indexStore = indexStore;
+ this.element = element;
+ this.relationship = relationship;
+ this.callback = callback;
}
@override
@@ -2475,11 +2486,15 @@
* [Location] with attached data.
*/
class LocationWithData<D> extends Location {
- final D data;
+ D data;
- LocationWithData.con1(Location location, this.data) : super(location.element, location.offset, location.length);
+ LocationWithData.con1(Location location, D data) : super(location.element, location.offset, location.length) {
+ this.data = data;
+ }
- LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
+ LocationWithData.con2(Element element, int offset, int length, D data) : super(element, offset, length) {
+ this.data = data;
+ }
@override
Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 4c47b62..a6282eb 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -260,6 +260,10 @@
String toString() => "UnsupportedOperationException";
}
+class NoSuchElementException extends JavaException {
+ String toString() => "NoSuchElementException";
+}
+
class NumberFormatException extends JavaException {
String toString() => "NumberFormatException";
}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index dd2d982..16a7bc1 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -26,12 +26,12 @@
/**
* The documentation comment that was parsed, or `null` if none was given.
*/
- final Comment comment;
+ Comment comment;
/**
* The metadata that was parsed.
*/
- final List<Annotation> metadata;
+ List<Annotation> metadata;
/**
* Initialize a newly created holder with the given data.
@@ -39,7 +39,10 @@
* @param comment the documentation comment that was parsed
* @param metadata the metadata that was parsed
*/
- CommentAndMetadata(this.comment, this.metadata);
+ CommentAndMetadata(Comment comment, List<Annotation> metadata) {
+ this.comment = comment;
+ this.metadata = metadata;
+ }
}
/**
@@ -50,12 +53,12 @@
/**
* The 'final', 'const' or 'var' keyword, or `null` if none was given.
*/
- final Token keyword;
+ Token keyword;
/**
* The type, of `null` if no type was specified.
*/
- final TypeName type;
+ TypeName type;
/**
* Initialize a newly created holder with the given data.
@@ -63,7 +66,10 @@
* @param keyword the 'final', 'const' or 'var' keyword
* @param type the type
*/
- FinalConstVarOrType(this.keyword, this.type);
+ FinalConstVarOrType(Token keyword, TypeName type) {
+ this.keyword = keyword;
+ this.type = type;
+ }
}
/**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6137bf0..9ec0164 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -7671,14 +7671,16 @@
/**
* The name of the synthetic identifier.
*/
- final String name;
+ String name;
/**
* Initialize a newly created synthetic identifier to have the given name.
*
* @param name the name of the synthetic identifier
*/
- ElementResolver_SyntheticIdentifier(this.name);
+ ElementResolver_SyntheticIdentifier(String name) {
+ this.name = name;
+ }
@override
accept(AstVisitor visitor) => null;
@@ -8731,7 +8733,7 @@
/**
* The source specifying the defining compilation unit of this library.
*/
- final Source librarySource;
+ Source librarySource;
/**
* The library element representing this library.
@@ -8786,9 +8788,10 @@
* @param errorListener the listener to which analysis errors will be reported
* @param librarySource the source specifying the defining compilation unit of this library
*/
- Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, this.librarySource) {
+ Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, Source librarySource) {
this._analysisContext = analysisContext;
this._errorListener = errorListener;
+ this.librarySource = librarySource;
this._libraryElement = analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
}
@@ -8978,7 +8981,7 @@
* @param unit the AST structure associated with the defining compilation unit for this library
*/
void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) {
- _astMap[librarySource] = new ResolvableCompilationUnit(modificationStamp, unit);
+ _astMap[librarySource] = new ResolvableCompilationUnit.con1(modificationStamp, unit);
}
/**
@@ -9223,7 +9226,7 @@
/**
* The analysis context in which the libraries are being analyzed.
*/
- final InternalAnalysisContext analysisContext;
+ InternalAnalysisContext analysisContext;
/**
* The listener to which analysis errors will be reported, this error listener is either
@@ -9262,7 +9265,8 @@
*
* @param analysisContext the analysis context in which the library is being analyzed
*/
- LibraryResolver(this.analysisContext) {
+ LibraryResolver(InternalAnalysisContext analysisContext) {
+ this.analysisContext = analysisContext;
this._errorListener = new RecordingErrorListener();
_coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
}
@@ -10126,7 +10130,7 @@
/**
* The conditional analysis error.
*/
- final AnalysisError analysisError;
+ AnalysisError analysisError;
/**
* Instantiate a new [ProxyConditionalAnalysisError] with some enclosing element and the
@@ -10135,8 +10139,9 @@
* @param enclosingElement the enclosing element
* @param analysisError the conditional analysis error
*/
- ProxyConditionalAnalysisError(Element enclosingElement, this.analysisError) {
+ ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysisError) {
this._enclosingElement = enclosingElement;
+ this.analysisError = analysisError;
}
/**
@@ -11471,7 +11476,7 @@
/**
* The source representing the compilation unit being visited.
*/
- final Source source;
+ Source source;
/**
* The error listener that will be informed of any errors that are found during resolution.
@@ -11486,7 +11491,7 @@
/**
* The object used to access the types from the core library.
*/
- final TypeProvider typeProvider;
+ TypeProvider typeProvider;
/**
* The scope used to resolve labels for `break` and `continue` statements, or
@@ -11501,11 +11506,13 @@
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
*/
- ScopedVisitor.con1(Library library, this.source, this.typeProvider) {
+ ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider) {
this._definingLibrary = library.libraryElement;
+ this.source = source;
LibraryScope libraryScope = library.libraryScope;
this._errorListener = libraryScope.errorListener;
this._nameScope = libraryScope;
+ this.typeProvider = typeProvider;
}
/**
@@ -11518,10 +11525,12 @@
* @param errorListener the error listener that will be informed of any errors that are found
* during resolution
*/
- ScopedVisitor.con2(LibraryElement definingLibrary, this.source, this.typeProvider, AnalysisErrorListener errorListener) {
+ ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
this._definingLibrary = definingLibrary;
+ this.source = source;
this._errorListener = errorListener;
this._nameScope = new LibraryScope(definingLibrary, errorListener);
+ this.typeProvider = typeProvider;
}
/**
@@ -11535,10 +11544,12 @@
* @param errorListener the error listener that will be informed of any errors that are found
* during resolution
*/
- ScopedVisitor.con3(LibraryElement definingLibrary, this.source, this.typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
+ ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
this._definingLibrary = definingLibrary;
+ this.source = source;
this._errorListener = errorListener;
this._nameScope = nameScope;
+ this.typeProvider = typeProvider;
}
/**
@@ -15783,7 +15794,7 @@
/**
* The scope in which this scope is lexically enclosed.
*/
- final Scope enclosingScope;
+ Scope enclosingScope;
/**
* A table mapping names that will be defined in this scope, but right now are not initialized.
@@ -15802,7 +15813,9 @@
*
* @param enclosingScope the scope in which this scope is lexically enclosed
*/
- EnclosedScope(this.enclosingScope);
+ EnclosedScope(Scope enclosingScope) {
+ this.enclosingScope = enclosingScope;
+ }
@override
AnalysisErrorListener get errorListener => enclosingScope.errorListener;
@@ -16017,7 +16030,7 @@
/**
* The listener that is to be informed when an error is encountered.
*/
- final AnalysisErrorListener errorListener;
+ AnalysisErrorListener errorListener;
/**
* A list of the namespaces representing the names that are available in this scope from imported
@@ -16032,8 +16045,9 @@
* this scope
* @param errorListener the listener that is to be informed when an error is encountered
*/
- LibraryImportScope(LibraryElement definingLibrary, this.errorListener) {
+ LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
this._definingLibrary = definingLibrary;
+ this.errorListener = errorListener;
_createImportedNamespaces(definingLibrary);
}
@@ -20712,8 +20726,6 @@
if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
continue;
}
- // Reference the type of the enclosing class
- InterfaceType enclosingType = _enclosingClass.type;
// Check to see if some element is in local enclosing class that matches the name of the
// required member.
if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
@@ -20724,9 +20736,16 @@
}
// First check to see if this element was declared in the superclass chain, in which case
// there is already a concrete implementation.
- ExecutableElement elt = membersInheritedFromSuperclasses.get(executableElt.name);
+ ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
// Check to see if an element was found in the superclass chain with the correct name.
if (elt != null) {
+ // Reference the types, if any are null then continue.
+ InterfaceType enclosingType = _enclosingClass.type;
+ FunctionType concreteType = elt.type;
+ FunctionType requiredMemberType = executableElt.type;
+ if (enclosingType == null || concreteType == null || requiredMemberType == null) {
+ continue;
+ }
// Some element was found in the superclass chain that matches the name of the required
// member.
// If it is not abstract and it is the correct one (types match- the version of this method
@@ -20735,8 +20754,8 @@
if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
// Since we are comparing two function types, we need to do the appropriate type
// substitutions first ().
- FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(elt.type, executableElt.name, enclosingType);
- FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(executableElt.type, executableElt.name, enclosingType);
+ FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
+ FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
continue;
}
@@ -22100,12 +22119,12 @@
/**
* The type of this error.
*/
- final ErrorType type;
+ ErrorType type;
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -22119,7 +22138,10 @@
* @param type the type of this error
* @param message the message template used to create the message to be displayed for the error
*/
- ResolverErrorCode.con1(String name, int ordinal, this.type, this.message) : super(name, ordinal);
+ ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : super(name, ordinal) {
+ this.type = type;
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given type, message and correction.
@@ -22128,7 +22150,9 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, String correction) : super(name, ordinal) {
+ ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String message, String correction) : super(name, ordinal) {
+ this.type = type;
+ this.message = message;
this.correction9 = correction;
}
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index efb01ff..ef03a42 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -163,7 +163,7 @@
/**
* The template used to create the message to be displayed for this error.
*/
- final String message;
+ String message;
/**
* The template used to create the correction to be displayed for this error, or `null` if
@@ -176,7 +176,9 @@
*
* @param message the message template used to create the message to be displayed for this error
*/
- ScannerErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+ ScannerErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+ this.message = message;
+ }
/**
* Initialize a newly created error code to have the given message and correction.
@@ -184,7 +186,8 @@
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
- ScannerErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+ ScannerErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+ this.message = message;
this.correction10 = correction;
}
@@ -795,7 +798,7 @@
/**
* The source being scanned.
*/
- final Source source;
+ Source source;
/**
* The reader used to access the characters in the source.
@@ -865,7 +868,8 @@
* @param reader the character reader used to read the characters in the source
* @param errorListener the error listener that will be informed of any errors that are found
*/
- Scanner(this.source, CharacterReader reader, AnalysisErrorListener errorListener) {
+ Scanner(Source source, CharacterReader reader, AnalysisErrorListener errorListener) {
+ this.source = source;
this._reader = reader;
this._errorListener = errorListener;
_tokens = new Token(TokenType.EOF, -1);
@@ -1927,7 +1931,7 @@
/**
* The type of the token.
*/
- final TokenType type;
+ TokenType type;
/**
* The offset from the beginning of the file to the first character in the token.
@@ -1950,7 +1954,8 @@
* @param type the type of the token
* @param offset the offset from the beginning of the file to the first character in the token
*/
- Token(this.type, int offset) {
+ Token(TokenType type, int offset) {
+ this.type = type;
this.offset = offset;
}
@@ -2198,7 +2203,7 @@
/**
* The keyword being represented by this token.
*/
- final Keyword keyword;
+ Keyword keyword;
/**
* Initialize a newly created token to represent the given keyword.
@@ -2206,7 +2211,9 @@
* @param keyword the keyword being represented by this token
* @param offset the offset from the beginning of the file to the first character in the token
*/
- KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+ KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
+ this.keyword = keyword;
+ }
@override
Token copy() => new KeywordToken(keyword, offset);
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 288677b..446c8ea 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -496,14 +496,16 @@
/**
* The single character encoding used to identify this kind of URI.
*/
- final int encoding;
+ int encoding = 0;
/**
* Initialize a newly created URI kind to have the given encoding.
*
* @param encoding the single character encoding used to identify this kind of URI.
*/
- UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
+ UriKind(String name, int ordinal, int encoding) : super(name, ordinal) {
+ this.encoding = encoding;
+ }
}
/**
@@ -519,13 +521,13 @@
* The 0-based index of the first character of the source code for this element, relative to the
* source buffer in which this element is contained.
*/
- final int offset;
+ int offset = 0;
/**
* The number of characters of the source code for this element, relative to the source buffer in
* which this element is contained.
*/
- final int length;
+ int length = 0;
/**
* Initialize a newly created source range using the given offset and the given length.
@@ -533,7 +535,10 @@
* @param offset the given offset
* @param length the given length
*/
- SourceRange(this.offset, this.length);
+ SourceRange(int offset, int length) {
+ this.offset = offset;
+ this.length = length;
+ }
/**
* @return `true` if <code>x</code> is in [offset, offset + length) interval.
@@ -753,12 +758,12 @@
/**
* The one-based index of the line containing the character.
*/
- final int lineNumber;
+ int lineNumber = 0;
/**
* The one-based index of the column containing the character.
*/
- final int columnNumber;
+ int columnNumber = 0;
/**
* Initialize a newly created location to represent the location of the character at the given
@@ -767,7 +772,10 @@
* @param lineNumber the one-based index of the line containing the character
* @param columnNumber the one-based index of the column containing the character
*/
- LineInfo_Location(this.lineNumber, this.columnNumber);
+ LineInfo_Location(int lineNumber, int columnNumber) {
+ this.lineNumber = lineNumber;
+ this.columnNumber = columnNumber;
+ }
}
/**
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index aef7473..a9bddb5 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -26,12 +26,14 @@
/**
* A flag indicating whether this is an optional parameter.
*/
- final bool isOptional;
+ bool isOptional = false;
/**
* Initialize a newly created kind with the given state.
*
* @param isOptional `true` if this is an optional parameter
*/
- ParameterKind(String name, int ordinal, this.isOptional) : super(name, ordinal);
+ ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
+ this.isOptional = isOptional;
+ }
}
\ No newline at end of file
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 9b33aa2..f5d2ae8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
name: analyzer
-version: 0.13.0-dev.7
+version: 0.13.0-dev.9
author: Dart Team <misc@dartlang.org>
description: Static analyzer for Dart.
homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index d49726d..7315085 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -23527,9 +23527,11 @@
/**
* The listener that is to be informed when an error is encountered.
*/
- final AnalysisErrorListener errorListener;
+ AnalysisErrorListener errorListener;
- ScopeTest_TestScope(this.errorListener);
+ ScopeTest_TestScope(AnalysisErrorListener errorListener) {
+ this.errorListener = errorListener;
+ }
@override
Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index c355a35..753e5a1 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -4,6 +4,9 @@
default. When using Barback with pub in verbose mode, these messages will be
printed.
+* Add a `Transform.hasInput` function that returns whether or not a given
+ secondary input exists.
+
* `Transformer.allowedExtensions` now supports extensions containing multiple
periods, such as `.dart.js`.
@@ -22,3 +25,8 @@
considered to have failed after it finishes running `apply()`. This means that
its outputs will not be consumed by future transformers and its primary input
will not be passed through to the next phase.
+
+* If a transform calls `Transform.getInput`, `Transform.readInput`,
+ `Transform.readInputAsString`, or `Transform.hasInput` on an input that
+ doesn't exist, the transform will be re-run if that input is created in the
+ future.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index b87ca39..74db0d9 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -48,8 +48,17 @@
/// one.
final _loadingSources = new Map<AssetId, CancelableFuture<Asset>>();
+ /// The list of phases in this cascade.
+ ///
+ /// This will always contain at least one phase, and the first phase will
+ /// never have any transformers. This ensures that every transformer can
+ /// request inputs from a previous phase.
final _phases = <Phase>[];
+ /// The subscription to the [Phase.onDone] stream of the last [Phase] in
+ /// [_phases].
+ StreamSubscription _phaseOnDoneSubscription;
+
/// A stream that emits any errors from the cascade or the transformers.
///
/// This emits errors as they're detected. If an error occurs in one part of
@@ -169,9 +178,12 @@
void updateTransformers(Iterable<Iterable> transformersIterable) {
var transformers = transformersIterable.toList();
+ // Always preserve a single phase with no transformers at the beginning of
+ // the cascade so that [TransformNode]s in the first populated phase will
+ // have something to request assets from.
for (var i = 0; i < transformers.length; i++) {
- if (_phases.length > i) {
- _phases[i].updateTransformers(transformers[i]);
+ if (_phases.length > i + 1) {
+ _phases[i + 1].updateTransformers(transformers[i]);
continue;
}
@@ -180,12 +192,14 @@
phase.updateTransformers(transformers[i]);
}
- if (transformers.length == 0) {
- _phases.last.updateTransformers([]);
- } else if (transformers.length < _phases.length) {
- _phases[transformers.length - 1].removeFollowing();
- _phases.removeRange(transformers.length, _phases.length);
+ for (var i = transformers.length + 1; i < _phases.length; i++) {
+ _phases[i].remove();
}
+ _phases.removeRange(transformers.length + 1, _phases.length);
+
+ _phaseOnDoneSubscription.cancel();
+ _phaseOnDoneSubscription = _phases.last.onDone
+ .listen(_onDoneController.add);
}
/// Force all [LazyTransformer]s' transforms in this cascade to begin
@@ -203,9 +217,8 @@
/// Add [phase] to the end of [_phases] and watch its streams.
void _addPhase(Phase phase) {
_onLogPool.add(phase.onLog);
- phase.onDone.listen((_) {
- if (!isDirty) _onDoneController.add(null);
- });
+ if (_phaseOnDoneSubscription != null) _phaseOnDoneSubscription.cancel();
+ _phaseOnDoneSubscription = phase.onDone.listen(_onDoneController.add);
_phases.add(phase);
}
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/base_transform.dart
index ea85f02..c0de0f8 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/base_transform.dart
@@ -110,6 +110,17 @@
Stream<List<int>> readInput(AssetId id) =>
futureStream(getInput(id).then((input) => input.read()));
+ /// A convenience method to return whether or not an asset exists.
+ ///
+ /// This is equivalent to calling [getInput] and catching an
+ /// [AssetNotFoundException].
+ Future<bool> hasInput(AssetId id) {
+ return getInput(id).then((_) => true).catchError((error) {
+ if (error is AssetNotFoundException && error.id == id) return false;
+ throw error;
+ });
+ }
+
/// Consume the primary input so that it doesn't get processed by future
/// phases or emitted once processing has finished.
///
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 4ef344f..970d4aa 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -37,15 +37,15 @@
///
/// This is synchronous in order to guarantee that it will emit an event as
/// soon as [isDirty] flips from `true` to `false`.
- Stream get onDone => _onDoneController.stream;
- final _onDoneController = new StreamController.broadcast(sync: true);
+ Stream get onDone => _onDone;
+ Stream _onDone;
/// A stream that emits any new assets emitted by [this].
///
/// Assets are emitted synchronously to ensure that any changes are thoroughly
/// propagated as soon as they occur.
- Stream<AssetNode> get onAsset => _onAssetPool.stream;
- final _onAssetPool = new StreamPool<AssetNode>();
+ Stream<AssetNode> get onAsset => _onAsset;
+ Stream<AssetNode> _onAsset;
/// A stream that emits an event whenever any transforms in this group logs
/// an entry.
@@ -53,10 +53,13 @@
final _onLogPool = new StreamPool<LogEntry>.broadcast();
GroupRunner(AssetCascade cascade, this._group, this._location) {
- _addPhase(new Phase(cascade, _location), _group.phases.first);
- for (var phase in _group.phases.skip(1)) {
+ _addPhase(new Phase(cascade, _location), []);
+ for (var phase in _group.phases) {
_addPhase(_phases.last.addPhase(), phase);
}
+
+ _onAsset = _phases.last.onAsset;
+ _onDone = _phases.last.onDone;
}
/// Add a phase with [contents] to [this]'s list of phases.
@@ -65,11 +68,7 @@
/// value.
void _addPhase(Phase phase, Iterable contents) {
_phases.add(phase);
- _onAssetPool.add(phase.onAsset);
_onLogPool.add(phase.onLog);
- phase.onDone.listen((_) {
- if (!isDirty) _onDoneController.add(null);
- });
phase.updateTransformers(contents);
}
@@ -88,7 +87,9 @@
/// Removes this group and all sub-phases within it.
void remove() {
- _phases.first.remove();
+ for (var phase in _phases) {
+ phase.remove();
+ }
}
String toString() => "group in phase $_location for $_group";
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index b7245f4..aa7dc78 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -91,14 +91,15 @@
/// propagated as soon as they occur. Only a phase with no [next] phase will
/// emit assets.
Stream<AssetNode> get onAsset => _onAssetController.stream;
- final _onAssetController = new StreamController<AssetNode>(sync: true);
+ final _onAssetController =
+ new StreamController<AssetNode>.broadcast(sync: true);
/// Whether [this] is dirty and still has more processing to do.
///
/// A phase is considered dirty if any of the previous phases in the same
/// cascade are dirty, since those phases could emit an asset that this phase
/// will then need to process.
- bool get isDirty => (_previous != null && _previous.isDirty) ||
+ bool get isDirty => (previous != null && previous.isDirty) ||
_inputs.values.any((input) => input.isDirty) ||
_groups.values.any((group) => group.isDirty);
@@ -108,16 +109,13 @@
final _onLogPool = new StreamPool<LogEntry>.broadcast();
/// The previous phase in the cascade, or null if this is the first phase.
- final Phase _previous;
+ final Phase previous;
- /// The subscription to [_previous]'s [onDone] stream.
+ /// The subscription to [previous]'s [onDone] stream.
StreamSubscription _previousOnDoneSubscription;
- /// The phase after this one.
- ///
- /// Outputs from this phase will be passed to it.
- Phase get next => _next;
- Phase _next;
+ /// The subscription to [previous]'s [onAsset] stream.
+ StreamSubscription<AssetNode> _previousOnAssetSubscription;
/// A map of asset ids to completers for [getInput] requests.
///
@@ -140,9 +138,10 @@
Phase(AssetCascade cascade, String location)
: this._(cascade, location, 0);
- Phase._(this.cascade, this._location, this._index, [this._previous]) {
- if (_previous != null) {
- _previousOnDoneSubscription = _previous.onDone.listen((_) {
+ Phase._(this.cascade, this._location, this._index, [this.previous]) {
+ if (previous != null) {
+ _previousOnAssetSubscription = previous.onAsset.listen(addInput);
+ _previousOnDoneSubscription = previous.onDone.listen((_) {
if (!isDirty) _onDoneController.add(null);
});
}
@@ -205,33 +204,11 @@
}
}
- // TODO(nweiz): If the input is available when this is called, it's
+ // TODO(nweiz): If the output is available when this is called, it's
// theoretically possible for it to become unavailable between the call and
// the return. If it does so, it won't trigger the rebuilding process. To
// avoid this, we should have this and the methods it calls take explicit
// callbacks, as in [AssetNode.whenAvailable].
- /// Gets the asset node for an input [id].
- ///
- /// If [id] is for a generated or transformed asset, this will wait until it
- /// has been created and return it. This means that the returned asset will
- /// always be [AssetState.AVAILABLE].
- ///
- /// If the input cannot be found, returns null.
- Future<AssetNode> getInput(AssetId id) {
- return syncFuture(() {
- if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
- if (_previous != null) return _previous.getOutput(id);
- if (!_inputs.containsKey(id)) return null;
-
- var input = _inputs[id].input;
- return input.whenAvailable((_) => input).catchError((error) {
- if (error is! AssetNotFoundException || error.id != id) throw error;
- // Retry in case the input was replaced.
- return getInput(id);
- });
- });
- }
-
/// Gets the asset node for an output [id].
///
/// If [id] is for a generated or transformed asset, this will wait until it
@@ -321,23 +298,20 @@
///
/// This may only be called on a phase with no phase following it.
Phase addPhase() {
- assert(_next == null);
- _next = new Phase._(cascade, _location, _index + 1, this);
+ var next = new Phase._(cascade, _location, _index + 1, this);
for (var output in _outputs.values.toList()) {
// Remove [output]'s listeners because now they should get the asset from
- // [_next], rather than this phase. Any transforms consuming [output] will
+ // [next], rather than this phase. Any transforms consuming [output] will
// be re-run and will consume the output from the new final phase.
output.removeListeners();
}
- return _next;
+ return next;
}
/// Mark this phase as removed.
///
- /// This will remove all the phase's outputs and all following phases.
+ /// This will remove all the phase's outputs.
void remove() {
- if (_previous != null) _previous._next = null;
- removeFollowing();
for (var input in _inputs.values.toList()) {
input.remove();
}
@@ -349,13 +323,9 @@
if (_previousOnDoneSubscription != null) {
_previousOnDoneSubscription.cancel();
}
- }
-
- /// Remove all phases after this one.
- void removeFollowing() {
- if (_next == null) return;
- _next.remove();
- _next = null;
+ if (_previousOnAssetSubscription != null) {
+ _previousOnAssetSubscription.cancel();
+ }
}
/// Add [asset] as an output of this phase.
@@ -388,11 +358,7 @@
/// This should be called after [_handleOutput], so that collisions are
/// resolved.
void _emit(AssetNode asset) {
- if (_next != null) {
- _next.addInput(asset);
- } else {
- _onAssetController.add(asset);
- }
+ _onAssetController.add(asset);
_providePendingAsset(asset);
}
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index c6b3826..db33779 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -50,7 +50,7 @@
/// Assets are emitted synchronously to ensure that any changes are thoroughly
/// propagated as soon as they occur.
Stream<AssetNode> get onAsset => _onAssetPool.stream;
- final _onAssetPool = new StreamPool<AssetNode>();
+ final _onAssetPool = new StreamPool<AssetNode>.broadcast();
/// Whether [this] is dirty and still has more processing to do.
bool get isDirty => _transforms.any((transform) => transform.isDirty);
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/phase_output.dart
index 1807156..bb5f176 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/phase_output.dart
@@ -36,7 +36,8 @@
/// A stream that emits an [AssetNode] each time this output starts forwarding
/// a new asset.
Stream<AssetNode> get onAsset => _onAssetController.stream;
- final _onAssetController = new StreamController<AssetNode>(sync: true);
+ final _onAssetController =
+ new StreamController<AssetNode>.broadcast(sync: true);
/// The assets for this output.
///
diff --git a/pkg/barback/lib/src/transform_logger.dart b/pkg/barback/lib/src/transform_logger.dart
index c3e5c73..5f43a2d 100644
--- a/pkg/barback/lib/src/transform_logger.dart
+++ b/pkg/barback/lib/src/transform_logger.dart
@@ -56,7 +56,15 @@
/// Otherwise it's associated with the primary input of [transformer].
/// If present, [span] indicates the location in the input asset that caused
/// the error.
- // TODO(sigmund,nweiz): clarify when an error should be logged or thrown.
+ ///
+ /// Logging any errors will cause Barback to consider the transformation to
+ /// have failed, much like throwing an exception. This means that neither the
+ /// primary input nor any outputs emitted by the transformer will be passed on
+ /// to the following phase, and the build will be reported as having failed.
+ ///
+ /// Unlike throwing an exception, this doesn't cause a transformer to stop
+ /// running. This makes it useful in cases where a single input may have
+ /// multiple errors that the user wants to know about.
void error(String message, {AssetId asset, Span span}) {
_logFunction(asset, LogLevel.ERROR, message, span);
}
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 4b0a076..e31d5e8 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -40,6 +40,9 @@
/// The subscription to [primary]'s [AssetNode.onStateChange] stream.
StreamSubscription _primarySubscription;
+ /// The subscription to [phase]'s [Phase.onAsset] stream.
+ StreamSubscription<AssetNode> _phaseSubscription;
+
/// Whether [this] is dirty and still has more processing to do.
bool get isDirty => !_state.isDone;
@@ -47,10 +50,12 @@
bool _isLazy;
/// The subscriptions to each input's [AssetNode.onStateChange] stream.
- var _inputSubscriptions = new Map<AssetId, StreamSubscription>();
+ final _inputSubscriptions = new Map<AssetId, StreamSubscription>();
/// The controllers for the asset nodes emitted by this node.
- var _outputControllers = new Map<AssetId, AssetNodeController>();
+ final _outputControllers = new Map<AssetId, AssetNodeController>();
+
+ final _missingInputs = new Set<AssetId>();
/// The controller that's used to pass [primary] through [this] if it's not
/// consumed or overwritten.
@@ -73,7 +78,8 @@
/// Assets are emitted synchronously to ensure that any changes are thoroughly
/// propagated as soon as they occur.
Stream<AssetNode> get onAsset => _onAssetController.stream;
- final _onAssetController = new StreamController<AssetNode>(sync: true);
+ final _onAssetController =
+ new StreamController<AssetNode>.broadcast(sync: true);
/// A stream that emits an event whenever this transform logs an entry.
///
@@ -108,6 +114,10 @@
}
});
+ _phaseSubscription = phase.previous.onAsset.listen((node) {
+ if (_missingInputs.contains(node.id)) _dirty(primaryChanged: false);
+ });
+
_process();
}
@@ -127,6 +137,7 @@
_onAssetController.close();
_onDoneController.close();
_primarySubscription.cancel();
+ _phaseSubscription.cancel();
_clearInputSubscriptions();
_clearOutputs();
if (_passThroughController != null) {
@@ -255,11 +266,14 @@
///
/// If an input with [id] cannot be found, throws an [AssetNotFoundException].
Future<Asset> getInput(AssetId id) {
- return phase.getInput(id).then((node) {
+ return phase.previous.getOutput(id).then((node) {
// Throw if the input isn't found. This ensures the transformer's apply
// is exited. We'll then catch this and report it through the proper
// results stream.
- if (node == null) throw new AssetNotFoundException(id);
+ if (node == null) {
+ _missingInputs.add(id);
+ throw new AssetNotFoundException(id);
+ }
_inputSubscriptions.putIfAbsent(node.id, () {
return node.onStateChange.listen((_) => _dirty(primaryChanged: false));
@@ -383,6 +397,7 @@
/// Cancels all subscriptions to secondary input nodes.
void _clearInputSubscriptions() {
+ _missingInputs.clear();
for (var subscription in _inputSubscriptions.values) {
subscription.cancel();
}
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 011f69f..02a7675 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -176,4 +176,22 @@
expectAsset("app|foo.txt", "failed to load app|nothing");
buildShouldSucceed();
});
+
+ test("a transformer that fails due to a missing secondary input is re-run "
+ "when that input appears", () {
+ initGraph({
+ "app|foo.txt": "bar.inc",
+ "app|bar.inc": "bar"
+ }, {"app": [
+ [new ManyToOneTransformer("txt")]
+ ]});
+
+ updateSources(["app|foo.txt"]);
+ expectNoAsset("app|foo.out");
+ buildShouldFail([isMissingInputException("app|bar.inc")]);
+
+ updateSources(["app|bar.inc"]);
+ expectAsset("app|foo.out", "bar");
+ buildShouldSucceed();
+ });
}
diff --git a/pkg/barback/test/package_graph/transform/transform_test.dart b/pkg/barback/test/package_graph/transform/transform_test.dart
index 747512c..dce5e2c 100644
--- a/pkg/barback/test/package_graph/transform/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform/transform_test.dart
@@ -341,4 +341,45 @@
expectAsset('app|bar.out', 'spread txt.out');
buildShouldSucceed();
});
+
+ group("Transform.hasInput", () {
+ test("returns whether an input exists", () {
+ initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+ [new HasInputTransformer(['app|foo.txt', 'app|bar.txt', 'app|baz.txt'])]
+ ]});
+
+ updateSources(['app|foo.txt', 'app|bar.txt']);
+ expectAsset('app|foo.txt',
+ 'app|foo.txt: true, app|bar.txt: true, app|baz.txt: false');
+ buildShouldSucceed();
+ });
+
+ test("re-runs the transformer when an input stops existing", () {
+ initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+ [new HasInputTransformer(['app|bar.txt'])]
+ ]});
+
+ updateSources(['app|foo.txt', 'app|bar.txt']);
+ expectAsset('app|foo.txt', 'app|bar.txt: true');
+ buildShouldSucceed();
+
+ removeSources(['app|bar.txt']);
+ expectAsset('app|foo.txt', 'app|bar.txt: false');
+ buildShouldSucceed();
+ });
+
+ test("re-runs the transformer when an input starts existing", () {
+ initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+ [new HasInputTransformer(['app|bar.txt'])]
+ ]});
+
+ updateSources(['app|foo.txt']);
+ expectAsset('app|foo.txt', 'app|bar.txt: false');
+ buildShouldSucceed();
+
+ updateSources(['app|bar.txt']);
+ expectAsset('app|foo.txt', 'app|bar.txt: true');
+ buildShouldSucceed();
+ });
+ });
}
diff --git a/pkg/barback/test/transformer/has_input.dart b/pkg/barback/test/transformer/has_input.dart
new file mode 100644
index 0000000..add3017
--- /dev/null
+++ b/pkg/barback/test/transformer/has_input.dart
@@ -0,0 +1,34 @@
+// 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 barback.test.transformer.has_input;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// Overwrites its primary inputs with descriptions of whether various secondary
+/// inputs exist.
+class HasInputTransformer extends MockTransformer {
+ /// The inputs whose existence will be checked.
+ final List<AssetId> inputs;
+
+ HasInputTransformer(Iterable<String> inputs)
+ : inputs = inputs.map((input) => new AssetId.parse(input)).toList();
+
+ Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+
+ Future doApply(Transform transform) {
+ return Future.wait(inputs.map((input) {
+ return transform.hasInput(input).then((hasInput) => "$input: $hasInput");
+ })).then((results) {
+ transform.addOutput(new Asset.fromString(
+ transform.primaryInput.id, results.join(', ')));
+ });
+ }
+
+ String toString() => "has inputs $inputs";
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 4d72a2b..7a77f1b 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -24,6 +24,7 @@
export 'transformer/conditionally_consume_primary.dart';
export 'transformer/create_asset.dart';
export 'transformer/emit_nothing.dart';
+export 'transformer/has_input.dart';
export 'transformer/lazy_bad.dart';
export 'transformer/lazy_many_to_one.dart';
export 'transformer/lazy_rewrite.dart';
diff --git a/pkg/browser/pubspec.yaml b/pkg/browser/pubspec.yaml
index e51235f..3bf88f1 100644
--- a/pkg/browser/pubspec.yaml
+++ b/pkg/browser/pubspec.yaml
@@ -1,8 +1,8 @@
name: browser
-version: 0.10.0
+version: 0.10.0+2
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
The bootstrap dart.js script for Dart apps running in the browser.
environment:
- sdk: ">=1.2.0 <2.0.0"
+ sdk: ">=1.3.0-dev.4.1 <2.0.0"
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
new file mode 100644
index 0000000..8fabaf6
--- /dev/null
+++ b/pkg/code_transformers/lib/assets.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Common methods used by transfomers for dealing with asset IDs.
+library code_transformers.assets;
+
+import 'dart:math' show min, max;
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:source_maps/span.dart' show Span;
+
+/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
+/// is used to resolve relative urls that occur in HTML assets, including
+/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
+/// urls are not resolved unless [source] is Dart file (has a .dart extension).
+// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
+AssetId uriToAssetId(AssetId source, String url, TransformLogger logger,
+ Span span, {bool errorOnAbsolute: true}) {
+ if (url == null || url == '') return null;
+ var uri = Uri.parse(url);
+ var urlBuilder = path.url;
+ if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
+ if (source.extension == '.dart' && uri.scheme == 'package') {
+ var index = uri.path.indexOf('/');
+ if (index != -1) {
+ return new AssetId(uri.path.substring(0, index),
+ 'lib${uri.path.substring(index)}');
+ }
+ }
+
+ if (errorOnAbsolute) {
+ logger.error('absolute paths not allowed: "$url"', span: span);
+ }
+ return null;
+ }
+
+ var targetPath = urlBuilder.normalize(
+ urlBuilder.join(urlBuilder.dirname(source.path), url));
+ var segments = urlBuilder.split(targetPath);
+ var sourceSegments = urlBuilder.split(source.path);
+ assert (sourceSegments.length > 0);
+ var topFolder = sourceSegments[0];
+ var entryFolder = topFolder != 'lib' && topFolder != 'asset';
+
+ // Find the first 'packages/' or 'assets/' segment:
+ var packagesIndex = segments.indexOf('packages');
+ var assetsIndex = segments.indexOf('assets');
+ var index = (packagesIndex >= 0 && assetsIndex >= 0)
+ ? min(packagesIndex, assetsIndex)
+ : max(packagesIndex, assetsIndex);
+ if (index > -1) {
+ if (entryFolder) {
+ // URLs of the form "packages/foo/bar" seen under entry folders (like
+ // 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.
+ return _extractOtherPackageId(index, segments, logger, span);
+ } else if (index == 1 && segments[0] == '..') {
+ // Relative URLs of the form "../../packages/foo/bar" in an asset under
+ // lib/ or asset/ are also resolved as an asset in another package, but we
+ // check that the relative path goes all the way out where the packages
+ // folder lives (otherwise the app would not work in Dartium). Since
+ // [targetPath] has been normalized, "packages" or "assets" should be at
+ // index 1.
+ return _extractOtherPackageId(1, segments, logger, span);
+ } else {
+ var prefix = segments[index];
+ var fixedSegments = [];
+ fixedSegments.addAll(sourceSegments.map((_) => '..'));
+ fixedSegments.addAll(segments.sublist(index));
+ var fixedUrl = urlBuilder.joinAll(fixedSegments);
+ logger.error('Invalid url to reach to another package: $url. Path '
+ 'reaching to other packages must first reach up all the '
+ 'way to the $prefix folder. For example, try changing the url above '
+ 'to: $fixedUrl', span: span);
+ return null;
+ }
+ }
+
+ // Otherwise, resolve as a path in the same package.
+ return new AssetId(source.package, targetPath);
+}
+
+AssetId _extractOtherPackageId(int index, List segments,
+ TransformLogger logger, Span span) {
+ if (index >= segments.length) return null;
+ var prefix = segments[index];
+ if (prefix != 'packages' && prefix != 'assets') return null;
+ var folder = prefix == 'packages' ? 'lib' : 'asset';
+ if (segments.length < index + 3) {
+ logger.error("incomplete $prefix/ path. It should have at least 3 "
+ "segments $prefix/name/path-from-name's-$folder-dir", span: span);
+ return null;
+ }
+ return new AssetId(segments[index + 1],
+ path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
+}
diff --git a/pkg/code_transformers/lib/resolver.dart b/pkg/code_transformers/lib/resolver.dart
index 91ce8c3..faf34db 100644
--- a/pkg/code_transformers/lib/resolver.dart
+++ b/pkg/code_transformers/lib/resolver.dart
@@ -5,6 +5,7 @@
/// Tools for working with resolved ASTs from Barback transformers.
library code_transformers.resolver;
-export 'src/resolvers.dart';
-export 'src/resolver.dart';
export 'src/dart_sdk.dart';
+export 'src/entry_point.dart';
+export 'src/resolver.dart';
+export 'src/resolvers.dart';
diff --git a/pkg/code_transformers/lib/src/dart_sdk.dart b/pkg/code_transformers/lib/src/dart_sdk.dart
index 3b79f36..7b6f8e6 100644
--- a/pkg/code_transformers/lib/src/dart_sdk.dart
+++ b/pkg/code_transformers/lib/src/dart_sdk.dart
@@ -5,7 +5,7 @@
library code_transformers.src.dart_sdk;
import 'dart:convert' as convert;
-import 'dart:io' show Directory, File, Platform, Process;
+import 'dart:io' show File, Platform, Process;
import 'package:path/path.dart' as path;
diff --git a/pkg/code_transformers/lib/src/entry_point.dart b/pkg/code_transformers/lib/src/entry_point.dart
new file mode 100644
index 0000000..ee7868e
--- /dev/null
+++ b/pkg/code_transformers/lib/src/entry_point.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 'package:analyzer/analyzer.dart' as analyzer;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:barback/barback.dart';
+
+/// Checks to see if the provided Asset is a Dart entry point.
+///
+/// Assets are considered entry points if they are Dart files located in
+/// web/, test/, benchmark/ or example/ and have a main() function.
+///
+/// Because this only analyzes the primary asset this may return true for files
+/// which are not dart entries if the file does not have a main() but does have
+/// parts or exports.
+Future<bool> isPossibleDartEntry(Asset asset) {
+ if (asset.id.extension != '.dart') return new Future.value(false);
+
+ if (!['benchmark', 'example', 'test', 'web']
+ .any((dir) => asset.id.path.startsWith("$dir/"))) {
+ return new Future.value(false);
+ }
+ return asset.readAsString().then((contents) {
+ return _couldBeEntrypoint(
+ analyzer.parseCompilationUnit(contents, suppressErrors: true));
+ });
+}
+
+bool _couldBeEntrypoint(CompilationUnit compilationUnit) {
+ // Allow two or fewer arguments so that entrypoints intended for use with
+ // [spawnUri] get counted.
+ var hasMain = compilationUnit.declarations.any((node) =>
+ node is FunctionDeclaration &&
+ node.name.name == "main" &&
+ node.functionExpression.parameters.parameters.length <= 2);
+
+ if (hasMain) return true;
+
+ // If it has an export or a part, assume the worst- that the main could be
+ // in there.
+ // We avoid loading those since this can be run from isPrimaryAsset calls
+ // where we do not have access to other sources.
+ return compilationUnit.directives.any((node) =>
+ node is ExportDirective || node is PartDirective);
+}
diff --git a/pkg/code_transformers/lib/src/resolver.dart b/pkg/code_transformers/lib/src/resolver.dart
index b944a4e..fac1aac 100644
--- a/pkg/code_transformers/lib/src/resolver.dart
+++ b/pkg/code_transformers/lib/src/resolver.dart
@@ -14,25 +14,23 @@
/// Class for working with a barback based resolved AST.
abstract class Resolver {
- /// The Dart entry point file where parsing begins.
- AssetId get entryPoint;
-
- /// Update the status of all the sources referenced by the entryPoint and
- /// update the resolved library.
+ /// Update the status of all the sources referenced by the entry points and
+ /// update the resolved library. If [entryPoints] is omitted, the primary
+ /// asset of [transform] is used as the only entry point.
///
/// [release] must be called when done handling this Resolver to allow it
/// to be used by later phases.
- Future<Resolver> resolve(Transform transform);
+ Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]);
/// Release this resolver so it can be updated by following transforms.
void release();
- /// Gets the resolved Dart library for the entry asset, or null if
- /// the AST has not been resolved.
+ /// Gets the resolved Dart library for an asset, or null if the AST has not
+ /// been resolved.
///
/// If the AST has not been resolved then this normally means that the
/// transformer hosting this needs to be in an earlier phase.
- LibraryElement get entryLibrary;
+ LibraryElement getLibrary(AssetId assetId);
/// Gets all libraries accessible from the entry point, recursively.
///
@@ -83,6 +81,10 @@
/// the element came from the Dart SDK.
Span getSourceSpan(Element element);
+ /// Get a [SourceFile] with the contents of the file that defines [element],
+ /// or null if the element came from the Dart SDK.
+ SourceFile getSourceFile(Element element);
+
/// Creates a text edit transaction for the given element if it is able
/// to be edited, returns null otherwise.
///
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 9322ccd..f26c072 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -5,14 +5,19 @@
library code_transformer.src.resolver_impl;
import 'dart:async';
+import 'package:analyzer/analyzer.dart' show parseCompilationUnit;
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
import 'package:analyzer/src/generated/source.dart';
import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
import 'package:path/path.dart' as native_path;
import 'package:source_maps/refactor.dart';
import 'package:source_maps/span.dart' show SourceFile, Span;
@@ -31,17 +36,14 @@
final Map<AssetId, _AssetBasedSource> sources =
<AssetId, _AssetBasedSource>{};
- /// The Dart entry point file where parsing begins.
- final AssetId entryPoint;
-
final AnalysisContext _context =
AnalysisEngine.instance.createAnalysisContext();
/// Transform for which this is currently updating, or null when not updating.
Transform _currentTransform;
- /// The currently resolved library, or null if unresolved.
- LibraryElement _entryLibrary;
+ /// The currently resolved entry libraries, or null if nothing is resolved.
+ List<LibraryElement> _entryLibraries;
/// Future indicating when this resolver is done in the current phase.
Future _lastPhaseComplete = new Future.value();
@@ -52,12 +54,9 @@
/// Handler for all Dart SDK (dart:) sources.
DirectoryBasedDartSdk _dartSdk;
- /// Creates a resolver that will resolve the Dart code starting at
- /// [entryPoint].
- ///
- /// [sdkDir] is the root directory of the Dart SDK, for resolving dart:
- /// imports.
- ResolverImpl(this.entryPoint, String sdkDir, {AnalysisOptions options}) {
+ /// Creates a resolver, where [sdkDir] is the root directory of the Dart SDK,
+ /// for resolving `dart:*` imports.
+ ResolverImpl(String sdkDir, {AnalysisOptions options}) {
if (options == null) {
options = new AnalysisOptionsImpl()
..cacheSize = 256 // # of sources to cache ASTs for.
@@ -74,16 +73,19 @@
new _AssetUriResolver(this)]);
}
- LibraryElement get entryLibrary => _entryLibrary;
+ LibraryElement getLibrary(AssetId assetId) {
+ var source = sources[assetId];
+ return source == null ? null : _context.computeLibraryElement(source);
+ }
- Future<Resolver> resolve(Transform transform) {
+ Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]) {
// Can only have one resolve in progress at a time, so chain the current
// resolution to be after the last one.
var phaseComplete = new Completer();
var future = _lastPhaseComplete.then((_) {
_currentPhaseComplete = phaseComplete;
-
- return _performResolve(transform);
+ return _performResolve(transform,
+ entryPoints == null ? [transform.primaryInput.id] : entryPoints);
}).then((_) => this);
// Advance the lastPhaseComplete to be done when this phase is all done.
_lastPhaseComplete = phaseComplete.future;
@@ -97,11 +99,12 @@
_currentPhaseComplete.complete(null);
_currentPhaseComplete = null;
- // Clear out the entry lib since it should not be referenced after release.
- _entryLibrary = null;
+ // Clear out libraries since they should not be referenced after release.
+ _entryLibraries = null;
+ _currentTransform = null;
}
- Future _performResolve(Transform transform) {
+ Future _performResolve(Transform transform, List<AssetId> entryPoints) {
if (_currentTransform != null) {
throw new StateError('Cannot be accessed by concurrent transforms');
}
@@ -111,6 +114,7 @@
// and see if it changed, then walk all files accessed by it.
var visited = new Set<AssetId>();
var visiting = new FutureGroup();
+ var toUpdate = [];
void processAsset(AssetId assetId) {
visited.add(assetId);
@@ -121,23 +125,22 @@
source = new _AssetBasedSource(assetId, this);
sources[assetId] = source;
}
- source.updateContents(contents);
-
- source.dependentAssets
- .where((id) => !visited.contains(id))
+ source.updateDependencies(contents);
+ toUpdate.add(new _PendingUpdate(source, contents));
+ source.dependentAssets.where((id) => !visited.contains(id))
.forEach(processAsset);
-
}, onError: (e) {
_context.applyChanges(new ChangeSet()..removedSource(sources[assetId]));
sources.remove(assetId);
}));
}
- processAsset(entryPoint);
+ entryPoints.forEach(processAsset);
// Once we have all asset sources updated with the new contents then
// resolve everything.
return visiting.future.then((_) {
var changeSet = new ChangeSet();
+ toUpdate.forEach((pending) => pending.apply(changeSet));
var unreachableAssets = new Set.from(sources.keys).difference(visited);
for (var unreachable in unreachableAssets) {
changeSet.removedSource(sources[unreachable]);
@@ -146,13 +149,15 @@
// Update the analyzer context with the latest sources
_context.applyChanges(changeSet);
- // Resolve the AST
- _entryLibrary = _context.computeLibraryElement(sources[entryPoint]);
- _currentTransform = null;
+ // Force resolve each entry point (the getter will ensure the library is
+ // computed first).
+ _entryLibraries = entryPoints
+ .map((id) => _context.computeLibraryElement(sources[id])).toList();
});
}
- Iterable<LibraryElement> get libraries => entryLibrary.visibleLibraries;
+ Iterable<LibraryElement> get libraries =>
+ _entryLibraries.expand((lib) => lib.visibleLibraries).toSet();
LibraryElement getLibraryByName(String libraryName) =>
libraries.firstWhere((l) => l.name == libraryName, orElse: () => null);
@@ -226,7 +231,7 @@
}
Span getSourceSpan(Element element) {
- var sourceFile = _getSourceFile(element);
+ var sourceFile = getSourceFile(element);
if (sourceFile == null) return null;
return sourceFile.span(element.node.offset, element.node.end);
}
@@ -234,22 +239,27 @@
TextEditTransaction createTextEditTransaction(Element element) {
if (element.source is! _AssetBasedSource) return null;
+ // Cannot edit unless there is an active transformer.
+ if (_currentTransform == null) return null;
+
_AssetBasedSource source = element.source;
// Cannot modify assets in other packages.
- if (source.assetId.package != entryPoint.package) return null;
+ if (source.assetId.package != _currentTransform.primaryInput.id.package) {
+ return null;
+ }
- var sourceFile = _getSourceFile(element);
+ var sourceFile = getSourceFile(element);
if (sourceFile == null) return null;
return new TextEditTransaction(source.rawContents, sourceFile);
}
/// Gets the SourceFile for the source of the element.
- SourceFile _getSourceFile(Element element) {
+ SourceFile getSourceFile(Element element) {
var assetId = getSourceAssetId(element);
if (assetId == null) return null;
- var importUri = _getSourceUri(element, from: entryPoint);
+ var importUri = _getSourceUri(element);
var spanPath = importUri != null ? importUri.toString() : assetId.path;
return new SourceFile.text(spanPath, sources[assetId].rawContents);
}
@@ -275,30 +285,26 @@
_AssetBasedSource(this.assetId, this._resolver);
+ /// Update the dependencies of this source. This parses [contents] but avoids
+ /// any analyzer resolution.
+ void updateDependencies(String contents) {
+ if (contents == _contents) return;
+ var unit = parseCompilationUnit(contents, suppressErrors: true);
+ _dependentAssets = unit.directives
+ .where((d) => (d is ImportDirective || d is PartDirective ||
+ d is ExportDirective))
+ .map((d) => _resolve(assetId, d.uri.stringValue, _logger,
+ _getSpan(d, contents)))
+ .where((id) => id != null).toSet();
+ }
+
/// Update the contents of this file with [contents].
///
/// Returns true if the contents of this asset have changed.
bool updateContents(String contents) {
if (contents == _contents) return false;
- var added = _contents == null;
_contents = contents;
++_revision;
- // Invalidate the imports so we only parse the AST when needed.
- _dependentAssets = null;
-
- if (added) {
- _resolver._context.applyChanges(new ChangeSet()..addedSource(this));
- } else {
- _resolver._context.applyChanges(new ChangeSet()..changedSource(this));
- }
-
- var compilationUnit = _resolver._context.parseCompilationUnit(this);
- _dependentAssets = compilationUnit.directives
- .where((d) => (d is ImportDirective || d is PartDirective ||
- d is ExportDirective))
- .map((d) => _resolve(assetId, d.uri.stringValue,
- _logger, _getSpan(d)))
- .where((id) => id != null).toSet();
return true;
}
@@ -357,13 +363,13 @@
}
/// For logging errors.
- Span _getSpan(AstNode node) => _sourceFile.span(node.offset, node.end);
+ Span _getSpan(AstNode node, [String contents]) =>
+ _getSourceFile(contents).span(node.offset, node.end);
/// For logging errors.
- SourceFile get _sourceFile {
- var uri = getSourceUri(_resolver.entryPoint);
+ SourceFile _getSourceFile([String contents]) {
+ var uri = getSourceUri();
var path = uri != null ? uri.toString() : assetId.path;
-
- return new SourceFile.text(path, rawContents);
+ return new SourceFile.text(path, contents != null ? contents : rawContents);
}
/// Gets a URI which would be appropriate for importing this file.
@@ -509,14 +515,7 @@
// Dart SDK libraries do not have assets.
if (uri.scheme == 'dart') return null;
- if (uri.host != '' || uri.scheme != '' || path.isAbsolute(url)) {
- logger.error('absolute paths not allowed: "$url"', span: span);
- return null;
- }
-
- var targetPath = path.normalize(
- path.join(path.dirname(source.path), url));
- return new AssetId(source.package, targetPath);
+ return uriToAssetId(source, url, logger, span);
}
@@ -574,3 +573,23 @@
*/
Future<List<E>> get future => _completer.future;
}
+
+/// A pending update to notify the resolver that a [Source] has been added or
+/// changed. This is used by the `_performResolve` algorithm above to apply all
+/// changes after it first discovers the transitive closure of files that are
+/// reachable from the sources.
+class _PendingUpdate {
+ _AssetBasedSource source;
+ String content;
+
+ _PendingUpdate(this.source, this.content);
+
+ void apply(ChangeSet changeSet) {
+ if (!source.updateContents(content)) return;
+ if (source._revision == 1 && source._contents != null) {
+ changeSet.addedSource(source);
+ } else {
+ changeSet.changedSource(source);
+ }
+ }
+}
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index b98e587..f7e39b3 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -19,21 +19,23 @@
/// If multiple transformers rely on a resolved AST they should (ideally) share
/// the same Resolvers object to minimize re-parsing the AST.
class Resolvers {
- final Map<AssetId, ResolverImpl> _resolvers = {};
+ final Map<AssetId, Resolver> _resolvers = {};
final String dartSdkDirectory;
Resolvers(this.dartSdkDirectory);
- /// Get a resolver for the AST starting from [id].
+ /// Get a resolver for [transform]. If provided, this resolves the code
+ /// starting from each of the assets in [entryPoints]. If not, this resolves
+ /// the code starting from `transform.primaryInput.id` by default.
///
/// [Resolver.release] must be called once it's done being used, or
/// [ResolverTransformer] should be used to automatically release the
/// resolver.
- Future<Resolver> get(Transform transform) {
+ Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
var id = transform.primaryInput.id;
var resolver = _resolvers.putIfAbsent(id,
- () => new ResolverImpl(id, dartSdkDirectory));
- return resolver.resolve(transform);
+ () => new ResolverImpl(dartSdkDirectory));
+ return resolver.resolve(transform, entryPoints);
}
}
@@ -45,8 +47,27 @@
/// The cache of resolvers- must be set from subclass.
Resolvers resolvers;
- Future apply(Transform transform) {
- return resolvers.get(transform).then((resolver) {
+ /// This provides a default implementation of `Transformer.apply` that will
+ /// get and release resolvers automatically. Internally this:
+ /// * Gets a resolver associated with the transform primary input.
+ /// * Does resolution to the code starting from that input.
+ /// * Calls [applyResolver].
+ /// * Then releases the resolver.
+ ///
+ /// Use [applyToEntryPoints] instead if you need to override the entry points
+ /// to run the resolver on.
+ Future apply(Transform transform) => applyToEntryPoints(transform);
+
+ /// Helper function to make it easy to write an `Transformer.apply` method
+ /// that automatically gets and releases the resolver. This is typically used
+ /// as follows:
+ ///
+ /// Future apply(Transform transform) {
+ /// var entryPoints = ...; // compute entry points
+ /// return applyToEntryPoints(transform, entryPoints);
+ /// }
+ Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
+ return resolvers.get(transform, entryPoints).then((resolver) {
return new Future.value(applyResolver(transform, resolver)).then((_) {
resolver.release();
});
diff --git a/pkg/code_transformers/lib/src/test_harness.dart b/pkg/code_transformers/lib/src/test_harness.dart
index db53909..e579a58 100644
--- a/pkg/code_transformers/lib/src/test_harness.dart
+++ b/pkg/code_transformers/lib/src/test_harness.dart
@@ -117,7 +117,7 @@
}).then((_) {
// We only check messages when an expectation is provided.
if (messages == null) return;
- expect(messages.length, messagesSeen,
+ expect(messagesSeen, messages.length,
reason: 'less messages than expected');
});
}
diff --git a/pkg/code_transformers/lib/tests.dart b/pkg/code_transformers/lib/tests.dart
index bd6886c..9ed8e0b 100644
--- a/pkg/code_transformers/lib/tests.dart
+++ b/pkg/code_transformers/lib/tests.dart
@@ -7,11 +7,14 @@
library code_transformers.tests;
import 'dart:async' show Future;
+import 'dart:io' show Platform;
import 'package:barback/barback.dart' show Transformer;
+import 'package:path/path.dart' as path;
import 'package:unittest/unittest.dart';
import 'src/test_harness.dart';
+import 'src/dart_sdk.dart';
/// Defines a test which invokes [applyTransformers].
testPhases(String testName, List<List<Transformer>> phases,
@@ -38,3 +41,19 @@
var helper = new TestHelper(phases, inputs, messages)..run();
return helper.checkAll(results).then((_) => helper.tearDown());
}
+
+/// Variant of [dartSdkDirectory] which includes additional cases only
+/// typically encountered in Dart's testing environment.
+String get testingDartSdkDirectory {
+ var sdkDir = dartSdkDirectory;
+ if (sdkDir == null) {
+ // If we cannot find the SDK dir, then assume this is being run from Dart's
+ // source directory and this script is the main script.
+ var segments = path.split(path.fromUri(Platform.script));
+ var index = segments.indexOf('pkg');
+ expect(index, greaterThan(0),
+ reason: 'testingDartSdkDirectory is only supported in pkg/ tests');
+ sdkDir = path.joinAll(segments.sublist(0, index)..add('sdk'));
+ }
+ return sdkDir;
+}
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 3ff8c5d..bd85f83 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,10 +1,10 @@
name: code_transformers
-version: 0.0.1-dev.1
+version: 0.0.1-dev.4
author: "Dart Team <misc@dartlang.org>"
description: Collection of utilities related to creating barback transformers.
homepage: http://www.dartlang.org
dependencies:
- analyzer: "0.13.0-dev.6"
+ analyzer: ">=0.13.0-dev.9 <0.14.0"
barback: ">=0.11.0 <0.12.0"
path: ">=0.9.0 <2.0.0"
source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/code_transformers/test/assets_test.dart b/pkg/code_transformers/test/assets_test.dart
new file mode 100644
index 0000000..0d104dd
--- /dev/null
+++ b/pkg/code_transformers/test/assets_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+ useCompactVMConfiguration();
+
+
+ Future testAssetUri(String name,
+ {AssetId source, String uri, AssetId result, String message,
+ bool errorOnAbsolute: true}) {
+ test(name, () {
+ var transformer = new Validator((transform) {
+ var assetId = uriToAssetId(source, uri, transform.logger, null,
+ errorOnAbsolute: errorOnAbsolute);
+ expect(assetId, result);
+ });
+ var messages = [];
+ if (message != null) messages.add(message);
+
+ return applyTransformers(
+ [[transformer]],
+ inputs: {
+ source.toString(): ''
+ },
+ messages: messages);
+ });
+ }
+
+ group('uriToAssetId', () {
+ testAssetUri('resolves relative URIs',
+ source: new AssetId('a', 'web/main.dart'),
+ uri: 'foo.dart',
+ result: new AssetId('a', 'web/foo.dart'));
+
+ testAssetUri('resolves package: URIs',
+ source: new AssetId('a', 'web/main.dart'),
+ uri: 'package:foo/foo.dart',
+ result: new AssetId('foo', 'lib/foo.dart'));
+
+ testAssetUri('resolves package: URIs from libs',
+ source: new AssetId('a', 'lib/main.dart'),
+ uri: 'package:foo/foo.dart',
+ result: new AssetId('foo', 'lib/foo.dart'));
+
+ testAssetUri('resolves packages paths',
+ source: new AssetId('a', 'web/main.dart'),
+ uri: 'packages/foo/foo.dart',
+ result: new AssetId('foo', 'lib/foo.dart'));
+
+ testAssetUri('resolves relative packages paths',
+ source: new AssetId('a', 'web/main.dart'),
+ uri: 'packages/foo/foo.dart',
+ result: new AssetId('foo', 'lib/foo.dart'));
+
+ testAssetUri('does not allow packages from non-dart lib files',
+ source: new AssetId('a', 'lib/index.html'),
+ uri: 'packages/foo/bar',
+ message: 'error: Invalid url to reach to another package: '
+ 'packages/foo/bar. Path reaching to other packages must first '
+ 'reach up all the way to the packages folder. For example, try '
+ 'changing the url above to: ../../packages/foo/bar');
+
+ testAssetUri('allows relative packages from non-dart lib files',
+ source: new AssetId('a', 'lib/index.html'),
+ uri: '../../packages/foo/bar',
+ result: new AssetId('foo', 'lib/bar'));
+
+ testAssetUri('does not allow package: imports from non-dart files',
+ source: new AssetId('a', 'lib/index.html'),
+ uri: 'package:foo/bar.dart',
+ message: 'error: absolute paths not allowed: "package:foo/bar.dart"');
+
+ testAssetUri('does not allow absolute /packages by default',
+ source: new AssetId('a', 'lib/index.html'),
+ uri: '/packages/foo/bar.dart',
+ message: 'error: absolute paths not allowed: "/packages/foo/bar.dart"');
+
+ testAssetUri('can suppress error on absolute /packages ',
+ source: new AssetId('a', 'lib/index.html'),
+ uri: '/packages/foo/bar.dart',
+ errorOnAbsolute: false,
+ result: null);
+ });
+}
+
+class Validator extends Transformer {
+ final Function validation;
+
+ Validator(this.validation);
+
+ Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+ Future apply(Transform transform) {
+ return new Future.value(validation(transform));
+ }
+}
diff --git a/pkg/code_transformers/test/entry_point_test.dart b/pkg/code_transformers/test/entry_point_test.dart
new file mode 100644
index 0000000..a384444
--- /dev/null
+++ b/pkg/code_transformers/test/entry_point_test.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+ useCompactVMConfiguration();
+
+ Future checkDartEntry({Map<String, String> inputs, bool expectation}) {
+ var transformer = new Validator((transform) {
+ return isPossibleDartEntry(transform.primaryInput).then((value) {
+ expect(value, expectation);
+ });
+ });
+ return applyTransformers(
+ [[transformer]],
+ inputs: inputs);
+ }
+
+ group('isPossibleDartEntry', () {
+ test('should handle empty files', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': '',
+ },
+ expectation: false);
+ });
+
+ test('should detect main methods', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': 'main() {}',
+ },
+ expectation: true);
+ });
+
+ test('should exclude dart mains in lib folder', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|lib/main.dart': 'main() {}',
+ },
+ expectation: false);
+ });
+
+ test('should validate file extension', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.not_dart': 'main() {}',
+ },
+ expectation: false);
+ });
+
+ test('should count exports as main', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': 'export "foo.dart";',
+ },
+ expectation: true);
+ });
+
+ test('should count parts as main', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': 'part "foo.dart";',
+ },
+ expectation: true);
+ });
+
+ test('is tolerant of syntax errors with main', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': 'main() {} {',
+ },
+ expectation: true);
+ });
+
+ test('is tolerant of syntax errors without main', () {
+ return checkDartEntry(
+ inputs: {
+ 'a|web/main.dart': 'class Foo {',
+ },
+ expectation: false);
+ });
+ });
+}
+
+class Validator extends Transformer {
+ final Function validation;
+
+ Validator(this.validation);
+
+ Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+ Future apply(Transform transform) {
+ return new Future.value(validation(transform));
+ }
+}
diff --git a/pkg/code_transformers/test/resolver_test.dart b/pkg/code_transformers/test/resolver_test.dart
index 73f50f1..886e935 100644
--- a/pkg/code_transformers/test/resolver_test.dart
+++ b/pkg/code_transformers/test/resolver_test.dart
@@ -16,17 +16,8 @@
main() {
useCompactVMConfiguration();
-
- var sdkDir = dartSdkDirectory;
- if (sdkDir == null) {
- // If we cannot find the SDK dir, then assume this is being run from Dart's
- // source directory and this script is the main script.
- sdkDir = path.join(
- path.dirname(path.fromUri(Platform.script)), '..', '..', '..', 'sdk');
- }
-
var entryPoint = new AssetId('a', 'web/main.dart');
- var resolvers = new Resolvers(sdkDir);
+ var resolvers = new Resolvers(testingDartSdkDirectory);
Future validateResolver({Map<String, String> inputs, void validator(Resolver),
List<String> messages: const[]}) {
@@ -47,7 +38,7 @@
var source = resolver.sources[entryPoint];
expect(source.modificationStamp, 1);
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib, isNotNull);
expect(lib.entryPoint, isNull);
});
@@ -62,7 +53,7 @@
var source = resolver.sources[entryPoint];
expect(source.modificationStamp, 2);
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib, isNotNull);
expect(lib.entryPoint, isNotNull);
});
@@ -81,7 +72,7 @@
''',
},
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 2);
var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
expect(libA.getType('Foo'), isNull);
@@ -102,7 +93,7 @@
''',
},
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 2);
var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
expect(libA.getType('Foo'), isNotNull);
@@ -122,7 +113,7 @@
''',
},
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 2);
var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
expect(libB.getType('Foo'), isNull);
@@ -143,7 +134,7 @@
''',
},
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 2);
var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
expect(libB.getType('Bar'), isNotNull);
@@ -161,10 +152,9 @@
},
messages: [
'error: Unable to find asset for "package:b/b.dart"',
- 'error: Unable to find asset for "package:b/b.dart"',
],
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 1);
});
});
@@ -180,13 +170,13 @@
},
messages: [
// First from the AST walker
- 'error: absolute paths not allowed: "/b.dart" (main.dart 0 14)',
+ 'error: absolute paths not allowed: "/b.dart" (web/main.dart 0 14)',
// Then two from the resolver.
'error: absolute paths not allowed: "/b.dart"',
'error: absolute paths not allowed: "/b.dart"',
],
validator: (resolver) {
- var lib = resolver.entryLibrary;
+ var lib = resolver.getLibrary(entryPoint);
expect(lib.importedLibraries.length, 1);
});
});
@@ -329,7 +319,7 @@
library foo;'''
},
validator: (resolver) {
- expect(resolver.entryLibrary.name, 'foo');
+ expect(resolver.getLibrary(entryPoint).name, 'foo');
}),
validateResolver(
inputs: {
@@ -337,7 +327,7 @@
library bar;'''
},
validator: (resolver) {
- expect(resolver.entryLibrary.name, 'bar');
+ expect(resolver.getLibrary(entryPoint).name, 'bar');
}),
]);
});
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 3b5784c..da817fe 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -22,8 +22,12 @@
import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart';
-import 'dart2yaml.dart';
+import 'src/dart2yaml.dart';
import 'src/io.dart';
+import 'src/mdn.dart';
+import 'src/models.dart';
+import 'src/utils.dart';
+
import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart'
@@ -44,7 +48,7 @@
'_js_helper.Returns'];
/// Support for [:foo:]-style code comments to the markdown parser.
-List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
+final List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
[new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
/// If we can't find the SDK introduction text, which will happen if running
@@ -218,29 +222,6 @@
}
}
-/// Docgen representation of an item to be documented, that wraps around a
-/// dart2js mirror.
-abstract class MirrorBased {
- /// The original dart2js mirror around which this object wraps.
- DeclarationMirror get mirror;
-
- /// Returns a list of meta annotations assocated with a mirror.
- static List<Annotation> _createAnnotations(DeclarationMirror mirror,
- Library owningLibrary) {
- var annotationMirrors = mirror.metadata.where((e) =>
- e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
- var annotations = [];
- annotationMirrors.forEach((annotation) {
- var docgenAnnotation = new Annotation(annotation, owningLibrary);
- if (!_SKIPPED_ANNOTATIONS.contains(
- dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
- annotations.add(docgenAnnotation);
- }
- });
- return annotations;
- }
-}
-
/// Top level documentation traversal and generation object.
///
/// Yes, everything in this class is used statically so this technically doesn't
@@ -377,7 +358,7 @@
libs.forEach((lib) {
// Files belonging to the SDK have a uri that begins with 'dart:'.
if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
- var library = generateLibrary(lib);
+ generateLibrary(lib);
}
});
@@ -398,7 +379,7 @@
// Outputs a JSON file with all libraries and their preview comments.
// This will help the viewer know what libraries are available to read in.
- var libraryMap;
+ Map<String, dynamic> libraryMap;
if (append) {
var docsDir = listDir(_outputDirectory);
@@ -430,7 +411,7 @@
/// Output all of the libraries and classes into json or yaml files for
/// consumption by a viewer.
- static void _writeOutputFiles(libraryMap,
+ static void _writeOutputFiles(Map<String, dynamic> libraryMap,
Iterable<Indexable> filteredEntities, bool outputToYaml, bool append,
String startPage) {
if (startPage != null) libraryMap['start-page'] = startPage;
@@ -577,8 +558,9 @@
for (var arg in args) {
if (FileSystemEntity.typeSync(arg) == FileSystemEntityType.FILE) {
if (arg.endsWith('.dart')) {
- libraries.add(new Uri.file(path.absolute(arg)));
- logger.info('Added to libraries: ${libraries.last}');
+ var lib = new Uri.file(path.absolute(arg));
+ libraries.add(lib);
+ logger.info('Added to libraries: $lib');
}
} else {
libraries.addAll(_findFilesToDocumentInPackage(arg));
@@ -594,26 +576,49 @@
// To avoid anaylzing package files twice, only files with paths not
// containing '/packages' will be added. The only exception is if the file
// to analyze already has a '/package' in its path.
- var files = listDir(packageName, recursive: true).where(
- (f) => f.endsWith('.dart') && (!f.contains('${path.separator}packages')
- || packageName.contains('${path.separator}packages'))).toList();
+ var files = listDir(packageName, recursive: true, listDir: _packageDirList)
+ .where((f) => f.endsWith('.dart')
+ && (!f.contains('${path.separator}packages')
+ || packageName.contains('${path.separator}packages'))).toList();
- files.forEach((String f) {
+ files.forEach((String lib) {
// Only include libraries at the top level of "lib"
- if (path.basename(path.dirname(f)) == 'lib') {
+ if (path.basename(path.dirname(lib)) == 'lib') {
// Only add the file if it does not contain 'part of'
// TODO(janicejl): Remove when Issue(12406) is resolved.
- var contents = new File(f).readAsStringSync();
+ var contents = new File(lib).readAsStringSync();
if (!(contents.contains(new RegExp('\npart of ')) ||
contents.startsWith(new RegExp('part of ')))) {
- libraries.add(new Uri.file(path.normalize(path.absolute(f))));
- logger.info('Added to libraries: $f');
+ libraries.add(new Uri.file(path.normalize(path.absolute(lib))));
+ logger.info('Added to libraries: $lib');
}
}
});
return libraries;
}
+ /// If [dir] contains both a `lib` directory and a `pubspec.yaml` file treat
+ /// it like a package and only return the `lib` dir.
+ ///
+ /// This ensures that packages don't have non-`lib` content documented.
+ static List<FileSystemEntity> _packageDirList(Directory dir) {
+ var entities = dir.listSync();
+
+ var pubspec = entities
+ .firstWhere((e) => e is File &&
+ path.basename(e.path) == 'pubspec.yaml', orElse: () => null);
+
+ var libDir = entities
+ .firstWhere((e) => e is Directory &&
+ path.basename(e.path) == 'lib', orElse: () => null);
+
+ if (pubspec != null && libDir != null) {
+ return [libDir];
+ } else {
+ return entities;
+ }
+ }
+
/// All of the directories for our dependent packages
/// If this is not a package, return an empty list.
static List<String> _allDependentPackageDirs(String packageDirectory) {
@@ -648,11 +653,10 @@
}
/// Currently left public for testing purposes. :-/
- static Library generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
+ static void generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
var result = new Library(library);
- result._findPackage(library);
+ result._updateLibraryPackage(library);
logger.fine('Generated library for ${result.name}');
- return result;
}
}
@@ -862,19 +866,15 @@
/// when running dart by default.
static Iterable<LibraryMirror> _sdkLibraries;
+ Library get _owningLibrary => owner._owningLibrary;
+
String get qualifiedName => fileName;
- bool isPrivate;
- DeclarationMirror mirror;
+ final DeclarationMirror mirror;
+ final bool isPrivate;
/// The comment text pre-resolution. We keep this around because inherited
/// methods need to resolve links differently from the superclass.
String _unresolvedComment = '';
- // TODO(janicejl): Make MDN content generic or pluggable. Maybe move
- // MDN-specific code to its own library that is imported into the default
- // impl?
- /// Map of all the comments for dom elements from MDN.
- static Map _mdn;
-
/// Index of all the dart2js mirrors examined to corresponding MirrorBased
/// docgen objects.
///
@@ -884,8 +884,9 @@
static Map<String, Map<String, Set<Indexable>>> _mirrorToDocgen =
new Map<String, Map<String, Set<Indexable>>>();
- Indexable(this.mirror) {
- this.isPrivate = _isHidden(mirror);
+ Indexable(DeclarationMirror mirror)
+ : this.mirror = mirror,
+ this.isPrivate = isHidden(mirror) {
var map = _mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)];
if (map == null) map = new Map<String, Set<Indexable>>();
@@ -897,12 +898,6 @@
_mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)] = map;
}
- /** Walk up the owner chain to find the owning library. */
- Library _getOwningLibrary(Indexable indexable) {
- if (indexable is Library) return indexable;
- return _getOwningLibrary(indexable.owner);
- }
-
static _initializeTopLevelLibraries(MirrorSystem mirrorSystem) {
_sdkLibraries = mirrorSystem.libraries.values.where(
(each) => each.uri.scheme == 'dart');
@@ -930,12 +925,6 @@
String findElementInScope(String name) =>
_findElementInScope(name, packagePrefix);
- /// For a given name, determine if we need to resolve it as a qualified name
- /// or a simple name in the source mirors.
- static determineLookupFunc(name) => name.contains('.') ?
- dart2js_util.lookupQualifiedInScope :
- (mirror, name) => mirror.lookupInScope(name);
-
/// The reference to this element based on where it is printed as a
/// documentation file and also the unique URL to refer to this item.
///
@@ -986,33 +975,6 @@
/// Generates MDN comments from database.json.
String _mdnComment();
- /// Generates the MDN Comment for variables and method DOM elements.
- String _mdnMemberComment(String type, String member) {
- var mdnType = _mdn[type];
- if (mdnType == null) return '';
- var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
- orElse: () => null);
- if (mdnMember == null) return '';
- if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
- if (mdnMember['url'] == null) return '';
- return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
- }
-
- /// Generates the MDN Comment for class DOM elements.
- String _mdnTypeComment(String type) {
- var mdnType = _mdn[type];
- if (mdnType == null) return '';
- if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
- if (mdnType['srcUrl'] == null) return '';
- return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
- }
-
- /// Encloses the given content in an MDN div and the original source link.
- String _htmlifyMdn(String content, String url) {
- return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
- '<a href="' + url.trim() + '">from Mdn</a></p></div>';
- }
-
/// The type of this member to be used in index.txt.
String get typeName => '';
@@ -1081,7 +1043,7 @@
// TODO(janicejl): When map to map feature is created, replace the below
// with a filter. Issue(#9590).
mirrors.forEach((VariableMirror mirror) {
- if (_Generator._includePrivate || !_isHidden(mirror)) {
+ if (_Generator._includePrivate || !isHidden(mirror)) {
var mirrorName = dart2js_util.nameOf(mirror);
data[mirrorName] = new Variable(mirrorName, mirror, owner);
}
@@ -1110,7 +1072,7 @@
var data = {};
mirrorList.forEach((ParameterMirror mirror) {
data[dart2js_util.nameOf(mirror)] =
- new Parameter(mirror, _getOwningLibrary(owner));
+ new Parameter(mirror, owner._owningLibrary);
});
return data;
}
@@ -1128,37 +1090,7 @@
/// Return a map representation of this type.
Map toMap();
- /// A declaration is private if itself is private, or the owner is private.
- // Issue(12202) - A declaration is public even if it's owner is private.
- bool _isHidden(DeclarationMirror mirror) {
- if (mirror is LibraryMirror) {
- return _isLibraryPrivate(mirror);
- } else if (mirror.owner is LibraryMirror) {
- return (mirror.isPrivate || _isLibraryPrivate(mirror.owner)
- || mirror.isNameSynthetic);
- } else {
- return (mirror.isPrivate || _isHidden(mirror.owner)
- || owner.mirror.isNameSynthetic);
- }
- }
- /// Returns true if a library name starts with an underscore, and false
- /// otherwise.
- ///
- /// An example that starts with _ is _js_helper.
- /// An example that contains ._ is dart._collection.dev
- bool _isLibraryPrivate(LibraryMirror mirror) {
- // This method is needed because LibraryMirror.isPrivate returns `false` all
- // the time.
- var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
- if (sdkLibrary != null) {
- return !sdkLibrary.documented;
- } else if (dart2js_util.nameOf(mirror).startsWith('_') ||
- dart2js_util.nameOf(mirror).contains('._')) {
- return true;
- }
- return false;
- }
////// Top level resolution functions
/// Converts all [foo] references in comments to <a>libraryName.foo</a>.
@@ -1182,11 +1114,11 @@
/// version of resolvedBar.
static markdown.Node _fixComplexReference(String name) {
// Parse into multiple elements we can try to resolve.
- var tokens = _tokenizeComplexReference(name);
+ var tokens = tokenizeComplexReference(name);
// Produce an html representation of our elements. Group unresolved and
// plain text are grouped into "link" elements so they display as code.
- final textElements = [' ', ',', '>', _LESS_THAN];
+ final textElements = [' ', ',', '>', LESS_THAN];
var accumulatedHtml = '';
for (var token in tokens) {
@@ -1206,43 +1138,6 @@
return new markdown.Text(accumulatedHtml);
}
-
- // HTML escaped version of '<' character.
- static final _LESS_THAN = '<';
-
- /// Chunk the provided name into individual parts to be resolved. We take a
- /// simplistic approach to chunking, though, we break at " ", ",", "<"
- /// and ">". All other characters are grouped into the name to be resolved.
- /// As a result, these characters will all be treated as part of the item to
- /// be resolved (aka the * is interpreted literally as a *, not as an
- /// indicator for bold <em>.
- static List<String> _tokenizeComplexReference(String name) {
- var tokens = [];
- var append = false;
- var index = 0;
- while(index < name.length) {
- if (name.indexOf(_LESS_THAN, index) == index) {
- tokens.add(_LESS_THAN);
- append = false;
- index += _LESS_THAN.length;
- } else if (name[index] == ' ' || name[index] == ',' ||
- name[index] == '>') {
- tokens.add(name[index]);
- append = false;
- index++;
- } else {
- if (append) {
- tokens[tokens.length - 1] = tokens.last + name[index];
- } else {
- tokens.add(name[index]);
- append = true;
- }
- index++;
- }
- }
- return tokens;
- }
-
static String _findElementInScope(String name, String packagePrefix) {
var lookupFunc = determineLookupFunc(name);
// Look in the dart core library scope.
@@ -1278,39 +1173,18 @@
/// Expand the method map [mapToExpand] into a more detailed map that
/// separates out setters, getters, constructors, operators, and methods.
Map _expandMethodMap(Map<String, Method> mapToExpand) => {
- 'setters': recurseMap(_filterMap(mapToExpand,
+ 'setters': recurseMap(filterMap(mapToExpand,
(key, val) => val.mirror.isSetter)),
- 'getters': recurseMap(_filterMap(mapToExpand,
+ 'getters': recurseMap(filterMap(mapToExpand,
(key, val) => val.mirror.isGetter)),
- 'constructors': recurseMap(_filterMap(mapToExpand,
+ 'constructors': recurseMap(filterMap(mapToExpand,
(key, val) => val.mirror.isConstructor)),
- 'operators': recurseMap(_filterMap(mapToExpand,
+ 'operators': recurseMap(filterMap(mapToExpand,
(key, val) => val.mirror.isOperator)),
- 'methods': recurseMap(_filterMap(mapToExpand,
+ 'methods': recurseMap(filterMap(mapToExpand,
(key, val) => val.mirror.isRegularMethod && !val.mirror.isOperator))
};
- /// Transforms the map by calling toMap on each value in it.
- Map recurseMap(Map inputMap) {
- var outputMap = {};
- inputMap.forEach((key, value) {
- if (value is Map) {
- outputMap[key] = recurseMap(value);
- } else {
- outputMap[key] = value.toMap();
- }
- });
- return outputMap;
- }
-
- Map _filterMap(Map map, Function test) {
- var exported = new Map();
- map.forEach((key, value) {
- if (test(key, value)) exported[key] = value;
- });
- return exported;
- }
-
/// Accessor to determine if this item and all of its owners are visible.
bool get _isVisible => _Generator._isFullChainVisible(this);
@@ -1365,6 +1239,9 @@
/// A class containing contents of a Dart library.
class Library extends Indexable {
+ final Map<String, Class> classes = {};
+ final Map<String, Typedef> typedefs = {};
+ final Map<String, Class> errors = {};
/// Top-level variables in the library.
Map<String, Variable> variables;
@@ -1372,14 +1249,12 @@
/// Top-level functions in the library.
Map<String, Method> functions;
- Map<String, Class> classes = {};
- Map<String, Typedef> typedefs = {};
- Map<String, Class> errors = {};
-
String packageName = '';
bool _hasBeenCheckedForPackage = false;
String packageIntro;
+ Library get _owningLibrary => this;
+
/// Returns the [Library] for the given [mirror] if it has already been
/// created, else creates it.
factory Library(LibraryMirror mirror) {
@@ -1394,10 +1269,7 @@
var exported = _calcExportedItems(libraryMirror);
var exportedClasses = _addAll(exported['classes'],
dart2js_util.typesOf(libraryMirror.declarations));
- _findPackage(mirror);
- classes = {};
- typedefs = {};
- errors = {};
+ _updateLibraryPackage(mirror);
exportedClasses.forEach((String mirrorName, TypeMirror mirror) {
if (mirror is TypedefMirror) {
// This is actually a Dart2jsTypedefMirror, and it does define value,
@@ -1428,7 +1300,7 @@
/// Look for the specified name starting with the current member, and
/// progressively working outward to the current library scope.
String findElementInScope(String name) {
- var lookupFunc = Indexable.determineLookupFunc(name);
+ var lookupFunc = determineLookupFunc(name);
var libraryScope = lookupFunc(mirror, name);
if (libraryScope != null) {
var result = Indexable.getDocgenObject(libraryScope, this);
@@ -1441,7 +1313,7 @@
String _mdnComment() => '';
/// Helper that maps [mirrors] to their simple name in map.
- Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
+ static Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
for (var mirror in mirrors) {
map[dart2js_util.nameOf(mirror)] = mirror;
}
@@ -1452,17 +1324,16 @@
/// believe it came from (because of its file URI).
///
/// If no package could be determined, we return an empty string.
- String _findPackage(LibraryMirror mirror) {
- if (mirror == null) return '';
- if (_hasBeenCheckedForPackage) return packageName;
+ void _updateLibraryPackage(LibraryMirror mirror) {
+ if (mirror == null) return;
+ if (_hasBeenCheckedForPackage) return;
_hasBeenCheckedForPackage = true;
- if (mirror.uri.scheme != 'file') return '';
+ if (mirror.uri.scheme != 'file') return;
packageName = _packageName(mirror);
// Associate the package readme with all the libraries. This is a bit
// wasteful, but easier than trying to figure out which partial match
// is best.
packageIntro = _packageIntro(_getPackageDirectory(mirror));
- return packageName;
}
String _packageIntro(packageDir) {
@@ -1569,7 +1440,7 @@
// Determine the classes, variables and methods that are exported for a
// specific dependency.
- _populateExports(LibraryDependencyMirror export, bool showExport) {
+ void _populateExports(LibraryDependencyMirror export, bool showExport) {
if (!showExport) {
// Add all items, and then remove the hidden ones.
// Ex: "export foo hide bar"
@@ -1667,29 +1538,13 @@
/// Generates MDN comments from database.json.
String _mdnComment() {
- //Check if MDN is loaded.
- if (Indexable._mdn == null) {
- // Reading in MDN related json file.
- var root = _Generator._rootDirectory;
- var mdnPath = path.join(root, 'utils/apidoc/mdn/database.json');
- var mdnFile = new File(mdnPath);
- if (mdnFile.existsSync()) {
- Indexable._mdn = JSON.decode(mdnFile.readAsStringSync());
- } else {
- _Generator.logger.warning("Cannot find MDN docs expected at $mdnPath");
- Indexable._mdn = {};
- }
- }
var domAnnotation = this.annotations.firstWhere(
(e) => e.mirror.qualifiedName == #metadata.DomName,
orElse: () => null);
if (domAnnotation == null) return '';
var domName = domAnnotation.parameters.single;
- var parts = domName.split('.');
- if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
- if (parts.length == 1) return _mdnTypeComment(parts[0]);
- throw new StateError('More than two items is not supported: $parts');
+ return mdnComment(_Generator._rootDirectory, _Generator.logger, domName);
}
String get packagePrefix => owner.packagePrefix;
@@ -1768,7 +1623,7 @@
dart2js_util.variablesOf(classMirror.declarations), this);
methods = _createMethods(classMirror.declarations.values.where(
(mirror) => mirror is MethodMirror), this);
- annotations = MirrorBased._createAnnotations(classMirror, _getOwningLibrary(owner));
+ annotations = _createAnnotations(classMirror, owner._owningLibrary);
generics = _createGenerics(classMirror);
isAbstract = classMirror.isAbstract;
inheritedMethods = new Map<String, Method>();
@@ -1784,7 +1639,7 @@
}
String _lookupInClassAndSuperclasses(String name) {
- var lookupFunc = Indexable.determineLookupFunc(name);
+ var lookupFunc = determineLookupFunc(name);
var classScope = this;
while (classScope != null) {
var classFunc = lookupFunc(classScope.mirror, name);
@@ -1799,7 +1654,7 @@
/// Look for the specified name starting with the current member, and
/// progressively working outward to the current library scope.
String findElementInScope(String name) {
- var lookupFunc = Indexable.determineLookupFunc(name);
+ var lookupFunc = determineLookupFunc(name);
var result = _lookupInClassAndSuperclasses(name);
if (result != null) {
return result;
@@ -1951,7 +1806,7 @@
returnType = Indexable.getDocgenObject(mirror.referent.returnType).docName;
generics = _createGenerics(mirror);
parameters = _createParameters(mirror.referent.parameters, owningLibrary);
- annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+ annotations = _createAnnotations(mirror, owningLibrary);
}
Map toMap() {
@@ -2003,8 +1858,8 @@
isFinal = mirror.isFinal;
isStatic = mirror.isStatic;
isConst = mirror.isConst;
- type = new Type(mirror.type, _getOwningLibrary(owner));
- annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+ type = new Type(mirror.type, owner._owningLibrary);
+ annotations = _createAnnotations(mirror, owner._owningLibrary);
}
String get name => _variableName;
@@ -2032,7 +1887,7 @@
}
String findElementInScope(String name) {
- var lookupFunc = Indexable.determineLookupFunc(name);
+ var lookupFunc = determineLookupFunc(name);
var result = lookupFunc(mirror, name);
if (result != null) {
result = Indexable.getDocgenObject(result);
@@ -2081,9 +1936,9 @@
isStatic = mirror.isStatic;
isAbstract = mirror.isAbstract;
isConst = mirror.isConstConstructor;
- returnType = new Type(mirror.returnType, _getOwningLibrary(owner));
+ returnType = new Type(mirror.returnType, owner._owningLibrary);
parameters = _createParameters(mirror.parameters, owner);
- annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+ annotations = _createAnnotations(mirror, owner._owningLibrary);
}
Method get originallyInheritedFrom => methodInheritedFrom == null ?
@@ -2092,7 +1947,7 @@
/// Look for the specified name starting with the current member, and
/// progressively working outward to the current library scope.
String findElementInScope(String name) {
- var lookupFunc = Indexable.determineLookupFunc(name);
+ var lookupFunc = determineLookupFunc(name);
var memberScope = lookupFunc(this.mirror, name);
if (memberScope != null) {
@@ -2212,7 +2067,7 @@
hasDefaultValue = mirror.hasDefaultValue,
defaultValue = '${mirror.defaultValue}',
type = new Type(mirror.type, owningLibrary),
- annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+ annotations = _createAnnotations(mirror, owningLibrary);
/// Generates a map describing the [Parameter] object.
Map toMap() => {
@@ -2226,16 +2081,6 @@
};
}
-/// A Docgen wrapper around the dart2js mirror for a generic type.
-class Generic extends MirrorBased {
- final TypeVariableMirror mirror;
- Generic(this.mirror);
- Map toMap() => {
- 'name': dart2js_util.nameOf(mirror),
- 'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
- };
-}
-
/// Docgen wrapper around the mirror for a return type, and/or its generic
/// type parameters.
///
@@ -2315,3 +2160,19 @@
'parameters': parameters
};
}
+
+/// Returns a list of meta annotations assocated with a mirror.
+List<Annotation> _createAnnotations(DeclarationMirror mirror,
+ Library owningLibrary) {
+ var annotationMirrors = mirror.metadata.where((e) =>
+ e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
+ var annotations = [];
+ annotationMirrors.forEach((annotation) {
+ var docgenAnnotation = new Annotation(annotation, owningLibrary);
+ if (!_SKIPPED_ANNOTATIONS.contains(
+ dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
+ annotations.add(docgenAnnotation);
+ }
+ });
+ return annotations;
+}
diff --git a/pkg/docgen/lib/dart2yaml.dart b/pkg/docgen/lib/src/dart2yaml.dart
similarity index 98%
rename from pkg/docgen/lib/dart2yaml.dart
rename to pkg/docgen/lib/src/dart2yaml.dart
index b86cbb4..ac0a8ee 100644
--- a/pkg/docgen/lib/dart2yaml.dart
+++ b/pkg/docgen/lib/src/dart2yaml.dart
@@ -5,7 +5,7 @@
/**
* This library is used to convert data from a map to a YAML string.
*/
-library dart2yaml;
+library docgen.dart2yaml;
/**
* Gets a String representing the input Map in YAML format.
diff --git a/pkg/docgen/lib/src/io.dart b/pkg/docgen/lib/src/io.dart
index 9998687..65e69e8 100644
--- a/pkg/docgen/lib/src/io.dart
+++ b/pkg/docgen/lib/src/io.dart
@@ -1,151 +1,61 @@
-library io;
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
/// This is a helper library to make working with io easier.
+library docgen.io;
+
// TODO(janicejl): listDir, canonicalize, resolveLink, and linkExists are from
// pub/lib/src/io.dart. If the io.dart file becomes a package, should remove
// copy of the functions.
-import 'dart:collection';
import 'dart:io';
import 'package:path/path.dart' as path;
-/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
-/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
-/// and directories beginning with `.` (defaults to `false`).
+/// Lists the contents of [dir].
+///
+/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
+///
+/// Excludes files and directories beginning with `.`
///
/// The returned paths are guaranteed to begin with [dir].
List<String> listDir(String dir, {bool recursive: false,
- bool includeHidden: false}) {
- List<String> doList(String dir, Set<String> listedDirectories) {
- var contents = <String>[];
+ List<FileSystemEntity> listDir(Directory dir)}) {
+ if (listDir == null) listDir = (Directory dir) => dir.listSync();
- // Avoid recursive symlinks.
- var resolvedPath = canonicalize(dir);
- if (listedDirectories.contains(resolvedPath)) return [];
-
- listedDirectories = new Set<String>.from(listedDirectories);
- listedDirectories.add(resolvedPath);
-
- var children = <String>[];
- for (var entity in new Directory(dir).listSync()) {
- if (!includeHidden && path.basename(entity.path).startsWith('.')) {
- continue;
- }
-
- contents.add(entity.path);
- if (entity is Directory) {
- // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
- // Note that once we remove the manual recursion, we'll need to
- // explicitly filter out files in hidden directories.
- if (recursive) {
- children.addAll(doList(entity.path, listedDirectories));
- }
- }
- }
-
- contents.addAll(children);
- return contents;
- }
-
- return doList(dir, new Set<String>());
+ return _doList(dir, new Set<String>(), recursive, listDir);
}
-/// Returns the canonical path for [pathString]. This is the normalized,
-/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
-/// recursive symlinks will not be fully resolved.
-///
-/// This doesn't require [pathString] to point to a path that exists on the
-/// filesystem; nonexistent or unreadable path entries are treated as normal
-/// directories.
-String canonicalize(String pathString) {
- var seen = new Set<String>();
- var components = new Queue<String>.from(
- path.split(path.normalize(path.absolute(pathString))));
+List<String> _doList(String dir, Set<String> listedDirectories, bool recurse,
+ List<FileSystemEntity> listDir(Directory dir)) {
+ var contents = <String>[];
- // The canonical path, built incrementally as we iterate through [components].
- var newPath = components.removeFirst();
+ // Avoid recursive symlinks.
+ var resolvedPath = new Directory(dir).resolveSymbolicLinksSync();
+ if (listedDirectories.contains(resolvedPath)) return [];
- // Move through the components of the path, resolving each one's symlinks as
- // necessary. A resolved component may also add new components that need to be
- // resolved in turn.
- while (!components.isEmpty) {
- seen.add(path.join(newPath, path.joinAll(components)));
- var resolvedPath = resolveLink(
- path.join(newPath, components.removeFirst()));
- var relative = path.relative(resolvedPath, from: newPath);
+ listedDirectories = new Set<String>.from(listedDirectories);
+ listedDirectories.add(resolvedPath);
- // If the resolved path of the component relative to `newPath` is just ".",
- // that means component was a symlink pointing to its parent directory. We
- // can safely ignore such components.
- if (relative == '.') continue;
-
- var relativeComponents = new Queue<String>.from(path.split(relative));
-
- // If the resolved path is absolute relative to `newPath`, that means it's
- // on a different drive. We need to canonicalize the entire target of that
- // symlink again.
- if (path.isAbsolute(relative)) {
- // If we've already tried to canonicalize the new path, we've encountered
- // a symlink loop. Avoid going infinite by treating the recursive symlink
- // as the canonical path.
- if (seen.contains(relative)) {
- newPath = relative;
- } else {
- newPath = relativeComponents.removeFirst();
- relativeComponents.addAll(components);
- components = relativeComponents;
- }
+ var children = <String>[];
+ for (var entity in listDir(new Directory(dir))) {
+ // Skip hidden files and directories
+ if (path.basename(entity.path).startsWith('.')) {
continue;
}
- // Pop directories off `newPath` if the component links upwards in the
- // directory hierarchy.
- while (relativeComponents.first == '..') {
- newPath = path.dirname(newPath);
- relativeComponents.removeFirst();
+ contents.add(entity.path);
+ if (entity is Directory) {
+ // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
+ // Note that once we remove the manual recursion, we'll need to
+ // explicitly filter out files in hidden directories.
+ if (recurse) {
+ children.addAll(_doList(entity.path, listedDirectories, recurse,
+ listDir));
+ }
}
-
- // If there's only one component left, [resolveLink] guarantees that it's
- // not a link (or is a broken link). We can just add it to `newPath` and
- // continue resolving the remaining components.
- if (relativeComponents.length == 1) {
- newPath = path.join(newPath, relativeComponents.single);
- continue;
- }
-
- // If we've already tried to canonicalize the new path, we've encountered a
- // symlink loop. Avoid going infinite by treating the recursive symlink as
- // the canonical path.
- var newSubPath = path.join(newPath, path.joinAll(relativeComponents));
- if (seen.contains(newSubPath)) {
- newPath = newSubPath;
- continue;
- }
-
- // If there are multiple new components to resolve, add them to the
- // beginning of the queue.
- relativeComponents.addAll(components);
- components = relativeComponents;
}
- return newPath;
-}
-/// Returns the transitive target of [link] (if A links to B which links to C,
-/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
-/// which links back to A), this returns the path to the first repeated link (so
-/// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
-/// return `"B"`).
-///
-/// This accepts paths to non-links or broken links, and returns them as-is.
-String resolveLink(String link) {
- var seen = new Set<String>();
- while (linkExists(link) && !seen.contains(link)) {
- seen.add(link);
- link = path.normalize(path.join(
- path.dirname(link), new Link(link).targetSync()));
- }
- return link;
+ contents.addAll(children);
+ return contents;
}
-
-/// Returns whether [link] exists on the file system. This will return `true`
-/// for any symlink, regardless of what it points at or whether it's broken.
-bool linkExists(String link) => new Link(link).existsSync();
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/mdn.dart b/pkg/docgen/lib/src/mdn.dart
new file mode 100644
index 0000000..073dbdd
--- /dev/null
+++ b/pkg/docgen/lib/src/mdn.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library docgen.mdn;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+// TODO(janicejl): Make MDN content generic or pluggable.
+
+/// Map of all the comments for dom elements from MDN.
+Map<String, dynamic> _mdn;
+
+/// Generates MDN comments from database.json.
+String mdnComment(String root, Logger logger, String domName) {
+ //Check if MDN is loaded.
+ if (_mdn == null) {
+ // Reading in MDN related json file.
+ var mdnPath = p.join(root, 'utils/apidoc/mdn/database.json');
+ var mdnFile = new File(mdnPath);
+ if (mdnFile.existsSync()) {
+ _mdn = JSON.decode(mdnFile.readAsStringSync());
+ } else {
+ logger.warning("Cannot find MDN docs expected at $mdnPath");
+ _mdn = {};
+ }
+ }
+
+ var parts = domName.split('.');
+ if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
+ if (parts.length == 1) return _mdnTypeComment(parts[0]);
+
+ throw new StateError('More than two items is not supported: $parts');
+}
+
+/// Generates the MDN Comment for variables and method DOM elements.
+String _mdnMemberComment(String type, String member) {
+ var mdnType = _mdn[type];
+ if (mdnType == null) return '';
+ var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
+ orElse: () => null);
+ if (mdnMember == null) return '';
+ if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
+ if (mdnMember['url'] == null) return '';
+ return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
+}
+
+/// Generates the MDN Comment for class DOM elements.
+String _mdnTypeComment(String type) {
+ var mdnType = _mdn[type];
+ if (mdnType == null) return '';
+ if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
+ if (mdnType['srcUrl'] == null) return '';
+ return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
+}
+
+/// Encloses the given content in an MDN div and the original source link.
+String _htmlifyMdn(String content, String url) {
+ return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
+ '<a href="' + url.trim() + '">from Mdn</a></p></div>';
+}
diff --git a/pkg/docgen/lib/src/models.dart b/pkg/docgen/lib/src/models.dart
new file mode 100644
index 0000000..32f4a43
--- /dev/null
+++ b/pkg/docgen/lib/src/models.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library docgen.models;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+ as dart2js_util;
+
+/// Docgen representation of an item to be documented, that wraps around a
+/// dart2js mirror.
+abstract class MirrorBased {
+ /// The original dart2js mirror around which this object wraps.
+ DeclarationMirror get mirror;
+}
+
+/// A Docgen wrapper around the dart2js mirror for a generic type.
+class Generic extends MirrorBased {
+ final TypeVariableMirror mirror;
+
+ Generic(this.mirror);
+
+ Map toMap() => {
+ 'name': dart2js_util.nameOf(mirror),
+ 'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
+ };
+}
diff --git a/pkg/docgen/lib/src/utils.dart b/pkg/docgen/lib/src/utils.dart
new file mode 100644
index 0000000..8915af4
--- /dev/null
+++ b/pkg/docgen/lib/src/utils.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library docgen.utils;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+ as dart2js_util;
+import '../../../../sdk/lib/_internal/libraries.dart';
+
+// HTML escaped version of '<' character.
+const LESS_THAN = '<';
+
+/// A declaration is private if itself is private, or the owner is private.
+// Issue(12202) - A declaration is public even if it's owner is private.
+bool isHidden(DeclarationMirror mirror) {
+ if (mirror is LibraryMirror) {
+ return _isLibraryPrivate(mirror);
+ } else if (mirror.owner is LibraryMirror) {
+ return (mirror.isPrivate || _isLibraryPrivate(mirror.owner) ||
+ mirror.isNameSynthetic);
+ } else {
+ return (mirror.isPrivate || isHidden(mirror.owner) ||
+ mirror.isNameSynthetic);
+ }
+}
+
+/// Returns true if a library name starts with an underscore, and false
+/// otherwise.
+///
+/// An example that starts with _ is _js_helper.
+/// An example that contains ._ is dart._collection.dev
+bool _isLibraryPrivate(LibraryMirror mirror) {
+ // This method is needed because LibraryMirror.isPrivate returns `false` all
+ // the time.
+ var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
+ if (sdkLibrary != null) {
+ return !sdkLibrary.documented;
+ } else if (dart2js_util.nameOf(mirror).startsWith('_') || dart2js_util.nameOf(
+ mirror).contains('._')) {
+ return true;
+ }
+ return false;
+}
+
+/// Transforms the map by calling toMap on each value in it.
+Map recurseMap(Map inputMap) {
+ var outputMap = {};
+ inputMap.forEach((key, value) {
+ if (value is Map) {
+ outputMap[key] = recurseMap(value);
+ } else {
+ outputMap[key] = value.toMap();
+ }
+ });
+ return outputMap;
+}
+
+Map filterMap(Map map, Function test) {
+ var exported = new Map();
+ map.forEach((key, value) {
+ if (test(key, value)) exported[key] = value;
+ });
+ return exported;
+}
+
+/// Chunk the provided name into individual parts to be resolved. We take a
+/// simplistic approach to chunking, though, we break at " ", ",", "<"
+/// and ">". All other characters are grouped into the name to be resolved.
+/// As a result, these characters will all be treated as part of the item to
+/// be resolved (aka the * is interpreted literally as a *, not as an
+/// indicator for bold <em>.
+List<String> tokenizeComplexReference(String name) {
+ var tokens = [];
+ var append = false;
+ var index = 0;
+ while (index < name.length) {
+ if (name.indexOf(LESS_THAN, index) == index) {
+ tokens.add(LESS_THAN);
+ append = false;
+ index += LESS_THAN.length;
+ } else if (name[index] == ' ' || name[index] == ',' || name[index] == '>') {
+ tokens.add(name[index]);
+ append = false;
+ index++;
+ } else {
+ if (append) {
+ tokens[tokens.length - 1] = tokens.last + name[index];
+ } else {
+ tokens.add(name[index]);
+ append = true;
+ }
+ index++;
+ }
+ }
+ return tokens;
+}
+
+typedef DeclarationMirror LookupFunction(DeclarationSourceMirror declaration,
+ String name);
+
+/// For a given name, determine if we need to resolve it as a qualified name
+/// or a simple name in the source mirors.
+LookupFunction determineLookupFunc(String name) => name.contains('.') ?
+ dart2js_util.lookupQualifiedInScope :
+ (mirror, name) => mirror.lookupInScope(name);
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index f158dab..68a3a12 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -1,4 +1,9 @@
-import 'dart:convert';
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 docgen.generate_json_test;
+
import 'dart:io';
import 'package:path/path.dart' as p;
@@ -12,94 +17,29 @@
void main() {
setUp(() {
- var tempDir;
- schedule(() {
- return Directory.systemTemp
- .createTemp('docgen_test-')
- .then((dir) {
- tempDir = dir;
- d.defaultRoot = tempDir.path;
- });
- });
-
- currentSchedule.onComplete.schedule(() {
- d.defaultRoot = null;
- return tempDir.delete(recursive: true);
- });
- });
+ scheduleTempDir();
+ });
test('json output', () {
schedule(() {
var codeDir = getMultiLibraryCodePath();
expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
- return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+ return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
});
d.dir('docs', [
- d.matcherFile('index.json', _isJsonMap),
- d.matcherFile('index.txt', _hasSortedLines),
- d.matcherFile('library_list.json', _isJsonMap),
- d.matcherFile('testLib-bar.C.json', _isJsonMap),
- d.matcherFile('testLib-bar.json', _isJsonMap),
- d.matcherFile('testLib.A.json', _isJsonMap),
- d.matcherFile('testLib.B.json', _isJsonMap),
- d.matcherFile('testLib.C.json', _isJsonMap),
- d.matcherFile('testLib.json', _isJsonMap),
- d.matcherFile('testLib2-foo.B.json', _isJsonMap),
- d.matcherFile('testLib2-foo.json', _isJsonMap)
+ d.matcherFile('index.json', isJsonMap),
+ d.matcherFile('index.txt', hasSortedLines),
+ d.matcherFile('library_list.json', isJsonMap),
+ d.matcherFile('test_lib-bar.C.json', isJsonMap),
+ d.matcherFile('test_lib-bar.json', isJsonMap),
+ d.matcherFile('test_lib-foo.B.json', isJsonMap),
+ d.matcherFile('test_lib-foo.json', isJsonMap),
+ d.matcherFile('test_lib.A.json', isJsonMap),
+ d.matcherFile('test_lib.B.json', isJsonMap),
+ d.matcherFile('test_lib.C.json', isJsonMap),
+ d.matcherFile('test_lib.json', isJsonMap),
]).validate();
});
-
- test('typedef gen', () {
- schedule(() {
- var codeDir = getMultiLibraryCodePath();
- expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
- return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
- });
-
- schedule(() {
- var dartCoreJson = new File(p.join(d.defaultRoot, 'docs', 'testLib-bar.json'))
- .readAsStringSync();
-
- var dartCore = JSON.decode(dartCoreJson) as Map<String, dynamic>;
-
- var classes = dartCore['classes'] as Map<String, dynamic>;
-
- expect(classes, hasLength(3));
-
- expect(classes['class'], isList);
- expect(classes['error'], isList);
-
- var typeDefs = classes['typedef'] as Map<String, dynamic>;
- var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
-
- var expectedPreview = '<p>A trivial use of <code>A</code> to eliminate '
- 'import warnings.</p>';
-
- expect(comparator['preview'], expectedPreview);
-
- var expectedComment = expectedPreview +
- '\n<p>And to test typedef preview.</p>';
-
- expect(comparator['comment'], expectedComment);
- });
- });
}
-
-final Matcher _hasSortedLines = predicate((String input) {
- var lines = new LineSplitter().convert(input);
-
- var sortedLines = new List.from(lines)..sort();
-
- var orderedMatcher = orderedEquals(sortedLines);
- return orderedMatcher.matches(lines, {});
-}, 'String has sorted lines');
-
-final Matcher _isJsonMap = predicate((input) {
- try {
- return JSON.decode(input) is Map;
- } catch (e) {
- return false;
- }
-}, 'Output is JSON encoded Map');
diff --git a/pkg/docgen/lib/dottedLibraryName.dart b/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
similarity index 100%
rename from pkg/docgen/lib/dottedLibraryName.dart
rename to pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
diff --git a/pkg/docgen/test/multi_library_code/lib/temp3.dart b/pkg/docgen/test/multi_library_code/lib/temp3.dart
deleted file mode 100644
index fa1d74a..0000000
--- a/pkg/docgen/test/multi_library_code/lib/temp3.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-library testLib.bar;
-import 'temp.dart';
-
-/*
- * Normal comment for class C.
- */
-class C {
-}
-
-/// A trivial use of `A` to eliminate import warnings.
-///
-/// And to test typedef preview.
-typedef A AnATransformer(A input);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp.dart b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
similarity index 75%
rename from pkg/docgen/test/multi_library_code/lib/temp.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib.dart
index 694a8a7..ab0a577 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
@@ -1,8 +1,9 @@
-library testLib;
-import 'temp2.dart';
-import 'temp3.dart';
-export 'temp2.dart';
-export 'temp3.dart';
+library test_lib;
+
+import 'test_lib_foo.dart';
+import 'test_lib_bar.dart';
+export 'test_lib_foo.dart';
+export 'test_lib_bar.dart';
/**
* Doc comment for class [A].
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
new file mode 100644
index 0000000..c329a43
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
@@ -0,0 +1,19 @@
+library test_lib.bar;
+
+import 'test_lib.dart';
+
+/*
+ * Normal comment for class C.
+ */
+class C {
+}
+
+/// [input] is of type [C] returns an [A].
+A generateFoo(C input) {
+ throw 'noop';
+}
+
+/// Processes a [C] instance for testing.
+///
+/// To eliminate import warnings for [A] and to test typedefs.
+typedef A AnATransformer(C other);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
similarity index 88%
rename from pkg/docgen/test/multi_library_code/lib/temp2.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
index ad62c09..f933f7f 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp2.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
@@ -1,5 +1,6 @@
-library testLib2.foo;
-import 'temp.dart';
+library test_lib.foo;
+
+import 'test_lib.dart';
/**
* Doc comment for class [B].
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
index 7cb6fab..bf5e551 100644
--- a/pkg/docgen/test/multi_library_test.dart
+++ b/pkg/docgen/test/multi_library_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
library single_library_test;
import 'package:path/path.dart' as p;
@@ -14,7 +18,7 @@
codePath = p.join(codePath, 'lib');
- return ['temp.dart', 'temp2.dart', 'temp3.dart']
+ return ['test_lib.dart', 'test_lib_bar.dart', 'test_lib_foo.dart']
.map((name) => p.join(codePath, name))
.map(p.toUri)
.toList();
@@ -26,14 +30,14 @@
var files = _writeLibFiles();
return getMirrorSystem(files)
.then((mirrorSystem) {
- var testLibraryUri = files[0];
- var library = new Library(mirrorSystem.libraries[testLibraryUri]);
+ var test_libraryUri = files[0];
+ var library = new Library(mirrorSystem.libraries[test_libraryUri]);
/// Testing fixReference
// Testing Doc comment for class [B].
- var libraryMirror = mirrorSystem.libraries[testLibraryUri];
+ var libraryMirror = mirrorSystem.libraries[test_libraryUri];
var classDocComment = library.fixReference('B').children.first.text;
- expect(classDocComment, 'testLib.B');
+ expect(classDocComment, 'test_lib.B');
// Test for linking to parameter [c]
var importedLib = libraryMirror.libraryDependencies.firstWhere(
@@ -41,7 +45,7 @@
var aClassMirror =
dart2js_util.classesOf(importedLib.declarations).first;
expect(dart2js_util.qualifiedNameOf(aClassMirror),
- 'testLib2.foo.B');
+ 'test_lib.foo.B');
var exportedClass = Indexable.getDocgenObject(aClassMirror, library);
expect(exportedClass is Class, isTrue);
@@ -50,17 +54,17 @@
expect(method is Method, isTrue);
var methodParameterDocComment = method.fixReference(
'c').children.first.text;
- expect(methodParameterDocComment, 'testLib.B.doThis.c');
+ expect(methodParameterDocComment, 'test_lib.B.doThis.c');
- expect(method.fixReference('A').children.first.text, 'testLib.A');
+ expect(method.fixReference('A').children.first.text, 'test_lib.A');
// Testing trying to refer to doThis function
expect(method.fixReference('doThis').children.first.text,
- 'testLib.B.doThis');
+ 'test_lib.B.doThis');
// Testing trying to refer to doThis function
expect(method.fixReference('doElse').children.first.text,
- 'testLib.B.doElse');
+ 'test_lib.B.doElse');
// Test a third library referencing another exported library in a
@@ -68,21 +72,21 @@
importedLib = libraryMirror.libraryDependencies.firstWhere(
(dep) => dep.isImport &&
dart2js_util.qualifiedNameOf(dep.targetLibrary) ==
- 'testLib.bar').targetLibrary;
+ 'test_lib.bar').targetLibrary;
aClassMirror = dart2js_util.classesOf(importedLib.declarations).first;
expect(dart2js_util.qualifiedNameOf(aClassMirror),
- 'testLib.bar.C');
+ 'test_lib.bar.C');
exportedClass = Indexable.getDocgenObject(aClassMirror, library);
expect(exportedClass is Class, isTrue);
- expect(exportedClass.docName, 'testLib.C');
+ expect(exportedClass.docName, 'test_lib.C');
methodParameterDocComment = exportedClass.fixReference(
'B').children.first.text;
- expect(methodParameterDocComment, 'testLib.B');
+ expect(methodParameterDocComment, 'test_lib.B');
methodParameterDocComment = exportedClass.fixReference(
'testFunc').children.first.text;
- expect(methodParameterDocComment, 'testLib.testFunc');
+ expect(methodParameterDocComment, 'test_lib.testFunc');
});
});
diff --git a/pkg/docgen/test/only_lib_content_in_pkg_test.dart b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
new file mode 100644
index 0000000..6df4a74
--- /dev/null
+++ b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library docgen.test.only_lib_content_in_pkg;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import '../lib/docgen.dart' as dg;
+import 'util.dart';
+
+void main() {
+
+ setUp(() {
+ scheduleTempDir();
+ });
+
+ test('exclude non-lib code from package docs', () {
+ schedule(() {
+ var thisScript = Platform.script;
+ var thisPath = p.fromUri(thisScript);
+ expect(p.basename(thisPath), 'only_lib_content_in_pkg_test.dart');
+ expect(p.dirname(thisPath), endsWith('test'));
+
+
+ var codeDir = p.normalize(p.join(thisPath, '..', '..'));
+ print(codeDir);
+ expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+ return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+ });
+
+ d.dir('docs', [
+ d.dir('docgen', [
+ d.matcherFile('docgen.json', isJsonMap)
+ ]),
+ d.matcherFile('index.json', isJsonMap),
+ d.matcherFile('index.txt', hasSortedLines),
+ d.matcherFile('library_list.json', isJsonMap),
+ d.nothing('test_lib.json'),
+ d.nothing('test_lib-bar.json'),
+ d.nothing('test_lib-foo.json')
+ ]).validate();
+
+ });
+}
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
index 1d7ded5..11b226b 100644
--- a/pkg/docgen/test/single_library_test.dart
+++ b/pkg/docgen/test/single_library_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
library single_library_test;
import 'dart:io';
diff --git a/pkg/docgen/test/typedef_test.dart b/pkg/docgen/test/typedef_test.dart
new file mode 100644
index 0000000..5defa66
--- /dev/null
+++ b/pkg/docgen/test/typedef_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 docgen.test.typedef;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import 'util.dart';
+import '../lib/docgen.dart' as dg;
+
+void main() {
+
+ setUp(() {
+ scheduleTempDir();
+ });
+
+ test('typedef gen', () {
+ schedule(() {
+ var codeDir = getMultiLibraryCodePath();
+ expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+ return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
+ });
+
+ schedule(() {
+ var path = p.join(d.defaultRoot, 'docs', 'test_lib-bar.json');
+ var dartCoreJson = new File(path).readAsStringSync();
+
+ var testLibBar = JSON.decode(dartCoreJson) as Map<String, dynamic>;
+
+ //
+ // Validate function doc references
+ //
+ var generateFoo = testLibBar['functions']['methods']['generateFoo']
+ as Map<String, dynamic>;
+
+ expect(generateFoo['comment'], '<p><a>test_lib-bar.generateFoo.input</a> '
+ 'is of type <a>test_lib-bar.C</a> returns an <a>test_lib.A</a>.</p>');
+
+ var classes = testLibBar['classes'] as Map<String, dynamic>;
+
+ expect(classes, hasLength(3));
+
+ expect(classes['class'], isList);
+ expect(classes['error'], isList);
+
+ var typeDefs = classes['typedef'] as Map<String, dynamic>;
+ var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
+
+ var expectedPreview = '<p>Processes a [C] instance for testing.</p>';
+
+ expect(comparator['preview'], expectedPreview);
+
+ var expectedComment = expectedPreview + '\n'
+ '<p>To eliminate import warnings for [A] and to test typedefs.</p>';
+
+ expect(comparator['comment'], expectedComment);
+ });
+ });
+}
diff --git a/pkg/docgen/test/util.dart b/pkg/docgen/test/util.dart
index fad786d..3f7f2ed 100644
--- a/pkg/docgen/test/util.dart
+++ b/pkg/docgen/test/util.dart
@@ -1,5 +1,31 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library docgen.test.util;
+
+import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+void scheduleTempDir() {
+ var tempDir;
+ schedule(() {
+ return Directory.systemTemp
+ .createTemp('docgen_test-')
+ .then((dir) {
+ tempDir = dir;
+ d.defaultRoot = tempDir.path;
+ });
+ });
+
+ currentSchedule.onComplete.schedule(() {
+ d.defaultRoot = null;
+ return tempDir.delete(recursive: true);
+ });
+}
String getMultiLibraryCodePath() {
var currentScript = p.fromUri(Platform.script);
@@ -9,3 +35,20 @@
return codeDir;
}
+
+final Matcher hasSortedLines = predicate((String input) {
+ var lines = new LineSplitter().convert(input);
+
+ var sortedLines = new List.from(lines)..sort();
+
+ var orderedMatcher = orderedEquals(sortedLines);
+ return orderedMatcher.matches(lines, {});
+}, 'String has sorted lines');
+
+final Matcher isJsonMap = predicate((input) {
+ try {
+ return JSON.decode(input) is Map;
+ } catch (e) {
+ return false;
+ }
+}, 'Output is JSON encoded Map');
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
new file mode 100644
index 0000000..0a9b4ba
--- /dev/null
+++ b/pkg/http/CHANGELOG.md
@@ -0,0 +1,9 @@
+## 0.10.0
+
+* Make `BaseRequest.contentLength` and `BaseResponse.contentLength` use `null`
+ to indicate an unknown content length rather than -1.
+
+* The `contentLength` parameter to `new BaseResponse` is now named rather than
+ positional.
+
+* Make request headers case-insensitive.
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index dab055b..a52b9c2 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -27,12 +27,17 @@
/// The URL to which the request will be sent.
final Uri url;
- /// The size of the request body, in bytes. This defaults to -1, which
- /// indicates that the size of the request is not known in advance.
+ /// The size of the request body, in bytes.
+ ///
+ /// This defaults to `null`, which indicates that the size of the request is
+ /// not known in advance.
int get contentLength => _contentLength;
- int _contentLength = -1;
+ int _contentLength;
set contentLength(int value) {
+ if (value != null && value < 0) {
+ throw new ArgumentError("Invalid content length $value.");
+ }
_checkFinalized();
_contentLength = value;
}
@@ -110,10 +115,12 @@
var client = new Client();
return client.send(this).then((response) {
var stream = onDone(response.stream, client.close);
+ var contentLength = response.contentLength < 0 ?
+ null : response.contentLength;
return new StreamedResponse(
new ByteStream(stream),
response.statusCode,
- response.contentLength,
+ contentLength: contentLength,
request: response.request,
headers: response.headers,
isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/base_response.dart b/pkg/http/lib/src/base_response.dart
index df0edb4..f222596 100644
--- a/pkg/http/lib/src/base_response.dart
+++ b/pkg/http/lib/src/base_response.dart
@@ -20,8 +20,9 @@
/// The reason phrase associated with the status code.
final String reasonPhrase;
- /// The size of the response body, in bytes. If the size of the request is not
- /// known in advance, this is -1.
+ /// The size of the response body, in bytes.
+ ///
+ /// If the size of the request is not known in advance, this is `null`.
final int contentLength;
// TODO(nweiz): automatically parse cookies from headers
@@ -39,10 +40,16 @@
/// Creates a new HTTP response.
BaseResponse(
this.statusCode,
- this.contentLength,
- {this.request,
+ {this.contentLength,
+ this.request,
this.headers: const {},
this.isRedirect: false,
this.persistentConnection: true,
- this.reasonPhrase});
+ this.reasonPhrase}) {
+ if (statusCode < 100) {
+ throw new ArgumentError("Invalid status code $statusCode.");
+ } else if (contentLength != null && contentLength < 0) {
+ throw new ArgumentError("Invalid content length $contentLength.");
+ }
+ }
}
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index c12cac2..112607d 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -27,10 +27,12 @@
return Chain.track(_inner.openUrl(request.method, request.url))
.then((ioRequest) {
+ var contentLength = request.contentLength == null ?
+ -1 : request.contentLength;
ioRequest
..followRedirects = request.followRedirects
..maxRedirects = request.maxRedirects
- ..contentLength = request.contentLength
+ ..contentLength = contentLength
..persistentConnection = request.persistentConnection;
request.headers.forEach((name, value) {
ioRequest.headers.set(name, value);
@@ -42,10 +44,12 @@
headers[key] = values.join(',');
});
+ var contentLength = response.contentLength == -1 ?
+ null : response.contentLength;
return new StreamedResponse(
response,
response.statusCode,
- response.contentLength,
+ contentLength: contentLength,
request: request,
headers: headers,
isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index 5d29545..35a710d 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -46,7 +46,7 @@
return new StreamedResponse(
new ByteStream.fromBytes(response.bodyBytes),
response.statusCode,
- response.contentLength,
+ contentLength: response.contentLength,
request: baseRequest,
headers: response.headers,
isRedirect: response.isRedirect,
@@ -63,7 +63,7 @@
return new StreamedResponse(
response.stream,
response.statusCode,
- response.contentLength,
+ contentLength: response.contentLength,
request: request,
headers: response.headers,
isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
index 435027d..afbb714 100644
--- a/pkg/http/lib/src/response.dart
+++ b/pkg/http/lib/src/response.dart
@@ -57,7 +57,7 @@
: bodyBytes = toUint8List(bodyBytes),
super(
statusCode,
- bodyBytes.length,
+ contentLength: bodyBytes.length,
request: request,
headers: headers,
isRedirect: isRedirect,
diff --git a/pkg/http/lib/src/streamed_response.dart b/pkg/http/lib/src/streamed_response.dart
index f82c964..21c7d9a 100644
--- a/pkg/http/lib/src/streamed_response.dart
+++ b/pkg/http/lib/src/streamed_response.dart
@@ -23,15 +23,15 @@
StreamedResponse(
Stream<List<int>> stream,
int statusCode,
- int contentLength,
- {BaseRequest request,
+ {int contentLength,
+ BaseRequest request,
Map<String, String> headers: const {},
bool isRedirect: false,
bool persistentConnection: true,
String reasonPhrase})
: super(
statusCode,
- contentLength,
+ contentLength: contentLength,
request: request,
headers: headers,
isRedirect: isRedirect,
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 3821bb0..75b4e54 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
name: http
-version: 0.9.3-dev
+version: 0.10.0-dev
author: "Dart Team <misc@dartlang.org>"
homepage: https://pub.dartlang.org/packages/http
description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index ac0eeee..5c1cbf0 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -40,7 +40,7 @@
controller.close();
});
- return new http.StreamedResponse(controller.stream, 200, -1);
+ return new http.StreamedResponse(controller.stream, 200);
});
});
diff --git a/pkg/http/test/response_test.dart b/pkg/http/test/response_test.dart
index bc1f33d..52efa2c 100644
--- a/pkg/http/test/response_test.dart
+++ b/pkg/http/test/response_test.dart
@@ -52,9 +52,9 @@
test('sets body', () {
var controller = new StreamController(sync: true);
var streamResponse = new http.StreamedResponse(
- controller.stream, 200, 13);
+ controller.stream, 200, contentLength: 13);
var future = http.Response.fromStream(streamResponse)
- .then((response) => response.body);
+ .then((response) => response.body);
expect(future, completion(equals("Hello, world!")));
controller.add([72, 101, 108, 108, 111, 44, 32]);
@@ -64,9 +64,10 @@
test('sets bodyBytes', () {
var controller = new StreamController(sync: true);
- var streamResponse = new http.StreamedResponse(controller.stream, 200, 5);
+ var streamResponse = new http.StreamedResponse(
+ controller.stream, 200, contentLength: 5);
var future = http.Response.fromStream(streamResponse)
- .then((response) => response.bodyBytes);
+ .then((response) => response.bodyBytes);
expect(future, completion(equals([104, 101, 108, 108, 111])));
controller.add([104, 101, 108, 108, 111]);
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index 56c9252..761102c 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -4,17 +4,58 @@
library streamed_request_test;
+import 'dart:convert';
+
import 'package:http/http.dart' as http;
import 'package:unittest/unittest.dart';
import 'utils.dart';
void main() {
- test('#finalize freezes contentLength', () {
- var request = new http.StreamedRequest('POST', dummyUrl);
- request.finalize();
+ group('contentLength', () {
+ test('defaults to null', () {
+ var request = new http.StreamedRequest('POST', dummyUrl);
+ expect(request.contentLength, isNull);
+ });
- expect(request.contentLength, equals(-1));
- expect(() => request.contentLength = 10, throwsStateError);
+ test('disallows negative values', () {
+ var request = new http.StreamedRequest('POST', dummyUrl);
+ expect(() => request.contentLength = -1, throwsArgumentError);
+ });
+
+ test('controls the Content-Length header', () {
+ return startServer().then((_) {
+ var request = new http.StreamedRequest('POST', serverUrl);
+ request.contentLength = 10;
+ request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+ request.sink.close();
+
+ return request.send();
+ }).then((response) {
+ expect(UTF8.decodeStream(response.stream),
+ completion(parse(containsPair('headers',
+ containsPair('content-length', ['10'])))));
+ }).whenComplete(stopServer);
+ });
+
+ test('defaults to sending no Content-Length', () {
+ return startServer().then((_) {
+ var request = new http.StreamedRequest('POST', serverUrl);
+ request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+ request.sink.close();
+
+ return request.send();
+ }).then((response) {
+ expect(UTF8.decodeStream(response.stream),
+ completion(parse(containsPair('headers',
+ isNot(contains('content-length'))))));
+ }).whenComplete(stopServer);
+ });
+
+ test('is frozen by finalize()', () {
+ var request = new http.StreamedRequest('POST', dummyUrl);
+ request.finalize();
+ expect(() => request.contentLength = 10, throwsStateError);
+ });
});
}
\ No newline at end of file
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index c3dad6e..61c4f52 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -9,6 +9,6 @@
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
- http: '>=0.9.2 <0.10.0'
+ http: '>=0.9.2 <0.11.0'
dev_dependencies:
unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
new file mode 100644
index 0000000..f51ca6a
--- /dev/null
+++ b/pkg/observe/CHANGELOG.md
@@ -0,0 +1,13 @@
+# changelog
+
+This file contains highlights of what changes on each version of the observe
+package.
+
+#### Pub version 0.10.0-dev
+ * package:observe no longer declares @MirrorsUsed. The package uses mirrors
+ for development time, but assumes frameworks (like polymer) and apps that
+ use it directly will either generate code that replaces the use of mirrors,
+ or add the @MirrorsUsed declaration themselves. For convinience, you can
+ import 'package:observe/mirrors_used.dart', and that will add a @MirrorsUsed
+ annotation that preserves properties and classes labeled with @reflectable
+ and properties labeled with @observable.
diff --git a/pkg/observe/lib/mirrors_used.dart b/pkg/observe/lib/mirrors_used.dart
new file mode 100644
index 0000000..b3d3f43
--- /dev/null
+++ b/pkg/observe/lib/mirrors_used.dart
@@ -0,0 +1,18 @@
+// 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.
+
+/// An empty library that declares what needs to be retained with [MirrorsUsed]
+/// if you were to use observables together with mirrors. By default this is not
+/// included because frameworks using this package also use code generation to
+/// avoid using mirrors at deploy time.
+library observe.mirrors_used;
+
+// Note: ObservableProperty is in this list only for the unusual use case of
+// invoking dart2js without running this package's transformers. The
+// transformer in `lib/transformer.dart` will replace @observable with the
+// @reflectable annotation.
+@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
+ override: 'smoke.mirrors')
+import 'dart:mirrors' show MirrorsUsed;
+import 'package:observe/observe.dart' show Reflectable, ObservableProperty;
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index 3b7c138..bce717e 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -12,6 +12,9 @@
/// You can provide an observable object in two ways. The simplest way is to
/// use dirty checking to discover changes automatically:
///
+/// import 'package:observe/observe.dart';
+/// import 'package:observe/mirrors_used.dart'; // for smaller code
+///
/// class Monster extends Unit with Observable {
/// @observable int health = 100;
///
@@ -40,6 +43,9 @@
/// manually. This avoids the potentially expensive [Observable.dirtyCheck]
/// operation, but requires more work in the object:
///
+/// import 'package:observe/observe.dart';
+/// import 'package:observe/mirrors_used.dart'; // for smaller code
+///
/// class Monster extends Unit with ChangeNotifier {
/// int _health = 100;
/// @reflectable get health => _health;
@@ -66,9 +72,24 @@
/// print('done!');
/// }
///
-/// *Note*: it is good practice to keep `@reflectable` annotation on
-/// getters/setters so they are accessible via reflection. This will preserve
-/// them from tree-shaking. You can also put this annotation on the class and it
+/// **Note**: by default this package uses mirrors to access getters and setters
+/// marked with `@reflectable`. Dart2js disables tree-shaking if there are any
+/// uses of mirrors, unless you declare how mirrors are used (via the
+/// [MirrorsUsed](https://api.dartlang.org/apidocs/channels/stable/#dart-mirrors.MirrorsUsed)
+/// annotation).
+///
+/// As of version 0.10.0, this package doesn't declare `@MirrorsUsed`. This is
+/// because we intend to use mirrors for development time, but assume that
+/// frameworks and apps that use this pacakge will either generate code that
+/// replaces the use of mirrors, or add the `@MirrorsUsed` declaration
+/// themselves. For convenience, you can import
+/// `package:observe/mirrors_used.dart` as shown on the first example above.
+/// That will add a `@MirrorsUsed` annotation that preserves properties and
+/// classes labeled with `@reflectable` and properties labeled with
+/// `@observable`.
+///
+/// If you are using the `package:observe/mirrors_used.dart` import, you can
+/// also make use of `@reflectable` on your own classes and dart2js will
/// preserve all of its members for reflection.
///
/// [Tools](https://www.dartlang.org/polymer-dart/) exist to convert the first
diff --git a/pkg/observe/lib/src/observable.dart b/pkg/observe/lib/src/observable.dart
index a1c7b65..eee62f2 100644
--- a/pkg/observe/lib/src/observable.dart
+++ b/pkg/observe/lib/src/observable.dart
@@ -7,14 +7,6 @@
import 'dart:async';
import 'dart:collection';
-// TODO(sigmund): figure out how to remove this annotation entirely
-// Note: ObservableProperty is in this list only for the unusual use case of
-// dart2js without deploy tool. The deploy tool (see "transformer.dart") will
-// add the @reflectable annotation, which makes it work with Polymer's
-// @published.
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
- override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
import 'package:smoke/smoke.dart' as smoke;
import 'package:observe/observe.dart';
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index be55102..0d631a0 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -7,13 +7,9 @@
import 'dart:async';
import 'dart:collection';
import 'dart:math' show min;
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
- override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
import 'package:logging/logging.dart' show Logger, Level;
import 'package:observe/observe.dart';
-import 'package:observe/src/observable.dart' show objectType;
import 'package:smoke/smoke.dart' as smoke;
/// A data-bound path starting from a view-model or model object, for example
@@ -128,7 +124,7 @@
for (var segment in path.trim().split('.')) {
if (segment == '') continue;
var index = int.parse(segment, radix: 10, onError: (_) => null);
- segments.add(index != null ? index : new Symbol(segment));
+ segments.add(index != null ? index : smoke.nameToSymbol(segment));
}
// TODO(jmesserly): we could use an UnmodifiableListView here, but that adds
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index fdb276a..85feca4 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
name: observe
-version: 0.10.0-pre.2
+version: 0.10.0-pre.3.dev
author: Polymer.dart Authors <web-ui-dev@dartlang.org>
description: >
Observable properties and objects for use in template_binding.
@@ -9,13 +9,13 @@
user input into the DOM is immediately assigned to the model.
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
- analyzer: "0.13.0-dev.6"
- barback: ">=0.9.0 <0.13.0"
- logging: ">=0.9.0 <0.10.0"
- path: ">=0.9.0 <2.0.0"
- smoke: ">=0.1.0-pre.0 <0.2.0"
- source_maps: ">=0.9.0 <0.10.0"
+ analyzer: 0.13.0-dev.6
+ barback: '>=0.9.0 <0.13.0'
+ logging: '>=0.9.0 <0.10.0'
+ path: '>=0.9.0 <2.0.0'
+ smoke: '>=0.1.0-pre.0 <0.2.0'
+ source_maps: '>=0.9.0 <0.10.0'
dev_dependencies:
- unittest: ">=0.10.0 <0.11.0"
+ unittest: '>=0.10.0 <0.11.0'
environment:
- sdk: ">=1.2.0 <2.0.0"
+ sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/observe/test/observe_test.dart b/pkg/observe/test/observe_test.dart
index f973db9..802e4d1 100644
--- a/pkg/observe/test/observe_test.dart
+++ b/pkg/observe/test/observe_test.dart
@@ -43,7 +43,7 @@
var maxNumIterations = dirty_check.MAX_DIRTY_CHECK_CYCLES;
var x = new WatcherModel(0);
- var sub = x.changes.listen(expectAsync1((_) { x.value++; },
+ var sub = x.changes.listen(expectAsync((_) { x.value++; },
count: maxNumIterations));
x.value = 1;
Observable.dirtyCheck();
@@ -82,7 +82,7 @@
});
test('handle future result', () {
- var callback = expectAsync0((){});
+ var callback = expectAsync((){});
return new Future(callback);
});
@@ -106,7 +106,7 @@
var t = createModel(123);
int called = 0;
- subs.add(t.changes.listen(expectAsync1((records) {
+ subs.add(t.changes.listen(expectAsync((records) {
called++;
expectPropertyChanges(records, watch ? 1 : 2);
})));
@@ -120,7 +120,7 @@
var t = createModel(123);
int called = 0;
- subs.add(t.changes.listen(expectAsync1((records) {
+ subs.add(t.changes.listen(expectAsync((records) {
called++;
expectPropertyChanges(records, 1);
if (called == 1) {
@@ -139,8 +139,8 @@
expectPropertyChanges(records, watch ? 1 : 2);
};
- subs.add(t.changes.listen(expectAsync1(verifyRecords)));
- subs.add(t.changes.listen(expectAsync1(verifyRecords)));
+ subs.add(t.changes.listen(expectAsync(verifyRecords)));
+ subs.add(t.changes.listen(expectAsync(verifyRecords)));
t.value = 41;
t.value = 42;
@@ -173,7 +173,7 @@
test('cancel listening', () {
var t = createModel(123);
var sub;
- sub = t.changes.listen(expectAsync1((records) {
+ sub = t.changes.listen(expectAsync((records) {
expectPropertyChanges(records, 1);
sub.cancel();
t.value = 777;
@@ -185,12 +185,12 @@
test('cancel and reobserve', () {
var t = createModel(123);
var sub;
- sub = t.changes.listen(expectAsync1((records) {
+ sub = t.changes.listen(expectAsync((records) {
expectPropertyChanges(records, 1);
sub.cancel();
- scheduleMicrotask(expectAsync0(() {
- subs.add(t.changes.listen(expectAsync1((records) {
+ scheduleMicrotask(expectAsync(() {
+ subs.add(t.changes.listen(expectAsync((records) {
expectPropertyChanges(records, 1);
})));
t.value = 777;
diff --git a/pkg/observe/test/observe_test_utils.dart b/pkg/observe/test/observe_test_utils.dart
index 02a88e2..07f4488 100644
--- a/pkg/observe/test/observe_test_utils.dart
+++ b/pkg/observe/test/observe_test_utils.dart
@@ -6,6 +6,7 @@
import 'dart:async';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // to make tests smaller
import 'package:unittest/unittest.dart';
export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 0993c69..8d71680 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -201,7 +201,7 @@
test('Path Value With Indices', () {
var model = toObservable([]);
var path = new PathObserver(model, '0');
- path.open(expectAsync1((x) {
+ path.open(expectAsync((x) {
expect(path.value, 123);
expect(x, 123);
}));
@@ -214,7 +214,7 @@
var path = new PathObserver(model, 'isNotEmpty');
expect(path.value, false);
- path.open(expectAsync1((_) {
+ path.open(expectAsync((_) {
expect(path.value, true);
}));
model.add(123);
@@ -225,7 +225,7 @@
var path = new PathObserver(model, 'isEmpty');
expect(path.value, true);
- path.open(expectAsync1((_) {
+ path.open(expectAsync((_) {
expect(path.value, false);
}));
model.add(123);
diff --git a/pkg/observe/test/transformer_test.dart b/pkg/observe/test/transformer_test.dart
index 1687d8a..0da84a5 100644
--- a/pkg/observe/test/transformer_test.dart
+++ b/pkg/observe/test/transformer_test.dart
@@ -164,6 +164,7 @@
readInput(id) => throw new UnimplementedError();
readInputAsString(id, {encoding}) => throw new UnimplementedError();
+ hasInput(id) => throw new UnimplementedError();
static void _mockLogFn(AssetId asset, LogLevel level, String message,
span) {
diff --git a/pkg/path/CHANGELOG.md b/pkg/path/CHANGELOG.md
new file mode 100644
index 0000000..0d48c07
--- /dev/null
+++ b/pkg/path/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 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 7ff858c..524f16d 100644
--- a/pkg/path/lib/path.dart
+++ b/pkg/path/lib/path.dart
@@ -322,23 +322,27 @@
/// withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
String withoutExtension(String path) => _context.withoutExtension(path);
-/// Returns the path represented by [uri].
+/// Returns the path represented by [uri], which may be a [String] or a [Uri].
///
/// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
/// style, this will just convert [uri] to a string.
///
/// // POSIX
-/// path.fromUri(Uri.parse('file:///path/to/foo'))
+/// context.fromUri('file:///path/to/foo')
/// // -> '/path/to/foo'
///
/// // Windows
-/// path.fromUri(Uri.parse('file:///C:/path/to/foo'))
+/// context.fromUri('file:///C:/path/to/foo')
/// // -> r'C:\path\to\foo'
///
/// // URL
-/// path.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+/// context.fromUri('http://dartlang.org/path/to/foo')
/// // -> 'http://dartlang.org/path/to/foo'
-String fromUri(Uri uri) => _context.fromUri(uri);
+///
+/// If [uri] is relative, a relative path will be returned.
+///
+/// path.fromUri('path/to/foo'); // -> 'path/to/foo'
+String fromUri(uri) => _context.fromUri(uri);
/// Returns the URI that represents [path].
///
diff --git a/pkg/path/lib/src/context.dart b/pkg/path/lib/src/context.dart
index b897c8b..9c8e1e4 100644
--- a/pkg/path/lib/src/context.dart
+++ b/pkg/path/lib/src/context.dart
@@ -423,23 +423,30 @@
return parsed.toString();
}
- /// Returns the path represented by [uri].
+ /// Returns the path represented by [uri], which may be a [String] or a [Uri].
///
/// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
/// style, this will just convert [uri] to a string.
///
/// // POSIX
- /// context.fromUri(Uri.parse('file:///path/to/foo'))
+ /// context.fromUri('file:///path/to/foo')
/// // -> '/path/to/foo'
///
/// // Windows
- /// context.fromUri(Uri.parse('file:///C:/path/to/foo'))
+ /// context.fromUri('file:///C:/path/to/foo')
/// // -> r'C:\path\to\foo'
///
/// // URL
- /// context.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+ /// context.fromUri('http://dartlang.org/path/to/foo')
/// // -> 'http://dartlang.org/path/to/foo'
- String fromUri(Uri uri) => style.pathFromUri(uri);
+ ///
+ /// If [uri] is relative, a relative path will be returned.
+ ///
+ /// path.fromUri('path/to/foo'); // -> 'path/to/foo'
+ String fromUri(uri) {
+ if (uri is String) uri = Uri.parse(uri);
+ return style.pathFromUri(uri);
+ }
/// Returns the URI that represents [path].
///
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index 3b555a1..8095c88 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,5 +1,5 @@
name: path
-version: 1.0.0
+version: 1.1.0
author: Dart Team <misc@dartlang.org>
description: >
A string-based path manipulation library. All of the path operations you know
diff --git a/pkg/path/test/posix_test.dart b/pkg/path/test/posix_test.dart
index 83a473e..9da97c9 100644
--- a/pkg/path/test/posix_test.dart
+++ b/pkg/path/test/posix_test.dart
@@ -474,19 +474,26 @@
expect(context.withoutExtension('a/b.c//'), 'a/b//');
});
- test('fromUri', () {
- expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
- expect(context.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
- expect(context.fromUri(Uri.parse('file:///')), '/');
- expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
- expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
- expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
- expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
- '/path/to/foo#bar');
- expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
- r'_{_}_`_^_ _"_%_');
- expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
- throwsArgumentError);
+ group('fromUri', () {
+ test('with a URI', () {
+ expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
+ expect(context.fromUri(Uri.parse('file:///path/to/foo/')),
+ '/path/to/foo/');
+ expect(context.fromUri(Uri.parse('file:///')), '/');
+ expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+ expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
+ expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
+ expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
+ '/path/to/foo#bar');
+ expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+ r'_{_}_`_^_ _"_%_');
+ expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+ throwsArgumentError);
+ });
+
+ test('with a string', () {
+ expect(context.fromUri('file:///path/to/foo'), '/path/to/foo');
+ });
});
test('toUri', () {
diff --git a/pkg/path/test/url_test.dart b/pkg/path/test/url_test.dart
index e149b4f..58c7b92 100644
--- a/pkg/path/test/url_test.dart
+++ b/pkg/path/test/url_test.dart
@@ -700,20 +700,28 @@
expect(context.withoutExtension('a/b.c//'), 'a/b//');
});
- test('fromUri', () {
- expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
- 'http://dartlang.org/path/to/foo');
- expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
- 'http://dartlang.org/path/to/foo/');
- expect(context.fromUri(Uri.parse('file:///path/to/foo')),
- 'file:///path/to/foo');
- expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
- expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
- 'http://dartlang.org/path/to/foo%23bar');
- // Since the resulting "path" is also a URL, special characters should
- // remain percent-encoded in the result.
- expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
- r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+ group('fromUri', () {
+ test('with a URI', () {
+ expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
+ 'http://dartlang.org/path/to/foo');
+ expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
+ 'http://dartlang.org/path/to/foo/');
+ expect(context.fromUri(Uri.parse('file:///path/to/foo')),
+ 'file:///path/to/foo');
+ expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+ expect(context.fromUri(
+ Uri.parse('http://dartlang.org/path/to/foo%23bar')),
+ 'http://dartlang.org/path/to/foo%23bar');
+ // Since the resulting "path" is also a URL, special characters should
+ // remain percent-encoded in the result.
+ expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+ r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+ });
+
+ test('with a string', () {
+ expect(context.fromUri('http://dartlang.org/path/to/foo'),
+ 'http://dartlang.org/path/to/foo');
+ });
});
test('toUri', () {
diff --git a/pkg/path/test/windows_test.dart b/pkg/path/test/windows_test.dart
index e5dcac4..d194663 100644
--- a/pkg/path/test/windows_test.dart
+++ b/pkg/path/test/windows_test.dart
@@ -590,27 +590,35 @@
expect(context.withoutExtension(r'a\b.c\'), r'a\b\');
});
- test('fromUri', () {
- expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
- r'C:\path\to\foo');
- expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
- r'\\server\share\path\to\foo');
- expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
- expect(context.fromUri(Uri.parse('file://server/share')),
- r'\\server\share');
- expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
- expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
- expect(context.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
- expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
- r'\\server\share\path\to\foo');
- expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
- r'C:\path\to\foo#bar');
- expect(context.fromUri(Uri.parse('file://server/share/path/to/foo%23bar')),
- r'\\server\share\path\to\foo#bar');
- expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
- r'_{_}_`_^_ _"_%_');
- expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
- throwsArgumentError);
+ group('fromUri', () {
+ test('with a URI', () {
+ expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
+ r'C:\path\to\foo');
+ expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
+ r'\\server\share\path\to\foo');
+ expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
+ expect(context.fromUri(Uri.parse('file://server/share')),
+ r'\\server\share');
+ expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
+ expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
+ expect(context.fromUri(Uri.parse('///C:/path/to/foo')),
+ r'C:\path\to\foo');
+ expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
+ r'\\server\share\path\to\foo');
+ expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
+ r'C:\path\to\foo#bar');
+ expect(context.fromUri(
+ Uri.parse('file://server/share/path/to/foo%23bar')),
+ r'\\server\share\path\to\foo#bar');
+ expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+ r'_{_}_`_^_ _"_%_');
+ expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+ throwsArgumentError);
+ });
+
+ test('with a string', () {
+ expect(context.fromUri('file:///C:/path/to/foo'), r'C:\path\to\foo');
+ });
});
test('toUri', () {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 152c39b..c6a89c0 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -17,7 +17,22 @@
scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
polymer/test/event_path_test: Pass, Fail # Issue 15766
-docgen/test/generate_json_test: Skip # Issue 17430
+
+[ $compiler == dart2js && $mode == debug ]
+docgen/test/generate_json_test: Skip # Way too slow
+docgen/test/multi_library_test: Skip # Way too slow
+docgen/test/single_library_test: Skip # Way too slow
+docgen/test/typedef_test: Skip # Way too slow
+
+[ $runtime == vm ]
+docgen/test/only_lib_content_in_pkg_test: Fail, Timeout # Issue 17597
+
+[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+docgen/test/only_lib_content_in_pkg_test: Skip # slow
+docgen/test/typedef_test: Skip # slow
+
+[ $runtime == vm && $arch == ia32 && $mode == debug ]
+docgen/test/generate_json_test: Skip # Issue 17602
[ $compiler == dart2js ]
collection/test/equality_test/01: Fail # Issue 1533
@@ -118,6 +133,7 @@
[ $runtime == vm && $system == windows ]
intl/test/find_default_locale_standalone_test: Fail # Issue 8110
+smoke/test/codegen/end_to_end_test: Fail # Issue 17600
[ $compiler == dartanalyzer ]
# These tests are runtime negative but statically positive, so we skip
@@ -212,6 +228,8 @@
observe/test/transformer_test: Fail, OK # Uses dart:io.
path/test/io_test: Fail, OK # Uses dart:io.
polymer/test/build/*: Fail, OK # Uses dart:io.
+smoke/test/codegen/recorder_test: Skip # Uses dart:io.
+smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
third_party/angular_tests/vm_test: Skip # Uses dart:io
third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
watcher/test/*: Fail, OK # Uses dart:io.
@@ -305,10 +323,8 @@
[ $runtime == safari || $runtime == ie9 || $runtime == ie10 ]
polymer_expressions/test/globals_test: Fail # Issue 16568
-[ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
-docgen/test/generate_json_test: Skip # Uses dart:io
-docgen/test/single_library_test: Skip # Uses dart:io
-docgen/test/multi_library_test: Skip # Uses dart:io
+[ $browser ]
+docgen/test/*: Skip # Uses dart:io
scheduled_test/test/scheduled_server_test: Skip # Uses dart:io
[ $browser || $runtime == vm ]
@@ -320,8 +336,10 @@
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
docgen/test/generate_json_test: StaticWarning # Issue 16950
-docgen/test/single_library_test: StaticWarning # Issue 16950
docgen/test/multi_library_test: StaticWarning # Issue 16950
+docgen/test/only_lib_content_in_pkg_test: StaticWarning # Issue 16950
+docgen/test/single_library_test: StaticWarning # Issue 16950
+docgen/test/typedef_test: StaticWarning # Issue 16950
unittest/test/matchers_test: StaticWarning, OK # testing error creating abstract class
[ $runtime == vm && ($system == windows || $system == macos) ]
diff --git a/pkg/polymer/example/canonicalization2/lib/g.html b/pkg/polymer/example/canonicalization2/lib/g.html
index 1b9e8d2..3897dba 100644
--- a/pkg/polymer/example/canonicalization2/lib/g.html
+++ b/pkg/polymer/example/canonicalization2/lib/g.html
@@ -5,6 +5,6 @@
-->
<!--
Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization2/b.html'.
-->
-<link rel="import" href="../packages/canonicalization/b.html">
+<link rel="import" href="../packages/canonicalization2/b.html">
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
index d467d03..2612a8f 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
@@ -3,17 +3,17 @@
// BSD-style license that can be found in the LICENSE file.
/// Tests how canonicalization works when using the deployed app.
-library canonicalization.dev3_test;
+library canonicalization.dev2_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: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;
main() {
initPolymer();
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
index 4db4438..bac8aba 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
<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/g.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>
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
index 3d6f1fe..f3df1c3 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
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: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;
main() {
initPolymer();
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
index a5c2d28..83313ee 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
<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/g.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>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/example/canonicalization3/lib/g.html
index af83397..ab73db5 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/example/canonicalization3/lib/g.html
@@ -5,6 +5,6 @@
-->
<!--
Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization3/b.html'.
-->
-<link rel="import" href="packages/canonicalization/b.html">
+<link rel="import" href="packages/canonicalization3/b.html">
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
index d467d03..574c472 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
@@ -9,11 +9,11 @@
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: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;
main() {
initPolymer();
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
index 4db4438..21448a6 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
<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/g.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>
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
index 3d6f1fe..afb2ab7 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
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: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;
main() {
initPolymer();
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
index a5c2d28..72f7574 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
<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/g.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>
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 4825b83..6e0c660 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.dart
+++ b/pkg/polymer/example/component/news/test/news_index_test.dart
@@ -16,13 +16,13 @@
.map((n) => n.query('a').href.split('/').last).toList();
test('initial state', () {
- final listComp = query('ul');
- final items = listComp.queryAll('li');
+ final listComp = querySelector('ul');
+ final items = listComp.querySelectorAll('li');
expect(items.length, 6);
expect(extractLinks(items), ['1', '2', '3', '4', '4', '5']);
expect(listComp is Polymer, true, reason: 'x-news should be created');
- final contents = listComp.shadowRoot.queryAll('content');
+ final contents = listComp.shadowRoot.querySelectorAll('content');
expect(contents.length, 2, reason: 'news has 2 content tags');
expect(extractLinks(contents[0].getDistributedNodes()),
['3', '5'], reason: 'breaking stories first');
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index fa1c0f7..9cf811a 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -78,7 +78,6 @@
import 'package:smoke/smoke.dart' as smoke;
import 'package:smoke/mirrors.dart' as smoke;
import 'package:template_binding/template_binding.dart';
-import 'package:web_components/polyfill.dart' show customElementsReady;
import 'deserialize.dart' as deserialize;
import 'src/mirror_loader.dart' as loader; // ** see important note above
diff --git a/pkg/polymer/lib/polymer_element.dart b/pkg/polymer/lib/polymer_element.dart
index c004985..ac98793 100644
--- a/pkg/polymer/lib/polymer_element.dart
+++ b/pkg/polymer/lib/polymer_element.dart
@@ -4,4 +4,4 @@
library polymer.polymer_element;
-export 'polymer.dart' show PolymerElement, registerPolymerElement;
+export 'polymer.dart' show PolymerElement;
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 5862562..2510742 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -136,93 +136,6 @@
List<List<Transformer>> get phasesForPolymer =>
[[new ObservableTransformer(['lib/src/instance.dart'])]];
-/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
-/// is used to resolve relative urls that occur in HTML assets, including
-/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
-/// urls are not resolved unless [source] is Dart file (has a .dart extension).
-// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
-AssetId resolve(AssetId source, String url, TransformLogger logger, Span span,
- {bool allowAbsolute: false}) {
- if (url == null || url == '') return null;
- var uri = Uri.parse(url);
- var urlBuilder = path.url;
- if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
- if (source.extension == '.dart' && uri.scheme == 'package') {
- var index = uri.path.indexOf('/');
- if (index != -1) {
- return new AssetId(uri.path.substring(0, index),
- 'lib${uri.path.substring(index)}');
- }
- }
-
- if (!allowAbsolute) {
- logger.error('absolute paths not allowed: "$url"', span: span);
- }
- return null;
- }
-
- var targetPath = urlBuilder.normalize(
- urlBuilder.join(urlBuilder.dirname(source.path), url));
- var segments = urlBuilder.split(targetPath);
- var sourceSegments = urlBuilder.split(source.path);
- assert (sourceSegments.length > 0);
- var topFolder = sourceSegments[0];
- var entryFolder = topFolder != 'lib' && topFolder != 'asset';
-
- // Find the first 'packages/' or 'assets/' segment:
- var packagesIndex = segments.indexOf('packages');
- var assetsIndex = segments.indexOf('assets');
- var index = (packagesIndex >= 0 && assetsIndex >= 0)
- ? min(packagesIndex, assetsIndex)
- : max(packagesIndex, assetsIndex);
- if (index > -1) {
- if (entryFolder) {
- // URLs of the form "packages/foo/bar" seen under entry folders (like
- // 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.
- return _extractOtherPackageId(index, segments, logger, span);
- } else if (index == 1 && segments[0] == '..') {
- // Relative URLs of the form "../../packages/foo/bar" in an asset under
- // lib/ or asset/ are also resolved as an asset in another package, but we
- // check that the relative path goes all the way out where the packages
- // folder lives (otherwise the app would not work in Dartium). Since
- // [targetPath] has been normalized, "packages" or "assets" should be at
- // index 1.
- return _extractOtherPackageId(1, segments, logger, span);
- } else {
- var prefix = segments[index];
- var fixedSegments = [];
- fixedSegments.addAll(sourceSegments.map((_) => '..'));
- fixedSegments.addAll(segments.sublist(index));
- var fixedUrl = urlBuilder.joinAll(fixedSegments);
- logger.error('Invalid url to reach to another package: $url. Path '
- 'reaching to other packages must first reach up all the '
- 'way to the $prefix folder. For example, try changing the url above '
- 'to: $fixedUrl', span: span);
- return null;
- }
- }
-
- // Otherwise, resolve as a path in the same package.
- return new AssetId(source.package, targetPath);
-}
-
-AssetId _extractOtherPackageId(int index, List segments,
- TransformLogger logger, Span span) {
- if (index >= segments.length) return null;
- var prefix = segments[index];
- if (prefix != 'packages' && prefix != 'assets') return null;
- var folder = prefix == 'packages' ? 'lib' : 'asset';
- if (segments.length < index + 3) {
- logger.error("incomplete $prefix/ path. It should have at least 3 "
- "segments $prefix/name/path-from-name's-$folder-dir", span: span);
- return null;
- }
- return new AssetId(segments[index + 1],
- path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
-}
-
/// Generate the import url for a file described by [id], referenced by a file
/// with [sourceId].
// TODO(sigmund): this should also be in barback (dartbug.com/12610)
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index abaa275..992ae78 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -10,6 +10,7 @@
import 'package:analyzer/src/generated/ast.dart';
import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
import 'package:path/path.dart' as path;
import 'package:html5lib/dom.dart' show
Document, DocumentFragment, Element, Node;
@@ -80,8 +81,8 @@
// Note: URL has already been normalized so use docId.
var href = tag.attributes['href'];
- var id = resolve(docId, href, transform.logger, tag.sourceSpan,
- allowAbsolute: rel == 'stylesheet');
+ var id = uriToAssetId(docId, href, transform.logger, tag.sourceSpan,
+ errorOnAbsolute: rel != 'stylesheet');
if (rel == 'import') {
changed = true;
@@ -162,7 +163,7 @@
if (script.attributes['type'] == TYPE_DART) {
script.remove();
var src = script.attributes['src'];
- scriptIds.add(resolve(docId, src, logger, script.sourceSpan));
+ scriptIds.add(uriToAssetId(docId, src, logger, script.sourceSpan));
// only the first script needs to be added.
// others are already removed by _extractScripts
@@ -318,8 +319,8 @@
var uri = directive.uri.stringValue;
var span = _getSpan(file, directive.uri);
- var id = resolve(sourceId, uri, transform.logger, span,
- allowAbsolute: true);
+ var id = uriToAssetId(sourceId, uri, transform.logger, span,
+ errorOnAbsolute: false);
if (id == null) continue;
var primaryId = transform.primaryInput.id;
@@ -345,7 +346,7 @@
if (uri.path.isEmpty) return href; // Implies standalone ? or # in URI.
if (path.isAbsolute(href)) return href;
- var id = resolve(sourceId, href, transform.logger, span);
+ var id = uriToAssetId(sourceId, href, transform.logger, span);
if (id == null) return href;
var primaryId = transform.primaryInput.id;
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index acd9c63..df33318 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -9,6 +9,7 @@
import 'dart:async';
import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
import 'package:html5lib/dom.dart';
import 'package:html5lib/dom_parsing.dart';
import 'package:source_maps/span.dart';
@@ -74,7 +75,7 @@
if (tag.attributes['rel'] != 'import') continue;
var href = tag.attributes['href'];
var span = tag.sourceSpan;
- var id = resolve(sourceId, href, logger, span);
+ var id = uriToAssetId(sourceId, href, logger, span);
if (id == null ||
(id.package == 'polymer' && id.path == 'lib/init.html')) continue;
importIds.add(assetExists(id, transform).then((exists) {
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index fe85e8f..61a6b71 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -11,6 +11,7 @@
import 'package:html5lib/dom.dart' show Document, Element;
import 'package:analyzer/src/generated/ast.dart';
import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
import 'package:path/path.dart' as path;
import 'package:source_maps/span.dart' show SourceFile;
@@ -102,7 +103,7 @@
tag.remove();
continue;
}
- mainLibraryId = resolve(docId, src, logger, tag.sourceSpan);
+ mainLibraryId = uriToAssetId(docId, src, logger, tag.sourceSpan);
mainScriptTag = tag;
}
}
@@ -171,7 +172,7 @@
return Future.forEach(unit.directives, (directive) {
// Include anything from parts.
if (directive is PartDirective) {
- var targetId = resolve(dartLibrary, directive.uri.stringValue,
+ var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
logger, _getSpan(file, directive));
return _initializersOf(targetId).then(result.addAll);
}
@@ -179,7 +180,7 @@
// Similarly, include anything from exports except what's filtered by
// the show/hide combinators.
if (directive is ExportDirective) {
- var targetId = resolve(dartLibrary, directive.uri.stringValue,
+ var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
logger, _getSpan(file, directive));
return _initializersOf(targetId).then(
(r) => _processExportDirective(directive, r, result));
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 54533c9..60bf2fe 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -81,13 +81,9 @@
polymerJs.callMethod('whenPolymerReady',
[zone.bindCallback(() => Polymer._ready.complete())]);
- var jsPolymer = new JsObject.fromBrowserObject(
- document.createElement('polymer-element'));
-
- var proto = js.context['Object'].callMethod('getPrototypeOf', [jsPolymer]);
- if (proto is Node) {
- proto = new JsObject.fromBrowserObject(proto);
- }
+ var polyElem = document.createElement('polymer-element');
+ var proto = new JsObject.fromBrowserObject(polyElem)['__proto__'];
+ if (proto is Node) proto = new JsObject.fromBrowserObject(proto);
JsFunction originalRegister = proto['register'];
if (originalRegister == null) {
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index d9d226f..c0a70ed 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
name: polymer
-version: 0.10.0-pre.2
+version: 0.10.0-pre.4
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
@@ -7,20 +7,23 @@
browsers.
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
- analyzer: "0.13.0-dev.6"
- args: ">=0.10.0 <0.11.0"
- barback: ">=0.9.0 <0.13.0"
- browser: ">=0.10.0 <0.11.0"
- html5lib: ">=0.9.2 <0.10.0"
- logging: ">=0.9.0 <0.10.0"
- observe: ">=0.10.0-pre.0 <0.11.0"
- path: ">=0.9.0 <2.0.0"
- polymer_expressions: ">=0.10.0-pre.0 <0.11.0"
- smoke: ">=0.1.0-pre.0 <0.2.0"
- source_maps: ">=0.9.0 <0.10.0"
- template_binding: ">=0.10.0-pre.0 <0.11.0"
- web_components: ">=0.3.2 <0.4.0"
- yaml: ">=0.9.0 <0.10.0"
+ analyzer: '>=0.13.0-dev.6 <0.14.0'
+ args: '>=0.10.0 <0.11.0'
+ barback: '>=0.9.0 <0.13.0'
+ browser: '>=0.10.0 <0.11.0'
+ code_transformers: '>=0.0.1-dev.4 <0.1.0'
+ html5lib: '>=0.9.2 <0.10.0'
+ logging: '>=0.9.0 <0.10.0'
+ observe: '>=0.10.0-pre.0 <0.11.0'
+ path: '>=0.9.0 <2.0.0'
+ polymer_expressions: '>=0.10.0-pre.0 <0.11.0'
+ smoke: '>=0.1.0-pre.0 <0.2.0'
+ source_maps: '>=0.9.0 <0.10.0'
+ template_binding: '>=0.10.0-pre.0 <0.11.0'
+ web_components: '>=0.3.2 <0.4.0'
+ yaml: '>=0.9.0 <0.10.0'
+dev_dependencies:
+ unittest: '>=0.10.0 <0.11.0'
transformers:
# TODO(sigmund): uncomment when full codegen is ready.
#- polymer/src/build/remove_mirrors
@@ -30,7 +33,5 @@
# TODO(sigmund): uncomment once $include is available in the stable channel
# (1.3.0) or when we really need a dependency on the latest dev channel.
# $include: lib/src/instance.dart
-dev_dependencies:
- unittest: ">=0.10.0 <0.11.0"
environment:
- sdk: ">=1.2.0 <2.0.0"
+ sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/polymer/test/bind_mdv_test.dart b/pkg/polymer/test/bind_mdv_test.dart
index a47bfc2..d30bc66 100644
--- a/pkg/polymer/test/bind_mdv_test.dart
+++ b/pkg/polymer/test/bind_mdv_test.dart
@@ -8,6 +8,7 @@
import 'dart:html';
import 'package:template_binding/template_binding.dart';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
import 'package:unittest/html_config.dart';
import 'package:unittest/unittest.dart';
import 'package:web_components/polyfill.dart';
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index 60d6c84..fbbda2e 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -5,7 +5,6 @@
library polymer.test.property_change_test;
import 'dart:async';
-import 'dart:html';
import 'package:polymer/polymer.dart';
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 209012d..c9321f3 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -9,6 +9,7 @@
import 'package:logging/logging.dart';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
import 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
import 'package:polymer_expressions/polymer_expressions.dart';
import 'package:template_binding/template_binding.dart' show templateBind;
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
index 952e78e..1f4bee6 100644
--- a/pkg/polymer_expressions/test/eval_test.dart
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -15,6 +15,7 @@
import 'package:polymer_expressions/parser.dart';
import 'package:unittest/unittest.dart';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
main() {
reflectClass(Object); // suppress unused import warning
diff --git a/pkg/polymer_expressions/test/globals_test.dart b/pkg/polymer_expressions/test/globals_test.dart
index 9690baf..433cd08 100644
--- a/pkg/polymer_expressions/test/globals_test.dart
+++ b/pkg/polymer_expressions/test/globals_test.dart
@@ -6,6 +6,7 @@
import 'dart:html';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
import 'package:polymer_expressions/polymer_expressions.dart';
import 'package:template_binding/template_binding.dart';
import 'package:unittest/unittest.dart';
diff --git a/pkg/polymer_expressions/test/syntax_test.dart b/pkg/polymer_expressions/test/syntax_test.dart
index 50972e3..b7e6592 100644
--- a/pkg/polymer_expressions/test/syntax_test.dart
+++ b/pkg/polymer_expressions/test/syntax_test.dart
@@ -7,6 +7,7 @@
import 'package:logging/logging.dart';
import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
import 'package:polymer_expressions/polymer_expressions.dart';
import 'package:template_binding/template_binding.dart';
import 'package:unittest/html_config.dart';
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index 46bb5b6..c99cf06 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -185,8 +185,8 @@
});
}
- /// Converts a stream of bytes to a stream of lines and returns that along
- /// with a [StreamCanceller] controlling it.
+ /// Converts a stream of byte lists to a stream of lines and returns that
+ /// along with a [StreamCanceller] controlling it.
Pair<Stream<String>, StreamCanceller> _lineStreamWithCanceller(
Future<Stream<List<int>>> streamFuture) {
return streamWithCanceller(futureStream(streamFuture)
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 55fea14..8e8462e 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -10,7 +10,7 @@
read like synchronous, linear code, despite executing asynchronously.
dependencies:
- http: ">=0.9.0 <0.10.0"
+ http: ">=0.9.0 <0.11.0"
path: ">=0.9.0 <2.0.0"
stack_trace: ">=0.9.1 <0.10.0"
unittest: ">=0.9.0 <0.11.0"
diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
new file mode 100644
index 0000000..06313f7
--- /dev/null
+++ b/pkg/smoke/lib/codegen/generator.dart
@@ -0,0 +1,445 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 to generate code that can initialize the `StaticConfiguration` in
+/// `package:smoke/static.dart`.
+///
+/// This library doesn't have any specific logic to extract information from
+/// Dart source code. To extract code using the analyzer, take a look at the
+/// `smoke.codegen.recorder` library.
+library smoke.codegen.generator;
+
+import 'dart:collection' show SplayTreeMap, SplayTreeSet;
+
+/// Collects the necessary information and generates code to initialize a
+/// `StaticConfiguration`. After setting up the generator by calling
+/// [addGetter], [addSetter], [addSymbol], and [addDeclaration], you can
+/// retrieve the generated code using the following three methods:
+///
+/// * [writeImports] writes a list of imports directives,
+/// * [writeTopLevelDeclarations] writes additional declarations used to
+/// represent mixin classes by name in the generated code.
+/// * [writeInitCall] writes the actual code that allocates the static
+/// configuration.
+///
+/// You'd need to include all three in your generated code, since the
+/// initialization code refers to symbols that are only available from the
+/// generated imports or the generated top-level declarations.
+class SmokeCodeGenerator {
+ // Note: we use SplayTreeSet/Map here and below to keep generated code sorted.
+ /// Names used as getters via smoke.
+ final Set<String> _getters = new SplayTreeSet();
+
+ /// Names used as setters via smoke.
+ final Set<String> _setters = new SplayTreeSet();
+
+ /// Subclass relations needed to run smoke queries.
+ final Map<TypeIdentifier, TypeIdentifier> _parents = new SplayTreeMap();
+
+ /// Declarations requested via `smoke.getDeclaration or `smoke.query`.
+ final Map<TypeIdentifier, Map<String, _DeclarationCode>> _declarations =
+ new SplayTreeMap();
+
+ /// Names that are used both as strings and symbols.
+ final Set<String> _names = new SplayTreeSet();
+
+ /// Prefixes associated with imported libraries.
+ final Map<String, String> _libraryPrefix = {};
+
+ /// Register that [name] is used as a getter in the code.
+ void addGetter(String name) { _getters.add(name); }
+
+ /// Register that [name] is used as a setter in the code.
+ void addSetter(String name) { _setters.add(name); }
+
+ /// Register that [name] might be needed as a symbol.
+ void addSymbol(String name) { _names.add(name); }
+
+ int _mixins = 0;
+
+ /// Creates a new type to represent a mixin. Use [comment] to help users
+ /// figure out what mixin is being represented.
+ TypeIdentifier createMixinType([String comment = '']) =>
+ new TypeIdentifier(null, '_M${_mixins++}', comment);
+
+ /// Register that we care to know that [child] extends [parent].
+ void addParent(TypeIdentifier child, TypeIdentifier parent) {
+ var existing = _parents[child];
+ if (existing != null) {
+ if (existing == parent) return;
+ throw new StateError('$child already has a different parent associated'
+ '($existing instead of $parent)');
+ }
+ _addLibrary(child.importUrl);
+ _addLibrary(parent.importUrl);
+ _parents[child] = parent;
+ }
+
+ /// Register a declaration of a field, property, or method. Note that one and
+ /// only one of [isField], [isMethod], or [isProperty] should be set at a
+ /// given time.
+ void addDeclaration(TypeIdentifier cls, String name, TypeIdentifier type,
+ {bool isField: false, bool isProperty: false, bool isMethod: false,
+ bool isFinal: false, bool isStatic: false,
+ List<ConstExpression> annotations: const []}) {
+ final count = (isField ? 1 : 0) + (isProperty ? 1 : 0) + (isMethod ? 1 : 0);
+ if (count != 1) {
+ throw new ArgumentError('Declaration must be one (and only one) of the '
+ 'following: a field, a property, or a method.');
+ }
+ var kind = isField ? 'FIELD' : isProperty ? 'PROPERTY' : 'METHOD';
+ _declarations.putIfAbsent(cls,
+ () => new SplayTreeMap<String, _DeclarationCode>());
+ _addLibrary(cls.importUrl);
+ var map = _declarations[cls];
+
+ for (var exp in annotations) {
+ for (var lib in exp.librariesUsed) {
+ _addLibrary(lib);
+ }
+ }
+
+ _addLibrary(type.importUrl);
+ var decl = new _DeclarationCode(name, type, kind, isFinal, isStatic,
+ annotations);
+ if (map.containsKey(name) && map[name] != decl) {
+ throw new StateError('$type.$name already has a different declaration'
+ ' (${map[name]} instead of $decl).');
+ }
+ map[name] = decl;
+ }
+
+ /// Register that we might try to read declarations of [type], even if no
+ /// declaration exists. This informs the smoke system that querying for a
+ /// member in this class might be intentional and not an error.
+ void addEmptyDeclaration(TypeIdentifier type) {
+ _addLibrary(type.importUrl);
+ _declarations.putIfAbsent(type,
+ () => new SplayTreeMap<String, _DeclarationCode>());
+ }
+
+ /// Writes to [buffer] a line for each import that is needed by the generated
+ /// code. The code added by [writeInitCall] depends on these imports.
+ void writeImports(StringBuffer buffer) {
+ DEFAULT_IMPORTS.forEach((i) => buffer.writeln(i));
+ _libraryPrefix.forEach((url, prefix) {
+ buffer.writeln("import '$url' as $prefix;");
+ });
+ }
+
+ /// Writes to [buffer] top-level declarations that are used by the code
+ /// generated in [writeInitCall]. These are typically declarations of empty
+ /// classes that are then used as placeholders for mixin superclasses.
+ void writeTopLevelDeclarations(StringBuffer buffer) {
+ var types = new Set()
+ ..addAll(_parents.keys)
+ ..addAll(_parents.values)
+ ..addAll(_declarations.keys)
+ ..addAll(_declarations.values.expand(
+ (m) => m.values.map((d) => d.type)))
+ ..removeWhere((t) => t.importUrl != null);
+ for (var type in types) {
+ buffer.write('abstract class ${type.name} {}');
+ if (type.comment != null) buffer.write(' // ${type.comment}');
+ buffer.writeln();
+ }
+ }
+
+ /// Appends to [buffer] code that will initialize smoke's static
+ /// configuration. For example, the code might be of the form:
+ ///
+ /// useGeneratedCode(new StaticConfiguration(
+ /// getters: {
+ /// #i: (o) => o.i,
+ /// ...
+ /// names: {
+ /// #i: "i",
+ /// }));
+ ///
+ /// The optional [indent] argument is used for formatting purposes. All
+ /// entries in each map (getters, setters, names, declarations, parents) are
+ /// sorted alphabetically.
+ ///
+ /// **Note**: this code assumes that imports from [writeImports] and top-level
+ /// declarations from [writeTopLevelDeclarations] are included in the same
+ /// library where this code will live.
+ void writeInitCall(StringBuffer buffer, [int indent = 2]) {
+ final spaces = new List.filled(indent, ' ').join('');
+ var args = {};
+
+ if (_getters.isNotEmpty) {
+ args['getters'] = _getters.map((n) => '#$n: (o) => o.$n');
+ }
+ if (_setters.isNotEmpty) {
+ args['setters'] = _setters.map((n) => '#$n: (o, v) { o.$n = v; }');
+ }
+
+ if (_parents.isNotEmpty) {
+ var parentsMap = [];
+ _parents.forEach((child, parent) {
+ var parent = _parents[child];
+ parentsMap.add('${child.asCode(_libraryPrefix)}: '
+ '${parent.asCode(_libraryPrefix)}');
+ });
+ args['parents'] = parentsMap;
+ }
+
+ if (_declarations.isNotEmpty) {
+ var declarations = [];
+ _declarations.forEach((type, members) {
+ final sb = new StringBuffer()
+ ..write(type.asCode(_libraryPrefix))
+ ..write(': ');
+ if (members.isEmpty) {
+ sb.write('const {}');
+ } else {
+ sb.write('{\n');
+ members.forEach((name, decl) {
+ var decl = members[name].asCode(_libraryPrefix);
+ sb.write('$spaces #$name: $decl,\n');
+ });
+ sb.write('$spaces }');
+ }
+ declarations.add(sb.toString());
+ });
+ args['declarations'] = declarations;
+ }
+
+ if (_names.isNotEmpty) {
+ args['names'] = _names.map((n) => "#$n: '$n'");
+ }
+
+ buffer..write(spaces)
+ ..writeln('useGeneratedCode(new StaticConfiguration(')
+ ..write('$spaces checkedMode: false');
+
+ args.forEach((name, mapContents) {
+ buffer.writeln(',');
+ // TODO(sigmund): use const map when Type can be keys (dartbug.com/17123)
+ buffer.writeln('$spaces $name: {');
+ for (var entry in mapContents) {
+ buffer.writeln('$spaces $entry,');
+ }
+ buffer.write('$spaces }');
+ });
+ buffer.writeln('));');
+ }
+
+ /// Adds a library that needs to be imported.
+ void _addLibrary(String url) {
+ if (url == null || url == 'dart:core') return;
+ _libraryPrefix.putIfAbsent(url, () => 'smoke_${_libraryPrefix.length}');
+ }
+}
+
+/// Information used to generate code that allocates a `Declaration` object.
+class _DeclarationCode extends ConstExpression {
+ final String name;
+ final TypeIdentifier type;
+ final String kind;
+ final bool isFinal;
+ final bool isStatic;
+ final List<ConstExpression> annotations;
+
+ _DeclarationCode(this.name, this.type, this.kind, this.isFinal, this.isStatic,
+ this.annotations);
+
+ List<String> get librariesUsed => []
+ ..addAll(type.librariesUsed)
+ ..addAll(annotations.expand((a) => a.librariesUsed));
+
+ String asCode(Map<String, String> libraryPrefixes) {
+ var sb = new StringBuffer();
+ sb.write("const Declaration(#$name, ${type.asCode(libraryPrefixes)}");
+ if (kind != 'FIELD') sb.write(', kind: $kind');
+ if (isFinal) sb.write(', isFinal: true');
+ if (isStatic) sb.write(', isStatic: true');
+ if (annotations != null && annotations.isNotEmpty) {
+ sb.write(', annotations: const [');
+ bool first = true;
+ for (var e in annotations) {
+ if (!first) sb.write(', ');
+ first = false;
+ sb.write(e.asCode(libraryPrefixes));
+ }
+ sb.write(']');
+ }
+ sb.write(')');
+ return sb.toString();
+ }
+
+ String toString() =>
+ '(decl: $type.$name - $kind, $isFinal, $isStatic, $annotations)';
+ operator== (other) => other is _DeclarationCode && name == other.name &&
+ type == other.type && kind == other.kind && isFinal == other.isFinal &&
+ isStatic == other.isStatic &&
+ _compareLists(annotations, other.annotations);
+ int get hashCode => name.hashCode + (31 * type.hashCode);
+}
+
+/// A constant expression that can be used as an annotation.
+abstract class ConstExpression {
+
+ /// Returns the library URLs that needs to be imported for this
+ /// [ConstExpression] to be a valid annotation.
+ List<String> get librariesUsed;
+
+ /// Return a string representation of the code in this expression.
+ /// [libraryPrefixes] describes what prefix has been associated with each
+ /// import url mentioned in [libraryUsed].
+ String asCode(Map<String, String> libraryPrefixes);
+
+ ConstExpression();
+
+ /// Create a string expression of the form `'string'`, where [string] is
+ /// normalized so we can correctly wrap it in single quotes.
+ factory ConstExpression.string(String string) {
+ var value = string.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
+ return new CodeAsConstExpression("'$value'");
+ }
+
+ /// Create an expression of the form `prefix.variable_name`.
+ factory ConstExpression.identifier(String importUrl, String name) =>
+ new TopLevelIdentifier(importUrl, name);
+
+ /// Create an expression of the form `prefix.Constructor(v1, v2, p3: v3)`.
+ factory ConstExpression.constructor(String importUrl, String name,
+ List<ConstExpression> positionalArgs,
+ Map<String, ConstExpression> namedArgs) =>
+ new ConstructorExpression(importUrl, name, positionalArgs, namedArgs);
+}
+
+/// A constant expression written as a String. Used when the code is self
+/// contained and it doesn't depend on any imported libraries.
+class CodeAsConstExpression extends ConstExpression {
+ String code;
+ List<String> get librariesUsed => const [];
+
+ CodeAsConstExpression(this.code);
+
+ String asCode(Map<String, String> libraryPrefixes) => code;
+
+ String toString() => '(code: $code)';
+ operator== (other) => other is CodeAsConstExpression && code == other.code;
+ int get hashCode => code.hashCode;
+}
+
+/// Describes a reference to some symbol that is exported from a library. This
+/// is typically used to refer to a type or a top-level variable from that
+/// library.
+class TopLevelIdentifier extends ConstExpression {
+ final String importUrl;
+ final String name;
+ TopLevelIdentifier(this.importUrl, this.name);
+
+ List<String> get librariesUsed => [importUrl];
+ String asCode(Map<String, String> libraryPrefixes) {
+ if (importUrl == 'dart:core' || importUrl == null) return name;
+ return '${libraryPrefixes[importUrl]}.$name';
+ }
+
+ String toString() => '(identifier: $importUrl, $name)';
+ operator== (other) => other is TopLevelIdentifier && name == other.name
+ && importUrl == other.importUrl;
+ int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+/// Represents an expression that invokes a const constructor.
+class ConstructorExpression extends ConstExpression {
+ final String importUrl;
+ final String name;
+ final List<ConstExpression> positionalArgs;
+ final Map<String, ConstExpression> namedArgs;
+ ConstructorExpression(this.importUrl, this.name, this.positionalArgs,
+ this.namedArgs);
+
+ List<String> get librariesUsed => [importUrl]
+ ..addAll(positionalArgs.expand((e) => e.librariesUsed))
+ ..addAll(namedArgs.values.expand((e) => e.librariesUsed));
+
+ String asCode(Map<String, String> libraryPrefixes) {
+ var sb = new StringBuffer();
+ sb.write('const ');
+ if (importUrl != 'dart:core' && importUrl != null) {
+ sb.write('${libraryPrefixes[importUrl]}.');
+ }
+ sb.write('$name(');
+ bool first = true;
+ for (var e in positionalArgs) {
+ if (!first) sb.write(', ');
+ first = false;
+ sb.write(e.asCode(libraryPrefixes));
+ }
+ namedArgs.forEach((name, value) {
+ if (!first) sb.write(', ');
+ first = false;
+ sb.write('$name: ');
+ sb.write(value.asCode(libraryPrefixes));
+ });
+ sb.write(')');
+ return sb.toString();
+ }
+
+ String toString() => '(ctor: $importUrl, $name, $positionalArgs, $namedArgs)';
+ operator== (other) => other is ConstructorExpression && name == other.name
+ && importUrl == other.importUrl &&
+ _compareLists(positionalArgs, other.positionalArgs) &&
+ _compareMaps(namedArgs, other.namedArgs);
+ int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+
+/// Describes a type identifier, with the library URL where the type is defined.
+// TODO(sigmund): consider adding support for imprecise TypeIdentifiers, which
+// may be used by tools that want to generate code without using the analyzer
+// (they can syntactically tell the type comes from one of N imports).
+class TypeIdentifier extends TopLevelIdentifier
+ implements Comparable<TypeIdentifier> {
+ final String comment;
+ TypeIdentifier(importUrl, typeName, [this.comment])
+ : super(importUrl, typeName);
+
+ // We implement [Comparable] to sort out entries in the generated code.
+ int compareTo(TypeIdentifier other) {
+ if (importUrl == null && other.importUrl != null) return 1;
+ if (importUrl != null && other.importUrl == null) return -1;
+ var c1 = importUrl == null ? 0 : importUrl.compareTo(other.importUrl);
+ return c1 != 0 ? c1 : name.compareTo(other.name);
+ }
+
+ String toString() => '(type-identifier: $importUrl, $name, $comment)';
+ bool operator ==(other) => other is TypeIdentifier &&
+ importUrl == other.importUrl && name == other.name &&
+ comment == other.comment;
+ int get hashCode => super.hashCode;
+}
+
+/// Default set of imports added by [SmokeCodeGenerator].
+const DEFAULT_IMPORTS = const [
+ "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;",
+ "import 'package:smoke/static.dart' show "
+ "useGeneratedCode, StaticConfiguration;",
+ ];
+
+/// Shallow comparison of two lists.
+bool _compareLists(List a, List b) {
+ if (a == null && b != null) return false;
+ if (a != null && b == null) return false;
+ if (a.length != b.length) return false;
+ for (int i = 0; i < a.length; i++) {
+ if (a[i] != b[i]) return false;
+ }
+ return true;
+}
+
+/// Shallow comparison of two maps.
+bool _compareMaps(Map a, Map b) {
+ if (a == null && b != null) return false;
+ if (a != null && b == null) return false;
+ if (a.length != b.length) return false;
+ for (var k in a.keys) {
+ if (!b.containsKey(k) || a[k] != b[k]) return false;
+ }
+ return true;
+}
diff --git a/pkg/smoke/lib/codegen/recorder.dart b/pkg/smoke/lib/codegen/recorder.dart
new file mode 100644
index 0000000..be4c96b
--- /dev/null
+++ b/pkg/smoke/lib/codegen/recorder.dart
@@ -0,0 +1,349 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Records accesses to Dart program declarations and generates code that will
+/// allow to do the same accesses at runtime using `package:smoke/static.dart`.
+/// Internally, this library relies on the `analyzer` to extract data from the
+/// program, and then uses [SmokeCodeGenerator] to produce the code needed by
+/// the smoke system.
+///
+/// This library only uses the analyzer to consume data previously produced by
+/// running the resolver. This library does not provide any hooks to integrate
+/// running the analyzer itself. See `package:code_transformers` to integrate
+/// the analyzer into pub transformers.
+library smoke.codegen.recorder;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'generator.dart';
+
+typedef String ImportUrlResolver(LibraryElement lib);
+
+/// A recorder that tracks how elements are accessed in order to generate code
+/// that replicates those accesses with the smoke runtime.
+class Recorder {
+ /// Underlying code generator.
+ SmokeCodeGenerator generator;
+
+ /// Function that provides the import url for a library element. This may
+ /// internally use the resolver to resolve the import url.
+ ImportUrlResolver importUrlFor;
+
+ Recorder(this.generator, this.importUrlFor);
+
+ /// Stores mixins that have been recorded and associates a type identifier
+ /// with them. Mixins don't have an associated identifier in the code, so we
+ /// generate a unique identifier for them and use it throughout the code.
+ Map<TypeIdentifier, Map<ClassElement, TypeIdentifier>> _mixins = {};
+
+ /// Adds the superclass information of [type] (including intermediate mixins).
+ /// This will not generate data for direct subtypes of Object, as that is
+ /// considered redundant information.
+ void lookupParent(ClassElement type) {
+ var parent = type.supertype;
+ var mixins = type.mixins;
+ if (parent == null && mixins.isEmpty) return; // type is Object
+ var baseType = parent.element;
+ var baseId = _typeFor(baseType);
+ if (mixins.isNotEmpty) {
+ _mixins.putIfAbsent(baseId, () => {});
+ for (var m in mixins) {
+ var mixinType = m.element;
+ var mixinId = _mixins[baseId].putIfAbsent(mixinType, () {
+ var comment = '${baseId.name} & ${mixinType.name}';
+ return generator.createMixinType(comment);
+ });
+ if (!baseType.type.isObject) generator.addParent(mixinId, baseId);
+ baseType = mixinType;
+ baseId = mixinId;
+ _mixins.putIfAbsent(mixinId, () => {});
+ }
+ }
+ if (!baseType.type.isObject) generator.addParent(_typeFor(type), baseId);
+ }
+
+ TypeIdentifier _typeFor(ClassElement type) =>
+ new TypeIdentifier(importUrlFor(type.library), type.displayName);
+
+ /// Adds any declaration and superclass information that is needed to answer a
+ /// query on [type] that matches [options].
+ void runQuery(ClassElement type, QueryOptions options) {
+ if (type.type.isObject) return; // We don't include Object in query results.
+ var id = _typeFor(type);
+ var parent = type.supertype != null ? type.supertype.element : null;
+ if (options.includeInherited && parent != null &&
+ parent != options.includeUpTo) {
+ lookupParent(type);
+ runQuery(parent, options);
+ var parentId = _typeFor(parent);
+ for (var m in type.mixins) {
+ var mixinClass = m.element;
+ var mixinId = _mixins[parentId][mixinClass];
+ _runQueryInternal(mixinClass, mixinId, options);
+ parentId = mixinId;
+ }
+ }
+ _runQueryInternal(type, id, options);
+ }
+
+ /// Helper for [runQuery]. This runs the query only on a specific [type],
+ /// which could be a class or a mixin labeled by [id].
+ // TODO(sigmund): currently we materialize mixins in smoke/static.dart,
+ // we should consider to include the mixin declaration information directly,
+ // and remove the duplication we have for mixins today.
+ void _runQueryInternal(ClassElement type, TypeIdentifier id,
+ QueryOptions options) {
+
+ skipBecauseOfAnnotations(Element e) {
+ if (options.withAnnotations == null) return false;
+ return !_matchesAnnotation(e.metadata, options.withAnnotations);
+ }
+
+ if (options.includeFields) {
+ for (var f in type.fields) {
+ if (f.isStatic) continue;
+ if (f.isSynthetic) continue; // exclude getters
+ if (options.excludeFinal && f.isFinal) continue;
+ if (skipBecauseOfAnnotations(f)) continue;
+ generator.addDeclaration(id, f.displayName, _typeFor(f.type.element),
+ isField: true, isFinal: f.isFinal,
+ annotations: _copyAnnotations(f));
+ }
+ }
+
+ if (options.includeProperties) {
+ for (var a in type.accessors) {
+ if (a is! PropertyAccessorElement) continue;
+ if (a.isStatic || !a.isGetter) continue;
+ var v = a.variable;
+ if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+ if (options.excludeFinal && v.isFinal) continue;
+ if (skipBecauseOfAnnotations(v)) continue;
+ generator.addDeclaration(id, v.displayName, _typeFor(v.type.element),
+ isProperty: true, isFinal: v.isFinal,
+ annotations: _copyAnnotations(a));
+ }
+ }
+
+ if (options.includeMethods) {
+ for (var m in type.methods) {
+ if (m.isStatic) continue;
+ if (skipBecauseOfAnnotations(m)) continue;
+ generator.addDeclaration(id, m.displayName,
+ new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+ annotations: _copyAnnotations(m));
+ }
+ }
+ }
+
+ /// Adds the declaration of [name] if it was found in [type]. If [recursive]
+ /// is true, then we continue looking up [name] in the parent classes until we
+ /// find it or we reach Object.
+ void lookupMember(ClassElement type, String name, {bool recursive: false}) {
+ _lookupMemberInternal(type, _typeFor(type), name, recursive);
+ }
+
+ /// Helper for [lookupMember] that walks up the type hierarchy including mixin
+ /// classes.
+ bool _lookupMemberInternal(ClassElement type, TypeIdentifier id, String name,
+ bool recursive) {
+ // Exclude members from [Object].
+ if (type.type.isObject) return false;
+ generator.addEmptyDeclaration(id);
+ for (var f in type.fields) {
+ if (f.displayName != name) continue;
+ if (f.isSynthetic) continue; // exclude getters
+ generator.addDeclaration(id, f.displayName,
+ _typeFor(f.type.element), isField: true, isFinal: f.isFinal,
+ isStatic: f.isStatic, annotations: _copyAnnotations(f));
+ return true;
+ }
+
+ for (var a in type.accessors) {
+ if (a is! PropertyAccessorElement) continue;
+ // TODO(sigmund): support setters without getters.
+ if (!a.isGetter) continue;
+ if (a.displayName != name) continue;
+ var v = a.variable;
+ if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+ generator.addDeclaration(id, v.displayName,
+ _typeFor(v.type.element), isProperty: true, isFinal: v.isFinal,
+ isStatic: v.isStatic, annotations: _copyAnnotations(a));
+ return true;
+ }
+
+ for (var m in type.methods) {
+ if (m.displayName != name) continue;
+ generator.addDeclaration(id, m.displayName,
+ new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+ isStatic: m.isStatic, annotations: _copyAnnotations(m));
+ return true;
+ }
+
+ if (recursive) {
+ lookupParent(type);
+ var parent = type.supertype != null ? type.supertype.element : null;
+ if (parent == null) return false;
+ var parentId = _typeFor(parent);
+ for (var m in type.mixins) {
+ var mixinClass = m.element;
+ var mixinId = _mixins[parentId][mixinClass];
+ if (_lookupMemberInternal(mixinClass, mixinId, name, false)) {
+ return true;
+ }
+ parentId = mixinId;
+ }
+ return _lookupMemberInternal(parent, parentId, name, true);
+ }
+ return false;
+ }
+
+
+ /// Copy metadata associated with the declaration of [target].
+ List<ConstExpression> _copyAnnotations(Element target) {
+ var node = target.node;
+ // [node] is the initialization expression, we walk up to get to the actual
+ // member declaration where the metadata is attached to.
+ while (node is! ClassMember) node = node.parent;
+ return node.metadata.map(_convertAnnotation).toList();
+ }
+
+ /// Converts annotations into [ConstExpression]s supported by the codegen
+ /// library.
+ ConstExpression _convertAnnotation(Annotation annotation) {
+ var element = annotation.element;
+ if (element is ConstructorElement) {
+ if (!element.name.isEmpty) {
+ throw new UnimplementedError(
+ 'named constructors are not implemented in smoke.codegen.recorder');
+ }
+
+ var positionalArgs = [];
+ for (var arg in annotation.arguments.arguments) {
+ if (arg is NamedExpression) {
+ throw new UnimplementedError(
+ 'named arguments in constructors are not implemented in '
+ 'smoke.codegen.recorder');
+ }
+ positionalArgs.add(_convertExpression(arg));
+ }
+
+ return new ConstructorExpression(importUrlFor(element.library),
+ element.enclosingElement.name, positionalArgs, const {});
+ }
+
+ if (element is PropertyAccessorElement) {
+ return new TopLevelIdentifier(
+ importUrlFor(element.library), element.name);
+ }
+
+ throw new UnsupportedError('unsupported annotation $annotation');
+ }
+
+ /// Converts [expression] into a [ConstExpression].
+ ConstExpression _convertExpression(Expression expression) {
+ if (expression is StringLiteral) {
+ return new ConstExpression.string(expression.stringValue);
+ }
+
+ if (expression is BooleanLiteral || expression is DoubleLiteral ||
+ expression is IntegerLiteral || expression is NullLiteral) {
+ return new CodeAsConstExpression("${(expression as dynamic).value}");
+ }
+
+ if (expression is Identifier) {
+ var element = expression.bestElement;
+ if (element == null || !element.isPublic) {
+ throw new UnsupportedError('private constants are not supported');
+ }
+
+ var url = importUrlFor(element.library);
+ if (element is ClassElement) {
+ return new TopLevelIdentifier(url, element.name);
+ }
+
+ if (element is PropertyAccessorElement) {
+ var variable = element.variable;
+ if (variable is FieldElement) {
+ var cls = variable.enclosingElement;
+ return new TopLevelIdentifier(url, '${cls.name}.${variable.name}');
+ } else if (variable is TopLevelVariableElement) {
+ return new TopLevelIdentifier(url, variable.name);
+ }
+ }
+ }
+
+ throw new UnimplementedError('expression convertion not implemented in '
+ 'smoke.codegen.recorder (${expression.runtimeType} $expression)');
+ }
+}
+
+/// Returns whether [metadata] contains any annotation that is either equal to
+/// an annotation in [queryAnnotations] or whose type is a subclass of a type
+/// listed in [queryAnnotations]. This is equivalent to the check done in
+/// `src/common.dart#matchesAnnotation`, except that this is applied to
+/// static metadata as it was provided by the analyzer.
+bool _matchesAnnotation(Iterable<ElementAnnotation> metadata,
+ Iterable<Element> queryAnnotations) {
+ for (var meta in metadata) {
+ var element = meta.element;
+ var exp;
+ var type;
+ if (element is PropertyAccessorElement) {
+ exp = element.variable;
+ type = exp.evaluationResult.value.type;
+ } else if (element is ConstructorElement) {
+ exp = element;
+ type = element.enclosingElement.type;
+ } else {
+ throw new UnimplementedError('Unsupported annotation: ${meta}');
+ }
+ for (var queryMeta in queryAnnotations) {
+ if (exp == queryMeta) return true;
+ if (queryMeta is ClassElement && type.isSubtypeOf(queryMeta.type)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/// Options equivalent to `smoke.dart#QueryOptions`, except that type
+/// information and annotations are denoted by resolver's elements.
+class QueryOptions {
+ /// Whether to include fields (default is true).
+ final bool includeFields;
+
+ /// Whether to include getters and setters (default is true). Note that to
+ /// include fields you also need to enable [includeFields].
+ final bool includeProperties;
+
+ /// Whether to include symbols from the given type and its superclasses
+ /// (except [Object]).
+ final bool includeInherited;
+
+ /// If [includeInherited], walk up the type hierarchy up to this type
+ /// (defaults to [Object]).
+ final ClassElement includeUpTo;
+
+ /// Whether to include final fields and getter-only properties.
+ final bool excludeFinal;
+
+ /// Whether to include methods (default is false).
+ final bool includeMethods;
+
+ /// If [withAnnotation] is not null, then it should be a list of types, so
+ /// only symbols that are annotated with instances of those types are
+ /// included.
+ final List<Element> withAnnotations;
+
+ const QueryOptions({
+ this.includeFields: true,
+ this.includeProperties: true,
+ this.includeInherited: true,
+ this.includeUpTo: null,
+ this.excludeFinal: false,
+ this.includeMethods: false,
+ this.withAnnotations: null});
+}
diff --git a/pkg/smoke/lib/static.dart b/pkg/smoke/lib/static.dart
index 4b276fc..3c8d59c 100644
--- a/pkg/smoke/lib/static.dart
+++ b/pkg/smoke/lib/static.dart
@@ -37,9 +37,15 @@
/// A map from strings to symbols (the reverse of [names]).
final Map<String, Symbol> symbols;
+
+ /// Whether to check for missing declarations, otherwise, return default
+ /// values (for example a missing parent class can be treated as Object)
+ final bool checkedMode;
+
StaticConfiguration({
this.getters: const {}, this.setters: const {}, this.parents: const {},
- this.declarations: const {}, this.names: const {}})
+ this.declarations: const {}, this.names: const {},
+ this.checkedMode: true})
: this.symbols = {} {
names.forEach((k, v) { symbols[v] = k; });
}
@@ -120,6 +126,7 @@
var parentType = _configuration.parents[type];
if (parentType == supertype) return true;
if (parentType == null) {
+ if (!_configuration.checkedMode) return false;
throw new MissingCodeException('superclass of "$type" ($parentType)');
}
type = parentType;
@@ -147,6 +154,7 @@
bool hasStaticMethod(Type type, Symbol name) {
final map = _configuration.declarations[type];
if (map == null) {
+ if (!_configuration.checkedMode) return false;
throw new MissingCodeException('declarations for $type');
}
final decl = map[name];
@@ -156,25 +164,27 @@
Declaration getDeclaration(Type type, Symbol name) {
var decl = _findDeclaration(type, name);
if (decl == null) {
+ if (!_configuration.checkedMode) return null;
throw new MissingCodeException('declaration for $type.$name');
}
return decl;
}
List<Declaration> query(Type type, QueryOptions options) {
- var result;
+ var result = [];
if (options.includeInherited) {
var superclass = _configuration.parents[type];
if (superclass == null) {
- throw new MissingCodeException('superclass of "$type"');
+ if (_configuration.checkedMode) {
+ throw new MissingCodeException('superclass of "$type"');
+ }
+ } else if (superclass != options.includeUpTo) {
+ result = query(superclass, options);
}
- result = (superclass == options.includeUpTo) ? []
- : query(superclass, options);
- } else {
- result = [];
}
var map = _configuration.declarations[type];
if (map == null) {
+ if (!_configuration.checkedMode) return result;
throw new MissingCodeException('declarations for $type');
}
for (var decl in map.values) {
@@ -218,6 +228,7 @@
}
var parentType = _configuration.parents[type];
if (parentType == null) {
+ if (!_configuration.checkedMode) return null;
throw new MissingCodeException('superclass of "$type"');
}
type = parentType;
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 4332d339..c20c690 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -9,11 +9,16 @@
dependencies:
barback: ">=0.9.0 <0.12.0"
logging: ">=0.9.0 <0.10.0"
-#TODO(sigmund): uncomment this once we have some easier way to do global
+# TODO(sigmund): uncomment this once we have some easier way to do global
# app-level transformers or a way to enable this selectively from the
# application package.
-#transformers: [smoke/src/default_transformer]
+#transformers:
+#- smoke/src/default_transformer
+# # TODO(sigmund): include this once this feature is available in the stable
+# # channel, or when we really need some other feature in the dev channel.
+# # $include: lib/src/implementation.dart
dev_dependencies:
unittest: ">=0.10.0 <0.11.0"
+ path: ">=1.0.0 <2.0.0"
environment:
sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/smoke/test/codegen/common.dart b/pkg/smoke/test/codegen/common.dart
new file mode 100644
index 0000000..a7a4c4c
--- /dev/null
+++ b/pkg/smoke/test/codegen/common.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library smoke.test.codegen.common;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+checkResults(SmokeCodeGenerator generator, {List<String> imports: const [],
+ String topLevel: '', String initCall}) {
+ var allImports = []..addAll(DEFAULT_IMPORTS)..addAll(imports)..add('');
+ var genImports = new StringBuffer();
+ generator.writeImports(genImports);
+ expect(genImports.toString(), allImports.join('\n'));
+
+ var genTopLevel = new StringBuffer();
+ generator.writeTopLevelDeclarations(genTopLevel);
+ expect(genTopLevel.toString(), topLevel);
+
+ var indentedCode = initCall.replaceAll("\n", "\n ").trim();
+ var genInitCall = new StringBuffer();
+ generator.writeInitCall(genInitCall);
+ expect(genInitCall.toString(), ' $indentedCode\n');
+}
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart
new file mode 100644
index 0000000..37a627a
--- /dev/null
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// And end-to-end test that generates code and checks that the output matches
+/// the code in `static_test.dart`. Techincally we could run the result in an
+/// isolate, but instead we decided to split that up in two tests. This test
+/// ensures that we generate the code as it was written in static_test, and
+/// separately static_test ensures that the smoke.static library behaves as
+/// expected.
+library smoke.test.codegen.end_to_end_test;
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main(args) {
+ final updateStaticTest = args.length > 0 && args[0] == '--update_static_test';
+
+ test('static_test is up to date', () {
+ var scriptPath = Platform.script.path;
+ var testDir = path.posix.dirname(path.posix.dirname(scriptPath));
+ var commonPath = path.posix.join(testDir, 'common.dart');
+ var testCode = new File('$commonPath').readAsStringSync();
+ var lib = initAnalyzer({'common.dart' : testCode})
+ .libraryFor('common.dart');
+ var coreLib = lib.visibleLibraries.firstWhere(
+ (l) => l.displayName == 'dart.core');
+ var generator = new SmokeCodeGenerator();
+ var recorder = new Recorder(generator, resolveImportUrl);
+
+ // Record all getters and setters we use in the tests.
+ generator.addGetter("i");
+ generator.addGetter("j");
+ generator.addGetter("j2");
+ generator.addGetter("inc0");
+ generator.addGetter("inc1");
+ generator.addGetter("inc2");
+ generator.addSetter("i");
+ generator.addSetter("j2");
+
+ // Record symbol convertions.
+ generator.addSymbol('i');
+
+ /// Record all parent-class relations that we explicitly request for
+ recorder.lookupParent(lib.getType('AnnotB'));
+ recorder.lookupParent(lib.getType('A'));
+ recorder.lookupParent(lib.getType('B'));
+ recorder.lookupParent(lib.getType('D'));
+ recorder.lookupParent(lib.getType('H'));
+
+ // Record members for which we implicitly request their declaration in
+ // has-getter and has-setter tests.
+ recorder.lookupMember(lib.getType('A'), "i", recursive: true);
+ recorder.lookupMember(lib.getType('A'), "j2", recursive: true);
+ recorder.lookupMember(lib.getType('A'), "inc2", recursive: true);
+ recorder.lookupMember(lib.getType('B'), "a", recursive: true);
+ recorder.lookupMember(lib.getType('B'), "f", recursive: true);
+ recorder.lookupMember(lib.getType('D'), "i", recursive: true);
+ recorder.lookupMember(lib.getType('E'), "y", recursive: true);
+
+ // Record also lookups for non-exisiting members.
+ recorder.lookupMember(lib.getType('B'), "i", recursive: true);
+ recorder.lookupMember(lib.getType('E'), "x", recursive: true);
+ recorder.lookupMember(lib.getType('E'), "z", recursive: true);
+
+ // Record members for which we explicitly request their declaration.
+ recorder.lookupMember(lib.getType('B'), "a");
+ recorder.lookupMember(lib.getType('B'), "w");
+ recorder.lookupMember(lib.getType('A'), "inc1");
+ recorder.lookupMember(lib.getType('F'), "staticMethod");
+ recorder.lookupMember(lib.getType('G'), "b");
+ recorder.lookupMember(lib.getType('G'), "d");
+
+ // Lookups from no-such-method test.
+ recorder.lookupMember(lib.getType('A'), "noSuchMethod", recursive: true);
+ recorder.lookupMember(lib.getType('E'), "noSuchMethod", recursive: true);
+ recorder.lookupMember(lib.getType('E2'), "noSuchMethod", recursive: true);
+
+ // Lookups from has-instance-method and has-static-method tests.
+ recorder.lookupMember(lib.getType('A'), "inc0", recursive: true);
+ recorder.lookupMember(lib.getType('A'), "inc3", recursive: true);
+ recorder.lookupMember(lib.getType('C'), "inc", recursive: true);
+ recorder.lookupMember(lib.getType('D'), "inc", recursive: true);
+ recorder.lookupMember(lib.getType('D'), "inc0", recursive: true);
+ recorder.lookupMember(lib.getType('F'), "staticMethod", recursive: true);
+ recorder.lookupMember(lib.getType('F2'), "staticMethod", recursive: true);
+
+ // Record all queries done by the test.
+ recorder.runQuery(lib.getType('A'), new QueryOptions());
+ recorder.runQuery(lib.getType('D'),
+ new QueryOptions(includeInherited: true));
+
+ var vars = lib.definingCompilationUnit.topLevelVariables;
+ expect(vars[0].name, 'a1');
+ expect(vars[1].name, 'a2');
+ var options = new QueryOptions(includeInherited: true,
+ withAnnotations: [vars[0], vars[1], lib.getType('Annot')]);
+ recorder.runQuery(lib.getType('H'), options);
+
+ var code = _createEntrypoint(generator);
+ var staticTestFile = new File(path.posix.join(testDir, 'static_test.dart'));
+ var existingCode = staticTestFile.readAsStringSync();
+ if (!updateStaticTest) {
+ expect(code, existingCode);
+ } else if (code == existingCode) {
+ print('static_test.dart is already up to date');
+ } else {
+ staticTestFile.writeAsStringSync(code);
+ print('static_test.dart has been updated.');
+ }
+ });
+}
+
+_createEntrypoint(SmokeCodeGenerator generator) {
+ var sb = new StringBuffer()
+ ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------')
+ ..writeln('/// To update this test file, call:')
+ ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test')
+ ..writeln('/// --------------------------------------------------------');
+ sb.write('\nlibrary smoke.test.static_test;\n\n');
+ sb.writeln("import 'package:unittest/unittest.dart';");
+ generator.writeImports(sb);
+ sb.writeln("import 'common.dart' as common show main;\n");
+ generator.writeTopLevelDeclarations(sb);
+ sb.writeln('\n_configure() {');
+ generator.writeInitCall(sb);
+ sb.writeln('}\n');
+ sb.writeln('main() {');
+ sb.writeln(' setUp(_configure);');
+ sb.writeln(' common.main();');
+ sb.writeln('}');
+ return sb.toString();
+}
+
+
+resolveImportUrl(LibraryElement lib) {
+ if (lib.isDartCore) return 'dart:core';
+ if (lib.displayName == 'smoke.test.common') return 'common.dart';
+ return 'unknown.dart';
+}
diff --git a/pkg/smoke/test/codegen/generator_test.dart b/pkg/smoke/test/codegen/generator_test.dart
new file mode 100644
index 0000000..dcd4c55
--- /dev/null
+++ b/pkg/smoke/test/codegen/generator_test.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 smoke.test.codegen.generator_test;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+
+main() {
+ test('getters', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addGetter('i');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' getters: {\n'
+ ' #i: (o) => o.i,\n'
+ ' }));\n');
+
+ generator.addGetter('foo');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' getters: {\n'
+ ' #foo: (o) => o.foo,\n'
+ ' #i: (o) => o.i,\n'
+ ' }));\n');
+ });
+
+ test('setters', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addSetter('i');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' setters: {\n'
+ ' #i: (o, v) { o.i = v; },\n'
+ ' }));\n');
+
+ generator.addSetter('foo');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' setters: {\n'
+ ' #foo: (o, v) { o.foo = v; },\n'
+ ' #i: (o, v) { o.i = v; },\n'
+ ' }));\n');
+ });
+
+ test('names/symbols', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addSymbol('i');
+ generator.addSymbol('foo');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' names: {\n'
+ ' #foo: \'foo\',\n'
+ ' #i: \'i\',\n'
+ ' }));\n');
+ });
+
+ test('getters, setters, and names', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addGetter('i');
+ generator.addSetter('i');
+ generator.addSetter('foo');
+ generator.addSymbol('foo');
+ checkResults(generator, initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' getters: {\n'
+ ' #i: (o) => o.i,\n'
+ ' },\n'
+ ' setters: {\n'
+ ' #foo: (o, v) { o.foo = v; },\n'
+ ' #i: (o, v) { o.i = v; },\n'
+ ' },\n'
+ ' names: {\n'
+ ' #foo: \'foo\',\n'
+ ' }));\n');
+ });
+
+ test('parents', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addParent(new TypeIdentifier('a.dart', 'A'),
+ new TypeIdentifier('b.dart', 'B'));
+ generator.addParent(new TypeIdentifier('a.dart', 'C'),
+ new TypeIdentifier('a.dart', 'A'));
+ checkResults(generator,
+ imports: [
+ "import 'a.dart' as smoke_0;",
+ "import 'b.dart' as smoke_1;"
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.A: smoke_1.B,\n'
+ ' smoke_0.C: smoke_0.A,\n'
+ ' }));\n');
+ });
+
+ test('declarations', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+ new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+ generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'bar',
+ new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+ annotations: [new ConstExpression.constructor(null, 'Annotation',
+ [new ConstExpression.string("hi")], const {})]);
+ checkResults(generator,
+ imports: ["import 'a.dart' as smoke_0;"],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #bar: const Declaration(#bar, Function, kind: METHOD, '
+ 'annotations: const [const Annotation(\'hi\')]),\n'
+ ' #foo: const Declaration(#foo, int, isFinal: true),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('repeated entries appear only once', () {
+ var generator = new SmokeCodeGenerator();
+ generator.addGetter('a');
+ generator.addGetter('a');
+ generator.addSetter('b');
+ generator.addSetter('b');
+ generator.addSymbol('d');
+ generator.addSymbol('d');
+ generator.addSymbol('c');
+ generator.addSymbol('c');
+ generator.addSymbol('c');
+
+ generator.addParent(new TypeIdentifier('a.dart', 'C'),
+ new TypeIdentifier('a.dart', 'A'));
+ generator.addParent(new TypeIdentifier('a.dart', 'C'),
+ new TypeIdentifier('a.dart', 'A'));
+ generator.addParent(new TypeIdentifier('a.dart', 'C'),
+ new TypeIdentifier('a.dart', 'A'));
+
+ generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+ new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+ generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+ new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+ generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+ new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+
+ checkResults(generator,
+ imports: [
+ "import 'a.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' getters: {\n'
+ ' #a: (o) => o.a,\n'
+ ' },\n'
+ ' setters: {\n'
+ ' #b: (o, v) { o.b = v; },\n'
+ ' },\n'
+ ' parents: {\n'
+ ' smoke_0.C: smoke_0.A,\n'
+ ' },\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #foo: const Declaration(#foo, int, isFinal: true),\n'
+ ' },\n'
+ ' },\n'
+ ' names: {\n'
+ ' #c: \'c\',\n'
+ ' #d: \'d\',\n'
+ ' }));\n');
+ });
+}
diff --git a/pkg/smoke/test/codegen/recorder_test.dart b/pkg/smoke/test/codegen/recorder_test.dart
new file mode 100644
index 0000000..33698c9
--- /dev/null
+++ b/pkg/smoke/test/codegen/recorder_test.dart
@@ -0,0 +1,554 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 smoke.test.codegen.recorder_test;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main() {
+ var provider = initAnalyzer(_SOURCES);
+ var generator;
+ var recorder;
+ setUp(() {
+ generator = new SmokeCodeGenerator();
+ recorder = new Recorder(generator, resolveImportUrl);
+ });
+
+ group('parents', () {
+ test('simple subclassing', () {
+ var lib = provider.libraryFor('/a.dart');
+ recorder.lookupParent(lib.getType('A'));
+ recorder.lookupParent(lib.getType('C'));
+
+ checkResults(generator,
+ imports: [
+ "import '/a.dart' as smoke_0;",
+ "import '/b.dart' as smoke_1;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.A: smoke_1.B,\n'
+ ' smoke_0.C: smoke_0.A,\n'
+ ' }));\n');
+ });
+
+ test('single mixin', () {
+ var lib = provider.libraryFor('/a.dart');
+ recorder.lookupParent(lib.getType('E'));
+
+ checkResults(generator,
+ imports: [
+ "import '/a.dart' as smoke_0;",
+ ],
+ topLevel: 'abstract class _M0 {} // A & D1\n',
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.E: _M0,\n'
+ ' _M0: smoke_0.A,\n'
+ ' }));\n');
+ });
+
+ test('multiple mixins', () {
+ var lib = provider.libraryFor('/a.dart');
+ recorder.lookupParent(lib.getType('F'));
+
+ checkResults(generator,
+ imports: [
+ "import '/a.dart' as smoke_0;",
+ ],
+ topLevel:
+ 'abstract class _M0 {} // A & D1\n'
+ 'abstract class _M1 {} // _M0 & D2\n'
+ 'abstract class _M2 {} // _M1 & D3\n',
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.F: _M2,\n'
+ ' _M0: smoke_0.A,\n'
+ ' _M1: _M0,\n'
+ ' _M2: _M1,\n'
+ ' }));\n');
+ });
+
+ test('same as common_test', () {
+ var lib = provider.libraryFor('/common.dart');
+ recorder.lookupParent(lib.getType('Annot'));
+ recorder.lookupParent(lib.getType('AnnotB'));
+ recorder.lookupParent(lib.getType('A'));
+ recorder.lookupParent(lib.getType('B'));
+ recorder.lookupParent(lib.getType('C'));
+ recorder.lookupParent(lib.getType('D'));
+ recorder.lookupParent(lib.getType('E'));
+ recorder.lookupParent(lib.getType('E2'));
+ recorder.lookupParent(lib.getType('F'));
+ recorder.lookupParent(lib.getType('F2'));
+ recorder.lookupParent(lib.getType('G'));
+ recorder.lookupParent(lib.getType('H'));
+ var coreLib = lib.visibleLibraries.firstWhere(
+ (l) => l.displayName == 'dart.core');
+ recorder.lookupParent(coreLib.getType('int'));
+ recorder.lookupParent(coreLib.getType('num'));
+
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ topLevel:
+ 'abstract class _M0 {} // C & A\n',
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.AnnotB: smoke_0.Annot,\n'
+ ' smoke_0.D: _M0,\n'
+ ' smoke_0.E2: smoke_0.E,\n'
+ ' smoke_0.F2: smoke_0.F,\n'
+ ' smoke_0.H: smoke_0.G,\n'
+ ' int: num,\n'
+ ' _M0: smoke_0.C,\n'
+ ' }));\n');
+ });
+ });
+
+ group('lookup member', () {
+ var lib;
+ setUp(() {
+ lib = provider.libraryFor('/common.dart');
+ });
+
+ test('missing declaration', () {
+ recorder.lookupMember(lib.getType('A'), 'q');
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: const {},\n'
+ ' }));\n');
+ });
+
+ test('field declaration', () {
+ recorder.lookupMember(lib.getType('A'), 'i');
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('property declaration', () {
+ recorder.lookupMember(lib.getType('A'), 'j2');
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('method declaration', () {
+ recorder.lookupMember(lib.getType('A'), 'inc0');
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('inherited field - not recursive', () {
+ recorder.lookupMember(lib.getType('D'), 'i');
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.D: const {},\n'
+ ' }));\n');
+ });
+
+ test('inherited field - recursive', () {
+ recorder.lookupMember(lib.getType('D'), 'i', recursive: true);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ topLevel: 'abstract class _M0 {} // C & A\n',
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.D: _M0,\n'
+ ' _M0: smoke_0.C,\n'
+ ' },\n'
+ ' declarations: {\n'
+ ' smoke_0.D: const {},\n'
+ ' _M0: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' },\n'
+ ' }));\n');
+ });
+ });
+
+ group('query', () {
+ test('default query', () {
+ var options = new QueryOptions();
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('A'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' #j: const Declaration(#j, int),\n'
+ ' #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+ ' },\n'
+ ' }));\n');
+
+ });
+
+ test('only fields', () {
+ var options = new QueryOptions(includeProperties: false);
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('A'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' #j: const Declaration(#j, int),\n'
+ ' },\n'
+ ' }));\n');
+
+ });
+
+ test('only properties', () {
+ var options = new QueryOptions(includeFields: false);
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('A'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+ ' },\n'
+ ' }));\n');
+
+ });
+
+ test('fields, properties, and and methods', () {
+ var options = new QueryOptions(includeMethods: true);
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('A'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.A: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+ ' #inc1: const Declaration(#inc1, Function, kind: METHOD),\n'
+ ' #inc2: const Declaration(#inc2, Function, kind: METHOD),\n'
+ ' #j: const Declaration(#j, int),\n'
+ ' #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('exclude inherited', () {
+ var options = new QueryOptions(includeInherited: false);
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('D'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' declarations: {\n'
+ ' smoke_0.D: {\n'
+ ' #i2: const Declaration(#i2, int, kind: PROPERTY, '
+ 'isFinal: true),\n'
+ ' #x2: const Declaration(#x2, int, kind: PROPERTY, '
+ 'isFinal: true),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('include inherited', () {
+ var options = new QueryOptions(includeInherited: true);
+ var lib = provider.libraryFor('/common.dart');
+ recorder.runQuery(lib.getType('D'), options);
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ topLevel: 'abstract class _M0 {} // C & A\n',
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.D: _M0,\n'
+ ' _M0: smoke_0.C,\n'
+ ' },\n'
+ ' declarations: {\n'
+ ' smoke_0.C: {\n'
+ ' #b: const Declaration(#b, smoke_0.B),\n'
+ ' #x: const Declaration(#x, int),\n'
+ ' #y: const Declaration(#y, String),\n'
+ ' },\n'
+ ' smoke_0.D: {\n'
+ ' #i2: const Declaration(#i2, int, kind: PROPERTY, '
+ 'isFinal: true),\n'
+ ' #x2: const Declaration(#x2, int, kind: PROPERTY, '
+ 'isFinal: true),\n'
+ ' },\n'
+ ' _M0: {\n'
+ ' #i: const Declaration(#i, int),\n'
+ ' #j: const Declaration(#j, int),\n'
+ ' #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('exact annotation', () {
+ var lib = provider.libraryFor('/common.dart');
+ var vars = lib.definingCompilationUnit.topLevelVariables;
+ expect(vars[0].name, 'a1');
+ var options = new QueryOptions(includeInherited: true,
+ withAnnotations: [vars[0]]);
+ recorder.runQuery(lib.getType('H'), options);
+ final annot = 'annotations: const [smoke_0.a1]';
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.H: smoke_0.G,\n'
+ ' },\n'
+ ' declarations: {\n'
+ ' smoke_0.G: {\n'
+ ' #b: const Declaration(#b, int, $annot),\n'
+ ' },\n'
+ ' smoke_0.H: {\n'
+ ' #f: const Declaration(#f, int, $annot),\n'
+ ' #g: const Declaration(#g, int, $annot),\n'
+ ' },\n'
+ ' }));\n');
+ });
+
+ test('type annotation', () {
+ var lib = provider.libraryFor('/common.dart');
+ var options = new QueryOptions(includeInherited: true,
+ withAnnotations: [lib.getType('Annot')]);
+ recorder.runQuery(lib.getType('H'), options);
+ final a1Annot = 'annotations: const [smoke_0.a1]';
+ final a3Annot = 'annotations: const [smoke_0.a3]';
+ final exprAnnot = 'annotations: const [const smoke_0.Annot(1)]';
+ checkResults(generator,
+ imports: [
+ "import '/common.dart' as smoke_0;",
+ ],
+ initCall:
+ 'useGeneratedCode(new StaticConfiguration(\n'
+ ' checkedMode: false,\n'
+ ' parents: {\n'
+ ' smoke_0.H: smoke_0.G,\n'
+ ' },\n'
+ ' declarations: {\n'
+ ' smoke_0.G: {\n'
+ ' #b: const Declaration(#b, int, $a1Annot),\n'
+ ' },\n'
+ ' smoke_0.H: {\n'
+ ' #f: const Declaration(#f, int, $a1Annot),\n'
+ ' #g: const Declaration(#g, int, $a1Annot),\n'
+ ' #i: const Declaration(#i, int, $a3Annot),\n'
+ ' #j: const Declaration(#j, int, $exprAnnot),\n'
+ ' },\n'
+ ' }));\n');
+ });
+ });
+}
+
+const _SOURCES = const {
+ '/a.dart': '''
+ library a;
+ import '/b.dart';
+
+ class Annot { const Annot(); }
+ const annot = const Annot();
+
+ class A extends B {}
+ class C extends A {}
+ class D1 {
+ int d1;
+ }
+ class D2 {
+ int d2;
+ }
+ class D3 {
+ int d3;
+ }
+ class E extends A with D1 {
+ int e1;
+ }
+ class F extends A with D1, D2, D3 {
+ int f1;
+ }
+ ''',
+
+ '/b.dart': '''
+ library b;
+
+ class B {}
+ ''',
+ '/common.dart': '''
+ library common;
+
+ class A {
+ int i = 42;
+ int j = 44;
+ int get j2 => j;
+ void set j2(int v) { j = v; }
+ void inc0() { i++; }
+ void inc1(int v) { i = i + (v == null ? -10 : v); }
+ void inc2([int v]) { i = i + (v == null ? -10 : v); }
+ }
+
+ class B {
+ final int f = 3;
+ int _w;
+ int get w => _w;
+ set w(int v) { _w = v; }
+
+ String z;
+ A a;
+
+ B(this._w, this.z, this.a);
+ }
+
+ class C {
+ int x;
+ String y;
+ B b;
+
+ inc(int n) {
+ x = x + n;
+ }
+ dec(int n) {
+ x = x - n;
+ }
+
+ C(this.x, this.y, this.b);
+ }
+
+
+ class D extends C with A {
+ int get x2 => x;
+ int get i2 => i;
+
+ D(x, y, b) : super(x, y, b);
+ }
+
+ class E {
+ set x(int v) { }
+ int get y => 1;
+
+ noSuchMethod(i) => y;
+ }
+
+ class E2 extends E {}
+
+ class F {
+ static int staticMethod(A a) => a.i;
+ }
+
+ class F2 extends F {}
+
+ class Annot { const Annot(int ignore); }
+ class AnnotB extends Annot { const AnnotB(); }
+ const a1 = const Annot(0);
+ const a2 = 32;
+ const a3 = const AnnotB();
+
+
+ class G {
+ int a;
+ @a1 int b;
+ int c;
+ @a2 int d;
+ }
+
+ class H extends G {
+ int e;
+ @a1 int f;
+ @a1 int g;
+ @a2 int h;
+ @a3 int i;
+ @Annot(1) int j;
+ }
+ '''
+};
+
+resolveImportUrl(LibraryElement lib) =>
+ lib.isDartCore ? 'dart:core' : '/${lib.displayName}.dart';
diff --git a/pkg/smoke/test/codegen/testing_resolver_utils.dart b/pkg/smoke/test/codegen/testing_resolver_utils.dart
new file mode 100644
index 0000000..7a76614
--- /dev/null
+++ b/pkg/smoke/test/codegen/testing_resolver_utils.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Utility functions to test the code generation tools with the resolver.
+// Note, this is just for simple tests, so we restricted the logic to only
+// support root-relative imports. For more sophisticated stuff, you should be
+// using the test helpers in `package:code_transformers`.
+library smoke.test.codegen.testing_resolver_utils;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
+
+class LibraryProvider {
+ final AnalysisContext _analyzer;
+ final Map<String, Source> _allSources;
+ LibraryProvider(this._analyzer, this._allSources);
+ LibraryElement libraryFor(String uri) =>
+ _analyzer.computeLibraryElement(_allSources[uri]);
+}
+
+LibraryProvider initAnalyzer(Map<String, String> contents) {
+ var analyzer = AnalysisEngine.instance.createAnalysisContext();
+ var options = new AnalysisOptionsImpl()
+ ..cacheSize = 256
+ ..preserveComments = false
+ ..analyzeFunctionBodies = false;
+ analyzer.analysisOptions = options;
+ var sdk = new DirectoryBasedDartSdk(new JavaFile(testingDartSdkDirectory));
+ sdk.context.analysisOptions = options;
+ var changes = new ChangeSet();
+ var allSources = {};
+ contents.forEach((url, code) {
+ var source = new _SimpleSource(url, code, allSources);
+ allSources[url] = source;
+ changes.addedSource(source);
+ });
+ analyzer.applyChanges(changes);
+
+ analyzer.sourceFactory = new SourceFactory([
+ new DartUriResolver(sdk),
+ new _SimpleUriResolver(allSources)]);
+
+ return new LibraryProvider(analyzer, allSources);
+}
+
+class _SimpleUriResolver implements UriResolver {
+ final Map<String, Source> allSources;
+ _SimpleUriResolver(this.allSources);
+
+ Source resolveAbsolute(Uri uri) => allSources['$uri'];
+
+ Source fromEncoding(UriKind kind, Uri uri) =>
+ throw new UnimplementedError('fromEncoding not implemented');
+
+ Uri restoreAbsolute(Source source) =>
+ throw new UnimplementedError('restoreAbsolute not implemented');
+}
+
+class _SimpleSource extends Source {
+ final String path;
+ final String rawContents;
+ final Map<String, Source> allSources;
+
+ _SimpleSource(this.path, this.rawContents, this.allSources);
+
+ operator ==(other) => other is _SimpleSource &&
+ rawContents == other.rawContents;
+ int get hashCode => rawContents.hashCode;
+
+ bool exists() => true;
+ String get encoding => '$uriKind/$path';
+ String get fullName => path;
+ TimestampedData<String> get contents =>
+ new TimestampedData<String>(modificationStamp, rawContents);
+
+ int get modificationStamp => 1;
+ String get shortName => path;
+ UriKind get uriKind => UriKind.FILE_URI;
+ final bool isInSystemLibrary = false;
+
+ // Since this is just for simple tests we just restricted this mock
+ // to root-relative imports. For more sophisticated stuff, you should be
+ // using the test helpers in `package:code_transformers`.
+ Source resolveRelative(Uri uri) {
+ if (uri.path.startsWith('/')) return allSources['${uri.path}'];
+ throw new UnimplementedError('relative URIs not supported: $uri');
+ }
+
+ void getContentsToReceiver(Source_ContentReceiver receiver) {
+ receiver.accept(rawContents, modificationStamp);
+ }
+}
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index d60679f..35d2248 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -215,72 +215,76 @@
});
group('query', () {
+ _checkQuery(result, names) {
+ expect(result.map((e) => e.name), unorderedEquals(names));
+ }
+
test('default', () {
var options = new smoke.QueryOptions();
var res = smoke.query(A, options);
- expect(res.map((e) => e.name), [#i, #j, #j2]);
+ _checkQuery(res, [#i, #j, #j2]);
});
test('only fields', () {
var options = new smoke.QueryOptions(includeProperties: false);
var res = smoke.query(A, options);
- expect(res.map((e) => e.name), [#i, #j]);
+ _checkQuery(res, [#i, #j]);
});
test('only properties', () {
var options = new smoke.QueryOptions(includeFields: false);
var res = smoke.query(A, options);
- expect(res.map((e) => e.name), [#j2]);
+ _checkQuery(res, [#j2]);
});
test('properties and methods', () {
var options = new smoke.QueryOptions(includeMethods: true);
var res = smoke.query(A, options);
- expect(res.map((e) => e.name), [#i, #j, #j2, #inc0, #inc1, #inc2]);
+ _checkQuery(res, [#i, #j, #j2, #inc0, #inc1, #inc2]);
});
test('inherited properties and fields', () {
var options = new smoke.QueryOptions(includeInherited: true);
var res = smoke.query(D, options);
- expect(res.map((e) => e.name), [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
+ _checkQuery(res, [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
});
test('inherited fields only', () {
var options = new smoke.QueryOptions(includeInherited: true,
includeProperties: false);
var res = smoke.query(D, options);
- expect(res.map((e) => e.name), [#x, #y, #b, #i, #j]);
+ _checkQuery(res, [#x, #y, #b, #i, #j]);
});
test('exact annotation', () {
var options = new smoke.QueryOptions(includeInherited: true,
withAnnotations: const [a1]);
var res = smoke.query(H, options);
- expect(res.map((e) => e.name), [#b, #f, #g]);
+ _checkQuery(res, [#b, #f, #g]);
options = new smoke.QueryOptions(includeInherited: true,
withAnnotations: const [a2]);
res = smoke.query(H, options);
- expect(res.map((e) => e.name), [#d, #h]);
+ _checkQuery(res, [#d, #h]);
options = new smoke.QueryOptions(includeInherited: true,
withAnnotations: const [a1, a2]);
res = smoke.query(H, options);
- expect(res.map((e) => e.name), [#b, #d, #f, #g, #h]);
+ _checkQuery(res, [#b, #d, #f, #g, #h]);
});
test('type annotation', () {
var options = new smoke.QueryOptions(includeInherited: true,
withAnnotations: const [Annot]);
var res = smoke.query(H, options);
- expect(res.map((e) => e.name), [#b, #f, #g, #i]);
+ _checkQuery(res, [#b, #f, #g, #i]);
});
test('mixed annotations (type and exact)', () {
var options = new smoke.QueryOptions(includeInherited: true,
withAnnotations: const [a2, Annot]);
var res = smoke.query(H, options);
- expect(res.map((e) => e.name), [#b, #d, #f, #g, #h, #i]);
+ _checkQuery(res, [#b, #d, #f, #g, #h, #i]);
});
test('symbol to name', () {
diff --git a/pkg/smoke/test/static_test.dart b/pkg/smoke/test/static_test.dart
index 9ede138..a92adc4 100644
--- a/pkg/smoke/test/static_test.dart
+++ b/pkg/smoke/test/static_test.dart
@@ -1,113 +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.
+/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------
+/// To update this test file, call:
+/// > dart codegen/end_to_end_test.dart --update_static_test
+/// --------------------------------------------------------
library smoke.test.static_test;
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart';
import 'package:unittest/unittest.dart';
-import 'common.dart' hide main;
+import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
+import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
+import 'common.dart' as smoke_0;
import 'common.dart' as common show main;
-// Abstract class used to represent the mixing C&A in the smoke configuration.
-abstract class C_with_A {}
+abstract class _M0 {} // C & A
-// Static configuration that declares only the symbols, getters, methods, and
-// super-class relationships we want to preserve. This and the class above
-// should be automatically generated by transformers using smoke.
-var _config = new StaticConfiguration(
- getters: {
- #i: (o) => o.i,
- #j: (o) => o.j,
- #j2: (o) => o.j2,
- #inc0: (o) => o.inc0,
- #inc1: (o) => o.inc1,
- #inc2: (o) => o.inc2,
- },
- setters: {
- #i: (o, v) { o.i = v; },
- #j2: (o, v) { o.j2 = v; },
- },
- // TODO(sigmund): this could be a const map, but that triggers
- // dartbug.com/17123
- // TODO(sigmund): before doing codegen for this, consider changing smoke's
- // defaults so we don't need to specify obvious things like `int`, or `*:
- // Object`.
- parents: {
- Annot: Object,
- AnnotB: Annot,
- A: Object,
- B: Object,
- C: Object,
- C_with_A: C,
- D: C_with_A,
- E: Object,
- E2: E,
- F: Object,
- F2: F,
- G: Object,
- H: G,
- int: Object,
- },
- declarations: {
- B: {
- #a: const Declaration(#a, A),
- #w: const Declaration(#w, int, kind: PROPERTY),
- #f: const Declaration(#f, int, isFinal: true),
+_configure() {
+ useGeneratedCode(new StaticConfiguration(
+ checkedMode: false,
+ getters: {
+ #i: (o) => o.i,
+ #inc0: (o) => o.inc0,
+ #inc1: (o) => o.inc1,
+ #inc2: (o) => o.inc2,
+ #j: (o) => o.j,
+ #j2: (o) => o.j2,
},
- A: {
- #i: const Declaration(#i, int),
- #j: const Declaration(#j, int),
- #j2: const Declaration(#j2, int, kind: PROPERTY),
- #inc0: const Declaration(#inc0, Function, kind: METHOD),
- #inc1: const Declaration(#inc1, Function, kind: METHOD),
- #inc2: const Declaration(#inc2, Function, kind: METHOD),
+ setters: {
+ #i: (o, v) { o.i = v; },
+ #j2: (o, v) { o.j2 = v; },
},
- C: {
- #x: const Declaration(#x, int),
- #y: const Declaration(#y, String),
- #b: const Declaration(#b, B),
- #inc: const Declaration(#inc, Function, kind: METHOD),
+ parents: {
+ smoke_0.AnnotB: smoke_0.Annot,
+ smoke_0.D: _M0,
+ smoke_0.E2: smoke_0.E,
+ smoke_0.F2: smoke_0.F,
+ smoke_0.H: smoke_0.G,
+ _M0: smoke_0.C,
},
- C_with_A: {
- #i: const Declaration(#i, int),
- #j: const Declaration(#j, int),
- #j2: const Declaration(#j2, int, kind: PROPERTY),
- #inc0: const Declaration(#inc0, Function, kind: METHOD),
- #inc1: const Declaration(#inc1, Function, kind: METHOD),
- #inc2: const Declaration(#inc2, Function, kind: METHOD),
+ declarations: {
+ smoke_0.A: {
+ #i: const Declaration(#i, int),
+ #inc0: const Declaration(#inc0, Function, kind: METHOD),
+ #inc1: const Declaration(#inc1, Function, kind: METHOD),
+ #inc2: const Declaration(#inc2, Function, kind: METHOD),
+ #j: const Declaration(#j, int),
+ #j2: const Declaration(#j2, int, kind: PROPERTY),
+ },
+ smoke_0.B: {
+ #a: const Declaration(#a, smoke_0.A),
+ #f: const Declaration(#f, int, isFinal: true),
+ #w: const Declaration(#w, int, kind: PROPERTY),
+ },
+ smoke_0.C: {
+ #b: const Declaration(#b, smoke_0.B),
+ #inc: const Declaration(#inc, Function, kind: METHOD),
+ #x: const Declaration(#x, int),
+ #y: const Declaration(#y, String),
+ },
+ smoke_0.D: {
+ #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
+ #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
+ },
+ smoke_0.E: {
+ #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
+ #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
+ },
+ smoke_0.E2: const {},
+ smoke_0.F: {
+ #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
+ },
+ smoke_0.F2: const {},
+ smoke_0.G: {
+ #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
+ #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
+ },
+ smoke_0.H: {
+ #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
+ #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
+ #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
+ #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
+ },
+ _M0: {
+ #i: const Declaration(#i, int),
+ #inc: const Declaration(#inc, Function, kind: METHOD),
+ #inc0: const Declaration(#inc0, Function, kind: METHOD),
+ #j: const Declaration(#j, int),
+ #j2: const Declaration(#j2, int, kind: PROPERTY),
+ },
},
- D: {
- #x2: const Declaration(#x2, int, kind: PROPERTY),
- #i2: const Declaration(#i2, int, kind: PROPERTY),
- },
- E: {
- #y: const Declaration(#y, int, isFinal: true, kind: PROPERTY),
- #noSuchMethod:
- const Declaration(#noSuchMethody, Function, kind: METHOD),
- },
- E2: const {},
- F: {#staticMethod: const Declaration(#staticMethod, Function,
- kind: METHOD, isStatic: true)},
- F2: const {},
- G: {
- #a: const Declaration(#a, int),
- #b: const Declaration(#b, int, annotations: const [a1]),
- #c: const Declaration(#c, int),
- #d: const Declaration(#d, int, annotations: const [a2]),
- },
- H: {
- #e: const Declaration(#e, int),
- #f: const Declaration(#f, int, annotations: const [a1]),
- #g: const Declaration(#g, int, annotations: const [a1]),
- #h: const Declaration(#h, int, annotations: const [a2]),
- #i: const Declaration(#i, int, annotations: const [a3]),
- },
- },
- names: {#i: 'i'});
+ names: {
+ #i: 'i',
+ }));
+}
main() {
- setUp(() => useGeneratedCode(_config));
+ setUp(_configure);
common.main();
}
diff --git a/pkg/template_binding/test/utils.dart b/pkg/template_binding/test/utils.dart
index 35e37b3..d2d7379 100644
--- a/pkg/template_binding/test/utils.dart
+++ b/pkg/template_binding/test/utils.dart
@@ -7,6 +7,10 @@
import 'dart:async';
import 'dart:html';
import 'package:observe/observe.dart';
+
+// Note: tests that import 'utils.dart' rely on the following line to make test
+// smaller for dart2js and prevent timeouts in the test bots.
+import 'package:observe/mirrors_used.dart';
import 'package:template_binding/template_binding.dart';
export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index be17c3f..24d6de1 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -79,16 +79,33 @@
try {
Uri requestUri = Uri.parse(uri);
_client.getUrl(requestUri)
- .then((HttpClientRequest request) => request.close())
+ .then((HttpClientRequest request) {
+ request.persistentConnection = false;
+ return request.close();
+ })
.then((HttpClientResponse response) {
- return response
- .fold(new BytesBuilder(), (b, d) => b..add(d))
- .then((builder) {
- _requestCompleted(builder.takeBytes(), response);
- // This client is only used for a single request. Force closing
- // it now otherwise we wait around until it times out.
- _client.close(force:true);
- });
+ // Only create a ByteBuilder, if multiple chunks are received.
+ var bufferOrBuilder;
+ response.listen(
+ (data) {
+ if (bufferOrBuilder == null) {
+ bufferOrBuilder = data;
+ } else {
+ if (bufferOrBuilder is! BytesBuilder) {
+ bufferOrBuilder = new BytesBuilder()
+ ..add(bufferOrBuilder);
+ }
+ bufferOrBuilder.add(data);
+ }
+ },
+ onDone: () {
+ var data = bufferOrBuilder;
+ if (data is BytesBuilder) data = data.takeBytes();
+ _requestCompleted(data, response);
+ // Close the client to stop any timers currently held alive.
+ _client.close();
+ },
+ onError: _requestFailed);
}).catchError((error) {
_requestFailed(error);
});
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 4b4e4cc..2d997bc 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -53,7 +53,6 @@
'io_buffer.cc',
'io_buffer.h',
'isolate_data.h',
- 'signal_blocker.h',
'thread.h',
'utils.h',
'utils_android.cc',
diff --git a/runtime/bin/crypto_android.cc b/runtime/bin/crypto_android.cc
index 61b87a1..8922a5e 100644
--- a/runtime/bin/crypto_android.cc
+++ b/runtime/bin/crypto_android.cc
@@ -11,6 +11,8 @@
#include "bin/fdutils.h"
#include "bin/crypto.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
diff --git a/runtime/bin/crypto_linux.cc b/runtime/bin/crypto_linux.cc
index 849fe71..905bf77 100644
--- a/runtime/bin/crypto_linux.cc
+++ b/runtime/bin/crypto_linux.cc
@@ -10,6 +10,7 @@
#include "bin/fdutils.h"
#include "bin/crypto.h"
+#include "platform/signal_blocker.h"
namespace dart {
@@ -18,8 +19,8 @@
bool Crypto::GetRandomBytes(intptr_t count, uint8_t* buffer) {
intptr_t fd = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY));
if (fd < 0) return false;
- intptr_t bytes_read = read(fd, buffer, count);
- close(fd);
+ intptr_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer, count));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return bytes_read == count;
}
diff --git a/runtime/bin/crypto_macos.cc b/runtime/bin/crypto_macos.cc
index 19745fc..36020d4 100644
--- a/runtime/bin/crypto_macos.cc
+++ b/runtime/bin/crypto_macos.cc
@@ -11,6 +11,8 @@
#include "bin/fdutils.h"
#include "bin/crypto.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index f87f882..972b36a 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -523,8 +523,16 @@
// Handle 'part' of IO library.
if (is_io_library) {
if (tag == Dart_kSourceTag) {
+ // Prepend the library URI to form a unique script URI for the part.
+ intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
+ char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
+ snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
+ Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
+ free(part_uri);
return Dart_LoadSource(
- library, url, Builtin::PartSource(Builtin::kIOLibrary, url_string));
+ library,
+ part_uri_obj,
+ Builtin::PartSource(Builtin::kIOLibrary, url_string));
} else {
ASSERT(tag == Dart_kImportTag);
return NewError("Unable to import '%s' ", url_string);
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index 92fb7ca5..35154a3 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -15,6 +15,8 @@
#include "bin/log.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -69,14 +71,14 @@
void DebuggerConnectionImpl::SetupPollQueue() {
- int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+ int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
if (result != 0) {
FATAL1("Pipe creation failed with error %d\n", result);
}
FDUtils::SetNonBlocking(wakeup_fds_[0]);
static const int kEpollInitialSize = 16;
- epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+ epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
if (epoll_fd_ == -1) {
FATAL("Failed creating epoll file descriptor");
}
@@ -85,7 +87,7 @@
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = wakeup_fds_[0];
- int status = TEMP_FAILURE_RETRY(epoll_ctl(
+ int status = NO_RETRY_EXPECTED(epoll_ctl(
epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
if (status == -1) {
FATAL("Failed adding wakeup fd to epoll instance");
@@ -94,7 +96,7 @@
// Register the listener_fd with the epoll instance.
event.events = EPOLLIN;
event.data.fd = DebuggerConnectionHandler::listener_fd_;
- status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+ status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
DebuggerConnectionHandler::listener_fd_, &event));
if (status == -1) {
FATAL("Failed adding listener fd to epoll instance");
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index 020b8cb..59dbd23 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -10,6 +10,7 @@
#include <stdlib.h> // NOLINT
#include <sys/epoll.h> // NOLINT
+#include "platform/signal_blocker.h"
#include "bin/dbg_connection.h"
#include "bin/fdutils.h"
#include "bin/log.h"
@@ -69,14 +70,14 @@
void DebuggerConnectionImpl::SetupPollQueue() {
- int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+ int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
if (result != 0) {
FATAL1("Pipe creation failed with error %d\n", result);
}
FDUtils::SetNonBlocking(wakeup_fds_[0]);
static const int kEpollInitialSize = 16;
- epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+ epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
if (epoll_fd_ == -1) {
FATAL("Failed creating epoll file descriptor");
}
@@ -85,8 +86,8 @@
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = wakeup_fds_[0];
- int status = TEMP_FAILURE_RETRY(epoll_ctl(
- epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
+ int status = NO_RETRY_EXPECTED(epoll_ctl(
+ epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
if (status == -1) {
FATAL("Failed adding wakeup fd to epoll instance");
}
@@ -94,8 +95,8 @@
// Register the listener_fd with the epoll instance.
event.events = EPOLLIN;
event.data.fd = DebuggerConnectionHandler::listener_fd_;
- status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
- DebuggerConnectionHandler::listener_fd_, &event));
+ status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+ DebuggerConnectionHandler::listener_fd_, &event));
if (status == -1) {
FATAL("Failed adding listener fd to epoll instance");
}
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index 3ee5bf3..f47755d 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -17,6 +17,7 @@
#include "bin/fdutils.h"
#include "bin/log.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
#include "platform/thread.h"
#include "platform/utils.h"
@@ -132,20 +133,20 @@
void DebuggerConnectionImpl::SetupPollQueue() {
int result;
- result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+ result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
if (result != 0) {
FATAL1("Pipe creation failed with error %d\n", result);
}
FDUtils::SetNonBlocking(wakeup_fds_[0]);
- kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+ kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
if (kqueue_fd_ == -1) {
FATAL("Failed creating kqueue\n");
}
// Register the wakeup_fd_ with the kqueue.
struct kevent event;
EV_SET(&event, wakeup_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
- int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+ int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
if (status == -1) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -156,7 +157,7 @@
// Register the listening socket.
EV_SET(&event, DebuggerConnectionHandler::listener_fd_,
EVFILT_READ, EV_ADD, 0, 0, NULL);
- status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+ status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
if (status == -1) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index e89dd05..60458da 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -17,6 +17,8 @@
#include "bin/file.h"
#include "bin/platform.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -104,9 +106,9 @@
int status = 0;
dirent entry;
dirent* result;
- if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
- &entry,
- &result))) == 0 &&
+ if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+ &entry,
+ &result))) == 0 &&
result != NULL) {
if (!listing->path_buffer().Add(entry.d_name)) {
done_ = true;
@@ -132,7 +134,7 @@
// the file pointed to.
struct stat entry_info;
int stat_success;
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
lstat(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
return kListError;
@@ -151,7 +153,7 @@
}
previous = previous->next;
}
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
stat(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
// Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
// Do not recurse into links for deletion. Instead delete the link.
// If it's a file, delete it.
struct stat st;
- if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
return false;
} else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
bool success = true;
dirent entry;
dirent* result;
- while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
- &entry,
- &result))) == 0 &&
+ while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+ &entry,
+ &result))) == 0 &&
result != NULL &&
success) {
switch (entry.d_type) {
@@ -282,7 +284,7 @@
success = false;
break;
}
- int lstat_success = TEMP_FAILURE_RETRY(
+ int lstat_success = NO_RETRY_EXPECTED(
lstat(path->AsString(), &entry_info));
if (lstat_success == -1) {
success = false;
@@ -316,7 +318,7 @@
Directory::ExistsResult Directory::Exists(const char* dir_name) {
struct stat entry_info;
- int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+ int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
if (success == 0) {
if (S_ISDIR(entry_info.st_mode)) {
return EXISTS;
@@ -357,7 +359,7 @@
bool Directory::SetCurrent(const char* path) {
- int result = TEMP_FAILURE_RETRY(chdir(path));
+ int result = NO_RETRY_EXPECTED(chdir(path));
return result == 0;
}
@@ -365,7 +367,7 @@
bool Directory::Create(const char* dir_name) {
// Create the directory with the permissions specified by the
// process umask.
- int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+ int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
// If the directory already exists, treat it as a success.
if (result == -1 && errno == EEXIST) {
return (Exists(dir_name) == EXISTS);
@@ -430,9 +432,9 @@
if (!recursive) {
if (File::GetType(dir_name, false) == File::kIsLink &&
File::GetType(dir_name, true) == File::kIsDirectory) {
- return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+ return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
}
- return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+ return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
} else {
PathBuffer path;
if (!path.Add(dir_name)) {
@@ -446,7 +448,7 @@
bool Directory::Rename(const char* path, const char* new_path) {
ExistsResult exists = Exists(path);
if (exists != EXISTS) return false;
- return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+ return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
}
} // namespace bin
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index c37b58b..f6b09c4 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -15,6 +15,7 @@
#include <sys/stat.h> // NOLINT
#include <unistd.h> // NOLINT
+#include "platform/signal_blocker.h"
#include "bin/file.h"
#include "bin/platform.h"
@@ -105,9 +106,9 @@
int status = 0;
dirent entry;
dirent* result;
- if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
- &entry,
- &result))) == 0 &&
+ if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+ &entry,
+ &result))) == 0 &&
result != NULL) {
if (!listing->path_buffer().Add(entry.d_name)) {
done_ = true;
@@ -133,7 +134,7 @@
// the file pointed to.
struct stat64 entry_info;
int stat_success;
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
lstat64(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
return kListError;
@@ -152,7 +153,7 @@
}
previous = previous->next;
}
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
stat64(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
// Report a broken link as a link, even if follow_links is true.
@@ -196,7 +197,7 @@
DirectoryListingEntry::~DirectoryListingEntry() {
ResetLink();
if (lister_ != 0) {
- closedir(reinterpret_cast<DIR*>(lister_));
+ VOID_NO_RETRY_EXPECTED(closedir(reinterpret_cast<DIR*>(lister_)));
}
}
@@ -217,7 +218,8 @@
static bool DeleteFile(char* file_name,
PathBuffer* path) {
- return path->Add(file_name) && unlink(path->AsString()) == 0;
+ return path->Add(file_name) &&
+ NO_RETRY_EXPECTED(unlink(path->AsString())) == 0;
}
@@ -233,10 +235,10 @@
// Do not recurse into links for deletion. Instead delete the link.
// If it's a file, delete it.
struct stat64 st;
- if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &st)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat64(path->AsString(), &st)) == -1) {
return false;
} else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
- return (unlink(path->AsString()) == 0);
+ return (NO_RETRY_EXPECTED(unlink(path->AsString())) == 0);
}
if (!path->Add(File::PathSeparator())) return false;
@@ -258,11 +260,10 @@
bool success = true;
dirent entry;
dirent* result;
- while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
- &entry,
- &result))) == 0 &&
- result != NULL &&
- success) {
+ while ((read = NO_RETRY_EXPECTED(
+ readdir_r(dir_pointer, &entry, &result))) == 0 &&
+ result != NULL &&
+ success) {
switch (entry.d_type) {
case DT_DIR:
success = success && DeleteDir(entry.d_name, path);
@@ -283,7 +284,7 @@
// readdir_r. For those we use lstat to determine the entry
// type.
struct stat64 entry_info;
- int lstat_success = TEMP_FAILURE_RETRY(
+ int lstat_success = NO_RETRY_EXPECTED(
lstat64(path->AsString(), &entry_info));
if (lstat_success == -1) {
success = false;
@@ -307,8 +308,8 @@
}
if ((read != 0) ||
- (closedir(dir_pointer) == -1) ||
- (remove(path->AsString()) == -1)) {
+ (NO_RETRY_EXPECTED(closedir(dir_pointer)) == -1) ||
+ (NO_RETRY_EXPECTED(remove(path->AsString())) == -1)) {
return false;
}
return success;
@@ -317,7 +318,7 @@
Directory::ExistsResult Directory::Exists(const char* dir_name) {
struct stat64 entry_info;
- int success = TEMP_FAILURE_RETRY(stat64(dir_name, &entry_info));
+ int success = NO_RETRY_EXPECTED(stat64(dir_name, &entry_info));
if (success == 0) {
if (S_ISDIR(entry_info.st_mode)) {
return EXISTS;
@@ -361,15 +362,14 @@
bool Directory::SetCurrent(const char* path) {
- int result = TEMP_FAILURE_RETRY(chdir(path));
- return result == 0;
+ return NO_RETRY_EXPECTED(chdir(path)) == 0;
}
bool Directory::Create(const char* dir_name) {
// Create the directory with the permissions specified by the
// process umask.
- int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+ int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
// If the directory already exists, treat it as a success.
if (result == -1 && errno == EEXIST) {
return (Exists(dir_name) == EXISTS);
@@ -422,9 +422,9 @@
if (!recursive) {
if (File::GetType(dir_name, false) == File::kIsLink &&
File::GetType(dir_name, true) == File::kIsDirectory) {
- return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+ return NO_RETRY_EXPECTED(unlink(dir_name)) == 0;
}
- return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+ return NO_RETRY_EXPECTED(rmdir(dir_name)) == 0;
} else {
PathBuffer path;
if (!path.Add(dir_name)) {
@@ -438,7 +438,7 @@
bool Directory::Rename(const char* path, const char* new_path) {
ExistsResult exists = Exists(path);
if (exists != EXISTS) return false;
- return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+ return NO_RETRY_EXPECTED(rename(path, new_path)) == 0;
}
} // namespace bin
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 94b495d..f75047d 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -17,6 +17,8 @@
#include "bin/file.h"
#include "bin/platform.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -104,9 +106,9 @@
int status = 0;
dirent entry;
dirent* result;
- if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
- &entry,
- &result))) == 0 &&
+ if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+ &entry,
+ &result))) == 0 &&
result != NULL) {
if (!listing->path_buffer().Add(entry.d_name)) {
done_ = true;
@@ -132,7 +134,7 @@
// the file pointed to.
struct stat entry_info;
int stat_success;
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
lstat(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
return kListError;
@@ -151,7 +153,7 @@
}
previous = previous->next;
}
- stat_success = TEMP_FAILURE_RETRY(
+ stat_success = NO_RETRY_EXPECTED(
stat(listing->path_buffer().AsString(), &entry_info));
if (stat_success == -1) {
// Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
// Do not recurse into links for deletion. Instead delete the link.
// If it's a file, delete it.
struct stat st;
- if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
return false;
} else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
bool success = true;
dirent entry;
dirent* result;
- while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
- &entry,
- &result))) == 0 &&
+ while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+ &entry,
+ &result))) == 0 &&
result != NULL &&
success) {
switch (entry.d_type) {
@@ -282,7 +284,7 @@
success = false;
break;
}
- int lstat_success = TEMP_FAILURE_RETRY(
+ int lstat_success = NO_RETRY_EXPECTED(
lstat(path->AsString(), &entry_info));
if (lstat_success == -1) {
success = false;
@@ -316,7 +318,7 @@
Directory::ExistsResult Directory::Exists(const char* dir_name) {
struct stat entry_info;
- int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+ int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
if (success == 0) {
if (S_ISDIR(entry_info.st_mode)) {
return EXISTS;
@@ -349,7 +351,7 @@
bool Directory::SetCurrent(const char* path) {
- int result = TEMP_FAILURE_RETRY(chdir(path));
+ int result = NO_RETRY_EXPECTED(chdir(path));
return result == 0;
}
@@ -357,7 +359,7 @@
bool Directory::Create(const char* dir_name) {
// Create the directory with the permissions specified by the
// process umask.
- int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+ int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
// If the directory already exists, treat it as a success.
if (result == -1 && errno == EEXIST) {
return (Exists(dir_name) == EXISTS);
@@ -410,9 +412,9 @@
if (!recursive) {
if (File::GetType(dir_name, false) == File::kIsLink &&
File::GetType(dir_name, true) == File::kIsDirectory) {
- return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+ return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
}
- return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+ return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
} else {
PathBuffer path;
if (!path.Add(dir_name)) {
@@ -426,7 +428,7 @@
bool Directory::Rename(const char* path, const char* new_path) {
ExistsResult exists = Exists(path);
if (exists != EXISTS) return false;
- return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+ return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
}
} // namespace bin
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index ce5171a..8600613 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -56,10 +56,10 @@
// Unregister the file descriptor for a SocketData structure with epoll.
static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
- VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_DEL,
- sd->fd(),
- NULL));
+ VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_DEL,
+ sd->fd(),
+ NULL));
}
@@ -67,10 +67,10 @@
struct epoll_event event;
event.events = sd->GetPollEvents();
event.data.ptr = sd;
- int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_ADD,
- sd->fd(),
- &event));
+ int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_ADD,
+ sd->fd(),
+ &event));
if (status == -1) {
// Epoll does not accept the file descriptor. It could be due to
// already closed file descriptor, or unuspported devices, such
@@ -84,7 +84,7 @@
EventHandlerImplementation::EventHandlerImplementation()
: socket_map_(&HashMap::SamePointerValue, 16) {
intptr_t result;
- result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+ result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
if (result != 0) {
FATAL("Pipe creation failed");
}
@@ -95,7 +95,7 @@
// The initial size passed to epoll_create is ignore on newer (>=
// 2.6.8) Linux versions
static const int kEpollInitialSize = 64;
- epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+ epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
if (epoll_fd_ == -1) {
FATAL("Failed creating epoll file descriptor");
}
@@ -104,7 +104,7 @@
struct epoll_event event;
event.events = EPOLLIN;
event.data.ptr = NULL;
- int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+ int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
EPOLL_CTL_ADD,
interrupt_fds_[0],
&event));
@@ -115,8 +115,8 @@
EventHandlerImplementation::~EventHandlerImplementation() {
- TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
- TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+ VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
+ VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
}
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 2647164..6b1bec6 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -10,11 +10,13 @@
#error use eventhandler.h instead.
#endif
-#include <unistd.h>
+#include <errno.h>
#include <sys/epoll.h>
#include <sys/socket.h>
+#include <unistd.h>
#include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
namespace dart {
@@ -40,7 +42,7 @@
void Close() {
port_ = 0;
mask_ = 0;
- close(fd_);
+ VOID_TEMP_FAILURE_RETRY(close(fd_));
fd_ = -1;
}
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index f87c1a4..d44486e 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -20,7 +20,7 @@
#include "bin/dartutils.h"
#include "bin/fdutils.h"
#include "bin/log.h"
-#include "platform/hashmap.h"
+#include "bin/socket.h"
#include "platform/thread.h"
#include "platform/utils.h"
@@ -49,10 +49,10 @@
// Unregister the file descriptor for a SocketData structure with epoll.
static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
- VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_DEL,
- sd->fd(),
- NULL));
+ VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_DEL,
+ sd->fd(),
+ NULL));
}
@@ -60,10 +60,10 @@
struct epoll_event event;
event.events = sd->GetPollEvents();
event.data.ptr = sd;
- int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_ADD,
- sd->fd(),
- &event));
+ int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_ADD,
+ sd->fd(),
+ &event));
if (status == -1) {
// Epoll does not accept the file descriptor. It could be due to
// already closed file descriptor, or unuspported devices, such
@@ -77,7 +77,7 @@
EventHandlerImplementation::EventHandlerImplementation()
: socket_map_(&HashMap::SamePointerValue, 16) {
intptr_t result;
- result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+ result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
if (result != 0) {
FATAL("Pipe creation failed");
}
@@ -88,7 +88,7 @@
// The initial size passed to epoll_create is ignore on newer (>=
// 2.6.8) Linux versions
static const int kEpollInitialSize = 64;
- epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+ epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
if (epoll_fd_ == -1) {
FATAL1("Failed creating epoll file descriptor: %i", errno);
}
@@ -97,24 +97,24 @@
struct epoll_event event;
event.events = EPOLLIN;
event.data.ptr = NULL;
- int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_ADD,
- interrupt_fds_[0],
- &event));
+ int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_ADD,
+ interrupt_fds_[0],
+ &event));
if (status == -1) {
FATAL("Failed adding interrupt fd to epoll instance");
}
- timer_fd_ = TEMP_FAILURE_RETRY(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
+ timer_fd_ = NO_RETRY_EXPECTED(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
if (timer_fd_ == -1) {
FATAL1("Failed creating timerfd file descriptor: %i", errno);
}
// Register the timer_fd_ with the epoll instance.
event.events = EPOLLIN;
event.data.fd = timer_fd_;
- status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
- EPOLL_CTL_ADD,
- timer_fd_,
- &event));
+ status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+ EPOLL_CTL_ADD,
+ timer_fd_,
+ &event));
if (status == -1) {
FATAL2(
"Failed adding timerfd fd(%i) to epoll instance: %i", timer_fd_, errno);
@@ -184,7 +184,8 @@
it.it_value.tv_sec = millis / 1000;
it.it_value.tv_nsec = (millis % 1000) * 1000000;
}
- timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL);
+ VOID_NO_RETRY_EXPECTED(
+ timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL));
} else if (msg[i].id == kShutdownId) {
shutdown_ = true;
} else {
@@ -192,11 +193,11 @@
if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
ASSERT(msg[i].data == (1 << kShutdownReadCommand));
// Close the socket for reading.
- shutdown(sd->fd(), SHUT_RD);
+ VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
} else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
// Close the socket for writing.
- shutdown(sd->fd(), SHUT_WR);
+ VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_WR));
} else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
ASSERT(msg[i].data == (1 << kCloseCommand));
// Close the socket and free system resources and move on to
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index 9341cd1..54f02509 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -9,11 +9,13 @@
#error Do not include eventhandler_linux.h directly; use eventhandler.h instead.
#endif
-#include <unistd.h>
+#include <errno.h>
#include <sys/epoll.h>
#include <sys/socket.h>
+#include <unistd.h>
#include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
namespace dart {
@@ -38,7 +40,7 @@
void Close() {
port_ = 0;
mask_ = 0;
- close(fd_);
+ VOID_TEMP_FAILURE_RETRY(close(fd_));
fd_ = -1;
}
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 8024e1c..beeae4b 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -49,9 +49,9 @@
static const intptr_t kMaxChanges = 2;
struct kevent events[kMaxChanges];
EV_SET(events, sd->fd(), EVFILT_READ, EV_DELETE, 0, 0, NULL);
- VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+ VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
EV_SET(events, sd->fd(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
- VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+ VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
sd->set_tracked_by_kqueue(false);
}
@@ -88,7 +88,7 @@
ASSERT(changes > 0);
ASSERT(changes <= kMaxChanges);
int status =
- TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
+ NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
if (status == -1) {
// kQueue does not accept the file descriptor. It could be due to
// already closed file descriptor, or unuspported devices, such
@@ -104,7 +104,7 @@
EventHandlerImplementation::EventHandlerImplementation()
: socket_map_(&HashMap::SamePointerValue, 16) {
intptr_t result;
- result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+ result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
if (result != 0) {
FATAL("Pipe creation failed");
}
@@ -113,7 +113,7 @@
FDUtils::SetCloseOnExec(interrupt_fds_[1]);
shutdown_ = false;
- kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+ kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
if (kqueue_fd_ == -1) {
FATAL("Failed creating kqueue");
}
@@ -121,7 +121,7 @@
// Register the interrupt_fd with the kqueue.
struct kevent event;
EV_SET(&event, interrupt_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
- int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+ int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
if (status == -1) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index 70a103c..18e463b 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -9,11 +9,13 @@
#error Do not include eventhandler_macos.h directly; use eventhandler.h instead.
#endif
-#include <unistd.h>
+#include <errno.h>
#include <sys/event.h> // NOLINT
#include <sys/socket.h>
+#include <unistd.h>
#include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
namespace dart {
@@ -44,7 +46,7 @@
void Close() {
port_ = 0;
mask_ = 0;
- close(fd_);
+ VOID_TEMP_FAILURE_RETRY(close(fd_));
fd_ = -1;
}
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index 2048667..ba28199 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -12,18 +12,20 @@
#include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
bool FDUtils::SetCloseOnExec(intptr_t fd) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
if (status < 0) {
return false;
}
status |= FD_CLOEXEC;
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
return false;
}
return true;
@@ -32,12 +34,12 @@
static bool SetBlockingHelper(intptr_t fd, bool blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
return false;
}
return true;
@@ -56,7 +58,7 @@
bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
@@ -67,7 +69,7 @@
intptr_t FDUtils::AvailableBytes(intptr_t fd) {
int available; // ioctl for FIONREAD expects an 'int*' argument.
- int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+ int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
if (result < 0) {
return result;
}
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index 3bb1ce1..e8984dd 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -11,6 +11,7 @@
#include <sys/ioctl.h> // NOLINT
#include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
namespace dart {
@@ -18,12 +19,12 @@
bool FDUtils::SetCloseOnExec(intptr_t fd) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
if (status < 0) {
return false;
}
status |= FD_CLOEXEC;
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
return false;
}
return true;
@@ -32,12 +33,12 @@
static bool SetBlockingHelper(intptr_t fd, bool blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
return false;
}
return true;
@@ -56,7 +57,7 @@
bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
@@ -67,7 +68,7 @@
intptr_t FDUtils::AvailableBytes(intptr_t fd) {
int available; // ioctl for FIONREAD expects an 'int*' argument.
- int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+ int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
if (result < 0) {
return result;
}
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index bbc442d..2ecf600 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -12,18 +12,20 @@
#include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
bool FDUtils::SetCloseOnExec(intptr_t fd) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
if (status < 0) {
return false;
}
status |= FD_CLOEXEC;
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
return false;
}
return true;
@@ -32,12 +34,12 @@
static bool SetBlockingHelper(intptr_t fd, bool blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
- if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+ if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
return false;
}
return true;
@@ -56,7 +58,7 @@
bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
intptr_t status;
- status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+ status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
if (status < 0) {
return false;
}
@@ -67,7 +69,7 @@
intptr_t FDUtils::AvailableBytes(intptr_t fd) {
int available; // ioctl for FIONREAD expects an 'int*' argument.
- int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+ int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
if (result < 0) {
return result;
}
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 6c740c5..fb3a616 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -17,7 +17,8 @@
#include "bin/builtin.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
namespace dart {
@@ -52,7 +53,7 @@
VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
VOID_TEMP_FAILURE_RETRY(close(null_fd));
} else {
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+ int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
if (err != 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -71,47 +72,44 @@
int64_t File::Read(void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
}
int64_t File::Write(const void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
}
int64_t File::Position() {
ASSERT(handle_->fd() >= 0);
- return lseek64(handle_->fd(), 0, SEEK_CUR);
+ return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
}
bool File::SetPosition(int64_t position) {
ASSERT(handle_->fd() >= 0);
- return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+ return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
}
bool File::Truncate(int64_t length) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ftruncate(handle_->fd(), length) != -1);
+ return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
}
bool File::Flush() {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+ return NO_RETRY_EXPECTED(fsync(handle_->fd()) != -1);
}
int64_t File::Length() {
ASSERT(handle_->fd() >= 0);
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+ if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
return st.st_size;
}
return -1;
@@ -121,7 +119,7 @@
File* File::Open(const char* name, FileOpenMode mode) {
// Report errors for non-regular files.
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
if (!S_ISREG(st.st_mode)) {
errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
return NULL;
@@ -135,7 +133,7 @@
flags = flags | O_TRUNC;
}
flags |= O_CLOEXEC;
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+ int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
if (fd < 0) {
return NULL;
}
@@ -157,7 +155,7 @@
bool File::Exists(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return S_ISREG(st.st_mode);
} else {
return false;
@@ -166,9 +164,7 @@
bool File::Create(const char* name) {
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name,
- O_RDONLY | O_CREAT | O_CLOEXEC,
- 0666));
+ int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
if (fd < 0) {
return false;
}
@@ -177,7 +173,7 @@
bool File::CreateLink(const char* name, const char* target) {
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+ int status = NO_RETRY_EXPECTED(symlink(target, name));
return (status == 0);
}
@@ -185,7 +181,7 @@
bool File::Delete(const char* name) {
File::Type type = File::GetType(name, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -198,7 +194,7 @@
bool File::DeleteLink(const char* name) {
File::Type type = File::GetType(name, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
}
errno = EINVAL;
return false;
@@ -208,7 +204,7 @@
bool File::Rename(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -221,7 +217,7 @@
bool File::RenameLink(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -235,25 +231,24 @@
File::Type type = File::GetType(old_path, true);
if (type == kIsFile) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(old_path, &st)) != 0) {
+ if (NO_RETRY_EXPECTED(stat(old_path, &st)) != 0) {
return false;
}
- int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(old_path,
- O_RDONLY | O_CLOEXEC));
+ int old_fd = TEMP_FAILURE_RETRY(open(old_path, O_RDONLY | O_CLOEXEC));
if (old_fd < 0) {
return false;
}
- int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ int new_fd = TEMP_FAILURE_RETRY(
open(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
if (new_fd < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+ VOID_TEMP_FAILURE_RETRY(close(old_fd));
return false;
}
off_t offset = 0;
int result = 1;
while (result > 0) {
// Loop to ensure we copy everything, and not only up to 2GB.
- result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ result = NO_RETRY_EXPECTED(
sendfile(new_fd, old_fd, &offset, kMaxUint32));
}
// From sendfile man pages:
@@ -262,10 +257,9 @@
if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
const intptr_t kBufferSize = 8 * KB;
uint8_t buffer[kBufferSize];
- while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ while ((result = TEMP_FAILURE_RETRY(
read(old_fd, buffer, kBufferSize))) > 0) {
- int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
- result));
+ int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
if (wrote != result) {
result = -1;
break;
@@ -274,9 +268,9 @@
}
if (result < 0) {
int e = errno;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+ VOID_TEMP_FAILURE_RETRY(close(old_fd));
+ VOID_TEMP_FAILURE_RETRY(close(new_fd));
+ VOID_NO_RETRY_EXPECTED(unlink(new_path));
errno = e;
return false;
}
@@ -292,7 +286,7 @@
int64_t File::LengthFromPath(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return st.st_size;
}
return -1;
@@ -301,7 +295,7 @@
void File::Stat(const char* name, int64_t* data) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
if (S_ISREG(st.st_mode)) {
data[kType] = kIsFile;
} else if (S_ISDIR(st.st_mode)) {
@@ -324,7 +318,7 @@
time_t File::LastModified(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return st.st_mtime;
}
return -1;
@@ -406,11 +400,9 @@
struct stat entry_info;
int stat_success;
if (follow_links) {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
} else {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
}
if (stat_success == -1) return File::kDoesNotExist;
if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -423,8 +415,8 @@
File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
struct stat file_1_info;
struct stat file_2_info;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+ NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
return File::kError;
}
return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 2e79248..92c5637 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -15,9 +15,9 @@
#include <unistd.h> // NOLINT
#include <libgen.h> // NOLINT
+#include "platform/signal_blocker.h"
#include "bin/builtin.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
namespace dart {
@@ -52,7 +52,7 @@
VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
VOID_TEMP_FAILURE_RETRY(close(null_fd));
} else {
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+ int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
if (err != 0) {
const int kBufferSize = 1024;
char error_buf[kBufferSize];
@@ -70,47 +70,44 @@
int64_t File::Read(void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
}
int64_t File::Write(const void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
}
int64_t File::Position() {
ASSERT(handle_->fd() >= 0);
- return lseek64(handle_->fd(), 0, SEEK_CUR);
+ return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
}
bool File::SetPosition(int64_t position) {
ASSERT(handle_->fd() >= 0);
- return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+ return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
}
bool File::Truncate(int64_t length) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ftruncate64(handle_->fd(), length) != -1);
+ return TEMP_FAILURE_RETRY(ftruncate64(handle_->fd(), length) != -1);
}
bool File::Flush() {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+ return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
}
int64_t File::Length() {
ASSERT(handle_->fd() >= 0);
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat64(handle_->fd(), &st)) == 0) {
+ if (NO_RETRY_EXPECTED(fstat64(handle_->fd(), &st)) == 0) {
return st.st_size;
}
return -1;
@@ -120,7 +117,7 @@
File* File::Open(const char* name, FileOpenMode mode) {
// Report errors for non-regular files.
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
// Only accept regular files and character devices.
if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,12 +132,12 @@
flags = flags | O_TRUNC;
}
flags |= O_CLOEXEC;
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(name, flags, 0666));
+ int fd = TEMP_FAILURE_RETRY(open64(name, flags, 0666));
if (fd < 0) {
return NULL;
}
if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
- int64_t position = lseek64(fd, 0, SEEK_END);
+ int64_t position = NO_RETRY_EXPECTED(lseek64(fd, 0, SEEK_END));
if (position < 0) {
return NULL;
}
@@ -157,7 +154,7 @@
bool File::Exists(const char* name) {
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
return S_ISREG(st.st_mode);
} else {
return false;
@@ -166,25 +163,24 @@
bool File::Create(const char* name) {
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ int fd = TEMP_FAILURE_RETRY(
open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
if (fd < 0) {
return false;
}
- return (close(fd) == 0);
+ return (TEMP_FAILURE_RETRY(close(fd)) == 0);
}
bool File::CreateLink(const char* name, const char* target) {
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
- return (status == 0);
+ return NO_RETRY_EXPECTED(symlink(target, name)) == 0;
}
bool File::Delete(const char* name) {
File::Type type = File::GetType(name, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -197,7 +193,7 @@
bool File::DeleteLink(const char* name) {
File::Type type = File::GetType(name, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
}
errno = EINVAL;
return false;
@@ -207,7 +203,7 @@
bool File::Rename(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -220,7 +216,7 @@
bool File::RenameLink(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -234,25 +230,24 @@
File::Type type = File::GetType(old_path, true);
if (type == kIsFile) {
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(old_path, &st)) != 0) {
+ if (NO_RETRY_EXPECTED(stat64(old_path, &st)) != 0) {
return false;
}
- int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(old_path,
- O_RDONLY | O_CLOEXEC));
+ int old_fd = TEMP_FAILURE_RETRY(open64(old_path, O_RDONLY | O_CLOEXEC));
if (old_fd < 0) {
return false;
}
- int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ int new_fd = TEMP_FAILURE_RETRY(
open64(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
if (new_fd < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+ VOID_TEMP_FAILURE_RETRY(close(old_fd));
return false;
}
int64_t offset = 0;
intptr_t result = 1;
while (result > 0) {
// Loop to ensure we copy everything, and not only up to 2GB.
- result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ result = NO_RETRY_EXPECTED(
sendfile64(new_fd, old_fd, &offset, kMaxUint32));
}
// From sendfile man pages:
@@ -261,10 +256,9 @@
if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
const intptr_t kBufferSize = 8 * KB;
uint8_t buffer[kBufferSize];
- while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ while ((result = TEMP_FAILURE_RETRY(
read(old_fd, buffer, kBufferSize))) > 0) {
- int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
- result));
+ int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
if (wrote != result) {
result = -1;
break;
@@ -273,9 +267,9 @@
}
if (result < 0) {
int e = errno;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+ VOID_TEMP_FAILURE_RETRY(close(old_fd));
+ VOID_TEMP_FAILURE_RETRY(close(new_fd));
+ VOID_NO_RETRY_EXPECTED(unlink(new_path));
errno = e;
return false;
}
@@ -291,7 +285,7 @@
int64_t File::LengthFromPath(const char* name) {
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
return st.st_size;
}
return -1;
@@ -300,7 +294,7 @@
void File::Stat(const char* name, int64_t* data) {
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
if (S_ISREG(st.st_mode)) {
data[kType] = kIsFile;
} else if (S_ISDIR(st.st_mode)) {
@@ -323,7 +317,7 @@
time_t File::LastModified(const char* name) {
struct stat64 st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
return st.st_mtime;
}
return -1;
@@ -332,14 +326,15 @@
char* File::LinkTarget(const char* pathname) {
struct stat64 link_stats;
- if (lstat64(pathname, &link_stats) != 0) return NULL;
+ if (NO_RETRY_EXPECTED(lstat64(pathname, &link_stats)) != 0) return NULL;
if (!S_ISLNK(link_stats.st_mode)) {
errno = ENOENT;
return NULL;
}
size_t target_size = link_stats.st_size;
char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
- size_t read_size = readlink(pathname, target_name, target_size + 1);
+ size_t read_size = NO_RETRY_EXPECTED(
+ readlink(pathname, target_name, target_size + 1));
if (read_size != target_size) {
free(target_name);
return NULL;
@@ -379,7 +374,7 @@
File::StdioHandleType File::GetStdioHandleType(int fd) {
ASSERT(0 <= fd && fd <= 2);
struct stat64 buf;
- int result = fstat64(fd, &buf);
+ int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
if (result == -1) {
const int kBufferSize = 1024;
char error_buf[kBufferSize];
@@ -398,11 +393,9 @@
struct stat64 entry_info;
int stat_success;
if (follow_links) {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(stat64(pathname, &entry_info));
} else {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(lstat64(pathname, &entry_info));
}
if (stat_success == -1) return File::kDoesNotExist;
if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -415,8 +408,8 @@
File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
struct stat64 file_1_info;
struct stat64 file_2_info;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_1, &file_1_info)) == -1 ||
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_2, &file_2_info)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat64(file_1, &file_1_info)) == -1 ||
+ NO_RETRY_EXPECTED(lstat64(file_2, &file_2_info)) == -1) {
return File::kError;
}
return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 46017fb..b5a1dd0 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -18,7 +18,8 @@
#include "bin/builtin.h"
#include "bin/fdutils.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
namespace dart {
namespace bin {
@@ -52,7 +53,7 @@
VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
VOID_TEMP_FAILURE_RETRY(close(null_fd));
} else {
- intptr_t err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+ intptr_t err = TEMP_FAILURE_RETRY(close(handle_->fd()));
if (err != 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -71,15 +72,13 @@
int64_t File::Read(void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
}
int64_t File::Write(const void* buffer, int64_t num_bytes) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
- num_bytes));
+ return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
}
@@ -97,21 +96,20 @@
bool File::Truncate(int64_t length) {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ftruncate(handle_->fd(), length) != -1);
+ return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length)) != -1;
}
bool File::Flush() {
ASSERT(handle_->fd() >= 0);
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+ return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
}
int64_t File::Length() {
ASSERT(handle_->fd() >= 0);
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+ if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
return st.st_size;
}
return -1;
@@ -121,7 +119,7 @@
File* File::Open(const char* name, FileOpenMode mode) {
// Report errors for non-regular files.
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
// Only accept regular files and character devices.
if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,7 +133,7 @@
if ((mode & kTruncate) != 0) {
flags = flags | O_TRUNC;
}
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+ int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
if (fd < 0) {
return NULL;
}
@@ -158,7 +156,7 @@
bool File::Exists(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return S_ISREG(st.st_mode);
} else {
return false;
@@ -167,8 +165,7 @@
bool File::Create(const char* name) {
- int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, O_RDONLY | O_CREAT,
- 0666));
+ int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT, 0666));
if (fd < 0) {
return false;
}
@@ -177,7 +174,7 @@
bool File::CreateLink(const char* name, const char* target) {
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+ int status = NO_RETRY_EXPECTED(symlink(target, name));
return (status == 0);
}
@@ -185,7 +182,7 @@
bool File::Delete(const char* name) {
File::Type type = File::GetType(name, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -198,7 +195,7 @@
bool File::DeleteLink(const char* name) {
File::Type type = File::GetType(name, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+ return NO_RETRY_EXPECTED(unlink(name)) == 0;
}
errno = EINVAL;
return false;
@@ -208,7 +205,7 @@
bool File::Rename(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, true);
if (type == kIsFile) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -221,7 +218,7 @@
bool File::RenameLink(const char* old_path, const char* new_path) {
File::Type type = File::GetType(old_path, false);
if (type == kIsLink) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+ return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
} else if (type == kIsDirectory) {
errno = EISDIR;
} else {
@@ -246,7 +243,7 @@
int64_t File::LengthFromPath(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return st.st_size;
}
return -1;
@@ -255,7 +252,7 @@
void File::Stat(const char* name, int64_t* data) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
if (S_ISREG(st.st_mode)) {
data[kType] = kIsFile;
} else if (S_ISDIR(st.st_mode)) {
@@ -278,7 +275,7 @@
time_t File::LastModified(const char* name) {
struct stat st;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+ if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
return st.st_mtime;
}
return -1;
@@ -359,11 +356,9 @@
struct stat entry_info;
int stat_success;
if (follow_links) {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
} else {
- stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
- &entry_info));
+ stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
}
if (stat_success == -1) return File::kDoesNotExist;
if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -376,8 +371,8 @@
File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
struct stat file_1_info;
struct stat file_2_info;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+ if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+ NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
return File::kError;
}
return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_system_watcher_android.cc b/runtime/bin/file_system_watcher_android.cc
index 96fd325..ac2ad5f 100644
--- a/runtime/bin/file_system_watcher_android.cc
+++ b/runtime/bin/file_system_watcher_android.cc
@@ -12,6 +12,8 @@
#include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -22,7 +24,7 @@
intptr_t FileSystemWatcher::Init() {
- int id = TEMP_FAILURE_RETRY(inotify_init());
+ int id = NO_RETRY_EXPECTED(inotify_init());
if (id < 0 || !FDUtils::SetCloseOnExec(id)) {
return -1;
}
@@ -48,7 +50,7 @@
if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
if (events & kDelete) list_events |= IN_DELETE;
if (events & kMove) list_events |= IN_MOVE;
- int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+ int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
if (path_id < 0) {
return -1;
}
@@ -57,7 +59,7 @@
void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
- VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+ VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
}
diff --git a/runtime/bin/file_system_watcher_linux.cc b/runtime/bin/file_system_watcher_linux.cc
index 2a5fee5..9261426 100644
--- a/runtime/bin/file_system_watcher_linux.cc
+++ b/runtime/bin/file_system_watcher_linux.cc
@@ -13,6 +13,8 @@
#include "bin/fdutils.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -23,7 +25,7 @@
intptr_t FileSystemWatcher::Init() {
- int id = TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
+ int id = NO_RETRY_EXPECTED(inotify_init1(IN_CLOEXEC));
if (id < 0) return -1;
// Some systems dosn't support setting this as non-blocking. Since watching
// internals are kept away from the user, we know it's possible to continue,
@@ -47,7 +49,7 @@
if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
if (events & kDelete) list_events |= IN_DELETE;
if (events & kMove) list_events |= IN_MOVE;
- int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+ int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
if (path_id < 0) {
return -1;
}
@@ -56,7 +58,7 @@
void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
- VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+ VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
}
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 30322c8..88d98d4 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -18,6 +18,8 @@
#include "bin/socket.h"
#include "bin/thread.h"
+#include "platform/signal_blocker.h"
+
#ifndef MAC_OS_X_VERSION_10_7
enum {
@@ -71,7 +73,7 @@
~Node() {
Stop();
- close(write_fd_);
+ VOID_TEMP_FAILURE_RETRY(close(write_fd_));
CFRelease(path_ref_);
}
@@ -261,7 +263,7 @@
Node* AddPath(const char* path, int events, bool recursive) {
int fds[2];
- VOID_TEMP_FAILURE_RETRY(pipe(fds));
+ VOID_NO_RETRY_EXPECTED(pipe(fds));
Socket::SetNonBlocking(fds[0]);
Socket::SetBlocking(fds[1]);
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 7fe5839..86d7c2d 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -48,6 +48,7 @@
V(Process_Wait, 5) \
V(Process_Kill, 3) \
V(Process_SetExitCode, 1) \
+ V(Process_GetExitCode, 0) \
V(Process_Exit, 1) \
V(Process_Sleep, 1) \
V(Process_Pid, 1) \
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 09476b9..5d392d2 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -221,6 +221,11 @@
}
+void FUNCTION_NAME(Process_GetExitCode)(Dart_NativeArguments args) {
+ Dart_SetReturnValue(args, Dart_NewInteger(Process::GlobalExitCode()));
+}
+
+
void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
int64_t milliseconds = 0;
// Ignore result if passing invalid argument and just set exit code to 0.
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 18e4b59..fafd749 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -18,9 +18,10 @@
#include "bin/fdutils.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/thread.h"
+#include "platform/signal_blocker.h"
+
extern char **environ;
@@ -151,7 +152,7 @@
running_ = false;
// Fork to wake up waitpid.
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+ if (TEMP_FAILURE_RETRY(fork()) == 0) {
exit(0);
}
@@ -251,7 +252,7 @@
FDUtils::WriteToBlocking(
exec_control_fd, os_error_message, strlen(os_error_message) + 1);
}
- TEMP_FAILURE_RETRY(close(exec_control_fd));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
exit(1);
}
@@ -286,8 +287,8 @@
result = TEMP_FAILURE_RETRY(pipe(read_err));
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -296,10 +297,10 @@
result = TEMP_FAILURE_RETRY(pipe(write_out));
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -308,12 +309,12 @@
result = TEMP_FAILURE_RETRY(pipe(exec_control));
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -322,14 +323,14 @@
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
Log::PrintErr("fcntl failed: %s\n", *os_error_message);
return errno;
}
@@ -350,18 +351,18 @@
program_environment[environment_length] = NULL;
}
- pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+ pid = TEMP_FAILURE_RETRY(fork());
if (pid < 0) {
SetChildOsErrorMessage(os_error_message);
delete[] program_arguments;
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
return errno;
} else if (pid == 0) {
// Wait for parent process before setting up the child process.
@@ -372,25 +373,25 @@
exit(1);
}
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
if (working_directory != NULL &&
TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
@@ -419,12 +420,12 @@
result = TEMP_FAILURE_RETRY(pipe(event_fds));
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -445,7 +446,7 @@
// Read exec result from child. If no data is returned the exec was
// successful and the exec call closed the pipe. Otherwise the errno
// is written to the pipe.
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
int child_errno;
int bytes_read = -1;
ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -461,22 +462,22 @@
message[kMaxMessageSize - 1] = '\0';
*os_error_message = message;
}
- TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
// Return error code if any failures.
if (bytes_read != 0) {
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
// Since exec() failed, we're not interested in the exit code.
// We close the reading side of the exit code pipe here.
// GetProcessExitCodes will get a broken pipe error when it tries to write
// to the writing side of the pipe and it will ignore the error.
- TEMP_FAILURE_RETRY(close(*exit_event));
+ VOID_TEMP_FAILURE_RETRY(close(*exit_event));
*exit_event = -1;
if (bytes_read == -1) {
@@ -488,13 +489,13 @@
FDUtils::SetNonBlocking(read_in[0]);
*in = read_in[0];
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
FDUtils::SetNonBlocking(write_out[1]);
*out = write_out[1];
- TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
FDUtils::SetNonBlocking(read_err[0]);
*err = read_err[0];
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
*id = pid;
return 0;
@@ -674,12 +675,12 @@
}
if (!found) return -1;
int fds[2];
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+ if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
return -1;
}
if (!FDUtils::SetNonBlocking(fds[0])) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -701,11 +702,10 @@
for (int i = 0; i < kSignalsCount; i++) {
sigaddset(&act.sa_mask, kSignals[i]);
}
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sigaction(signal, &act, NULL));
+ int status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
if (status < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
}
@@ -742,7 +742,7 @@
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = SIG_DFL;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+ VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
}
}
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index e2810fc..844d09e 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -16,9 +16,9 @@
#include <sys/wait.h> // NOLINT
#include <unistd.h> // NOLINT
+#include "platform/signal_blocker.h"
#include "bin/fdutils.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/thread.h"
@@ -151,7 +151,7 @@
running_ = false;
// Fork to wake up waitpid.
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+ if (TEMP_FAILURE_RETRY(fork()) == 0) {
exit(0);
}
@@ -250,7 +250,7 @@
FDUtils::WriteToBlocking(
exec_control_fd, os_error_message, strlen(os_error_message) + 1);
}
- TEMP_FAILURE_RETRY(close(exec_control_fd));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
exit(1);
}
@@ -274,7 +274,7 @@
int exec_control[2]; // Pipe to get the result from exec.
int result;
- result = TEMP_FAILURE_RETRY(pipe(read_in));
+ result = pipe(read_in);
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
@@ -282,37 +282,37 @@
}
FDUtils::SetCloseOnExec(read_in[0]);
- result = TEMP_FAILURE_RETRY(pipe(read_err));
+ result = pipe(read_err);
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
FDUtils::SetCloseOnExec(read_err[0]);
- result = TEMP_FAILURE_RETRY(pipe(write_out));
+ result = pipe(write_out);
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
FDUtils::SetCloseOnExec(write_out[1]);
- result = TEMP_FAILURE_RETRY(pipe(exec_control));
+ result = pipe(exec_control);
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -321,14 +321,14 @@
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
Log::PrintErr("fcntl failed: %s\n", *os_error_message);
return errno;
}
@@ -349,18 +349,18 @@
program_environment[environment_length] = NULL;
}
- pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+ pid = TEMP_FAILURE_RETRY(fork());
if (pid < 0) {
SetChildOsErrorMessage(os_error_message);
delete[] program_arguments;
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
return errno;
} else if (pid == 0) {
// Wait for parent process before setting up the child process.
@@ -371,28 +371,27 @@
exit(1);
}
- TEMP_FAILURE_RETRY(close(write_out[1]));
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
ReportChildError(exec_control[1]);
}
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
- if (working_directory != NULL &&
- TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
+ if (working_directory != NULL && chdir(working_directory) == -1) {
ReportChildError(exec_control[1]);
}
@@ -400,8 +399,7 @@
environ = program_environment;
}
- TEMP_FAILURE_RETRY(
- execvp(path, const_cast<char* const*>(program_arguments)));
+ execvp(path, const_cast<char* const*>(program_arguments));
ReportChildError(exec_control[1]);
}
@@ -415,15 +413,15 @@
delete[] program_environment;
int event_fds[2];
- result = TEMP_FAILURE_RETRY(pipe(event_fds));
+ result = pipe(event_fds);
if (result < 0) {
SetChildOsErrorMessage(os_error_message);
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
return errno;
}
@@ -444,7 +442,7 @@
// Read exec result from child. If no data is returned the exec was
// successful and the exec call closed the pipe. Otherwise the errno
// is written to the pipe.
- TEMP_FAILURE_RETRY(close(exec_control[1]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
int child_errno;
int bytes_read = -1;
ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -460,22 +458,22 @@
message[kMaxMessageSize - 1] = '\0';
*os_error_message = message;
}
- TEMP_FAILURE_RETRY(close(exec_control[0]));
+ VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
// Return error code if any failures.
if (bytes_read != 0) {
- TEMP_FAILURE_RETRY(close(read_in[0]));
- TEMP_FAILURE_RETRY(close(read_in[1]));
- TEMP_FAILURE_RETRY(close(read_err[0]));
- TEMP_FAILURE_RETRY(close(read_err[1]));
- TEMP_FAILURE_RETRY(close(write_out[0]));
- TEMP_FAILURE_RETRY(close(write_out[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
// Since exec() failed, we're not interested in the exit code.
// We close the reading side of the exit code pipe here.
// GetProcessExitCodes will get a broken pipe error when it tries to write
// to the writing side of the pipe and it will ignore the error.
- TEMP_FAILURE_RETRY(close(*exit_event));
+ VOID_TEMP_FAILURE_RETRY(close(*exit_event));
*exit_event = -1;
if (bytes_read == -1) {
@@ -487,13 +485,13 @@
FDUtils::SetNonBlocking(read_in[0]);
*in = read_in[0];
- TEMP_FAILURE_RETRY(close(read_in[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
FDUtils::SetNonBlocking(write_out[1]);
*out = write_out[1];
- TEMP_FAILURE_RETRY(close(write_out[0]));
+ VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
FDUtils::SetNonBlocking(read_err[0]);
*err = read_err[0];
- TEMP_FAILURE_RETRY(close(read_err[1]));
+ VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
*id = pid;
return 0;
@@ -618,7 +616,7 @@
bool Process::Kill(intptr_t id, int signal) {
- return (TEMP_FAILURE_RETRY(kill(id, signal)) != -1);
+ return kill(id, signal) != -1;
}
@@ -673,12 +671,12 @@
}
if (!found) return -1;
int fds[2];
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+ if (pipe(fds) != 0) {
return -1;
}
if (!FDUtils::SetNonBlocking(fds[0])) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -700,11 +698,10 @@
for (int i = 0; i < kSignalsCount; i++) {
sigaddset(&act.sa_mask, kSignals[i]);
}
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sigaction(signal, &act, NULL));
+ int status = sigaction(signal, &act, NULL);
if (status < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
}
@@ -741,7 +738,7 @@
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = SIG_DFL;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+ sigaction(signal, &act, NULL);
}
}
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 5c85d9a..0e82ce2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -18,9 +18,11 @@
#include "bin/fdutils.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/thread.h"
+#include "platform/signal_blocker.h"
+
+
extern char **environ;
@@ -150,7 +152,7 @@
running_ = false;
// Fork to wake up waitpid.
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+ if (TEMP_FAILURE_RETRY(fork()) == 0) {
exit(0);
}
@@ -349,7 +351,7 @@
program_environment[environment_length] = NULL;
}
- pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+ pid = TEMP_FAILURE_RETRY(fork());
if (pid < 0) {
SetChildOsErrorMessage(os_error_message);
delete[] program_arguments;
@@ -717,12 +719,12 @@
}
if (!found) return -1;
int fds[2];
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+ if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
return -1;
}
if (!FDUtils::SetNonBlocking(fds[0])) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -744,11 +746,10 @@
for (int i = 0; i < kSignalsCount; i++) {
sigaddset(&act.sa_mask, kSignals[i]);
}
- intptr_t status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sigaction(signal, &act, NULL));
+ intptr_t status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
if (status < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+ VOID_TEMP_FAILURE_RETRY(close(fds[1]));
return -1;
}
}
@@ -787,7 +788,7 @@
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = SIG_DFL;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+ VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
}
}
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 02a5e86..bb6461e 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -125,6 +125,7 @@
/* patch */ static void _exit(int status) native "Process_Exit";
/* patch */ static void _setExitCode(int status)
native "Process_SetExitCode";
+ /* patch */ static int _getExitCode() native "Process_GetExitCode";
/* patch */ static void _sleep(int millis) native "Process_Sleep";
/* patch */ static int _pid(Process process) native "Process_Pid";
/* patch */ static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 0e5de6b..92cb2d9 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -16,9 +16,10 @@
#include "bin/fdutils.h"
#include "bin/file.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -36,13 +37,13 @@
bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
socklen_t salen = SocketAddress::GetAddrLength(addr);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
- salen,
- address,
- len,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
+ if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+ salen,
+ address,
+ len,
+ NULL,
+ 0,
+ NI_NUMERICHOST)) != 0) {
return false;
}
return true;
@@ -57,8 +58,7 @@
intptr_t Socket::Create(RawAddr addr) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
- 0));
+ fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
if (fd < 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -74,14 +74,12 @@
intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
SocketAddress::SetAddrPort(&addr, port);
- intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- connect(fd,
- &addr.addr,
- SocketAddress::GetAddrLength(&addr)));
+ intptr_t result = TEMP_FAILURE_RETRY(
+ connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
if (result == 0 || errno == EINPROGRESS) {
return fd;
}
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -105,8 +103,7 @@
int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
- num_bytes));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
@@ -121,9 +118,8 @@
RawAddr* addr) {
ASSERT(fd >= 0);
socklen_t addr_len = sizeof(addr->ss);
- ssize_t read_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(
+ recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
// as the number of bytes written.
@@ -135,8 +131,7 @@
int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
- num_bytes));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -150,10 +145,9 @@
int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
RawAddr addr) {
ASSERT(fd >= 0);
- ssize_t written_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sendto(fd, buffer, num_bytes, 0,
- &addr.addr, SocketAddress::GetAddrLength(&addr)));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(
+ sendto(fd, buffer, num_bytes, 0,
+ &addr.addr, SocketAddress::GetAddrLength(&addr)));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -168,10 +162,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getsockname(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
strerror_r(errno, error_message, kBufferSize);
@@ -186,10 +177,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getpeername(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
@@ -272,7 +260,7 @@
intptr_t host_len,
OSError** os_error) {
ASSERT(host_len >= NI_MAXHOST);
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+ int status = NO_RETRY_EXPECTED(getnameinfo(
&addr.addr,
SocketAddress::GetAddrLength(&addr),
host,
@@ -307,24 +295,23 @@
RawAddr* addr, intptr_t port, bool reuseAddress) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+ fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
if (fd < 0) return -1;
FDUtils::SetCloseOnExec(fd);
if (reuseAddress) {
int optval = 1;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ if (NO_RETRY_EXPECTED(
bind(fd,
&addr->addr,
SocketAddress::GetAddrLength(addr))) < 0) {
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -348,28 +335,27 @@
bool v6_only) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
- 0));
+ fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
if (fd < 0) return -1;
FDUtils::SetCloseOnExec(fd);
int optval = 1;
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
if (addr.ss.ss_family == AF_INET6) {
optval = v6_only ? 1 : 0;
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(&addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ if (NO_RETRY_EXPECTED(
bind(fd,
&addr.addr,
SocketAddress::GetAddrLength(&addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -379,14 +365,13 @@
// that we do not get the bad port number again.
intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
int err = errno;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
errno = err;
return new_fd;
}
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -409,7 +394,7 @@
intptr_t socket;
struct sockaddr clientaddr;
socklen_t addrlen = sizeof(clientaddr);
- socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+ socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
if (socket == -1) {
if (IsTemporaryAcceptError(errno)) {
// We need to signal to the caller that this is actually not an
@@ -427,7 +412,7 @@
void Socket::Close(intptr_t fd) {
ASSERT(fd >= 0);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ int err = TEMP_FAILURE_RETRY(close(fd));
if (err != 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -450,11 +435,11 @@
bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<void *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ reinterpret_cast<void *>(&on),
+ &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -464,11 +449,11 @@
bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -478,11 +463,11 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&on),
+ &len)) == 0) {
*enabled = (on == 1);
return true;
}
@@ -495,25 +480,24 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
-
bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
uint8_t v;
socklen_t len = sizeof(v);
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&v),
+ &len)) == 0) {
*value = v;
return true;
}
@@ -526,22 +510,22 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- sizeof(v))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&v),
+ sizeof(v))) == 0;
}
bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(fd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ reinterpret_cast<char *>(&on),
+ &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -551,11 +535,11 @@
bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -565,7 +549,7 @@
struct group_req mreq;
mreq.gr_interface = interfaceIndex;
memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
}
@@ -576,7 +560,7 @@
struct group_req mreq;
mreq.gr_interface = interfaceIndex;
memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
}
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 2c05324..e650c68 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -18,8 +18,8 @@
#include "bin/fdutils.h"
#include "bin/file.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
#include "vm/thread.h"
@@ -39,13 +39,8 @@
bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
socklen_t salen = SocketAddress::GetAddrLength(addr);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
- salen,
- address,
- len,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
+ if (NO_RETRY_EXPECTED(getnameinfo(
+ &addr->addr, salen, address, len, NULL, 0, NI_NUMERICHOST) != 0)) {
return false;
}
return true;
@@ -60,8 +55,8 @@
intptr_t Socket::Create(RawAddr addr) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
- addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
+ fd = NO_RETRY_EXPECTED(
+ socket(addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
if (fd < 0) {
const int kBufferSize = 1024;
char error_buf[kBufferSize];
@@ -75,14 +70,12 @@
intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
SocketAddress::SetAddrPort(&addr, port);
- intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- connect(fd,
- &addr.addr,
- SocketAddress::GetAddrLength(&addr)));
+ intptr_t result = TEMP_FAILURE_RETRY(
+ connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
if (result == 0 || errno == EINPROGRESS) {
return fd;
}
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -103,8 +96,7 @@
int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
- num_bytes));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
@@ -119,9 +111,8 @@
RawAddr* addr) {
ASSERT(fd >= 0);
socklen_t addr_len = sizeof(addr->ss);
- ssize_t read_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(
+ recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
// as the number of bytes written.
@@ -133,8 +124,7 @@
int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
- num_bytes));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -148,10 +138,9 @@
int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
RawAddr addr) {
ASSERT(fd >= 0);
- ssize_t written_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sendto(fd, buffer, num_bytes, 0,
- &addr.addr, SocketAddress::GetAddrLength(&addr)));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(
+ sendto(fd, buffer, num_bytes, 0,
+ &addr.addr, SocketAddress::GetAddrLength(&addr)));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -166,10 +155,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getsockname(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
const int kBufferSize = 1024;
char error_buf[kBufferSize];
Log::PrintErr("Error getsockname: %s\n",
@@ -184,10 +170,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getpeername(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
@@ -198,11 +181,8 @@
void Socket::GetError(intptr_t fd, OSError* os_error) {
int len = sizeof(errno);
int err = 0;
- getsockopt(fd,
- SOL_SOCKET,
- SO_ERROR,
- &err,
- reinterpret_cast<socklen_t*>(&len));
+ VOID_NO_RETRY_EXPECTED(getsockopt(
+ fd, SOL_SOCKET, SO_ERROR, &err, reinterpret_cast<socklen_t*>(&len)));
errno = err;
os_error->SetCodeAndMessage(OSError::kSystem, errno);
}
@@ -210,7 +190,7 @@
int Socket::GetType(intptr_t fd) {
struct stat64 buf;
- int result = fstat64(fd, &buf);
+ int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
if (result == -1) return -1;
if (S_ISCHR(buf.st_mode)) return File::kTerminal;
if (S_ISFIFO(buf.st_mode)) return File::kPipe;
@@ -235,12 +215,12 @@
hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo* info = NULL;
- int status = getaddrinfo(host, 0, &hints, &info);
+ int status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
if (status != 0) {
// We failed, try without AI_ADDRCONFIG. This can happen when looking up
// e.g. '::1', when there are no global IPv6 addresses.
hints.ai_flags = AI_V4MAPPED;
- status = getaddrinfo(host, 0, &hints, &info);
+ status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
if (status != 0) {
ASSERT(*os_error == NULL);
*os_error = new OSError(status,
@@ -271,7 +251,7 @@
intptr_t host_len,
OSError** os_error) {
ASSERT(host_len >= NI_MAXHOST);
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+ int status = NO_RETRY_EXPECTED(getnameinfo(
&addr.addr,
SocketAddress::GetAddrLength(&addr),
host,
@@ -293,10 +273,11 @@
bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
int result;
if (type == SocketAddress::TYPE_IPV4) {
- result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+ result = NO_RETRY_EXPECTED(inet_pton(AF_INET, address, &addr->in.sin_addr));
} else {
ASSERT(type == SocketAddress::TYPE_IPV6);
- result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+ result = NO_RETRY_EXPECTED(
+ inet_pton(AF_INET6, address, &addr->in6.sin6_addr));
}
return result == 1;
}
@@ -306,24 +287,21 @@
RawAddr* addr, intptr_t port, bool reuseAddress) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
- addr->addr.sa_family,
- SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
- IPPROTO_UDP));
+ fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family,
+ SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+ IPPROTO_UDP));
if (fd < 0) return -1;
if (reuseAddress) {
int optval = 1;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- bind(fd,
- &addr->addr,
- SocketAddress::GetAddrLength(addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(
+ bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
return fd;
@@ -350,7 +328,7 @@
OSError** os_error) {
struct ifaddrs* ifaddr;
- int status = getifaddrs(&ifaddr);
+ int status = NO_RETRY_EXPECTED(getifaddrs(&ifaddr));
if (status != 0) {
ASSERT(*os_error == NULL);
*os_error = new OSError(status,
@@ -387,26 +365,24 @@
bool v6_only) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
- addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
+ fd = NO_RETRY_EXPECTED(
+ socket(addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
if (fd < 0) return -1;
int optval = 1;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
if (addr.ss.ss_family == AF_INET6) {
optval = v6_only ? 1 : 0;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(&addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- bind(fd,
- &addr.addr,
- SocketAddress::GetAddrLength(&addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(
+ bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -416,14 +392,13 @@
// that we do not get the bad port number again.
intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
int err = errno;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
errno = err;
return new_fd;
}
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -445,8 +420,8 @@
intptr_t socket;
struct sockaddr clientaddr;
socklen_t addrlen = sizeof(clientaddr);
- socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept4(
- fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
+ socket = TEMP_FAILURE_RETRY(accept4(
+ fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
if (socket == -1) {
if (IsTemporaryAcceptError(errno)) {
// We need to signal to the caller that this is actually not an
@@ -462,7 +437,7 @@
void Socket::Close(intptr_t fd) {
ASSERT(fd >= 0);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ int err = TEMP_FAILURE_RETRY(close(fd));
if (err != 0) {
const int kBufferSize = 1024;
char error_buf[kBufferSize];
@@ -474,11 +449,8 @@
bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<void *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(
+ fd, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<void *>(&on), &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -488,11 +460,11 @@
bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -502,11 +474,8 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(
+ fd, level, optname, reinterpret_cast<char *>(&on), &len)) == 0) {
*enabled = (on == 1);
return true;
}
@@ -519,11 +488,8 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(
+ fd, level, optname, reinterpret_cast<char *>(&on), sizeof(on))) == 0;
}
@@ -533,11 +499,8 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(
+ fd, level, optname, reinterpret_cast<char *>(&v), &len)) == 0) {
*value = v;
return true;
}
@@ -550,22 +513,16 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- sizeof(v))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(
+ fd, level, optname, reinterpret_cast<char *>(&v), sizeof(v))) == 0;
}
bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(
+ fd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char *>(&on), &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -575,11 +532,11 @@
bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -589,8 +546,8 @@
struct group_req mreq;
mreq.gr_interface = interfaceIndex;
memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
- fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
+ return NO_RETRY_EXPECTED(
+ setsockopt(fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
}
@@ -600,8 +557,8 @@
struct group_req mreq;
mreq.gr_interface = interfaceIndex;
memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
- fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
+ return NO_RETRY_EXPECTED(
+ setsockopt(fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
}
} // namespace bin
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 1d0198c..04a1413 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -18,9 +18,10 @@
#include "bin/fdutils.h"
#include "bin/file.h"
#include "bin/log.h"
-#include "bin/signal_blocker.h"
#include "bin/socket.h"
+#include "platform/signal_blocker.h"
+
namespace dart {
namespace bin {
@@ -38,13 +39,13 @@
bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
socklen_t salen = SocketAddress::GetAddrLength(addr);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
- salen,
- address,
- len,
- NULL,
- 0,
- NI_NUMERICHOST)) != 0) {
+ if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+ salen,
+ address,
+ len,
+ NULL,
+ 0,
+ NI_NUMERICHOST)) != 0) {
return false;
}
return true;
@@ -59,8 +60,7 @@
intptr_t Socket::Create(RawAddr addr) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
- 0));
+ fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
if (fd < 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -76,14 +76,12 @@
intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
SocketAddress::SetAddrPort(&addr, port);
- intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- connect(fd,
- &addr.addr,
- SocketAddress::GetAddrLength(&addr)));
+ intptr_t result = TEMP_FAILURE_RETRY(
+ connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
if (result == 0 || errno == EINPROGRESS) {
return fd;
}
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -107,8 +105,7 @@
int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
- num_bytes));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
@@ -123,9 +120,8 @@
RawAddr* addr) {
ASSERT(fd >= 0);
socklen_t addr_len = sizeof(addr->ss);
- ssize_t read_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(
+ recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
if (read_bytes == -1 && errno == EWOULDBLOCK) {
// If the read would block we need to retry and therefore return 0
// as the number of bytes written.
@@ -137,8 +133,7 @@
int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
- num_bytes));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -152,10 +147,9 @@
int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
RawAddr addr) {
ASSERT(fd >= 0);
- ssize_t written_bytes =
- TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- sendto(fd, buffer, num_bytes, 0,
- &addr.addr, SocketAddress::GetAddrLength(&addr)));
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(
+ sendto(fd, buffer, num_bytes, 0,
+ &addr.addr, SocketAddress::GetAddrLength(&addr)));
ASSERT(EAGAIN == EWOULDBLOCK);
if (written_bytes == -1 && errno == EWOULDBLOCK) {
// If the would block we need to retry and therefore return 0 as
@@ -170,10 +164,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getsockname(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
strerror_r(errno, error_message, kBufferSize);
@@ -188,10 +179,7 @@
ASSERT(fd >= 0);
RawAddr raw;
socklen_t size = sizeof(raw);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- getpeername(fd,
- &raw.addr,
- &size))) {
+ if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
return NULL;
}
*port = SocketAddress::GetAddrPort(&raw);
@@ -267,7 +255,7 @@
intptr_t host_len,
OSError** os_error) {
ASSERT(host_len >= NI_MAXHOST);
- int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+ int status = NO_RETRY_EXPECTED(getnameinfo(
&addr.addr,
SocketAddress::GetAddrLength(&addr),
host,
@@ -302,24 +290,21 @@
RawAddr* addr, intptr_t port, bool reuseAddress) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+ fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
if (fd < 0) return -1;
FDUtils::SetCloseOnExec(fd);
if (reuseAddress) {
int optval = 1;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- bind(fd,
- &addr->addr,
- SocketAddress::GetAddrLength(addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(
+ bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -385,28 +370,25 @@
bool v6_only) {
intptr_t fd;
- fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
- 0));
+ fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
if (fd < 0) return -1;
FDUtils::SetCloseOnExec(fd);
int optval = 1;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
if (addr.ss.ss_family == AF_INET6) {
optval = v6_only ? 1 : 0;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+ VOID_NO_RETRY_EXPECTED(
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
}
SocketAddress::SetAddrPort(&addr, port);
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- bind(fd,
- &addr.addr,
- SocketAddress::GetAddrLength(&addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(
+ bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -416,14 +398,13 @@
// that we do not get the bad port number again.
intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
int err = errno;
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ VOID_TEMP_FAILURE_RETRY(close(fd));
errno = err;
return new_fd;
}
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
- VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+ VOID_TEMP_FAILURE_RETRY(close(fd));
return -1;
}
@@ -436,7 +417,7 @@
intptr_t socket;
struct sockaddr clientaddr;
socklen_t addrlen = sizeof(clientaddr);
- socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+ socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
if (socket == -1) {
if (errno == EAGAIN) {
// We need to signal to the caller that this is actually not an
@@ -454,7 +435,7 @@
void Socket::Close(intptr_t fd) {
ASSERT(fd >= 0);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+ int err = TEMP_FAILURE_RETRY(close(fd));
if (err != 0) {
const int kBufferSize = 1024;
char error_message[kBufferSize];
@@ -477,11 +458,11 @@
bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<void *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ reinterpret_cast<void *>(&on),
+ &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -491,11 +472,11 @@
bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -505,11 +486,11 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&on),
+ &len)) == 0) {
*enabled = (on == 1);
return true;
}
@@ -522,11 +503,11 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -536,11 +517,11 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- &len)) == 0) {
+ if (NO_RETRY_EXPECTED(getsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&v),
+ &len)) == 0) {
*value = v;
return true;
}
@@ -553,22 +534,22 @@
int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
int optname = protocol == SocketAddress::TYPE_IPV4
? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- level,
- optname,
- reinterpret_cast<char *>(&v),
- sizeof(v))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ level,
+ optname,
+ reinterpret_cast<char *>(&v),
+ sizeof(v))) == 0;
}
bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
int on;
socklen_t len = sizeof(on);
- int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- &len));
+ int err = NO_RETRY_EXPECTED(getsockopt(fd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ reinterpret_cast<char *>(&on),
+ &len));
if (err == 0) {
*enabled = on == 1;
}
@@ -578,11 +559,11 @@
bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
int on = enabled ? 1 : 0;
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
- SOL_SOCKET,
- SO_BROADCAST,
- reinterpret_cast<char *>(&on),
- sizeof(on))) == 0;
+ return NO_RETRY_EXPECTED(setsockopt(fd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ reinterpret_cast<char *>(&on),
+ sizeof(on))) == 0;
}
@@ -601,10 +582,10 @@
&interface->in.sin_addr,
SocketAddress::GetInAddrLength(interface));
if (join) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
} else {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
}
} else {
@@ -615,10 +596,10 @@
SocketAddress::GetInAddrLength(addr));
mreq.ipv6mr_interface = interfaceIndex;
if (join) {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
} else {
- return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+ return NO_RETRY_EXPECTED(setsockopt(
fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
}
}
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 0edd468..144696d 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -836,7 +836,7 @@
sendWriteEvents = write;
if (read) issueReadEvent();
if (write) issueWriteEvent();
- if (eventPort == null && !isClosing && !isClosed) {
+ if (eventPort == null) {
int flags = typeFlags & TYPE_TYPE_MASK;
if (!isClosedRead) flags |= 1 << READ_EVENT;
if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 77c51ef..da82b27 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -12,6 +12,8 @@
#include "bin/socket.h"
#include "bin/utils.h"
+#include "vm/thread.h"
+
namespace dart {
namespace bin {
@@ -217,11 +219,15 @@
}
+static Mutex* getaddrinfo_mutex = new Mutex();
AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
int type,
OSError** os_error) {
Initialize();
+ // getaddrinfo is not thread-safe on Windows. Use a mutex to get around it.
+ MutexLocker locker(getaddrinfo_mutex);
+
// Perform a name lookup for a host name.
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index 25d16c3..d0ba85e 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -11,7 +11,8 @@
#include "bin/stdio.h"
#include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
namespace dart {
@@ -66,8 +67,7 @@
bool Stdout::GetTerminalSize(int size[2]) {
struct winsize w;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+ if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
(w.ws_col != 0 || w.ws_row != 0)) {
size[0] = w.ws_col;
size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index 43ece52..dee8c38 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -11,14 +11,15 @@
#include "bin/stdio.h"
#include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
namespace dart {
namespace bin {
int Stdin::ReadByte() {
- int c = getchar();
+ int c = NO_RETRY_EXPECTED(getchar());
if (c == EOF) {
c = -1;
}
@@ -28,46 +29,45 @@
bool Stdin::GetEchoMode() {
struct termios term;
- tcgetattr(STDIN_FILENO, &term);
+ VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
return (term.c_lflag & ECHO) != 0;
}
void Stdin::SetEchoMode(bool enabled) {
struct termios term;
- tcgetattr(STDIN_FILENO, &term);
+ VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
if (enabled) {
term.c_lflag |= ECHO|ECHONL;
} else {
term.c_lflag &= ~(ECHO|ECHONL);
}
- tcsetattr(STDIN_FILENO, TCSANOW, &term);
+ VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
}
bool Stdin::GetLineMode() {
struct termios term;
- tcgetattr(STDIN_FILENO, &term);
+ VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
return (term.c_lflag & ICANON) != 0;
}
void Stdin::SetLineMode(bool enabled) {
struct termios term;
- tcgetattr(STDIN_FILENO, &term);
+ VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
if (enabled) {
term.c_lflag |= ICANON;
} else {
term.c_lflag &= ~(ICANON);
}
- tcsetattr(STDIN_FILENO, TCSANOW, &term);
+ VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
}
bool Stdout::GetTerminalSize(int size[2]) {
struct winsize w;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+ if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w)) == 0 &&
(w.ws_col != 0 || w.ws_row != 0)) {
size[0] = w.ws_col;
size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index 79e34f8..be736bd 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -11,7 +11,8 @@
#include "bin/stdio.h"
#include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
namespace dart {
@@ -66,8 +67,7 @@
bool Stdout::GetTerminalSize(int size[2]) {
struct winsize w;
- if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
- ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+ if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
(w.ws_col != 0 || w.ws_row != 0)) {
size[0] = w.ws_col;
size[1] = w.ws_row;
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 366b9f6..f8fbd36 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -171,10 +171,11 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
<nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+ <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
<content></content>
</nav-menu>
@@ -227,44 +228,12 @@
<polymer-element name="service-ref" extends="observatory-element">
</polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
</polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
- <template>
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <div class="panel panel-danger">
- <div class="panel-heading">{{ error.kind }}</div>
- <div class="panel-body">
- <p>{{ error.message }}</p>
- </div>
- </div>
- </div>
- </div>
- </template>
-
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
- <template if="{{ ref['final'] }}"> final </template>
- <template if="{{ ref['const'] }}"> const </template>
- <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
- var
- </template>
- <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
- <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
- </template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
<template>
<style>
.idle {
@@ -307,9 +276,17 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 1px 0 1px 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div>
@@ -333,6 +310,7 @@
<template if="{{ isClosure(ref.serviceType) }}">
<a href="{{ url }}">
+ <!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc']['user_name'] }}
</a>
</template>
@@ -340,28 +318,34 @@
<template if="{{ isInstance(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
<curly-block callback="{{ expander() }}">
- <table>
- <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
- <td class="member">{{ field['decl']['user_name'] }}</td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ field in ref['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ {{ field['decl']['user_name'] }}
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ isList(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
<curly-block callback="{{ expander() }}">
- <table>
- <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ element in ref['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
@@ -369,184 +353,7 @@
</template>
</polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
- <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
- <template>
- <nav-bar>
- <top-nav-menu></top-nav-menu>
- <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
- <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
- <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
- <nav-refresh callback="{{ refresh }}"></nav-refresh>
- </nav-bar>
-
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <div class="panel panel-warning">
- <div class="panel-heading">
- class <strong>{{ cls.name }}</strong>
- <template if="{{ cls['super']['type'] != 'Null' }}">
- extends
- <class-ref ref="{{ cls['super'] }}"></class-ref>
- </template>
- <p></p>
- <library-ref ref="{{ cls['library'] }}"></library-ref>
- </div>
- <div class="panel-body">
- <table class="table table-hover">
- <tbody>
- <tr>
- <td>Abstract</td><td>{{ cls['abstract'] }}</td>
- </tr>
- <tr>
- <td>Const</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Finalized</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Implemented</td><td>{{ cls['implemented'] }}</td>
- </tr>
- <tr>
- <td>Patch</td><td>{{ cls['patch'] }}</td>
- </tr>
- <tr>
- <td>VM Name</td><td>{{ cls['name'] }}</td>
- </tr>
- </tbody>
- </table>
- <template if="{{ cls['error'] == null }}">
- <blockquote><strong>Fields</strong></blockquote>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ field in cls['fields'] }}">
- <td><field-ref ref="{{ field }}"></field-ref></td>
- <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <blockquote><strong>Functions</strong></blockquote>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>User Name</th>
- <th>VM Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{ function in cls['functions'] }}">
- <td><function-ref ref="{{ function }}"></function-ref></td>
- <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
- </tr>
- </tbody>
- </table>
- </template>
- <template if="{{ cls['error'] != null }}">
- <error-view error_obj="{{ cls['error'] }}"></error-view>
- </template>
- </div>
- </div>
- </div>
- </div>
- </template>
-
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
- <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
- <template>
- <nav-bar>
- <top-nav-menu></top-nav-menu>
- <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
- <nav-refresh callback="{{ refresh }}"></nav-refresh>
- </nav-bar>
- <style>
- .content {
- padding-left: 10%;
- font: 400 14px 'Montserrat', sans-serif;
- }
- h1 {
- font: 400 18px 'Montserrat', sans-serif;
- }
- .member, .memberHeader {
- 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;
- }
- </style>
- <div class="content">
- <h1>Code for {{ code.name }}</h1>
- <table>
- <tbody><tr>
- <td class="memberHeader">kind</td>
- <td class="member">{{code.kind}}</td>
- </tr>
- <tr>
- <td class="memberHeader">function</td>
- <td class="member">
- <function-ref ref="{{code.function}}">
- </function-ref>
- </td>
- </tr>
- <tr>
- <td class="memberHeader">Inclusive</td>
- <td class="member">{{ code.formattedInclusiveTicks }}</td>
- </tr>
- <tr>
- <td class="memberHeader">Exclusive</td>
- <td class="member">{{ code.formattedExclusiveTicks }}</td>
- </tr>
- </tbody></table>
- </div>
- <hr>
- <div class="content">
- <template if="{{ code.hasDisassembly }}">
- <div class="row">
- <div class="col-md-2 memberHeader">Inclusive</div>
- <div class="col-md-2 memberHeader">Exclusive</div>
- <div class="col-md-2 memberHeader">Address</div>
- <div class="col-md-6 memberHeader">Disassembly</div>
- </div>
- </template>
- <template repeat="{{ instruction in code.instructions }}">
- <div class="row">
- <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
- <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
- <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
- <div class="col-md-6 monospace">{{ instruction.human }}</div>
- </div>
- </template>
- </div>
- </template>
-
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
- <template>
- <div class="well row">
- <a on-click="toggleDisplay" class="btn muted unselectable">
- Raw message... <i class="{{ iconClass }}"></i>
- </a>
- <div style="display: {{ displayValue }}" class="well">
- <content></content>
- </div>
- </div>
- </template>
-
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
<template>
<style>
.textbox {
@@ -627,7 +434,314 @@
</polymer-element>
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+ <template if="{{ ref['final'] }}"> final </template>
+ <template if="{{ ref['const'] }}"> const </template>
+ <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
+ var
+ </template>
+ <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+ <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+ </template>
+ <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
+ <template><!-- These comments are here to allow newlines.
+ --><template if="{{ qualified && !hasParent && hasClass }}"><!--
+ --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+ --><template if="{{ qualified && hasParent }}"><!--
+ --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+ </function-ref>.<!--
+ --></template><a href="{{ url }}">{{ name }}</a><!--
+ --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+ <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+ <template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+ <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+ <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+
+ <div class="content">
+ <h1>
+ <template if="{{ cls['abstract'] }}">
+ abstract
+ </template>
+ <template if="{{ cls['patch'] }}">
+ patch
+ </template>
+ class {{ cls.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ cls['library'] }}"></library-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">script</div>
+ <div class="memberValue">
+ <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+ </script-ref>
+ </div>
+ </div>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['super']['type'] != 'Null' }}">
+ <div class="memberItem">
+ <div class="memberName">extends</div>
+ <div class="memberValue">
+ <class-ref ref="{{ cls['super'] }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls['subclasses'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">extended by</div>
+ <div class="memberValue">
+ <template repeat="{{ subclass in cls['subclasses'] }}">
+ <class-ref ref="{{ subclass }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['interfaces'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">implements</div>
+ <div class="memberValue">
+ <template repeat="{{ interface in cls['interfaces'] }}">
+ <class-ref ref="{{ interface }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls.name != cls.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ cls.vmName }}</div>
+ </div>
+ </template>
+ </div>
+ </div>
+
+ <template if="{{ cls['error'] != null }}">
+ <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+ <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+ </template>
+
+ <hr>
+
+ <div class="content">
+ <template if="{{ cls['fields'].isNotEmpty }}">
+ fields ({{ cls['fields'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in cls['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ cls['functions'].isNotEmpty }}">
+ functions ({{ cls['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in cls['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}" qualified="{{ false }}">
+ </function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+ <template>
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+ <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+ <div class="content">
+ <h1>Code for {{ code.name }}</h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">kind</div>
+ <div class="memberValue">{{code.kind}}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">function</div>
+ <div class="memberValue">
+ <function-ref ref="{{code.function}}">
+ </function-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Inclusive</div>
+ <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Exclusive</div>
+ <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Constant object pool</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr>
+ <div class="content">
+ <template if="{{ code.hasDisassembly }}">
+ <div class="row">
+ <div class="col-md-2 memberHeader">Inclusive</div>
+ <div class="col-md-2 memberHeader">Exclusive</div>
+ <div class="col-md-2 memberHeader">Address</div>
+ <div class="col-md-6 memberHeader">Disassembly</div>
+ </div>
+ </template>
+ <template repeat="{{ instruction in code.instructions }}">
+ <div class="row">
+ <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+ <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+ <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+ <div class="col-md-6 monospace">{{ instruction.human }}</div>
+ </div>
+ </template>
+ </div>
+ </template>
+
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+ <template>
+ <div class="well row">
+ <a on-click="toggleDisplay" class="btn muted unselectable">
+ Raw message... <i class="{{ iconClass }}"></i>
+ </a>
+ <div style="display: {{ displayValue }}" class="well">
+ <content></content>
+ </div>
+ </div>
+ </template>
+
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+ <template>
+ <div class="row">
+ <div class="col-md-8 col-md-offset-2">
+ <div class="panel panel-danger">
+ <div class="panel-heading">{{ error.kind }}</div>
+ <div class="panel-body">
+ <p>{{ error.message }}</p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
<template>
<nav-bar>
<top-nav-menu></top-nav-menu>
@@ -743,9 +857,26 @@
</template>
</polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+ <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+ <div class="row">
+ <p style="text-align:center">{{ status }}</p>
+ </div>
+ <div class="row">
+ <canvas id="fragmentation" width="1px" height="1px"></canvas>
+ </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ ref.name }}</a>
</template>
</polymer-element>
@@ -762,14 +893,7 @@
<div class="col-md-4">
<div class="row">
- <template if="{{ isolate.entry['id'] != null }}">
- <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
- {{ isolate.name }}
- </a>
- </template>
- <template if="{{ isolate.entry['id'] == null }}">
- {{ isolate.name }}
- </template>
+ <isolate-ref ref="{{ isolate }}"></isolate-ref>
</div>
<div class="row">
@@ -812,6 +936,7 @@
<a href="{{ isolate.relativeHashLink('allocationprofile') }}">
{{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
</a>
+ ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
</div>
<div class="col-md-2">
<template if="{{ isolate.topFrame == null }}">
@@ -857,6 +982,158 @@
</template>
</polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+ <template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ .sourceInset {
+ padding-left: 15%;
+ padding-right: 15%;
+ }
+ </style>
+
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+ </isolate-nav-menu>
+ </nav-bar>
+
+ <div class="content">
+ <h1>isolate '{{ isolate.name }}'</h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">status</div>
+ <div class="memberValue">
+ <template if="{{ isolate.topFrame == null }}">
+ <strong>idle</strong>
+ </template>
+ <template if="{{ isolate.topFrame != null }}">
+ <strong>running</strong>
+ @
+ <function-ref ref="{{ isolate.topFrame['function'] }}">
+ </function-ref>
+ (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+ </template>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <template if="{{ isolate.topFrame != null }}">
+ <br>
+ <div class="sourceInset">
+ <pre> {{ isolate.topFrame['line'] }} {{ isolate.topFrame['lineString'] }}</pre>
+ </div>
+ </template>
+
+ <br>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <template if="{{ isolate.entry != null }}">
+ <div class="memberName">entry</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.entry }}"></function-ref>
+ </div>
+ </template>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">id</div>
+ <div class="memberValue">{{ isolate.vmName }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+
+ <br>
+
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
<polymer-element name="instance-view" extends="observatory-element">
<template>
<nav-bar>
@@ -876,12 +1153,14 @@
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
- .member {
- vertical-align: top;
- padding: 3px 0 3px 1em;
- font: 400 14px 'Montserrat', sans-serif;
+ .memberList {
+ display: table;
}
- .memberBold {
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 14px 'Montserrat', sans-serif;
@@ -896,23 +1175,25 @@
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<h1>instance of {{ instance['class']['user_name'] }}</h1>
- <table>
- <tbody><tr>
- <td class="memberBold">class</td>
- <td class="member">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">class</div>
+ <div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
</class-ref>
- </td>
- </tr>
- <tr template="" if="{{ instance['preview'] != null }}">
- <td class="memberBold">preview</td>
- <td class="member">{{ instance['preview'] }}</td>
- </tr>
- <tr>
- <td class="memberBold">size</td>
- <td class="member">{{ instance['size'] | formatSize }}</td>
- </tr>
- </tbody></table>
+ </div>
+ </div>
+ <template if="{{ instance['preview'] != null }}">
+ <div class="memberItem">
+ <div class="memberName">preview</div>
+ <div class="memberValue">{{ instance['preview'] }}</div>
+ </div>
+ </template>
+ <div class="memberItem">
+ <div class="memberName">size</div>
+ <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+ </div>
+ </div>
</div>
<hr>
@@ -921,44 +1202,50 @@
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
- <td class="member">
- <field-ref ref="{{ field['decl'] }}"></field-ref>
- </td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ field in instance['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field['decl'] }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
- <td class="member">[{{ field['index']}}]</td>
- <td class="member">[{{ field['value']}}]</td>
- </tr>
- </tbody></table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in instance['nativeFields'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ field['index']}}]</div>
+ <div class="memberValue">[{{ field['value']}}]</div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}">
- </instance-ref>
- </td>
- </tr>
- </tbody></table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ element in instance['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}">
+ </instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
</div>
@@ -1005,6 +1292,28 @@
</polymer-element>
<polymer-element name="library-view" extends="observatory-element">
<template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1012,68 +1321,195 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="alert alert-info">Scripts</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ script in library['scripts']}}">
- <td>
- {{ script.kind }}
- </td>
- <td>
- <script-ref ref="{{ script }}"></script-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Imported Libraries</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ lib in library['libraries'] }}">
- <td>
- <library-ref ref="{{ lib }}"></library-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Variables</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ variable in library['variables'] }}">
- <td><field-ref ref="{{ variable }}"></field-ref></td>
- <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Functions</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ func in library['functions'] }}">
- <td>
- <function-ref ref="{{ func }}"></function-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Classes</div>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>Name</th>
- <th>Internal Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{ cls in library['classes'] }}">
- <td>
- <class-ref ref="{{ cls }}"></class-ref>
- </td>
- <td>
- <class-ref ref="{{ cls }}" internal=""></class-ref>
- </td>
- </tr>
- </tbody>
- </table>
+ <div class="content">
+ <h1>
+ <!-- TODO(turnidge): Handle unnamed libraries -->
+ library {{ library.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">url</div>
+ <div class="memberValue">{{ library['url'] }}</div>
+ </div>
+ <template if="{{ library['imports'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">imports</div>
+ <div class="memberValue">
+ <template repeat="{{ import in library['imports'] }}">
+ <library-ref ref="{{ import }}"></library-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ library.name != library.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ library.vmName }}</div>
+ </div>
+ </template>
+ </div>
+ </div>
+ <hr>
+
+ <div class="content">
+ <template if="{{ library['scripts'].isNotEmpty }}">
+ scripts ({{ library['scripts'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ script in library['scripts'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <script-ref ref="{{ script }}"></script-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['classes'].isNotEmpty }}">
+ classes ({{ library['classes'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ cls in library['classes'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <class-ref ref="{{ cls }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['variables'].isNotEmpty }}">
+ variables ({{ library['variables'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in library['variables'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['functions'].isNotEmpty }}">
+ functions ({{ library['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in library['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}"></function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+ <template>
+ <style>
+ .switch {
+ position: relative;
+ width: 121px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ }
+ .hide {
+ display: none;
+ }
+ .label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ }
+ .content {
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
+ }
+ .content:before, .content:after {
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 30px;
+ color: white;
+ font: 400 14px 'Montserrat', sans-serif;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .content:before {
+ content: {{ checkedText }};
+ padding-left: 10px;
+ background-color: #0489C3;
+ }
+ .content:after {
+ content: {{ uncheckedText }};
+ padding-right: 10px;
+ background-color: #EEEEEE;
+ color: #999999;
+ text-align: right;
+ }
+ .dot {
+ width: 14px;
+ margin: 8px;
+ background: #FFFFFF;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 87px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
+ }
+ :checked + .label .content {
+ margin-left: 0;
+ }
+ :checked + .label .dot {
+ right: 0px;
+ }
+ </style>
+ <div class="switch">
+ <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+ <label class="label" for="slide-switch">
+ <div class="content"></div>
+ <div class="dot"></div>
+ </label>
+ </div>
</template>
</polymer-element>
@@ -1085,38 +1521,81 @@
<nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="row">
- <div class="col-md-12">
- <span>Top</span>
- <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
- <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
- </select>
- <span>exclusive methods</span>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
- </div>
- </div>
- <table id="tableTree" class="table table-hover">
- <thead>
+ <style>
+ .content {
+ padding-left: 10%;
+ font: 400 14px 'Montserrat', sans-serif;
+ }
+ h1 {
+ font: 400 18px 'Montserrat', sans-serif;
+ }
+ .member, .memberHeader {
+ 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;
+ }
+ </style>
+ <div class="content">
+ <h1>Sampled CPU profile</h1>
+ <table>
+ <tbody><tr>
+ <td class="memberHeader">Timestamp</td>
+ <td class="member">{{ refreshTime }}</td>
+ </tr>
<tr>
- <th>Method</th>
- <th>Exclusive</th>
- <th>Caller</th>
+ <td class="memberHeader">Sample count</td>
+ <td class="member">{{ sampleCount }}</td>
</tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
- <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
- <code-ref ref="{{ row.code }}"></code-ref>
+ <tr>
+ <td class="memberHeader">Sample rate</td>
+ <td class="member">{{ sampleRate }} Hz</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Sample depth</td>
+ <td class="member">{{ sampleDepth }} stack frames</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Call graph tree</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ callGraphChecked }}">
</td>
- <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
- <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
- </tr>
- </tbody>
- </table>
+ </tr><tr>
+ <td class="memberHeader">Display cutoff</td>
+ <td class="member">{{ displayCutoff }}</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Hide tags</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ hideTagsChecked }}">
+ </td>
+ </tr>
+ </tbody></table>
+ <hr>
+ <table id="tableTree" class="table table-hover">
+ <thead>
+ <tr>
+ <th>Method</th>
+ <th>Caller</th>
+ <th>Exclusive</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+ <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+ <code-ref ref="{{ row.code }}"></code-ref>
+ </td>
+ <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+ <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</template>
</polymer-element>
@@ -1227,9 +1706,17 @@
<polymer-element name="stack-frame" extends="observatory-element">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 0 0 0 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div class="row">
@@ -1241,15 +1728,18 @@
<function-ref ref="{{ frame['function'] }}"></function-ref>
( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
</script-ref> )
+
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
- <td class="member">{{ v['name']}}</td>
- <td class="member">
- <instance-ref ref="{{ v['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ v in frame['vars'] }}">
+ <div class="memberItem">
+ <div class="memberName">{{ v['name']}}</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ v['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</div>
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 74565cd..4cd0dff 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
@@ -8542,7 +8542,7 @@
function DartObject(o) {
this.o = o;
}
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
(function($){function dart(){this.x=0}var A=new dart
delete A.x
var B=new dart
@@ -8597,7 +8597,7 @@
init()
$=I.p
var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
"use strict";
function map(x){x={x:x};delete x.x;return x}
function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return H.eQ(a)},
bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
kn:{
"^":"bool/Gv;",
bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
Q:{
"^":"List/Gv;",
h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
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)
return!0}return!1},"call$1","guH",2,0,null,132,[]],
ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
y.fixed$length=init
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)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
tg:[function(a,b){var z
for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
if(b)return H.VM(a.slice(),[H.Kp(a,0)])
else{z=H.VM(a.slice(),[H.Kp(a,0)])
z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
giO:function(a){return H.eQ(a)},
gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
a.length=b},
t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
$isList:true,
$isList:true,
$aszM:null,
@@ -8992,9 +8990,9 @@
if(b>20)throw H.b(P.C3(b))
z=a.toFixed(b)
if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
bu:[function(a){if(a===0&&1/a<0)return"-0.0"
else return""+a},"call$0","gXo",0,0,null],
giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
if(b<0)return z-b
else return z+b},"call$1","gQR",2,0,null,109,[]],
Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
return a>=b},"call$1","gNH",2,0,null,109,[]],
$isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
im:{
"^":"int/P;",
gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
gbx:function(a){return C.O4},
$isdouble:true,
$isnum:true},
-vT:{
+x1:{
"^":"im;"},
VP:{
-"^":"vT;"},
+"^":"x1;"},
BQ:{
"^":"VP;"},
O:{
@@ -9063,8 +9062,8 @@
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))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
wL:[function(a,b,c){var z,y,x,w
if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
z=a.length
@@ -9075,7 +9074,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)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
return a+b},"call$1","gF1n",2,0,null,109,[]],
Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
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)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
Nj:[function(a,b,c){var z
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
if(J.z8(c,a.length))throw H.b(P.N(c))
return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
z=a.trim()
y=z.length
if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
U:[function(a,b){var z,y
if(typeof b!=="number")return H.s(b)
if(0>=b)return""
@@ -9126,15 +9117,15 @@
for(z=a,y="";!0;){if((b&1)===1)y=z+y
b=b>>>1
if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
XU:[function(a,b,c){var z,y,x,w
if(b==null)H.vh(new P.AT(null))
if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
Pk:[function(a,b,c){var z,y,x
c=a.length
if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
gl0:function(a){return a.length===0},
gor:function(a){return a.length!==0},
iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
gB:function(a){return a.length},
t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
$isString:true,
static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
"^":"",
zd:[function(a,b){var z=a.vV(0,b)
init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
ox:[function(){var z=init.globalState.Xz
z.GL=z.GL-1},"call$0","q4",0,0,null],
oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
if(b==null){b=[]
z.a=b
y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("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
@@ -9208,7 +9205,7 @@
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()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
yl:[function(){var z=init.currentScript
if(z!=null)return String(z.src)
if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
self.postMessage(q)}else P.JS(y.t(z,"msg"))
break
case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
ZF:[function(a){var z,y,x,w
if(init.globalState.EF===!0){y=init.globalState.vd
x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,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))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
Ws:[function(a,b,c,d,e,f){var z,y,x,w
z=init.globalState.N0
y=z.jO
@@ -9294,21 +9291,21 @@
$.eb=$.eb+("_"+y)
y=z.EE
x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
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.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$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)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
PK:{
"^":"Tp:115;a,b",
call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
$.jk().onmessage=w
$.jk().dartPrint = function (object) {}}}},
aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
NR:[function(a){var z,y,x,w,v,u
if(!this.RW)return
z=this.lJ
@@ -9356,18 +9353,18 @@
if(w<0||w>=u)return H.e(v,w)
v[w]=x
if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
iK:[function(a){var z=this.Jp
if(z==null){z=[]
this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
Hh:[function(a){var z=this.Jp
if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
vV:[function(a,b){var z,y
z=init.globalState.N0
init.globalState.N0=this
@@ -9388,11 +9385,11 @@
break
case"ping":this.Wq(z.t(a,1),z.t(a,2))
break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
aU:[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)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
else this.UM()},"call$0","gi8",0,0,null],
UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
if(y)z.call$1(this.b)
else z.call$0()}}},"call$0",null,0,0,null,"call"],
$isEH:true},
-Iy:{
+dq:{
"^":"a;",
$isbC:true},
Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
zY:[function(a,b){var z,y,x,w,v
z={}
y=this.Jz
@@ -9483,11 +9480,9 @@
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))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return J.td(this.JE)},
$isZ6:true,
$isbC:true},
@@ -9499,19 +9494,17 @@
y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
$isEH:true},
ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
zY:[function(a,b){var z,y
z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
if(init.globalState.EF===!0){init.globalState.vd.toString
self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+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)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
x=this.bv
if(typeof x!=="number")return H.s(x)
return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
z.fW.Rz(0,y)
z.PC()},"call$0","gJK",0,0,null],
FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
$isyo:true,
static:{"^":"Vz"}},
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]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
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)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
II:{
"^":"AP;RZ",
Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
"^":"a;MD",
t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
Xq:[function(){var z,y,x
for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
X1:{
"^":"a;",
t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
Hn:[function(a){},"call$0","gb6",0,0,null],
Xq:[function(){},"call$0","gt6",0,0,null]},
HU:{
@@ -9582,19 +9575,19 @@
if(H.VO(a))return this.Pq(a)
this.il.Hn(0)
z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
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(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
Nt:{
"^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
wb:[function(a){var z,y,x,w,v,u
z=this.il.t(0,a)
if(z!=null)return z
@@ -9606,7 +9599,7 @@
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},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
TI:[function(a){var z,y
z={}
y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
this.il.u(0,a,y)
a.aN(0,new H.OW(z,this))
return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
$isEH:true},
Tf:{
"^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
wb:[function(a){var z,y
z=this.il.t(0,a)
if(z!=null)return["ref",z]
y=this.CN
this.CN=y+1
this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
TI:[function(a){var z,y
z=this.il.t(0,a)
if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
for(;w<y;++w){v=this.I8(z.t(a,w))
if(w>=x.length)return H.e(x,w)
x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
AP:{
"^":"a;",
QS:[function(a){if(H.ZR(a))return a
this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
XE:[function(a){var z,y
if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
z=J.U6(a)
@@ -9667,7 +9660,7 @@
case"map":return this.tv(a)
case"sendport":return this.Vf(a)
case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
Dj:[function(a){var z,y,x,w,v
z=J.U6(a)
y=z.t(a,1)
@@ -9678,7 +9671,7 @@
if(typeof w!=="number")return H.s(w)
v=0
for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
tv:[function(a){var z,y,x,w,v,u,t,s
z=P.L5(null,null,null,null,null)
y=J.U6(a)
@@ -9692,8 +9685,8 @@
t=J.U6(v)
s=0
for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
yH:{
"^":"a;Kf,zu,p9",
ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
n:[function(a,b){var z,y
if(b==null)return!1
if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
y=b.ng
return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
$isku:true,
$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
"^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
d:[function(a){var z
if(typeof a==="string")return a
if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
else if(a==null)return"null"
z=J.AG(a)
if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-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."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$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."))},"call$1","IT",2,0,null,31,[]],
eQ:[function(a){var z=a.$identityHash
if(z==null){z=Math.random()*0x3fffffff|0
a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
BU:[function(a,b,c){var z,y,x,w,v,u
if(c==null)c=H.Rm()
if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
if(!(v<u))break
y.j(w,0)
if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
IH:[function(a,b){var z,y
if(typeof a!=="string")H.vh(new P.AT(a))
if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
z=parseFloat(a)
if(isNaN(z)){y=J.rr(a)
if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
lh:[function(a){var z,y,x
z=C.AS(J.x(a))
if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
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},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
Cq:[function(a){var z,y,x
z=[]
z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
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.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
eT:[function(a){var z,y
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
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},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
zo:[function(a,b,c){var z,y,x
z={}
z.a=0
y=[]
x=[]
-if(b!=null){z.a=0+b.length
+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,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
Ek:[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*"]
@@ -9877,26 +9868,27 @@
if(z.a)return H.zo(a,b,c)
C.Nm.FV(b,v.gUQ(v))
return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
C.Nm.FV(r,b)
y=a["call$"+q]
if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+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.l0
+if(a=="List")return C.E3
if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+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},"call$1","EN",2,0,null,6,[]],
Pq:[function(){var z={x:0}
delete z.x
return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
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))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
b:[function(a){var z
if(a==null)a=new P.LK()
z=new Error()
@@ -9965,7 +9957,7 @@
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"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
tR:[function(a,b){var z
if(a==null)return
z=a.$identity
@@ -10001,7 +9993,7 @@
n=o.$callName
if(n!=null){m=d?o:H.SD(o,t)
w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
vq:[function(a,b){var z=H.eZ
switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
SD:[function(a,b){var z,y,x,w
if(b)return H.Oj(a)
z=a.length
@@ -10026,7 +10018,7 @@
$.bf=x}x=y+H.d(x)+","+w+");"
y=$.OK
$.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
Z4:[function(a,b,c){var z,y
z=H.eZ
y=H.yS
@@ -10037,7 +10029,7 @@
case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
Oj:[function(a){var z,y,x,w,v
z=a.$stubName
y=a.length
@@ -10049,33 +10041,33 @@
x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
w=$.OK
$.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
Kq:[function(a,b,c,d,e,f){b.fixed$length=init
c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],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))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
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)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
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)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
return a},"call$2","Ub",4,0,null,79,[],80,[]],
oX:[function(a){if(a==null)return
return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
Ko:[function(a,b){if(a==null)return"dynamic"
else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
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)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
uc:[function(a){var z=$.NF
return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
w3:[function(a){var z,y,x,w,v,u
z=$.NF.call$1(a)
y=$.nw[z]
@@ -10264,10 +10256,10 @@
else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
m2:[function(a,b,c){var z,y
if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+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)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
ys:[function(a,b,c){var z,y,x,w,v
if(typeof b==="string")if(b==="")if(a==="")return c
else{z=P.p9("")
@@ -10277,12 +10269,11 @@
w=z.vM+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{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
v.lastIndex=0
return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
"^":"a;"},
xQ:{
"^":"a;"},
@@ -10294,8 +10285,8 @@
gor:function(a){return!J.de(this.gB(this),0)},
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
$isZ0:true},
@@ -10304,10 +10295,10 @@
di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
x4:[function(a){if(typeof a!=="string")return!1
if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
aN:[function(a,b){var z,y,x
z=this.tc
for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
$isyN:true},
LD:{
"^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$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:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
$isEH:true},
XR:{
"^":"mW;Y3",
@@ -10331,14 +10322,13 @@
"^":"a;lK,uk,xI,rq,FX,Nc",
gWa:function(){var z,y,x
z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+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},
gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
"^":"a;e0",
gpf:function(){return!0},
Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
FD:{
"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
BX:[function(a,b){var z=this.Rv
if(typeof b!=="number")return b.C()
if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
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))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
KE:[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))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
e4:[function(a){var z,y,x,w,v,u,t
z={}
if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
H.rd(y,null)
H.bQ(y,new H.Nv(z,this,x))}z=this.NE
if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
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"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
gx5:function(){return this.mr.$reflectionName},
static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
w=z[1]
return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
call$1:[function(a){var z,y,x
z=this.b.NE
y=this.a
@@ -10472,18 +10462,18 @@
z[x]=y},"call$1",null,2,0,null,12,[],"call"],
$isEH:true},
Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
call$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=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
$isEH:true},
u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
call$2:[function(a,b){var z=this.b
if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
$isEH:true},
Zr:{
"^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
if(x!==-1)y.method=z[x+1]
x=this.EP
if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
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)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+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)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
var $argumentsExpr$ = '$arguments$'
try {
$expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
Am:{
"^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
return a},"call$1",null,2,0,null,159,[],"call"],
$isEH:true},
XO:{
@@ -10596,11 +10585,9 @@
"^":"Tp;"},
v:{
"^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y
z=this.EP
@@ -10619,11 +10606,11 @@
x=y
for(y=x.length,w=0;w<y;++w){v=x[w]
if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
"^":"a;QW"},
-D2:{
+dN:{
"^":"a;QW"},
-my:{
+GT:{
"^":"a;oc>"},
Pe:{
"^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
"^":"Ge;G1>",
bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
"^":"a;"},
tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
BD:[function(a){var z=this.rP(a)
return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
z={ "func": "dynafunc" }
y=this.dw
x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+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)
y=this.is
@@ -10656,7 +10643,7 @@
if(y!=null){w={}
v=H.kU(y)
for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
bu:[function(a){var z,y,x,w,v,u,t,s
z=this.Iq
if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
a=a
z=[]
for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
hJ:{
-"^":"lb;",
+"^":"lbp;",
bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
$ishJ:true},
tu:{
-"^":"lb;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},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
za:[function(){var z,y
z=this.Et
if(z!=null)return z
@@ -10701,7 +10688,7 @@
if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
Zz:{
"^":"Ge;K9",
@@ -10720,10 +10707,8 @@
this.ke=y
return y},"call$0","gXo",0,0,null],
giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
$iscu:true,
$isuq:true},
Lm:{
@@ -10733,11 +10718,11 @@
call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
$isEH:true},
wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
$isEH:true},
VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
$isEH:true},
VR:{
@@ -10758,16 +10743,16 @@
if(typeof a!=="string")H.vh(new P.AT(a))
z=this.Ej.exec(a)
if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
yk:[function(a,b){var z,y
z=this.gF4()
z.lastIndex=b
y=z.exec(a)
if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
Bh:[function(a,b){var z,y,x,w
z=this.gAT()
z.lastIndex=b
@@ -10778,13 +10763,13 @@
if(w<0)return H.e(y,w)
if(y[w]!=null)return
J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
wL:[function(a,b,c){var z
if(c>=0){z=J.q8(b)
if(typeof z!=="number")return H.s(z)
z=c>z}else z=!0
if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
$isVR:true,
$isSP:true,
static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
"^":"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]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
VO:function(a,b){},
$isOd:true,
static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
tQ:{
"^":"a;M,J9,zO",
t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
$isOd:true}}],["app","package:observatory/app.dart",,G,{
"^":"",
m7:[function(a){var z
@@ -10839,11 +10824,11 @@
$.NR=z
return z},"call$1","vN",2,0,112,113,[]],
mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
Da:[function(){var z=this.Z6
z.sec(this)
z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
"^":"a;Yb<",
goH:function(){return this.Yb.nQ("getNumberOfColumns")},
gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
RP:[function(a,b){var z=[]
C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
qu:{
"^":"a;vR,bG>",
u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
dZ:{
"^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
kI:[function(){var z=C.PP.aM(window)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
Pr:[function(){var z=this.R6()
if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
z=F.Wi(this,C.h1,this.JL,z)
this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
return!0}return!1},"call$0","goO",0,0,null],
rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
this.JL=F.Wi(this,C.h1,this.JL,z)
z=this.ec
y=this.Pr()
@@ -10921,10 +10906,10 @@
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
goE:function(a){return this.z3},
soE:function(a,b){var z=this.z3
this.z3=b
@@ -10934,28 +10919,19 @@
return this.z3},"call$0","gMk",0,0,null],
$isY2:true},
XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
rT:[function(a){var z,y
z=this.WT
y=J.w1(z)
y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
z=this.WT
y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
PP:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
z.soE(a,!1)
z=this.WT
w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
"^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_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/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.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/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/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/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/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_list.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/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
$.uP=!1
F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
"^":"",
G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.jy]},
static:{Dw:[function(a){var z,y,x,w
z=$.Nd()
@@ -10990,13 +10967,13 @@
C.J0.ZL(a)
C.J0.G6(a)
return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
"^":"uL+Pi;",
$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
"^":"",
Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.OS]},
static:{rt:[function(a){var z,y,x,w
z=$.Nd()
@@ -11011,13 +10988,14 @@
C.YZ.ZL(a)
C.YZ.G6(a)
return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
"^":"",
Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.oY]},
static:{zg:[function(a){var z,y,x,w
z=$.Nd()
@@ -11031,13 +11009,13 @@
C.kk.ZL(a)
C.kk.G6(a)
return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
"^":"uL+Pi;",
$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
"^":"",
CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.U8]},
static:{On:[function(a){var z,y,x,w
z=$.Nd()
@@ -11052,20 +11030,20 @@
C.IK.ZL(a)
C.IK.G6(a)
return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
"^":"",
Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Xx
if(z==null)return
J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
static:{Fe:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
C.YD.ZL(a)
C.YD.G6(a)
return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
"^":"uL+Pi;",
$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
"^":"",
E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
SS:[function(a){var z,y
z=a.Uy
y=a.zh
@@ -11104,7 +11082,7 @@
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")}},"call$0","glg",0,0,114,"_refresh"],
"@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -11119,29 +11097,29 @@
C.j8.ZL(a)
C.j8.G6(a)
return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
"^":"uL+Pi;",
$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
"^":"",
lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
Ki:function(a){return this.gFR(a).call$0()},
AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[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)},"call$0","goJ",0,0,114,"doneCallback"],
AZ:[function(a,b,c,d){var z=a.Hu
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)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
"@":function(){return[C.DKS]},
static:{fR:[function(a){var z,y,x,w
z=$.Nd()
@@ -11158,7 +11136,7 @@
C.O0.ZL(a)
C.O0.G6(a)
return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
LP:{
"^":"ir+Pi;",
$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
qG:[function(a,b,c,d,e){var z,y
H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
y=J.Wx(e)
if(y.C(e,0))throw H.b(new P.AT(e))
if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
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)
+if(!y.$isyN)c=y.tt(c,!1)
y=J.U6(c)
x=y.gB(c)
w=a.length
@@ -11220,9 +11199,13 @@
w=a.length
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.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[function(a,b,c){var z,y
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+for(z=J.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
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))
@@ -11247,7 +11230,7 @@
while(!0){u=J.Wx(v)
if(!(u.D(v,b)&&J.z8(d.call$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)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
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)
@@ -11357,7 +11340,7 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return J.de(this.gB(this),0)},
grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
zV:[function(a,b){var z,y,x,w,v,u
z=this.gB(this)
if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
for(;v<z;++v){u=this.Zv(0,v)
u=typeof u==="string"?u:H.d(u)
w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
es:[function(a,b,c){var z,y,x
z=this.gB(this)
@@ -11414,7 +11397,7 @@
if(!(x<y))break
y=this.Zv(0,x)
if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
$isyN:true},
nH:{
"^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
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)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
qZ:[function(a,b){var z,y,x
if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
z=this.AN
@@ -11479,11 +11462,10 @@
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))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
$asmW:function(a,b){return[b]},
$asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+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:{
"^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
"^":"aL;CR,T6",
mb:function(a){return this.T6.call$1(a)},
gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
$asaL:function(a,b){return[b]},
$asmW:function(a,b){return[b]},
$asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
z=J.GP(this.mb(y.gl()))
this.C2=z}else return!1}this.lo=this.C2.gl()
return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
"^":"a;",
G:[function(){return!1},"call$0","gqy",0,0,null],
gl:function(){return}},
SU7:{
"^":"a;",
sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
"^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
$isList:true,
$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
$isList:true,
$aszM:null,
$isyN:true,
@@ -11579,13 +11564,11 @@
Zv:[function(a,b){var z,y
z=this.CR
y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
GD:{
"^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z=J.v1(this.fN)
if(typeof z!=="number")return H.s(z)
return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
YC:[function(a){if(a==null)return
return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
jO:[function(a){var z,y
z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
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.pL(b)
+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(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
r=s["@"]
if(r==null){q=null
p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+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)
@@ -11657,15 +11638,13 @@
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},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+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)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+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},"call$2","un",4,0,null,140,[],141,[]],
MJ:[function(a,b){var z,y,x,w
z=[]
@@ -11686,8 +11665,8 @@
z={}
z.a=null
for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+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)
@@ -11696,8 +11675,7 @@
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.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
fb:[function(a,b){if(a==null)return b
return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
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)},"call$1","C7",2,0,null,147,[]],
jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+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
@@ -11724,7 +11702,7 @@
if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
Mk:[function(a,b){var z=J.U6(a)
if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
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}},"call$1","IX",2,0,null,12,[]],
Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
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,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
Sn:{
"^":"a;L5,F1>",
gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
jU:{
"^":"a;",
bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
$isej:true},
Lj:{
"^":"jU;MA",
@@ -11776,23 +11754,21 @@
return z.gUQ(z).XG(0,new H.mb())},
$isej:true},
mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
$isEH:true},
cb:{
"^":"jU;If<",
gUx:function(){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)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
$isNL:true,
$isej:true},
cw:{
"^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+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)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y
z=J.v1(C.Gp.LU)
if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
gOO:function(){return"LibraryMirror"},
gUx:function(){return this.If},
gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+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())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+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
@@ -11847,12 +11822,10 @@
rN:[function(a){var z=this.gQH().nb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,[],null,null))
return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
z=this.SD
if(z!=null)return z
@@ -11935,7 +11908,6 @@
this.xO=z
return z},
gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isD4:true,
$isej:true,
$isNL:true},
@@ -11943,12 +11915,12 @@
"^":"cb+M2;",
$isej:true},
IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
YX:{
"^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
return z},
gUx:function(){return this.gIf()},
gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
gJi:function(){return this},
gNy:function(){throw H.b(P.SY(null))},
gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isMs:true,
$isej:true,
$isX9:true,
@@ -11990,7 +11961,7 @@
"^":"M2;Ax<,xq",
gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gK8:function(){var z,y,x
z=$.eb
y=this.Ax
@@ -12007,7 +11978,7 @@
y=v.ZU(this.Ax)
z[c]=y}else v=null
if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
PU:[function(a,b){var z=H.d(a.gfN(a))+"="
this.tu(H.YC(z),2,z,[b])
return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
t.v=t.m=w
return y},"call$1","gFf",2,0,null,70,[]],
ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
QN:[function(a,b){var z=J.x(this.Ax)
if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
n:[function(a,b){var z,y
if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+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},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isiu:true,
$isvr:true,
$isej:true},
mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){var z,y
z=a.gfN(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"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
$isEH:true},
bl:{
"^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
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)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gHA:function(){return!1},
gJi:function(){return this.NK},
gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
gUx:function(){return this.NK.gUx()},
gYj:function(){return new H.cu(this.gCr(),null)},
gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isbl:true,
$isMs:true,
$isej:true,
$isX9:true,
$isNL:true},
tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
call$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))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
$isEH:true},
Oo:{
"^":"Tp:112;",
@@ -12173,15 +12141,13 @@
Ax:{
"^":"Tp:112;a",
call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"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,RH,jE,If",
gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+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
@@ -12211,7 +12177,7 @@
p=H.ys(n,"$",".")}}else continue
s=H.Sd(p,q,!o,o)
x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
gEO:function(){var z=this.qu
if(z!=null)return z
z=this.ly(this)
@@ -12227,7 +12193,7 @@
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},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
gTH:function(){var z=this.zE
if(z!=null)return z
z=this.ws(this)
@@ -12276,9 +12242,7 @@
else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
gXP:function(){var z,y
z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+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)
@@ -12310,12 +12274,12 @@
F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
if(z==null||!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))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
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.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+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])},"call$1","gki",2,0,null,145,[]],
gkZ:function(){var z=this.qm
if(z!=null)return z
@@ -12336,7 +12300,6 @@
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)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isWf:true,
$isMs:true,
$isej:true,
@@ -12346,19 +12309,19 @@
"^":"EE+M2;",
$isej:true},
Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
Ci:{
"^":"Tp:112;b",
call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
$isEH:true},
t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
-Ld:{
+XJ:{
"^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
gOO:function(){return"VariableMirror"},
gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
if(z==null){z=this.n6
z=z==null?C.xD:z()
this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
$isRY:true,
$isNL:true,
$isej:true,
@@ -12397,7 +12360,7 @@
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.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
if(a>=123&&a<=126)return a-117
if(a>=37&&a<=43)return a-27
return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
w=x.split("$")
if(1>=w.length)return H.e(w,1)
v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+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)
@@ -12426,7 +12389,6 @@
y.constructor[z]=s
return s},
bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isvr:true,
$isej:true},
Zk:{
@@ -12451,10 +12413,7 @@
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()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?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
+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.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
this.le=z}return z},
jd:[function(a,b){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))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
guU:function(){return!this.lT&&!this.hB&&!this.xV},
$isZk:true,
$isRS:true,
@@ -12507,8 +12466,8 @@
$isNL:true,
$isej:true},
wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
ng:{
"^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
gAY:function(){return H.vh(P.SY(null))},
gkZ:function(){return H.vh(P.SY(null))},
gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
gNy:function(){return H.vh(P.SY(null))},
gw8:function(){return H.vh(P.SY(null))},
gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
$isX9:true,
$isNL:true},
rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
call$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)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
call$1:[function(a){var z,y
z=this.b.call$1(a)
y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+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()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"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)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
gvc:function(a){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()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
$isZ0:true,
static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
z.fixed$length=init
return z},"call$1","wp",2,0,null,147,[]],
Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
$isEH:true}}],["dart.async","dart:async",,P,{
"^":"",
VH:[function(a,b){var z=H.N7()
z=H.KT(z,[z,z]).BD(a)
if(z)return b.O8(a)
else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
Cx:[function(){var z=$.S6
for(;z!=null;){J.cG(z)
z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
BG:[function(){var z
try{P.Cx()}catch(z){H.Ru(z)
P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
if(a==null)return
try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+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)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
dL:[function(){},"call$0","v3",0,0,114],
FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
rT:function(a,b){var z
if(J.de($.X3,C.NU))return $.X3.uN(a,b)
z=$.X3
@@ -12761,7 +12720,7 @@
gY8:function(){return this.Y8},
uR:[function(a){var z=this.Ae
if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
Ac:[function(){var z=this.Ae
if(typeof z!=="number")return z.w()
this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
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","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
cO:[function(a){var z,y
z=this.Gv
if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
y.sAe(z&4294967293)
y=w}else y=y.giE()
this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
P.ot(this.QC)},"call$0","gVg",0,0,null]},
dz:{
@@ -12866,7 +12825,7 @@
"^":"Tp;a",
call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
DL:{
"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
b8:{
"^":"a;",
$isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
Ia:{
"^":"a;"},
Zf:{
"^":"Ia;MM",
oo:[function(a,b){var z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
w0:[function(a,b){var z
if(a==null)throw H.b(new P.AT("Error must not be null"))
z=this.MM
if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
vs:{
"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
y=P.VH(a,z)
x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
YM:[function(a){var z,y
z=$.X3
y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
y.$builtinTypeInfo=this.$builtinTypeInfo
this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
gDL:function(){return this.jk},
gcG:function(){return this.jk},
Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
E6:[function(a,b){this.Gv=8
this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
L3:[function(){var z,y,x
z=this.jk
this.jk=null
@@ -12937,26 +12904,26 @@
z.sBQ(y)}return y},"call$0","gAw",0,0,null],
rX:[function(a){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
else P.k3(a,this)
else{y=this.L3()
this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
R8:[function(a){var z=this.L3()
this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
K5:[function(a,b){var z=this.L3()
this.E6(a,b)
P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
OH:[function(a){var z
if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+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)
return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
this.Gv=1
this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
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])
z.L7(a,b)
return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],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)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
z={}
z.e=a
for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
if(s!=null)$.X3=s
if(x.d)return
if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!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()
+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()
v=x.c
b.E6(J.w8(v),v.gI4())}z.e=b
y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
da:{
"^":"Tp:115;a,b",
call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
$isEH:true},
pV:{
"^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
$isEH:true},
rH:{
@@ -13040,7 +13004,7 @@
call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
$isEH:true},
rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
call$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)
@@ -13100,33 +13064,29 @@
u=this.b
if(v)u.c=this.c.e.gcG()
else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
v.swG(!0)
this.b.d=!0
z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
$isEH:true},
jZ:{
"^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
$isEH:true},
FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+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.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
$isEH:true},
OM:{
"^":"a;FR>,aw@",
Ki:function(a){return this.FR.call$0()}},
qh:{
"^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
tg:[function(a,b){var z,y
z={}
y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
y=P.Dt(null)
z.a=null
z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
Vr:[function(a,b){var z,y
z={}
y=P.Dt(J.kn)
z.a=null
z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
gB:function(a){var z,y
z={}
y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
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.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
gtH:function(a){var z,y
z={}
y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
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.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
$isqh:true},
YJ:{
"^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
$isEH:true},
LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
$isEH:true},
DO:{
"^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
$isEH:true},
pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
$isEH:true},
eN:{
"^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
$isEH:true},
lU:{
"^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$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:{
@@ -13280,7 +13240,7 @@
"^":"Tp;a,b",
call$1:[function(a){var z=this.a
z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Z5:{
@@ -13293,7 +13253,7 @@
"^":"Tp;a,b,c",
call$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)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$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:{
@@ -13320,13 +13280,11 @@
z.SJ=w
w.Ae=z.Gv&1
if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
$isO9:true},
yU:{
@@ -13338,18 +13296,18 @@
"^":"a;"},
KA:{
"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
Fv:[function(a,b){var z,y,x
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())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
QE:[function(){var z=this.Gv
if((z&8)!==0)return
if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
y=this.Gv
if((y&64)===0){y=(y|64)>>>0
this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
Iv:[function(a){var z=this.Gv
this.Gv=(z|32)>>>0
this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
if(x)this.uO()
else this.LP()
z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
$isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
Vo:{
"^":"Tp:114;a,b,c",
call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
z.fe(a)
z.fm(0,d)
z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
w4:[function(a){var z,y
z=$.X3
y=a?1:0
y=new P.KA(null,null,null,z,y,null,null)
y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
fIm:{
"^":"a;aw@"},
LV:{
"^":"fIm;P>,aw",
r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
DS:{
"^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
JF:{
"^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
gaw:function(){return},
saw:function(a){throw H.b(new P.lj("No events after a done."))}},
ht:{
@@ -13492,7 +13450,7 @@
if(z===1)return
if(z>=1){this.Gv=1
return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
CR:{
"^":"Tp:115;a,b",
call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
h:[function(a,b){var z=this.N6
if(z==null){this.N6=b
this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
TO:[function(a){var z,y
z=this.zR
y=z.gaw()
this.zR=y
if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
V1:[function(a){if(this.Gv===1)this.Gv=3
this.N6=null
this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
$isEH:true},
uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
$isEH:true},
GU:{
@@ -13543,8 +13501,8 @@
v.fe(a)
v.fm(0,d)
v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
$asqh:function(a,b){return[b]}},
fB:{
"^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
if(z!=null){this.Ee=null
z.ed()}return},"call$0","gQC",0,0,null],
vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
S8:function(a,b,c,d){var z,y
z=this.gOa()
@@ -13579,7 +13537,7 @@
y=v
x=new H.XO(w,null)
b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
$asYR:function(a){return[a,a]},
$asqh:null},
t3:{
@@ -13591,26 +13549,26 @@
y=v
x=new H.XO(w,null)
b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
tU:{
"^":"a;"},
aY:{
"^":"a;"},
zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
hk:function(a,b){return this.E2.call$2(a,b)},
Gr:function(a){return this.cP.call$1(a)},
FI:function(a,b){return this.Jl.call$2(a,b)},
mg:function(a,b,c){return this.pU.call$3(a,b,c)},
Al:function(a){return this.Fh.call$1(a)},
cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
wr:function(a){return this.rb.call$1(a)},
RK:function(a,b){return this.rb.call$2(a,b)},
uN:function(a,b){return this.Zq.call$2(a,b)},
Ch:function(a,b){return this.JS.call$1(b)},
iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
"^":"a;"},
dl:{
"^":"a;"},
@@ -13643,8 +13601,8 @@
return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
mz:[function(a,b){var z,y
z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
RK:[function(a,b){var z,y,x
z=this.oh
for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
WH:{
"^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
bH:[function(a){var z,y,x,w
try{x=this.Gr(a)
return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
xi:[function(a,b){var z=this.Al(a)
if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
oj:[function(a,b){var z=this.cR(a)
if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
PT:[function(a,b){var z=this.O8(a)
if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
TF:{
"^":"Tp:115;a,b",
call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
$isEH:true},
dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
$isEH:true},
ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
$isEH:true},
uo:{
@@ -13724,7 +13682,7 @@
z=this.R1
y=z.t(0,b)
if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
$isEH:true},
eM:{
"^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
z=this.c
P.JS("Uncaught Error: "+H.d(z))
y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
throw H.b(z)},"call$0",null,0,0,null,"call"],
$isEH:true},
Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
-W5:{
+nU:{
"^":"a;",
gE2:function(){return P.xP()},
hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
Al:function(a){return this.gFh().call$1(a)},
gXp:function(){return P.zi()},
cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
grb:function(){return P.G2()},
wr:function(a){return this.grb().call$1(a)},
RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
geT:function(a){return},
gzU:function(){return C.v8},
gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
return y==null?!1:y[a]!=null}else{x=this.OB
if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
di:[function(a){var z=this.Ig()
z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
t:[function(a,b){var z,y,x,w,v,u,t
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null)y=null
@@ -13893,7 +13849,7 @@
if(v==null)return
u=v[this.nm(b)]
t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
u:[function(a,b,c){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
if(u>=0)v[u+1]=c
else{v.push(b,c)
this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -13920,7 +13876,7 @@
if(x<0)return
this.X5=this.X5-1
this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
V1:[function(a){if(this.X5>0){this.wV=null
this.OB=null
this.OX=null
@@ -13930,7 +13886,7 @@
z=this.Ig()
for(y=z.length,x=0;x<y;++x){w=z[x]
b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
z=this.wV
if(z!=null)return z
@@ -13951,71 +13907,71 @@
for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
return y},"call$0","gtL",0,0,null],
dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
Nv:[function(a,b){var z
if(a!=null&&a[b]!=null){z=P.vL(a,b)
delete a[b]
this.X5=this.X5-1
this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
$isZ0:true,
static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
P.cW(z,"<non-identifier-key>",z)
delete z["<non-identifier-key>"]
return z},"call$0","Vd",0,0,null]}},
oi:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
ce:{
"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
DJ:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
PL:{
"^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
aH:[function(a,b){var z,y,x
if(a==null)return-1
z=a.length
for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
Fq:{
"^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
WV:function(a,b){return this.m6.call$2(a,b)},
H5:function(a){return this.Q6.call$1(a)},
Ef:function(a){return this.ac.call$1(a)},
t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
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:112;a",
call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
$isEH:true},
fG:{
"^":"mW;Fb",
@@ -14058,8 +14014,8 @@
if(y==null)return!1
return y[a]!=null}else{x=this.OB
if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
t:[function(a,b){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
v=w[this.nm(b)]
u=this.aH(v,b)
if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
u:[function(a,b,c){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
if(v==null)x[w]=[this.pE(b,c)]
else{u=this.aH(v,b)
if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
to:[function(a,b){var z
if(this.x4(a))return this.t(0,a)
z=b.call$0()
this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
Rz:[function(a,b){var z,y,x,w
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)
@@ -14102,7 +14058,7 @@
if(x<0)return
w=y.splice(x,1)[0]
this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
V1:[function(a){if(this.X5>0){this.lX=null
this.H9=null
this.OB=null
@@ -14115,17 +14071,17 @@
y=this.zN
for(;z!=null;){b.call$2(z.gkh(),z.gS4())
if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
dg:[function(a,b,c){var z=a[b]
if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
Nv:[function(a,b){var z
if(a==null)return
z=a[b]
if(z==null)return
this.Vb(z)
delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
pE:[function(a,b){var z,y
z=new P.db(a,b,null,null)
if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
y.sDG(z)
this.lX=z}this.X5=this.X5+1
this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
Vb:[function(a){var z,y
z=a.gzQ()
y=a.gDG()
@@ -14143,13 +14099,13 @@
if(y==null)this.lX=z
else y.szQ(z)
this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
$isFo:true,
$isZ0:true,
@@ -14159,15 +14115,15 @@
return z},"call$0","Bs",0,0,null]}},
a1:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
ou:{
"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
S9:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
db:{
@@ -14249,7 +14205,7 @@
this.DM=null
return!0}},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -14300,18 +14256,19 @@
if(a==null)return-1
z=a.length
for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
YO:{
"^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
aH:[function(a,b){var z,y,x
if(a==null)return-1
z=a.length
for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
oz:{
"^":"a;O2,DM,zi,fD",
gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
y=this.zN
for(;z!=null;){b.call$1(z.gGc())
if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
grZ:function(a){var z=this.lX
if(z==null)throw H.b(new P.lj("No elements"))
return z.gGc()},
@@ -14381,7 +14338,7 @@
else{if(this.aH(u,b)>=0)return!1
u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -14426,13 +14383,14 @@
if(y==null)this.lX=z
else y.szQ(z)
this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -14451,7 +14409,7 @@
Yp:{
"^":"w2Y;G4",
gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
lN:{
"^":"mW;",
tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
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},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -14484,11 +14443,11 @@
else{y.KF(H.d(z.gl()))
for(;z.G();){y.vM=y.vM+b
x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
Vr:[function(a,b){var z
for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
gB:function(a){var z,y
z=this.gA(this)
for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
return y},
qA:[function(a,b,c){var z,y
for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
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))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
$isQV:true,
$asQV:null},
@@ -14523,13 +14482,13 @@
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)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
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.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return J.de(this.gB(a),0)},
gor:function(a){return!this.gl0(a)},
grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
zV:[function(a,b){var z
if(J.de(this.gB(a),0))return""
z=P.p9("")
z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
if(!(x<y))break
y=this.t(a,x)
if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
h:[function(a,b){var z=this.gB(a)
this.sB(a,J.WB(z,1))
this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
x=this.gB(a)
this.sB(a,J.WB(x,1))
this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
Mu:[function(a,b,c){this.pZ(a,b,c)
return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+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))},"call$2","gYH",4,0,null,123,[],124,[]],
YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
if(typeof z!=="number")return H.s(z)
z=b>z}else z=!0
if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
if(typeof x!=="number")return H.s(x)
if(e+y>x)throw H.b(new P.lj("Not enough elements"))
if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
XU:[function(a,b,c){var z,y
z=this.gB(a)
if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
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},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
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
return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
if(z)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))
this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+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)))
+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.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+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
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
bu:[function(a){var z
if($.xb().tg(0,a))return"[...]"
z=P.p9("")
@@ -14662,14 +14639,14 @@
$isQV:true,
$asQV:null},
ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$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)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
Sw:{
"^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
if(y<0||y>=x.length)return H.e(x,y)
b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
z=this.av
y=this.eZ
if(z===y)throw H.b(new P.lj("No elements"))
z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+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)
@@ -14702,21 +14678,23 @@
x=z.length
y=(y+b&x-1)>>>0
if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
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)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+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
w=this.v5
v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
if(typeof u!=="number")return H.s(u)
w=Array(u)
w.fixed$length=init
@@ -14724,15 +14702,16 @@
this.eZ=this.wR(t)
this.v5=t
this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=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=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+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=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
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)
@@ -14747,38 +14726,33 @@
this.av=0
this.qT=this.qT+1}},"call$0","gRa",0,0,null],
bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
z=this.v5
y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+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}},"call$1","gzv",2,0,null,456,[]],
VW:[function(){var z,y,x,w
z=Array(this.v5.length*2)
z.fixed$length=init
@@ -14793,25 +14767,29 @@
this.av=0
this.eZ=this.v5.length
this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
z=this.av
y=this.eZ
-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)
+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)
z=this.eZ
+if(typeof z!=="number")return H.s(z)
y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
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])
+static:{"^":"PO",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
if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
y.T8=null
y.Bb=null
this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
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},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
bB:[function(a){var z,y,x
if(this.aY==null)return
if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
else{y=this.Xu(y)
this.aY=y
y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
fS:[function(a,b){var z,y
this.P6=this.P6+1
this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
a.T8=y.T8
y.T8=null}else{a.T8=y
a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
Ba:{
"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
wS:function(a,b){return this.Cw.call$2(a,b)},
Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
if(this.Ef(b)!==!0)return
if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
Rz:[function(a,b){var z
if(this.Ef(b)!==!0)return
z=this.bB(b)
if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
u:[function(a,b,c){var z
if(b==null)throw H.b(new P.AT(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)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
gl0:function(a){return this.aY==null},
gor:function(a){return this.aY!=null},
aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
V1:[function(a){this.aY=null
this.P6=0
this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
gUQ:function(a){var z=new P.uM(this)
z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
An:{
"^":"Tp:112;a",
call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
$isEH:true},
bF:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
call$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.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
$isEH:true},
S6B:{
"^":"a;",
@@ -14976,7 +14954,7 @@
return this.Wb(z)},
p0:[function(a){var z
for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
G:[function(){var z,y,x
z=this.Dn
if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
$isyN:true},
DN:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
ZM:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
$asS6B:function(a,b){return[b]}},
HW:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
"^":"",
VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
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)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
f1:{
"^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
for(y=this.a,x=0;x<w.length;++x){u=w[x]
v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Uk:{
"^":"a;"},
@@ -15073,12 +15051,12 @@
static:{TP:function(a){return new P.K8(a,null)}}},
by:{
"^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
gZE:function(){return C.Ap},
gHe:function(){return C.A3},
$asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
"^":"zF;Xi",
$aszF:function(){return[P.a,J.O]}},
Cf:{
@@ -15121,7 +15099,7 @@
this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
WD:[function(a){var z=this.qi
if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
rl:[function(a){var z,y,x,w,v
if(!this.IS(a)){x=a
w=this.qi
@@ -15144,7 +15122,7 @@
this.aK(a)
z.KF("\"")
return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
z=this.Vy
z.KF("[")
if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
z.vM=z.vM+","
this.rl(y.t(a,x));++x}}z.KF("]")
this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
w=this.Vy
w.KF("{")
z.a=!0
@@ -15163,13 +15141,13 @@
w.KF("}")
this.qi.Rz(0,a)
return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
b=P.BC()
z=P.p9("")
new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
call$2:[function(a,b){var z,y,x
z=this.a
y=this.b
@@ -15178,13 +15156,13 @@
x.KF("\"")}y.aK(a)
x.KF("\":")
y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
z0:{
"^":"Zi;lH",
goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
"^":"zF;",
WJ:[function(a){var z,y,x
z=J.U6(a)
@@ -15193,7 +15171,7 @@
y=H.VM(Array(y),[J.im])
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)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
$aszF:function(){return[J.O,[J.Q,J.im]]}},
Rw:{
"^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
this.ZP=y+1
if(y>=v)return H.e(z,y)
z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
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)
if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
z[s]=128|v>>>6&63
this.ZP=u+1
if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
"^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
hl:[function(a){var z,y,x,w,v,u
if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
FM:function(a){return new P.HG(a)},
ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,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,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+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,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
O8:function(a,b,c){var z,y,x
z=J.Qi(a,c)
if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
HM:function(a){return H.eT(a)},
fc:function(a){return P.HM(P.O8(1,a,J.im))},
HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
$isEH:true},
CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){var z=this.a
if(z.b>0)z.a.KF(", ")
z.a.KF(J.GL(a))
z.a.KF(": ")
z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
p4:{
"^":"a;OF",
@@ -15336,10 +15314,8 @@
"^":"a;"},
iP:{
"^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+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},"call$1","gUJ",2,0,null,109,[]],
iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
EK:function(){H.o2(this)},
RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
$isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
if(z!=null){y=new P.MF()
x=z.QK
@@ -15405,32 +15381,30 @@
return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
return"0"+a},"call$1","wI",2,0,null,198,[]]}},
MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
$isEH:true},
Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
$isEH:true},
a6:{
"^":"a;Fq<",
g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
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)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return this.Fq&0x1FFFFFFF},
iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
$isa6:true,
static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
call$1:[function(a){if(a>=100000)return""+a
if(a>=10000)return"0"+a
if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
call$1:[function(a){if(a>=10)return""+a
return"0"+a},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
@@ -15549,7 +15523,7 @@
return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
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)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
Qz:[function(){var z,y
z=H.of(this,"expando$key")
if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return H.eQ(this)},
bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
gbx:function(a){return new H.cu(H.dJ(this),null)},
$isa:true},
Od:{
@@ -15622,7 +15596,7 @@
for(;z.G();){this.vM=this.vM+b
y=z.gl()
y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
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},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
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)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
SK:[function(a){var z,y,x,w,v
if(!this.uo(a))return a
z=[]
@@ -15673,12 +15647,12 @@
z.pop()}x=!0}else if("."===w)x=!0
else{z.push(w)
x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
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))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
bu:[function(a){var z,y
z=P.p9("")
y=this.Fi
@@ -15692,8 +15666,8 @@
z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
n:[function(a,b){var z,y
if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)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
@@ -15708,7 +15682,7 @@
else this.HC=e
this.r0=this.x6(c,d)},
$isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",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)
@@ -15875,18 +15849,18 @@
if(q&&!p)z.call$1("expected a part after last `:`")
if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
r=J.UQ(v,1)
if(typeof r!=="number")return H.s(r)
J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
s=J.UQ(v,3)
if(typeof s!=="number")return H.s(s)
J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$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))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
z=new P.rI()
y=P.p9("")
x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
y.vM=y.vM+u
z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
call$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},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
Kd:{
"^":"Tp:112;",
call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
$isEH:true},
yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z=this.a
if(!z.a)this.b.KF("&")
z.a=!1
@@ -15938,44 +15912,44 @@
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))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$1:[function(a){var z
if(!(48<=a&&a<=57))z=65<=a&&a<=70
else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
$isEH:true},
pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
$isEH:true},
Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
call$1:[function(a){var z,y
z=this.b
y=C.xB.j(z,a)
if(this.d.call$1(y)===!0)return y-32
else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
call$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(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
Lk:{
"^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
$isEH:true},
XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
call$2:[function(a,b){var z=J.v1(a)
if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
$isEH:true},
Mx:{
"^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
$isEH:true},
C9:{
"^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
z=H.BU(a,null,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
$isEH:true},
kZ:{
"^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
$isEH:true},
JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
call$2:[function(a,b){var z,y
if(b-a>4)this.b.call$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)
@@ -16023,18 +15997,18 @@
"^":"Tp:112;c",
call$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)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z=J.Wx(a)
b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
$isEH:true}}],["dart.dom.html","dart:html",,W,{
"^":"",
UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
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},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
Pv:[function(a){if(a==null)return
return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
if(a==null)return
if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
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(new P.AT(d))
@@ -16118,7 +16088,7 @@
return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
qE:{
"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
zw:{
"^":"Gv;",
$isList:true,
@@ -16130,12 +16100,10 @@
Ps:{
"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
"%":"HTMLAnchorElement"},
Sb:{
"^":"qE;N:target=,cC:hash%,mH:href=",
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
"%":"HTMLAreaElement"},
Xk:{
"^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
Fy:{
"^":"qE;",
$isD0:true,
-$isGv:true,
"%":"HTMLBodyElement"},
QW:{
"^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
Zv:{
"^":"KV;Rn:data=,B:length=",
-$isGv:true,
"%":"Comment;CharacterData"},
Yr:{
"^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
QF:{
"^":"KV;",
JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
gi9:function(a){return C.mt.aM(a)},
gVl:function(a){return C.pi.aM(a)},
gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
$isQF:true,
"%":"Document|HTMLDocument|SVGDocument"},
Aj:{
@@ -16199,10 +16180,9 @@
x=J.w1(y)
x.V1(y)
x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
"%":";DocumentFragment"},
cm:{
"^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
y=this.gwd(a)
y.V1(0)
y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
i4:[function(a){},"call$0","gQd",0,0,null],
xo:[function(a){},"call$0","gbt",0,0,null],
aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
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"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
bA:[function(a,b){var z=a
do{if(J.RF(z,b))return!0
z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
gLm:function(a){return C.i3.f0(a)},
ZL:function(a){},
$iscv:true,
-$isGv:true,
$isD0:true,
"%":";Element"},
Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
"%":"HTMLEmbedElement"},
Ty:{
"^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
ea:{
"^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
$isea:true,
"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
D0:{
"^":"Gv;",
gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
$isD0:true,
"%":";EventTarget"},
as:{
@@ -16293,14 +16282,14 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16309,9 +16298,9 @@
$isXj:true,
"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
$iszU:true,
"%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
"^":"D0;",
"%":";XMLHttpRequestEventTarget"},
tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
"%":"HTMLIFrameElement"},
Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
$isSg:true,
"%":"ImageData"},
pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
oo:function(a,b){return a.complete.call$1(b)},
"%":"HTMLImageElement"},
Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
RR:function(a,b){return a.accept.call$1(b)},
r6:function(a,b){return a.value.call$1(b)},
$isMi:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true,
"%":"HTMLInputElement"},
In:{
"^":"qE;MB:form=,oc:name%,t5:type=",
"%":"HTMLKeygenElement"},
-wP:{
+pL:{
"^":"qE;P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
El:{
"^":"qE;kc:error=,LA:src=",
xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
zm:{
"^":"Gv;tT:code=",
"%":"MediaError"},
@@ -16400,16 +16388,17 @@
"^":"ea;Rn:data=",
"%":"MIDIMessageEvent"},
bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
"%":"MIDIOutput"},
-ab:{
+tH:{
"^":"D0;jO:id=,oc:name=,t5:type=",
"%":"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))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
$isWp:true,
"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
H9:{
@@ -16423,15 +16412,11 @@
y.call$2("subtree",i)
y.call$2("attributeOldValue",d)
y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
"%":"MutationObserver|WebKitMutationObserver"},
o4:{
"^":"Gv;jL:oldValue=,N:target=,t5:type=",
"%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
ih:{
"^":"Gv;G1:message=,oc:name=",
"%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
Tk:[function(a,b){var z,y
try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(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)},"call$2","gZM",4,0,null,332,[],333,[]],
bu:[function(a){var z=a.nodeValue
return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
$isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
yk:{
"^":"ma;",
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16475,7 +16465,7 @@
"^":"qE;t5:type%",
"%":"HTMLOListElement"},
G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
"%":"HTMLObjectElement"},
l9:{
"^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
"^":"qE;P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLProgressElement"},
-ew:{
+kQ:{
"^":"ea;",
-$isew:true,
+$iskQ:true,
"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
"%":"ResourceProgressEvent"},
j2:{
"^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
"%":"HTMLSelectElement"},
I0:{
"^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
$isI0:true,
"%":"ShadowRoot"},
QR:{
@@ -16548,7 +16538,7 @@
G5:{
"^":"ea;oc:name=",
"%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
"^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
"%":"StorageEvent"},
Lx:{
@@ -16579,7 +16569,7 @@
r6:function(a,b){return a.value.call$1(b)},
$isAE:true,
"%":"HTMLTextAreaElement"},
-xV:{
+R0:{
"^":"Mf;Rn:data=",
"%":"TextEvent"},
RH:{
@@ -16592,9 +16582,12 @@
Mf:{
"^":"ea;",
"%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
if(W.uC(z)===!0)return z
if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
return a._location_wrapper},
@@ -16619,41 +16612,35 @@
geT:function(a){return W.Pv(a.parent)},
cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
gi9:function(a){return C.mt.aM(a)},
gVl:function(a){return C.pi.aM(a)},
gLm:function(a){return C.i3.aM(a)},
$isu9:true,
-$isGv:true,
$isD0:true,
"%":"DOMWindow|Window"},
Bn:{
"^":"KV;oc:name=,P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
"^":"qE;",
$isD0:true,
-$isGv: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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16666,14 +16653,14 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.yg]},
$isyN:true,
@@ -16681,19 +16668,19 @@
$asQV:function(){return[W.yg]},
$isXj:true,
"%":"SpeechInputResultList"},
-LO:{
+LOx:{
"^":"kEI;",
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.uj]},
$isyN:true,
@@ -16703,12 +16690,12 @@
"%":"SpeechRecognitionResultList"},
QZ:{
"^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
static:{"^":"wk"}},
VG:{
"^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
gB:function(a){return this.vG.length},
t:[function(a,b){var z=this.vG
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=this.vG
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
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=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
if(b.parentNode===z){z.removeChild(b)
return!0}}return!1},"call$1","guH",2,0,null,6,[]],
xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
z=this.vG
y=z.length
x=this.MW
if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
grZ:function(a){var z=this.MW.lastElementChild
if(z==null)throw H.b(new P.lj("No elements"))
return z},
@@ -16760,8 +16742,8 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
return z}}},
B1:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
M5:{
"^":"Gv;"},
@@ -16813,11 +16794,11 @@
$asQV:function(){return[W.KV]}},
Kx:{
"^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
$isEH:true},
iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
$isEH:true},
bU:{
"^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
x=this.b
if(y){y=x.MM
if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
e7:{
"^":"ar;NL",
grZ:function(a){var z=this.NL.lastChild
if(z==null)throw H.b(new P.lj("No elements"))
return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-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)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+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())},"call$1","gDY",2,0,null,116,[]],
xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
z=this.NL
y=z.childNodes
x=y.length
if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+oF:[function(a,b,c){var z,y
z=this.NL
y=z.childNodes
if(b<0||b>=y.length)return H.e(y,b)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
z=this.NL
if(z!==b.parentNode)return!1
z.removeChild(b)
@@ -16869,15 +16853,16 @@
z=this.NL
y=z.childNodes
if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
gA:function(a){return C.t5.gA(this.NL.childNodes)},
GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
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]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
$asar:function(){return[W.KV]},
$aszM:function(){return[W.KV]},
$asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
$asQV:function(){return[W.KV]}},
Ou:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
yoo:{
"^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
$asQV:function(){return[W.uj]}},
tJ:{
"^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
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},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
V1:[function(a){var z
for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
$isZ0:true,
$asZ0:function(){return[J.O,J.O]}},
Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
i7:{
"^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
Rz:[function(a,b){var z,y
z=this.MW
y=z.getAttribute(b)
z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
nF:{
"^":"As;QX,Kd",
lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
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)},"call$1","gVH",2,0,null,91,[]],
OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
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)
@@ -17002,27 +16986,27 @@
return z}}},
FK:{
"^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Si:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
vf:{
"^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Iw:{
"^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Fc:{
"^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
$isEH:true},
I4:{
"^":"As;MW",
@@ -17032,35 +17016,35 @@
if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
p5:[function(a){P.F(a,!0,null)
J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
"^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
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)
z.$builtinTypeInfo=this.$builtinTypeInfo
z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
eu:{
"^":"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])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
$isqh:true},
ie:{
"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
Ea:{
"^":"Tp:112;b",
call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"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])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
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.KS(null)
@@ -17068,16 +17052,16 @@
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)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
$isqh:true},
i2:{
"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
b0:{
"^":"Tp:112;b",
call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Ov:{
"^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
return},"call$0","gZS",0,0,null],
Fv:[function(a,b){if(this.uv==null)return
this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
gRW:function(){return this.VP>0},
QE:[function(){if(this.uv==null||this.VP<=0)return
this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
z=this.eM
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()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
cO:[function(a){var z,y
for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
z.V1(0)
@@ -17116,19 +17100,21 @@
call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
$isEH:true},
bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
Gm:{
"^":"a;",
gA:function(a){return H.VM(new W.W9(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."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
$isList:true,
$aszM:null,
$isyN:true,
@@ -17143,17 +17129,17 @@
V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
t:[function(a,b){var z=this.xa
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=this.xa
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){J.wg(this.xa,b)},
GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
Qg:{
"^":"a;je",
G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
call$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)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
$isEH:true},
dW:{
"^":"a;Ui",
geT:function(a){return W.P1(this.Ui.parent)},
cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+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."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
$isD0:true,
-$isGv:true,
static:{P1:[function(a){if(a===window)return a
else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
Dk:{
@@ -17195,8 +17180,7 @@
gmH:function(a){return this.WK.href},
VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
"^":"",
hF:{
"^":"Gv;",
@@ -17205,156 +17189,92 @@
"^":"",
Dh:{
"^":"zp;N:target=,mH:href=",
-$isGv:true,
"%":"SVGAElement"},
Ue:{
"^":"Eo;mH:href=",
-$isGv:true,
"%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEBlendElement"},
lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
"%":"SVGFEColorMatrixElement"},
pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEComponentTransferElement"},
NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
"%":"SVGFECompositeElement"},
W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEConvolveMatrixElement"},
mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEDiffuseLightingElement"},
kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEDisplacementMapElement"},
bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEFloodElement"},
Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEGaussianBlurElement"},
me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGFEImageElement"},
oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEMergeElement"},
EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
"%":"SVGFEMorphologyElement"},
MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFETileElement"},
Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
"%":"SVGFETurbulenceElement"},
QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGFilterElement"},
N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
"%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
"^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
zp:{
"^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
"%":"SVGRectElement"},
j24:{
"^":"d5;t5:type%,mH:href=",
-$isGv:true,
"%":"SVGScriptElement"},
-Lu:{
+ki:{
"^":"d5;t5:type%",
"%":"SVGStyleElement"},
d5:{
@@ -17369,61 +17289,27 @@
gVl:function(a){return C.pi.f0(a)},
gLm:function(a){return C.i3.f0(a)},
$isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|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"},
hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
$ishy:true,
-$isGv:true,
"%":"SVGSVGElement"},
-mq:{
+mHq:{
"^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
"%":";SVGTextContentElement"},
Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
"%":"SVGTextPathElement"},
Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
wD:{
"^":"d5;mH:href=",
-$isGv:true,
"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
O7:{
"^":"As;LO",
lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
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},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
return},"call$2","Cb",4,0,null,96,[],12,[]],
wY:[function(a){var z
if(a==null)return
else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
else z=!0
else z=!0
if(z)return a
else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+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()))}}},"call$1","En",2,0,112,96,[]],
hE:[function(a,b,c){var z=P.Om(a,b)
if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
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=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!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
@@ -17487,12 +17373,10 @@
t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
bu:[function(a){var z,y
try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
V7:[function(a,b){var z,y
z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
$isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
z=P.wY(a)
if(b==null)return P.ND(new z())
y=[null]
@@ -17519,10 +17402,10 @@
z=this.a
if(z.x4(a))return z.t(0,a)
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
z.u(0,a,x)
for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
z.u(0,a,v)
C.Nm.FV(v,y.ez(a,this))
return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
"^":"E4;eh"},
Tz:{
"^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
t:[function(a,b){var z
if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>=z}else z=!0
else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z
if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>=z}else z=!0
else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>z}else z=!0
if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
if(J.de(y,0))return
if(e<0)throw H.b(new P.AT(e))
x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
Wk:{
"^":"E4+lD;",
@@ -17607,6 +17488,12 @@
call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
$isEH:true}}],["dart.math","dart:math",,P,{
"^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
J:[function(a,b){var z
if(typeof a!=="number")throw H.b(new P.AT(a))
if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
if(a===0)z=b===0?1/b<0:b<0
else z=!1
if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
if(typeof b!=="number")throw H.b(new P.AT(b))
if(a>b)return a
@@ -17624,17 +17511,166 @@
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},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"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},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+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
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3: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)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*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:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+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},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(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)
+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.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+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)
+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.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+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)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
"^":"",
re:[function(a){var z,y
z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
ej:{
"^":"a;",
$isej:true},
@@ -17692,26 +17728,26 @@
$isZ0:true},
B8q:{
"^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
$isZ0:true},
Nx:{
"^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
gl0:function(a){return this.EV.X5===0},
gor:function(a){return this.EV.X5!==0},
gvc:function(a){var z=this.EV
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)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
gUQ:function(a){var z=this.EV
return z.gUQ(z)},
$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
"^":"Gv;",
J2:[function(a,b,c){var z=J.Wx(b)
if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
$ispF:true,
$isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
df:{
"^":"pF;",
gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
gbx:function(a){return C.hN},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
gbx:function(a){return C.lk},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
gbx:function(a){return C.jV},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
gbx:function(a){return C.Im},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
gbx:function(a){return C.la},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
$asQV:function(){return[J.im]},
$isHY:true,
"%":"Int8Array"},
-aH:{
+us:{
"^":"Pg;",
gbx:function(a){return C.iN},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
gbx:function(a){return C.Vh},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
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)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
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)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
$asQV:function(){return[J.im]},
$isHY:true,
"%":";Uint8Array"},
-LZ:{
+b0B:{
"^":"pF;",
gB:function(a){return a.length},
oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
x=d.length
if(x-e<y)throw H.b(new P.lj("Not enough elements"))
if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
$isXj:true},
Dg:{
"^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
$isDg:true,
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
$isQV:true,
$asQV:function(){return[J.GW]}},
Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
$isList:true,
$aszM:function(){return[J.GW]},
$isyN:true,
@@ -17936,9 +17971,8 @@
"^":"Ui+SU7;"},
Pg:{
"^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
$isPg:true,
$isList:true,
$aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
$isQV:true,
$asQV:function(){return[J.im]}},
ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
$isList:true,
$aszM:function(){return[J.im]},
$isyN:true,
@@ -17959,12 +17993,12 @@
return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
return}if(typeof window=="object")return
if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
"^":"",
E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
"@":function(){return[C.uW]},
static:{TW:[function(a){var z,y,x,w
z=$.Nd()
@@ -17978,29 +18012,29 @@
C.OD.ZL(a)
C.OD.G6(a)
return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
"^":"uL+Pi;",
$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
"^":"",
rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
Ki:function(a){return this.gFR(a).call$0()},
VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
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.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
J.xW(b)
z=a.fn
a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
x=R.Jk(y)
J.kW(x,"expr",z)
J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
"@":function(){return[C.Qz]},
static:{Rp:[function(a){var z,y,x,w,v
z=R.Jk([])
@@ -18027,18 +18061,18 @@
C.Gh.ZL(a)
C.Gh.G6(a)
return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
"^":"uL+Pi;",
$isd3:true},
YW:{
"^":"Tp:112;a-82",
call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
$isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
"^":"",
m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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()
@@ -18053,14 +18087,14 @@
C.MC.ZL(a)
C.MC.G6(a)
return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
"^":"",
Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
static:{bH:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
C.LT.ZL(a)
C.LT.G6(a)
return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
"^":"uL+Pi;",
$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
"^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
static:{ZV:[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.Pe=!1
a.SO=z
a.B7=y
@@ -18094,13 +18147,16 @@
C.Xo.ZL(a)
C.Xo.G6(a)
return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
"^":"",
mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.nu]},
static:{N0:[function(a){var z,y,x,w
z=$.Nd()
@@ -18114,37 +18170,154 @@
C.Yu.ZL(a)
C.Yu.G6(a)
return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
"^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[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.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$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))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
"^":"",
jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
i4:[function(a){var z,y
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
a.q3=y
y.bG.u(0,"allowHtml",!0)
J.kW(J.wc(a.q3),"sortColumn",1)
J.kW(J.wc(a.q3),"sortAscending",!1)
y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
a.J0=z
z.bG.u(0,"title","New Space")
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
a.CO=y
y.bG.u(0,"title","Old Space")
y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
a.kg=z
z.bG.u(0,"allowHtml",!0)
J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
hZ:[function(a){var z,y,x,w,v,u
z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
z=J.U6(u)
J.N5(a.GQ,["Used",z.t(u,"used")])
J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
z=J.U6(u)
J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
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},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
iF:[function(a,b,c){var z
switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
case 6:return J.UQ(J.UQ(b,"old"),5)
case 7:return J.UQ(J.UQ(b,"old"),1)
case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
VI:[function(a,b,c){var z
switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
case 6:z=J.U6(b)
return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
ii:[function(a,b,c,d){var z=a.Ol
if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
pM:[function(a,b){this.hZ(a)
this.ct(a,C.Aq,[],this.gOd(a))
this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
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"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
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"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
Q0:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.LY=z
z.Gl("string","Class")
a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
a.LY.Gl("number","Allocated Since GC (old)")
a.LY.Gl("number","Total before GC (old)")
a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.GQ=z
z.Gl("string","Type")
a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.Oc=z
z.Gl("string","Type")
a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.bV=z
z.Gl("string","Class")
a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
a.bV.Gl("number","Total before GC")
a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
"@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -18289,44 +18459,51 @@
C.Vc.G6(a)
C.Vc.Dd(a)
return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
"^":"uL+Pi;",
$isd3:true},
nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
$isEH:true},
-"+ nx":[489],
+"+ nx":[501],
jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
$isEH:true},
-"+ jm":[489],
+"+ jm":[501],
ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
$isEH:true},
-"+ ke":[489],
+"+ ke":[501],
xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
$isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
"^":"",
bL:[function(a){var z,y
z=[]
y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$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)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
dg:function(){var z=$.L4
if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
$.L4=z}return z},
@@ -18341,19 +18518,19 @@
for(x=0;x<y;++x)if(z[x]===a)return x
z.push(a)
this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
call$1:[function(a){var z=this.d
if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
call$2:[function(a,b){var z=this.e
if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
$isEH:true},
wO:{
"^":"Tp:115;",
@@ -18368,14 +18545,14 @@
if(typeof a==="number")return a
if(typeof a==="string")return a
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
w=this.UI.call$1(x)
z.a=w
if(w!=null)return w
@@ -18383,7 +18560,7 @@
z.a=w
this.bK.call$2(x,w)
y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
x=this.f.call$1(a)
w=this.UI.call$1(x)
if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
u=0
for(;u<v;++u){z=this.call$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"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
CA:{
"^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
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},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
call$1:[function(a){var z=this.c
if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
call$2:[function(a,b){var z=this.d
if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
$isEH:true},
xL:{
"^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
u=J.w1(y)
t=0
for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
As:{
"^":"a;",
bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
if(!z.tg(0,a)===!0){z.h(0,a)
y=!0}else{z.Rz(0,a)
y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
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)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
ez:[function(a,b){var z=this.lF()
return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
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)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
Rz:[function(a,b){var z,y
if(typeof b!=="string")return!1
z=this.lF()
y=z.Rz(0,b)
this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
grZ:function(a){var z=this.lF().lX
if(z==null)H.vh(new P.lj("No elements"))
return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
OS:[function(a){var z,y
z=this.lF()
y=a.call$1(z)
this.p5(z)
return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
$isyN:true,
$isQV:true,
$asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
u:[function(a,b,c){var z=this.gzT()
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.AT("Invalid list length"))
this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
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.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
return!0}}return!1},"call$1","guH",2,0,null,132,[]],
gB:function(a){return this.gzT().length},
t:[function(a,b){var z=this.gzT()
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
gA:function(a){var z=this.gzT()
return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
hT:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
GS:{
"^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
"^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
z=a.tY
if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
else{y=J.w1(z)
y.u(z,"fields",null)
y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
"@":function(){return[C.VW]},
static:{b4:[function(a){var z,y,x,w
z=$.Nd()
@@ -18592,7 +18772,7 @@
C.cp.ZL(a)
C.cp.G6(a)
return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
Js:{
"^":"Tp:112;a-82",
call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
$isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
"^":"",
hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.be]},
static:{HC:[function(a){var z,y,x,w
z=$.Nd()
@@ -18621,20 +18801,20 @@
a.SO=z
a.B7=y
a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
"^":"",
u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
static:{Cu:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
C.b9.ZL(a)
C.b9.G6(a)
return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
"^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+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())
+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))}},"call$0","gz7",0,0,null],
o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
z=H.VM([],[G.Y2])
y=c!=null?J.WB(c.yt,1):0
z=new X.qm(a,b,c,y,z,[],!1,null,null)
z.Af(a,b,c)
return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,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,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
z=a.pD
if(z==null)return
y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
a.FT=this.ct(a,C.XU,a.FT,z)
z=x.bu(0)
a.vk=this.ct(a,C.Dj,a.vk,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")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,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)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+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)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
YF:[function(a,b,c,d){var z,y,x
z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
x=z.rowIndex
if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
"@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-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.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[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.FT=""
a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
C.XH.ZL(a)
C.XH.G6(a)
return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
"^":"uL+Pi;",
$isd3:true},
SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
$isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
"^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+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.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
"@":function(){return[C.aM]},
static:{JR:[function(a){var z,y,x,w
z=$.Nd()
@@ -18787,39 +19041,60 @@
C.Qt.ZL(a)
C.Qt.G6(a)
return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[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.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
"^":"uL+Pi;",
$isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
"^":"",
vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
gkG:[function(a){var z=a.kf
a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
gvc:[function(a){var z,y
z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
"@":function(){return[C.KH]},
static:{mA:[function(a){var z,y,x,w
z=$.Nd()
@@ -18835,13 +19110,13 @@
C.Yt.ZL(a)
C.Yt.G6(a)
return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
"^":"uL+Pi;",
$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
"^":"",
LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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()
@@ -18856,14 +19131,15 @@
C.Z3.ZL(a)
C.Z3.G6(a)
return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
"^":"",
KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"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)
@@ -18876,8 +19152,8 @@
C.MG.ZL(a)
C.MG.G6(a)
return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
"^":"uL+Pi;",
$isd3:true}}],["logging","package:logging/logging.dart",,N,{
"^":"",
@@ -18896,7 +19172,7 @@
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},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
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)
@@ -18906,19 +19182,19 @@
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)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
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()},"call$0","gnc",0,0,null],
od:[function(a,b){var z=this.Gs
if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
QL:function(a,b,c){var z=this.eT
if(z!=null)J.Tr(z).u(0,this.oc,this)},
$isTJ:true,
@@ -18939,10 +19215,8 @@
qV:{
"^":"a;oc>,P>",
r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
C:[function(a,b){var z=J.Vm(b)
if(typeof z!=="number")return H.s(z)
return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
giO:function(a){return this.P},
bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
$isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
HV:{
"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
$isEH:true},
Lb:{
"^":"Tp:112;",
@@ -18985,22 +19259,22 @@
A.Ok()},"call$1",null,2,0,null,113,[],"call"],
$isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
"^":"",
-T4:{
+jh:{
"^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
tzK:{
"^":"a;"},
jA:{
"^":"a;oc>"},
-PO:{
+Jo:{
"^":"a;"},
oBi:{
"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
"^":"",
F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19012,16 +19286,16 @@
C.kD.ZL(a)
C.kD.G6(a)
return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
static:{AJ:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
C.SU.ZL(a)
C.SU.G6(a)
return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
"^":"uL+Pi;",
$isd3:true},
Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
"@":function(){return[C.nh]},
static:{EL:[function(a){var z,y,x,w
z=$.Nd()
@@ -19062,27 +19336,27 @@
C.nn.ZL(a)
C.nn.G6(a)
return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
"^":"uL+Pi;",
$isd3:true},
Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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",368,387],
Ki:function(a){return this.gFR(a).call$0()},
VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
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.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
"@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19096,14 +19370,14 @@
C.J7.ZL(a)
C.J7.G6(a)
return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
"^":"uL+Pi;",
$isd3:true},
tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.NT]},
static:{J8:[function(a){var z,y,x,w
z=$.Nd()
@@ -19118,16 +19392,16 @@
C.lx.ZL(a)
C.lx.G6(a)
return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
"^":"uL+Pi;",
$isd3:true},
fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
"@":function(){return[C.zaS]},
static:{Du:[function(a){var z,y,x,w
z=$.Nd()
@@ -19142,16 +19416,16 @@
C.RR.ZL(a)
C.RR.G6(a)
return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
"^":"uL+Pi;",
$isd3:true},
Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.KI]},
static:{IV:[function(a){var z,y,x,w
z=$.Nd()
@@ -19166,16 +19440,16 @@
C.ct.ZL(a)
C.ct.G6(a)
return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
"^":"uL+Pi;",
$isd3:true},
iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.t9]},
static:{lT:[function(a){var z,y,x,w
z=$.Nd()
@@ -19190,30 +19464,30 @@
C.xE.ZL(a)
C.xE.G6(a)
return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
"^":"",
lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
z.pC()
z.PI()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
z.pC()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
"@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19227,17 +19501,17 @@
C.k0.G6(a)
C.k0.ZB(a)
return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
"^":"",
uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
Om:[function(a,b){var z,y,x,w
if(b==null)return"-"
z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
z=C.jn.Y(z,60000)
w=C.jn.cU(z,1000)
z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
A5:[function(a,b){var z=J.Wx(b)
if(z.C(b,1024))return H.d(b)+"B"
else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"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"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
"@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19287,8 +19561,8 @@
for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
if(typeof w!=="number")H.vh(new P.AT(w))
if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
"^":"",
Pi:{
"^":"a;",
@@ -19306,16 +19580,16 @@
x=H.VM(new P.Yp(z),[T.z2])
if(y.Gv>=4)H.vh(y.q7())
y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
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)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
nq:[function(a,b){if(!this.gnz(a))return
if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
"^":"",
z2:{
@@ -19330,7 +19604,7 @@
"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
kb:function(a){return this.rk.call$1(a)},
gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
wE:[function(a){var z,y,x,w,v
if(this.YX)return
@@ -19381,22 +19655,21 @@
$.tW=w
for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+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()
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();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+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},"call$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)},"call$0","Zq",0,0,null],
o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
call$2:[function(a,b){var z=this.a
if(z.a)return
z.a=!0
@@ -19418,14 +19691,14 @@
return this.f.call$0()},"call$0",null,0,0,null,"call"],
$isEH:true},
id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
call$4:[function(a,b,c,d){if(d==null)return d
return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
$isEH:true},
iV:{
"^":"Tp:112;bK,Gq,Rm,w3",
call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
"^":"",
f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
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},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
z=a.length
y=z-1
@@ -19498,10 +19771,10 @@
v=p
y=w}else{u.push(2)
v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
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},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
xU:[function(a,b,c){var z,y,x,w,v,u
z=J.U6(a)
y=z.gB(a)
@@ -19512,7 +19785,7 @@
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},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.Wx(c)
y=J.Wx(f)
@@ -19562,7 +19835,7 @@
s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
break
default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.RE(b)
y=z.gWA(b)
@@ -19581,7 +19854,8 @@
y=J.WB(z,J.q8(u.ok.G4))
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
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
z=J.xH(q.dM,J.q8(q.ok.G4))
if(typeof z!=="number")return H.s(z)
s-=z
@@ -19602,11 +19876,11 @@
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)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
xl:[function(a,b){var z,y
z=H.VM([],[G.DA])
for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
u2:[function(a,b){var z,y,x,w,v,u
if(b.length===1)return b
z=[]
@@ -19616,7 +19890,7 @@
if(u>>>0!==u||u>=x.length)return H.e(x,u)
if(!J.de(v,x[u]))z.push(w)
continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+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},"call$2","W5",4,0,null,73,[],255,[]],
DA:{
"^":"a;WA>,ok,Il<,jr,dM",
gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
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},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
$isDA:true,
static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
z.$builtinTypeInfo=[null]
return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
"^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
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},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
d3:{
"^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
$isd3:true},
lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z,y,x,w,v
z=this.b
y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
"^":"",
xh:{
"^":"Pi;L1,AP,Lk",
-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",358],
+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",368],
r6:function(a,b){return this.gP(this).call$1(b)},
-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")},230,[],"value",358],
+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")},230,[],"value",368],
bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
"^":"",
wn:{
@@ -19737,7 +19951,7 @@
if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
this.xg=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
sB:[function(a,b){var z,y,x,w,v,u
z=this.h3
y=z.length
@@ -19765,10 +19979,10 @@
u=[]
w=new P.Yp(u)
w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
t:[function(a,b){var z=this.h3
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
u:[function(a,b,c){var z,y,x,w
z=this.h3
if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
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},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
h:[function(a,b){var z,y,x,w
z=this.h3
y=z.length
@@ -19791,7 +20015,7 @@
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))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){var z,y,x,w
z=this.h3
y=z.length
@@ -19808,7 +20032,7 @@
UZ:[function(a,b,c){var z,y,x,w,v,u,t
z=b>=0
if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
x=c-b
w=this.h3
@@ -19827,14 +20051,31 @@
z=new H.nH(w,b,c)
z.$builtinTypeInfo=[null]
if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
if(b>c)H.vh(P.TE(b,0,c))
z=z.br(0)
y=new P.Yp(z)
y.$builtinTypeInfo=[null]
this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+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
+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))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
z=this.h3
y=z.length
if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
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(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
iH:[function(a){var z,y
z=this.xg
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)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
nU:[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))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
oC:[function(){var z,y,x
z=this.b3
if(z==null)return!1
@@ -19879,7 +20114,7 @@
if(x){x=H.VM(new P.Yp(y),[G.DA])
if(z.Gv>=4)H.vh(z.q7())
z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
$iswn:true,
static:{uX:function(a,b){var z=H.VM([],[b])
return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
qC:{
"^":"Pi;Zp,AP,Lk",
gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
u:[function(a,b,c){var z,y,x,w,v
z=this.Zp
y=z.gB(z)
@@ -19923,7 +20158,7 @@
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]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+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]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
Rz:[function(a,b){var z,y,x,w,v
z=this.Zp
@@ -19933,7 +20168,7 @@
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},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
V1:[function(a){var z,y,x,w
z=this.Zp
y=z.gB(z)
@@ -19950,76 +20185,61 @@
z.FV(0,a)
return z},Bq:function(a,b,c){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!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])
+if(!!z.$isBa)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}}},
zT:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
"^":"",
Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+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},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
if(a==null)return
x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+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(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+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.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
if(a==null)return!1
x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+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)){z.PU(b,c)
return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+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.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],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},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+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
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+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},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
pY:[function(a){var z,y
try{z=a.gAY()
@@ -20042,7 +20262,7 @@
if(z!=null){y=z.iE
z=y==null?z!=null:y!==z}else z=!1
if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
sP:[function(a,b){var z,y,x,w
z=this.BK
@@ -20059,7 +20279,7 @@
if(w>=z.length)return H.e(z,w)
if(L.h6(x,z[w],b)){z=this.kN
if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
k0:[function(a){O.Pi.prototype.k0.call(this,this)
this.ov()
this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
if(w===y&&x)u=this.E4(u)
v=this.kN;++w
if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
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
@@ -20102,7 +20322,7 @@
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)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
Rl:[function(a,b){var z,y
if(b==null)b=this.BK.length
if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
if(z>=y.length)return H.e(y,z)
y=y[z]
if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
Kh:[function(a){var z,y,x,w,v
z=this.kN
if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
z=this.BK
if(a>=z.length)return H.e(z,a)
x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
w=y.gvp().w4(!1)
v=w.Lj
w.dB=v.cR(new L.Px(this,a,x))
w.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.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
w=z.gUj(y).w4(!1)
z=w.Lj
w.dB=z.cR(new L.C4(this,a,x))
w.o7=P.VH(P.AY(),z)
w.Bd=z.Al(P.v3())
if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
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
@@ -20156,16 +20375,16 @@
call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
call$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}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
$isEH:true},
C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
call$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}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
$isEH:true},
Md:{
"^":"Tp:115;",
@@ -20174,16 +20393,16 @@
"^":"",
Jk:[function(a){var z,y,x
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
x=Q.uX(null,null)
x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
"^":"",
JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
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())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+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.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+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();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+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=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
Oy:[function(a,b){var z,y
do{z=a.gYK().nb.t(0,b)
y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
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))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
YG:[function(a,b,c){var z,y,x
z=$.cM()
if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
if(y==null)return
x=J.UQ(y,"ShadowCSS")
if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
if(a==null)return""
w=J.RE(a)
z=w.gmH(a)
@@ -20246,36 +20462,34 @@
w.send()
w=w.responseText
return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+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}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
Ad:[function(a,b){var z
if(b==null)b=C.hG
$.Ej().u(0,a,b)
z=$.p2().Rz(0,a)
if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
if(a==null)return
b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
z9:[function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
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},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
ZI:[function(a,b){var z,y
if(a==null)return
@@ -20283,25 +20497,23 @@
J.c9(z,J.nJ(a))
y=a.getAttribute("element")
if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
pX:[function(){var z=window
C.ol.hr(z)
C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),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},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+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
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
z.Gr(A.PB())
return z}A.ei()
@@ -20333,14 +20545,14 @@
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.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+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.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
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
@@ -20392,12 +20604,11 @@
y.$builtinTypeInfo=[H.Kp(r,0)]
for(;y.G();){l=z.gl()
for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+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)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
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
@@ -20421,11 +20632,10 @@
gt5:function(a){return a.zx},
gP1:function(a){return a.aa},
goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?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
@@ -20452,17 +20662,15 @@
A.YG(this.gZf(a),y,z)
w=P.re(a.zx)
v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
this.Ba(a,y)
A.yV(a.RT)},"call$0","gGy",0,0,null],
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},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
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")
@@ -20490,14 +20698,14 @@
if(typeof console!="undefined")console.warn(t)
continue}y=a.Q7
if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
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))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
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)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
y=z.br(z)
x=this.gZf(a)
if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
kO:[function(a,b){var z,y,x,w,v,u
z=P.p9("")
y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
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=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
J3:[function(a,b,c){var z
if(b==="")return
z=document.createElement("style",null)
J.c9(z,b)
z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
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
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+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())}}},"call$1","gHv",2,0,null,257,[]],
qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
du:function(a){a.RT=a.getAttribute("name")
this.yx(a)},
$isXP:true,
@@ -20567,16 +20774,16 @@
call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
$isEH:true},
CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$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)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
ZG:{
"^":"Tp:112;",
@@ -20587,8 +20794,8 @@
call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
$isEH:true},
MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
w12:{
"^":"Tp:115;",
@@ -20597,14 +20804,14 @@
return z},"call$0",null,0,0,null,"call"],
$isEH:true},
r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
$isEH:true},
yL:{
-"^":"nd;",
+"^":"ndx;",
$isyL:true},
zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
gpQ:function(a){return!1},
Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
this.BT(a,!0)},"call$0","gQd",0,0,null],
xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[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)
else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
Se:[function(a,b){var z,y
if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
y=z.ZK(a,a.SO)
this.jx(a,y)
this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
Tp:[function(a,b){var z,y
if(b==null)return
this.gIW(a)
@@ -20649,14 +20854,13 @@
$.od().u(0,z,a)
z.applyAuthorStyles=this.gpQ(a)
z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
z.appendChild(y.ZK(a,a.SO))
this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
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)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
aC:[function(a,b,c,d){var z=J.x(b)
if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
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.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
B2:[function(a,b){var z=J.ak(a.dZ)
if(z==null)return
return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
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)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
Id:[function(a,b){var z,y
z=H.vn(a).rN(b).gAx()
y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
t.bw(a,y,c,d)
this.Id(a,z.gIf())
J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
gCd:function(a){return J.QE(M.Ky(a))},
Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
z=a.oq
if(z!=null){z.TP(0)
a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
Xl:[function(a){var z,y,x,w,v,u
z=J.xR(a.dZ)
y=J.YP(a.dZ)
x=z==null
if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+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()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
rJ:[function(a,b,c,d){var z,y,x,w,v
z=J.xR(a.dZ)
if(z==null)return
y=z.t(0,b)
if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+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")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+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)
x=w.Lj
@@ -20762,7 +20963,7 @@
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)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
l5:[function(a,b){var z=a.Sa.Rz(0,b)
if(z==null)return!1
z.ed()
@@ -20786,7 +20987,7 @@
t=new W.Ov(0,w.uv,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)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
iw:[function(a,b){var z,y,x,w,v,u,t
z=J.RE(b)
if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
u=J.UQ($.QX(),v)
t=w.t(0,u!=null?u:v)
if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+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))+")")},"call$1","gD4",2,0,583,378,[]],
+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))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(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(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
$iszs:true,
$isTU:true,
$isd3:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true},
WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=J.Vs(this.a)
if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
Xi:{
"^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
$isEH:true},
TV:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
Mq:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
$isEH:true},
Oa:{
"^":"Tp:115;a",
call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
$isEH:true},
n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
call$2:[function(a,b){var z,y,x
z=this.e
if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
if(y!=null){z=this.b
x=J.RE(b)
J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
$isEH:true},
xf:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$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+"())")
@@ -20866,26 +21064,26 @@
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])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
$isEH:true},
Rs:{
"^":"Tp:112;c,d,e",
call$1:[function(a){var z,y,x,w,v,u
z=this.e
y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+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.ao(v,C.xB.yn(w,1),null)
w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
uJ:{
"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
$isEH:true},
hm:{
"^":"Tp:112;",
@@ -20908,16 +21106,15 @@
X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
EC:[function(a){this.dY=a
this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
G6:function(a){this.Pa(a)},
static:{oa:function(a){var z,y,x,w
z=$.Nd()
@@ -20931,17 +21128,16 @@
C.Iv.ZL(a)
C.Iv.G6(a)
return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
$iszs:true,
$isTU:true,
$isd3:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true},
GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
$isd3:true},
bS:{
"^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
$isEH:true},
Fn:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
$isEH:true},
e3:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
$isEH:true},
pM:{
"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
$isEH:true},
-jh:{
+Mh:{
"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
"^":"",
Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
if(z!=null)return z.call$2(a,b)
try{y=C.xr.kV(J.JA(a,"'","\""))
return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
W6:{
"^":"Tp:115;",
call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
return z},"call$0",null,0,0,null,"call"],
$isEH:true},
Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z,y
try{z=P.Gl(a)
return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
mf:{
"^":"Tp:112;a",
call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
HK:{
"^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
"^":"",
ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
o8:{
"^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
$isEH:true},
ex:{
"^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
$isEH:true},
e9:{
"^":"ve;",
@@ -21065,65 +21259,60 @@
y.w5()
x=y.o9()
if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$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?H.B7([],P.L5(null,null,null,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)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
$isEH:true},
uK:{
"^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$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?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
$isEH:true},
mY:{
"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
u0:function(a){return this.uI.call$1(a)},
KX:[function(a){var z,y
z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+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)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(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:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
mB:{
"^":"Tp:112;a,b",
call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
$isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
"^":"",
XF:{
@@ -21136,31 +21325,29 @@
bX:{
"^":"Tp;a,b",
call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
"^":"",
OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
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.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
x.push(w.gT8())
z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
t=z.a.ghP()
u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+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.call$0()
u=J.vF(z.a)}else{y.call$0()
u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
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)))
if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z=H.Og(P.a)
z=H.KT(z,[z]).BD(b)
if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
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(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
else w=!0
if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+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"))},"call$1","gIA",2,0,null,12,[]],
tI:[function(a){var z
@@ -21286,12 +21472,12 @@
gju: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)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
DX:[function(a){var z
this.yc(0,a)
z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
yc:[function(a,b){var z,y,x
z=this.tj
if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
z=this.Lv
if(z==null?y!=null:z!==y){x=this.k6
if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
$ishw:true},
Ed:{
"^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
co:[function(a){var z,y
z=J.UK(a.ghP(),this)
y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
CU:[function(a){var z,y,x
z=J.UK(a.ghP(),this)
y=J.UK(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)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
ZR:[function(a){var z,y,x,w,v
z=J.UK(a.ghP(),this)
y=a.gre()
@@ -21333,21 +21519,21 @@
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){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
o0:[function(a){var z,y
z=H.VM(new H.A8(a.gPu(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},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
YV:[function(a){var z,y,x
z=J.UK(a.gG3(a),this)
y=J.UK(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)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
im:[function(a){var z,y,x
z=J.UK(a.gBb(),this)
y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
y=J.UK(a.gT8(),this)
x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
Os:{
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Wh:{
"^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.EZ]},
$isEZ:true,
$ishw:true},
@@ -21391,27 +21577,27 @@
return z.gP(z)},
r6:function(a,b){return this.gP(this).call$1(b)},
Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
$asAy: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())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.kB]},
$iskB:true,
$ishw:true},
ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
$isEH:true},
qR:{
"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.ae]},
$isae:true,
$ishw:true},
@@ -21424,21 +21610,20 @@
z=this.KL
this.Lv=J.UQ(a,z.gP(z))
y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+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)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.w6]},
$isw6:true,
$ishw:true},
Qv:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
Xm:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
mv:{
"^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
y=$.ww().t(0,z.gkp(z))
if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.jK]},
$isjK:true,
$ishw:true},
@@ -21458,7 +21643,7 @@
"^":"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,w
+Qh:[function(a){var z,y,x
z=this.KL
y=$.e6().t(0,z.gkp(z))
if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
else{x=this.Bb
if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+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.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.uk]},
$isuk:true,
$ishw:true},
@@ -21491,20 +21672,19 @@
return}y=this.KL
x=new H.GD(H.u1(y.goc(y)))
this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.x9]},
$isx9:true,
$ishw:true},
Li:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
WK:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
iT:{
"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
return}y=this.Jn.gLv()
x=J.U6(z)
this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.zX]},
$iszX:true,
$ishw:true},
-ja:{
+tE:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
ey:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
fa:{
"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
x=this.hP.gLv()
if(x==null){this.Lv=null
return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.Jy]},
$isJy:true,
$ishw:true},
@@ -21553,13 +21732,12 @@
call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
$isEH:true},
vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
a9:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
VA:{
"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
z=this.Bb
y=this.T8.gLv()
x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+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))
x=J.Vm(z)
w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.K9]},
$isK9:true,
$ishw:true},
@@ -21581,11 +21759,11 @@
call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
$isfk:true},
wL:{
"^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
$iswL:true,
$isEH:true},
B0:{
@@ -21600,33 +21778,33 @@
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},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
Zm:[function(a,b){var z=J.WB(a,b)
if(typeof z!=="number")return H.s(z)
a=536870911&z
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
Up:[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)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
tc:{
"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
hw:{
"^":"a;",
$ishw:true},
EZ:{
"^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
$isEZ:true},
no:{
"^":"hw;P>",
r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){var z=this.P
return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
$isno:true},
kB:{
"^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return U.au(this.Pu)},
$iskB:true},
ae:{
"^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.G3.P)
y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
$isae:true},
XC:{
"^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return J.v1(this.wz)},
$isXC:true},
w6:{
"^":"hw;P>",
r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return this.P},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return J.v1(this.P)},
$isw6:true},
jK:{
"^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.kp)
y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
$isjK:true},
uk:{
"^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y,x
z=J.v1(this.kp)
y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
$isuk:true},
K9:{
"^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=this.Bb
z=z.giO(z)
@@ -21722,12 +21896,10 @@
$isK9:true},
zX:{
"^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+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)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.hP)
y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
$iszX:true},
x9:{
"^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.hP)
y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
$isx9:true},
Jy:{
"^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+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)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y,x
z=J.v1(this.hP)
y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
$isJy:true},
xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
"^":"",
FX:{
@@ -21771,10 +21943,10 @@
if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
else z=!0
if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
o9:[function(){if(this.fL.lo==null){this.Sk.toString
return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
BH:[function(a,b){var z,y,x,w,v
for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
z.toString
@@ -21782,25 +21954,21 @@
z.toString
a=new U.zX(a,w)}else break
else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}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()
v=this.o9()
z.toString
a=new U.K9(a,v)}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},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){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)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
Tw:[function(a){var z,y,x
z=this.fL.lo
this.w5()
@@ -21832,7 +22000,7 @@
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()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
Ai:[function(){var z,y,x
switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
y=J.x(z)
@@ -21907,28 +22075,26 @@
this.Sk.toString
y=H.VM(new U.no(z),[null])
this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
yj:[function(a){var z,y
z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
this.Sk.toString
y=H.VM(new U.no(z),[null])
this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
"^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+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)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"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.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
"+IndexedValue":[0],
Bt:{
"^":"mW;YR",
@@ -21945,7 +22111,7 @@
return z},
Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
$asmW:function(a){return[[K.Ae,a]]},
$asQV:function(a){return[[K.Ae,a]]}},
vR:{
@@ -21965,14 +22131,14 @@
z=a.gAY()
if(z!=null&&!J.de(z.gUx(),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},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
"^":"",
wX:[function(a){switch(a){case 102:return 12
case 110:return 10
case 114:return 13
case 116:return 9
case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
Pn:{
"^":"a;fY>,P>,G8<",
r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
x=H.eT(v)
z.vM=z.vM+x
this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
hA:{
"^":"a;G1>",
bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
"^":"",
fr:{
"^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
d2:{
"^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
CU:[function(a){J.UK(a.ghP(),this)
J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
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)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
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)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
YV:[function(a){J.UK(a.gG3(a),this)
J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
im:[function(a){J.UK(a.gBb(),this)
J.UK(a.gT8(),this)
this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
this.xn(a)},"call$1","ghe",2,0,null,96,[]],
ky:[function(a){J.UK(a.gBb(),this)
J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
"^":"",
JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
"@":function(){return[C.Is]},
static:{Zo:[function(a){var z,y,x,w
z=$.Nd()
@@ -22128,27 +22294,27 @@
C.Cc.ZL(a)
C.Cc.G6(a)
return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
"^":"uL+Pi;",
$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
"^":"",
knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
gD5:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
z=J.u6(a.zw,0)
y=a.tY
if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
goc:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
z=J.u6(a.zw,0)
y=a.tY
if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
"@":function(){return[C.Ur]},
static:{Th:[function(a){var z,y,x,w
z=$.Nd()
@@ -22164,17 +22330,17 @@
C.c0.ZL(a)
C.c0.G6(a)
return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
"^":"xI+Pi;",
$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
"^":"",
fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Uz
@@ -22188,9 +22354,9 @@
y=J.UQ(z.gu9(),J.f2(b))
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"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
"@":function(){return[C.I3]},
static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
z=$.Nd()
@@ -22205,16 +22371,16 @@
C.cJ.ZL(a)
C.cJ.G6(a)
return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
"^":"uL+Pi;",
$isd3:true},
-qq:{
+l0:{
"^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
$isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
"^":"",
Er:[function(a){var z
if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
return z},"call$1","XI",2,0,null,190,[]],
Io:[function(a){var z=J.rY(a)
if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
f3:[function(a,b,c){var z,y,x,w,v
for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
z.H4(b,c)
@@ -22252,31 +22419,29 @@
z.$builtinTypeInfo=[null,null]
z=new D.SI(z,b,null,null,null,null,null,null,null)
z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
G8:{
"^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
Jb:[function(a){var z,y
z=J.U6(a)
y=z.t(a,"id")
z.t(a,"type")
if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.cI().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y,x
z=this.F1
y=J.im
@@ -22284,58 +22449,44 @@
x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
x.H4(z,a)
return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
$asG8:function(){return[D.rj]},
static:{"^":"RI"}},
q1:{
"^":"Tp:112;a",
call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
$isEH:true},
jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.xN().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y,x
z=this.F1
y=J.im
x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
x.H4(z,a)
return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
pl:[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()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
$asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
$isEH:true},
du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.Yk().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y
z=this.F1
y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
$asG8:function(){return[D.SI]},
static:{"^":"Oi"}},
xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.uG().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y
z=this.F1
y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
return y},"call$1","gUU",2,0,null,98,[]],
$asG8:function(){return[D.SI]},
static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
gPj:function(a){return this.KG},
gHP:function(){return"#/"+H.d(this.KG)},
gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
z=D.SI
y=J.O
this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
this.fq.toString
z=$.cI().Ej
y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
z=$.uG().Ej
if(y)H.vh(new P.AT(a))
if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
tM:[function(a,b){var z,y,x,w
D.Ch(b,this.zf,this)
this.nr=!1
@@ -22432,9 +22660,9 @@
y=F.Wi(this,C.tP,this.cL,y)
this.cL=y
y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
x=H.B7([],P.L5(null,null,null,null,null))
J.kH(z.t(b,"timers"),new D.Qq(x))
y=this.LE
@@ -22446,33 +22674,71 @@
w.u(y,"dart",x.t(0,"time_dart_execution"))
y=J.UQ(z.t(b,"heap"),"usedNew")
this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+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)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[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)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[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()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
$isbv:true},
D3:{
"^":"af+Pi;",
$isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
call$1:[function(a){var z=this.a
return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
$isEH:true},
Qq:{
"^":"Tp:112;a",
call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
$isEH:true},
Qd:{
"^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
gzf:function(){return this.Gt},
VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
l9:[function(a){var z=[]
J.kH(this.i2,new D.i6(a,z))
H.bQ(z,new D.r2(this))
J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
AQ:[function(a){var z,y,x,w
z=this.i2
y=J.U6(z)
@@ -22480,14 +22746,14 @@
if(x!=null)return x
w=P.L5(null,null,null,J.O,J.GW)
w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
x.nr=C.xB.nC("@Isolate","@")
x.mQ=D.Io("@Isolate")
x.DC(0)
x.pC()
y.u(z,a,x)
x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
Ze:[function(a){var z,y,x,w,v
z=J.UQ(a,"id")
y=this.i2
@@ -22496,21 +22762,21 @@
if(w!=null){w.eC(a)
return w}v=P.L5(null,null,null,J.O,J.GW)
v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
w.H4(null,a)
w.pC()
x.u(y,z,w)
w.xW(0)
return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
r2:{
"^":"Tp:112;c",
call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
$isEH:true},
JB:{
"^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
w=J.U6(x)
if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
u.H4(null,a)
u.pC()
N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
$isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
$isEH:true},
BH:{
"^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
$isEH:true},
SI:{
"^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
y=y.t(0,"name")
this.GR=this.ct(this,C.KS,this.GR,y)
y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
gl0:function(a){var z=this.RF.Zp
return z.gB(z)===0},
gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
gB:function(a){var z=this.RF.Zp
return z.gB(z)},
BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
k0:[function(a){return},"call$0","gqw",0,0,114],
ni:[function(a){this.RF.AP=null
return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
$isd3:true},
pt:{
"^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
tM:[function(a,b){var z,y
z=J.U6(b)
y=z.t(b,"kind")
this.J6=F.Wi(this,C.fy,this.J6,y)
z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,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)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
wVq:{
"^":"af+Pi;",
$isd3:true},
c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
$isc2:true},
rj:{
"^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
tM:[function(a,b){var z,y,x
z=J.U6(b)
if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
this.GR=this.ct(this,C.KS,this.GR,y)
y=z.t(b,"kind")
this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
aq:[function(a){var z,y,x,w,v
if(this.nr)this.xW(0)
z=J.U6(a)
@@ -22641,7 +22907,7 @@
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}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
W8:[function(a){var z,y,x,w,v
this.nr=!0
if(a==null)return
@@ -22653,7 +22919,7 @@
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]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
$isrj:true},
dZL:{
"^":"af+Pi;",
@@ -22662,50 +22928,56 @@
"^":"a;Yu<,Du<,fF<",
$isN8:true},
Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
xt:[function(){var z,y
z=this.Yu
y=J.x(z)
if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
Io:[function(a){var z
if(a==null)return""
z=J.UQ(a.gyP(),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())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
HU:[function(a){var z
if(a==null)return""
z=J.UQ(a.gyP(),this.Yu)
if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
WAE:{
"^":"a;uX",
bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
if(z.n(a,"Native"))return C.nj
else if(z.n(a,"Dart"))return C.l8
else if(z.n(a,"Collected"))return C.WA
else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
Vi:{
"^":"a;tT>,Av<",
$isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",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],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",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],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
this.Du=0
this.fF=0
@@ -22727,7 +22999,7 @@
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())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
eL:[function(a,b,c){var z,y
this.jv=F.Wi(this,C.QK,this.jv,c)
z=J.U6(a)
@@ -22739,8 +23011,8 @@
if(y!=null)this.pd(y)
z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
tM:[function(a,b){var z,y,x
z=J.U6(b)
this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
y=this.Fm
y=D.Lr(y.zf,y,z.t(b,"function"))
this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
x=z.t(b,"disassembly")
if(x!=null)this.xs(x)
z=this.va
y=J.U6(z)
this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
xs:[function(a){var z,y,x,w,v,u,t,s
z=this.va
y=J.w1(z)
@@ -22774,7 +23049,7 @@
t=x.t(a,w+2)
s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
pd:[function(a){var z,y,x,w,v,u
z=J.U6(a)
y=this.yP
@@ -22785,117 +23060,49 @@
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}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
F3:[function(a){var z,y,x
for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
Ov:[function(a,b){var z,y
for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
$iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
w8F:{
"^":"af+Pi;",
$isd3:true},
fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
call$2:[function(a,b){var z,y
z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
"^":"",
XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
z6:[function(a,b){var z=this.Yu
N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
dT:{
"^":"Tp:112;",
call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
$isEH:true},
ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
bI:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
z=this.ja
v=z.t(0,y)
z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
z6:[function(a,b){var z,y,x
z=""+this.yb
y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
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),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
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,{
"^":"",
ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
hu:[function(a){var z
switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
J.X8(z,a.mC)
return z
case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
return z
case"Code":z=W.r3("code-view",null)
J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
case"Function":z=W.r3("function-view",null)
J.dk(z,a.mC)
return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
J.ti(z,a.mC)
return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
case"IsolateList":z=W.r3("isolate-list",null)
J.oq(z,a.mC)
return z
@@ -22965,7 +23178,7 @@
case"StackTrace":z=W.r3("stack-trace",null)
J.yO(z,a.mC)
return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
fa:[function(a,b){var z,y,x
a.textContent=""
z=a.mC
@@ -22988,32 +23201,32 @@
C.ZO.ZL(a)
C.ZO.G6(a)
return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
"^":"uL+Pi;",
$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
"^":"",
xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
gO3:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
gOL:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
gD5:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
goc:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
"@":function(){return[C.JD]},
static:{lK:[function(a){var z,y,x,w
z=$.Nd()
@@ -23028,15 +23241,43 @@
C.wU.ZL(a)
C.wU.G6(a)
return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
"^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"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.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
"^":"",
nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
"@":function(){return[C.pE]},
static:{an:[function(a){var z,y,x,w
z=$.Nd()
@@ -23050,16 +23291,16 @@
C.dX.ZL(a)
C.dX.G6(a)
return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
"^":"uL+Pi;",
$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
"^":"",
Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.js]},
static:{bV:[function(a){var z,y,x,w
z=$.Nd()
@@ -23073,20 +23314,20 @@
C.bg.ZL(a)
C.bg.G6(a)
return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
"^":"uL+Pi;",
$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
"^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
case"radio":case"select-multiple":case"select-one":return z.gi9(a)
default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
iX:[function(a,b){var z,y,x,w,v,u,t,s
z=M.pN(a,b)
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+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
@@ -23094,7 +23335,7 @@
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)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
HP:[function(a,b,c,d,e){var z,y,x
if(b==null)return
if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
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)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
bM:[function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
pN:[function(a,b){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+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},"call$2","vw",4,0,null,263,[],285,[]],
F5:[function(a,b){var z,y,x
z={}
z.a=null
@@ -23124,9 +23365,9 @@
if(y==null){x=[]
z.a=x
y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
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),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+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)
@@ -23154,7 +23395,7 @@
t.push(L.ao(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)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
z=a.length
if(z===0)return
@@ -23172,30 +23413,30 @@
v=t+2}if(v===z)w.push("")
z=new M.HS(w,null)
z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
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}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
Ky:[function(a){var z,y,x,w
z=$.rw()
z.toString
y=H.of(a,"expando$values")
x=y==null?null:H.of(y,z.Qz())
if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+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.$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 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=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
else z=!0
else z=!1
return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
"^":"TU;N1,mD,Ck",
Z1:[function(a,b,c,d){var z,y,x,w,v
J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
y=this.gN1()
if(z){H.Go(y,"$isQl")
y.toString
@@ -23221,29 +23460,29 @@
z=d!=null?d:""
x=new M.D8(w,y,c,null,null,v,z)
x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
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)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
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,u
+EC:[function(a){var z,y,x,w,v
z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+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)},"call$1","gH0",2,0,null,230,[]]},
H2:{
"^":"TR;",
cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
$isEH:true},
fTP:{
"^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
ppY:{
"^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
NP:{
"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
FC:[function(a){var z=J.Vm(this.gH())
J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
jt:{
"^":"H2;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)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
z=J.Hf(X.TR.prototype.gH.call(this))
J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$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();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+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()},"call$1","gqf",2,0,157,21,[]],
static:{kv:[function(a){var z,y,x
z=J.RE(a)
if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
call$1:[function(a){var z,y
z=this.a
y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)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},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
$isEH:true},
jz:{
"^":"Tp:112;b",
call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
$isEH:true},
SA:{
"^":"H2;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
@@ -23347,14 +23585,14 @@
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)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,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},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
$isEH:true},
nv:{
"^":"Tp:112;",
@@ -23367,8 +23605,7 @@
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()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+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
@@ -23382,7 +23619,7 @@
x.Og(z,"checked",c,d)
x.Ca=M.IP(z).yI(x.gqf())
z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
K6:{
"^":"a;Cd>,wd>,N2<,Te<"},
TU:{
@@ -23392,7 +23629,7 @@
z=$.pl()
y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
Ih:[function(a,b){var z
if(this.mD==null)return
z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
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,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
$isTU:true},
yp:{
"^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
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()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+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())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
DT:{
"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+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
@@ -23462,7 +23693,7 @@
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)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
Ih:[function(a,b){var z
switch(b){case"bind":z=this.kr
if(z==null)return
@@ -23495,32 +23726,30 @@
P.rb(z.gjM())}},"call$0","geB",0,0,null],
a5:[function(a,b,c){var z,y,x,w,v,u,t
z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(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("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+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},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
gk8:function(){return this.lr},
gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+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.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
gjb:function(a){var z
this.Sy()
z=this.jH
@@ -23529,43 +23758,38 @@
if(this.mj===!0)return!1
M.oR()
this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+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(new P.AT("instanceRef should not be supplied for attribute templates."))
v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
$isDT:true,
static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+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.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
z=J.VN(a)
if(W.Pv(z.defaultView)==null)return z
y=$.LQ().t(0,z)
if(y==null){y=z.implementation.createHTMLDocument("")
for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],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)
@@ -23580,38 +23804,37 @@
v.removeAttribute(w)
y.setAttribute(w,u)
break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
z=J.nX(a)
if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
z=new M.OB()
y=J.MK(a,$.cz())
if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],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)},"call$0","Lv",0,0,null]}},
OB:{
"^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
$isEH:true},
Uf:{
"^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"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())},
r6:function(a,b){return this.gP(this).call$1(b)},
sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
return L.ao(this.lr,this.ay,null)},
cO:[function(a){var z=this.ud
if(z==null)return
@@ -23620,7 +23843,7 @@
this.ud=null},"call$0","gJK",0,0,null],
$isTR:true},
NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
call$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
@@ -23632,7 +23855,7 @@
z.a=w
z=w}else z=x
z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
HS:{
"^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
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])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[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])
@@ -23662,7 +23885,7 @@
if(t>=z.length)return H.e(z,t)
u=z[t]
u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
Yn:function(a){this.bX=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",
@@ -23687,11 +23910,11 @@
Az:[function(a){var z,y,x,w
z=this.xG
this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+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&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+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:[]
@@ -23709,7 +23932,7 @@
if(z)return x
w=M.Ky(x).gkr()
if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
lP:[function(a,b,c,d){var z,y,x,w,v,u
z=J.Wx(a)
y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
v=J.TZ(this.e9.N1)
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)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
MC:[function(a){var z,y,x,w,v,u,t,s
z=[]
z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
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)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
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=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+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(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+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(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+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,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),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))},"call$1","gZX",2,0,632,251,[]],
+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))},"call$1","gZX",2,0,650,254,[]],
uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
Gb:[function(){var z=this.IY
if(z==null)return
z.ed()
@@ -23783,20 +24004,20 @@
this.pq=!0},"call$0","gJK",0,0,null]},
VU:{
"^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
$isEH:true},
Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
call$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]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
$isEH:true},
R7:{
"^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
$isEH:true},
Ya:{
"^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
x=new M.ic(y,c,null,null,"text",x)
x.Og(y,"text",c,d)
z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
ic:{
"^":"TR;qP,ZY,xS,PB,eS,ay",
EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
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()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+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())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
"^":"",
ve:{
"^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
this.qP=null
this.ZY=null},"call$0","gJK",0,0,null],
Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+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.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
VD:{
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
$isEH:true}}],])
I.$finishClasses($$,$,null)
$$=null
@@ -24001,9 +24220,9 @@
P.Ys.$isej=true
P.Ys.$isa=true
X.TR.$isa=true
-F.d3.$isa=true
P.MO.$isMO=true
P.MO.$isa=true
+F.d3.$isa=true
W.ea.$isea=true
W.ea.$isa=true
P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
D.bv.$isaf=true
D.bv.$isa=true
D.c2.$isa=true
-D.Vi.$isVi=true
D.Vi.$isa=true
D.Q4.$isa=true
D.N8.$isa=true
W.zU.$isD0=true
W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
W.tV.$iscv=true
W.tV.$isKV=true
W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
H.Uz.$isej=true
H.Uz.$isej=true
H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
P.dl.$isdl=true
P.dl.$isa=true
V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
J.AA=function(a){return J.RE(a).GB(a)}
J.AB=function(a){return J.RE(a).gkU(a)}
J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
J.EC=function(a){return J.RE(a).giC(a)}
J.EY=function(a,b){return J.RE(a).od(a,b)}
J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
J.F6=function(a,b){return J.RE(a).stD(a,b)}
J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
J.GL=function(a){return J.RE(a).gfN(a)}
J.GP=function(a){return J.w1(a).gA(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.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
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.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+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.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.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
J.Mz=function(a){return J.rY(a).hc(a)}
J.N5=function(a,b){return J.RE(a).RP(a,b)}
J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
J.Ng=function(a){return J.RE(a).gxX(a)}
+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.OE=function(a,b){return J.RE(a).sfg(a,b)}
J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
J.QC=function(a){return J.w1(a).wg(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.QQ=function(a,b){return J.RE(a).sRu(a,b)}
J.Qr=function(a,b){return J.RE(a).skc(a,b)}
J.RF=function(a,b){return J.RE(a).WO(a,b)}
J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
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.Vm=function(a){return J.RE(a).gP(a)}
J.Vq=function(a){return J.RE(a).xo(a)}
J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
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.YP=function(a){return J.RE(a).gQ7(a)}
J.YV=function(a){return J.RE(a).goE(a)}
J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
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.c1=function(a,b){return J.Wx(a).O(a,b)}
J.c9=function(a,b){return J.RE(a).sa4(a,b)}
J.cG=function(a){return J.RE(a).Ki(a)}
J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
J.f5=function(a){return J.RE(a).gI(a)}
J.fH=function(a,b){return J.RE(a).stT(a,b)}
J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
J.i4=function(a,b){return J.w1(a).Zv(a,b)}
J.iG=function(a,b){return J.RE(a).szZ(a,b)}
J.iZ=function(a){return J.RE(a).gzZ(a)}
J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
J.jf=function(a,b){return J.x(a).T(a,b)}
J.kE=function(a,b){return J.U6(a).tg(a,b)}
J.kH=function(a,b){return J.w1(a).aN(a,b)}
J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
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.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
J.oE=function(a,b){return J.Qc(a).iM(a,b)}
J.og=function(a,b){return J.RE(a).sIt(a,b)}
J.on=function(a){return J.RE(a).gtT(a)}
J.oq=function(a,b){return J.RE(a).si2(a,b)}
J.pO=function(a){return J.U6(a).gor(a)}
J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
J.pe=function(a,b){return J.RE(a).pr(a,b)}
J.q8=function(a){return J.U6(a).gB(a)}
J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
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.tH=function(a,b){return J.w1(a).KI(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)}
@@ -24308,8 +24543,10 @@
return J.Wx(a).C(a,b)}
J.uH=function(a,b){return J.rY(a).Fr(a,b)}
J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
J.v1=function(a){return J.x(a).giO(a)}
J.vF=function(a){return J.RE(a).gbP(a)}
+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.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
J.xR=function(a){return J.RE(a).ghf(a)}
J.xW=function(a){return J.RE(a).e6(a)}
J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
J.yO=function(a,b){return J.RE(a).stN(a,b)}
J.yj=function(a){return J.RE(a).gG1(a)}
J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
C.J0=B.G6.prototype
C.KZ=new H.hJ()
C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
C.Fm=new J.kn()
C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
C.x0=new J.Jh()
C.oD=new J.P()
C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
C.IU=new P.kF()
C.Us=new A.yL()
C.Nw=new K.vly()
C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
C.xE=A.iL.prototype
C.YZ=Q.Tg.prototype
C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
C.l8=new D.WAE("Dart")
C.nj=new D.WAE("Native")
C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
C.IK=O.CN.prototype
C.YD=F.Be.prototype
C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
C.nh=new A.V3("nav-menu-item")
C.KI=new A.V3("library-nav-menu")
C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
C.nu=new A.V3("function-view")
C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
C.U8=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.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
C.jy=new A.V3("breakpoint-list")
C.VW=new A.V3("instance-ref")
C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
C.zaS=new A.V3("isolate-nav-menu")
C.t9=new A.V3("class-nav-menu")
C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
C.JD=new A.V3("service-ref")
C.Ug=new A.V3("nav-bar")
C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
C.ny=new P.a6(0)
C.OD=F.E9.prototype
C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.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.kQ])
+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.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
C.MC=D.m8.prototype
C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
C.Vc=K.jY.prototype
C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
C.b9=L.u7.prototype
C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
C.Nm=J.Q.prototype
C.ON=J.GW.prototype
C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
}
C.xr=new P.by(null,null)
C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
C.Yt=Z.vj.prototype
C.VZ=new N.qV("FINER",400)
C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+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.MEG=I.makeConstantList(["enumerate"])
C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
C.cJ=U.fI.prototype
C.ZO=U.ob.prototype
C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
C.dX=K.nm.prototype
C.bg=X.Vu.prototype
C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
C.wh=new H.GD("app")
C.S4=new H.GD("busy")
C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
C.XA=new H.GD("cls")
C.b1=new H.GD("code")
C.h1=new H.GD("currentHash")
C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
C.Jw=new H.GD("displayValue")
C.nN=new H.GD("dynamic")
C.tP=new H.GD("entry")
C.YU=new H.GD("error")
C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
C.CX=new H.GD("fileAndLine")
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.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
C.rE=new H.GD("frame")
C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
C.YH=new H.GD("hitsStyle")
C.bA=new H.GD("hoverText")
C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
C.eh=new H.GD("lineMode")
C.dB=new H.GD("link")
C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
C.UX=new H.GD("msg")
C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
C.IO=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.ap=new H.GD("oldHeapUsed")
C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
C.kY=new H.GD("ref")
C.Dj=new H.GD("refreshTime")
C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
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.kA=new H.GD("sampleRate")
C.fX=new H.GD("script")
C.eC=new H.GD("[]=")
C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
C.QK=new H.GD("totalSamplesInProfile")
C.kw=new H.GD("trace")
C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
C.Fh=new H.GD("url")
C.ls=new H.GD("value")
C.eR=new H.GD("valueType")
C.KS=new H.GD("vmName")
C.v6=new H.GD("void")
C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
C.io=new H.Lm(C.Gsc,"E",0)
C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
C.vB=J.is.prototype
C.xM=new P.z0(!1)
C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
$.Bh=0
$.uP=!0
$.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
}
}())})
I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$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)})
@@ -24899,7 +25164,7 @@
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","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),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")})
@@ -24910,7 +25175,7 @@
I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$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])})
@@ -24918,7 +25183,7 @@
I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","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:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","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.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"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","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","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","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",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.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","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","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:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","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.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"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","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","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","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",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.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
I = I.$finishIsolateConstructor(I)
$=new I()
function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
$desc=$collectedClasses.Ny
if($desc instanceof Array)$desc=$desc[1]
Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
function Zv(){}Zv.builtin$cls="Zv"
if(!"name" in Zv)Zv.name="Zv"
$desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
$desc=$collectedClasses.Fs
if($desc instanceof Array)$desc=$desc[1]
Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
Fs.prototype.goc=function(receiver){return receiver.name}
Fs.prototype.soc=function(receiver,v){return receiver.name=v}
Fs.prototype.gLA=function(receiver){return receiver.src}
Fs.prototype.gt5=function(receiver){return receiver.type}
Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
function Ty(){}Ty.builtin$cls="Ty"
if(!"name" in Ty)Ty.name="Ty"
$desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
$desc=$collectedClasses.Uq
if($desc instanceof Array)$desc=$desc[1]
Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
function Rt(){}Rt.builtin$cls="Rt"
if(!"name" in Rt)Rt.name="Rt"
$desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
if($desc instanceof Array)$desc=$desc[1]
zU.prototype=$desc
zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
function wa(){}wa.builtin$cls="wa"
if(!"name" in wa)wa.name="wa"
$desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
$desc=$collectedClasses.tX
if($desc instanceof Array)$desc=$desc[1]
tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
tX.prototype.goc=function(receiver){return receiver.name}
tX.prototype.soc=function(receiver,v){return receiver.name=v}
tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
function Sg(){}Sg.builtin$cls="Sg"
if(!"name" in Sg)Sg.name="Sg"
$desc=$collectedClasses.Sg
if($desc instanceof Array)$desc=$desc[1]
Sg.prototype=$desc
Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
function pA(){}pA.builtin$cls="pA"
if(!"name" in pA)pA.name="pA"
$desc=$collectedClasses.pA
if($desc instanceof Array)$desc=$desc[1]
pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
function Mi(){}Mi.builtin$cls="Mi"
if(!"name" in Mi)Mi.name="Mi"
$desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
Mi.prototype.gTq=function(receiver){return receiver.checked}
Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
Mi.prototype.go6=function(receiver){return receiver.list}
Mi.prototype.goc=function(receiver){return receiver.name}
Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
Mi.prototype.st5=function(receiver,v){return receiver.type=v}
Mi.prototype.gP=function(receiver){return receiver.value}
Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
function Gt(){}Gt.builtin$cls="Gt"
if(!"name" in Gt)Gt.name="Gt"
$desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
In.prototype.goc=function(receiver){return receiver.name}
In.prototype.soc=function(receiver,v){return receiver.name=v}
In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
function eP(){}eP.builtin$cls="eP"
if(!"name" in eP)eP.name="eP"
$desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
$desc=$collectedClasses.bn
if($desc instanceof Array)$desc=$desc[1]
bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
function Ve(){}Ve.builtin$cls="Ve"
if(!"name" in Ve)Ve.name="Ve"
$desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
G7.prototype=$desc
G7.prototype.gRn=function(receiver){return receiver.data}
G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
G7.prototype.goc=function(receiver){return receiver.name}
G7.prototype.soc=function(receiver,v){return receiver.name=v}
G7.prototype.gt5=function(receiver){return receiver.type}
G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
function l9(){}l9.builtin$cls="l9"
if(!"name" in l9)l9.name="l9"
$desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
Xp.prototype.gt5=function(receiver){return receiver.type}
Xp.prototype.gP=function(receiver){return receiver.value}
Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
function mX(){}mX.builtin$cls="mX"
if(!"name" in mX)mX.name="mX"
$desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
HD.prototype.soc=function(receiver,v){return receiver.name=v}
HD.prototype.gP=function(receiver){return receiver.value}
HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
function jg(){}jg.builtin$cls="jg"
if(!"name" in jg)jg.name="jg"
$desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
jg.prototype=$desc
jg.prototype.gtT=function(receiver){return receiver.code}
jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
function nC(){}nC.builtin$cls="nC"
if(!"name" in nC)nC.name="nC"
$desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
KR.prototype=$desc
KR.prototype.gP=function(receiver){return receiver.value}
KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
function fs(){}fs.builtin$cls="fs"
if(!"name" in fs)fs.name="fs"
$desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
lp.prototype.gt5=function(receiver){return receiver.type}
lp.prototype.gP=function(receiver){return receiver.value}
lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
function I0(){}I0.builtin$cls="I0"
if(!"name" in I0)I0.name="I0"
$desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
if($desc instanceof Array)$desc=$desc[1]
G5.prototype=$desc
G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
function Lx(){}Lx.builtin$cls="Lx"
if(!"name" in Lx)Lx.name="Lx"
$desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
AE.prototype.gt5=function(receiver){return receiver.type}
AE.prototype.gP=function(receiver){return receiver.value}
AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
function FH(){}FH.builtin$cls="FH"
if(!"name" in FH)FH.name="FH"
$desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
RH.prototype.gph=function(receiver){return receiver.label}
RH.prototype.sph=function(receiver,v){return receiver.label=v}
RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
function OJ(){}OJ.builtin$cls="OJ"
if(!"name" in OJ)OJ.name="OJ"
$desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
$desc=$collectedClasses.dp
if($desc instanceof Array)$desc=$desc[1]
dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
function u9(){}u9.builtin$cls="u9"
if(!"name" in u9)u9.name="u9"
$desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
u9.prototype=$desc
u9.prototype.goc=function(receiver){return receiver.name}
u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
function Bn(){}Bn.builtin$cls="Bn"
if(!"name" in Bn)Bn.name="Bn"
$desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
$desc=$collectedClasses.tZ
if($desc instanceof Array)$desc=$desc[1]
tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
function AK(){}AK.builtin$cls="AK"
if(!"name" in AK)AK.name="AK"
$desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
$desc=$collectedClasses.ty
if($desc instanceof Array)$desc=$desc[1]
ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
function F2(){}F2.builtin$cls="F2"
if(!"name" in F2)F2.name="F2"
$desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
$desc=$collectedClasses.c5
if($desc instanceof Array)$desc=$desc[1]
c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
function Q7(){}Q7.builtin$cls="Q7"
if(!"name" in Q7)Q7.name="Q7"
$desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
$desc=$collectedClasses.y5
if($desc instanceof Array)$desc=$desc[1]
y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
function jQ(){}jQ.builtin$cls="jQ"
if(!"name" in jQ)jQ.name="jQ"
$desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
$desc=$collectedClasses.ui
if($desc instanceof Array)$desc=$desc[1]
ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
function DQ(){}DQ.builtin$cls="DQ"
if(!"name" in DQ)DQ.name="DQ"
$desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
$desc=$collectedClasses.eG
if($desc instanceof Array)$desc=$desc[1]
eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
function lv(){}lv.builtin$cls="lv"
if(!"name" in lv)lv.name="lv"
$desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
lv.prototype=$desc
lv.prototype.gt5=function(receiver){return receiver.type}
lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
function pf(){}pf.builtin$cls="pf"
if(!"name" in pf)pf.name="pf"
$desc=$collectedClasses.pf
if($desc instanceof Array)$desc=$desc[1]
pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
function NV(){}NV.builtin$cls="NV"
if(!"name" in NV)NV.name="NV"
$desc=$collectedClasses.NV
if($desc instanceof Array)$desc=$desc[1]
NV.prototype=$desc
NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
function W1(){}W1.builtin$cls="W1"
if(!"name" in W1)W1.name="W1"
$desc=$collectedClasses.W1
if($desc instanceof Array)$desc=$desc[1]
W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
function mCz(){}mCz.builtin$cls="mCz"
if(!"name" in mCz)mCz.name="mCz"
$desc=$collectedClasses.mCz
if($desc instanceof Array)$desc=$desc[1]
mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
function kK(){}kK.builtin$cls="kK"
if(!"name" in kK)kK.name="kK"
$desc=$collectedClasses.kK
if($desc instanceof Array)$desc=$desc[1]
kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
function n5(){}n5.builtin$cls="n5"
if(!"name" in n5)n5.name="n5"
$desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
$desc=$collectedClasses.bb
if($desc instanceof Array)$desc=$desc[1]
bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
function NdT(){}NdT.builtin$cls="NdT"
if(!"name" in NdT)NdT.name="NdT"
$desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
$desc=$collectedClasses.Ob
if($desc instanceof Array)$desc=$desc[1]
Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
function me(){}me.builtin$cls="me"
if(!"name" in me)me.name="me"
$desc=$collectedClasses.me
if($desc instanceof Array)$desc=$desc[1]
me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
me.prototype.gmH=function(receiver){return receiver.href}
function oB(){}oB.builtin$cls="oB"
if(!"name" in oB)oB.name="oB"
$desc=$collectedClasses.oB
if($desc instanceof Array)$desc=$desc[1]
oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
function NY(){}NY.builtin$cls="NY"
if(!"name" in NY)NY.name="NY"
$desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
if($desc instanceof Array)$desc=$desc[1]
EI.prototype=$desc
EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
function MI(){}MI.builtin$cls="MI"
if(!"name" in MI)MI.name="MI"
$desc=$collectedClasses.MI
if($desc instanceof Array)$desc=$desc[1]
MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
function rg(){}rg.builtin$cls="rg"
if(!"name" in rg)rg.name="rg"
$desc=$collectedClasses.rg
if($desc instanceof Array)$desc=$desc[1]
rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
function um(){}um.builtin$cls="um"
if(!"name" in um)um.name="um"
$desc=$collectedClasses.um
if($desc instanceof Array)$desc=$desc[1]
um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
function eW(){}eW.builtin$cls="eW"
if(!"name" in eW)eW.name="eW"
$desc=$collectedClasses.eW
if($desc instanceof Array)$desc=$desc[1]
eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
function kL(){}kL.builtin$cls="kL"
if(!"name" in kL)kL.name="kL"
$desc=$collectedClasses.kL
if($desc instanceof Array)$desc=$desc[1]
kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
function Fu(){}Fu.builtin$cls="Fu"
if(!"name" in Fu)Fu.name="Fu"
$desc=$collectedClasses.Fu
if($desc instanceof Array)$desc=$desc[1]
Fu.prototype=$desc
Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
function QN(){}QN.builtin$cls="QN"
if(!"name" in QN)QN.name="QN"
$desc=$collectedClasses.QN
if($desc instanceof Array)$desc=$desc[1]
QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
QN.prototype.gmH=function(receiver){return receiver.href}
function N9(){}N9.builtin$cls="N9"
if(!"name" in N9)N9.name="N9"
$desc=$collectedClasses.N9
if($desc instanceof Array)$desc=$desc[1]
N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
function BA(){}BA.builtin$cls="BA"
if(!"name" in BA)BA.name="BA"
$desc=$collectedClasses.BA
if($desc instanceof Array)$desc=$desc[1]
BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
function zp(){}zp.builtin$cls="zp"
if(!"name" in zp)zp.name="zp"
$desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
$desc=$collectedClasses.br
if($desc instanceof Array)$desc=$desc[1]
br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
br.prototype.gmH=function(receiver){return receiver.href}
function PIw(){}PIw.builtin$cls="PIw"
if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
$desc=$collectedClasses.Jq
if($desc instanceof Array)$desc=$desc[1]
Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
function kN(){}kN.builtin$cls="kN"
if(!"name" in kN)kN.name="kN"
$desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
$desc=$collectedClasses.Gr
if($desc instanceof Array)$desc=$desc[1]
Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
Gr.prototype.gmH=function(receiver){return receiver.href}
function XE(){}XE.builtin$cls="XE"
if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
$desc=$collectedClasses.NJ
if($desc instanceof Array)$desc=$desc[1]
NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
function j24(){}j24.builtin$cls="j24"
if(!"name" in j24)j24.name="j24"
$desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
$desc=$collectedClasses.rQ
if($desc instanceof Array)$desc=$desc[1]
rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
function LR(){}LR.builtin$cls="LR"
if(!"name" in LR)LR.name="LR"
$desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
$desc=$collectedClasses.hy
if($desc instanceof Array)$desc=$desc[1]
hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
function mq(){}mq.builtin$cls="mq"
if(!"name" in mq)mq.name="mq"
$desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
$desc=$collectedClasses.CG
if($desc instanceof Array)$desc=$desc[1]
CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
function y0(){}y0.builtin$cls="y0"
if(!"name" in y0)y0.name="y0"
$desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
$desc=$collectedClasses.Eo
if($desc instanceof Array)$desc=$desc[1]
Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
function Dn(){}Dn.builtin$cls="Dn"
if(!"name" in Dn)Dn.name="Dn"
$desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
$desc=$collectedClasses.pyk
if($desc instanceof Array)$desc=$desc[1]
pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
pyk.prototype.gmH=function(receiver){return receiver.href}
function ZD(){}ZD.builtin$cls="ZD"
if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
$desc=$collectedClasses.Ja
if($desc instanceof Array)$desc=$desc[1]
Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
function hW(){}hW.builtin$cls="hW"
if(!"name" in hW)hW.name="hW"
$desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
$desc=$collectedClasses.yR
if($desc instanceof Array)$desc=$desc[1]
yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
function xJ(){}xJ.builtin$cls="xJ"
if(!"name" in xJ)xJ.name="xJ"
$desc=$collectedClasses.xJ
if($desc instanceof Array)$desc=$desc[1]
xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
function Et(){}Et.builtin$cls="Et"
if(!"name" in Et)Et.name="Et"
$desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
$desc=$collectedClasses.Zn
if($desc instanceof Array)$desc=$desc[1]
Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
function tG(){}tG.builtin$cls="tG"
if(!"name" in tG)tG.name="tG"
$desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
$desc=$collectedClasses.IJ
if($desc instanceof Array)$desc=$desc[1]
IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
function N2(){}N2.builtin$cls="N2"
if(!"name" in N2)N2.name="N2"
$desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
$desc=$collectedClasses.GW
if($desc instanceof Array)$desc=$desc[1]
GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
function VP(){}VP.builtin$cls="VP"
if(!"name" in VP)VP.name="VP"
$desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
f0.prototype.gi2=function(receiver){return this.i2}
f0.prototype.si2=function(receiver,v){return this.i2=v}
f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
this.Gx=Gx
this.fW=fW
this.En=En
this.EE=EE
-this.Qy=Qy
+this.um=um
this.PX=PX
this.RW=RW
this.C9=C9
@@ -26901,11 +27326,11 @@
$desc=$collectedClasses.Vg
if($desc instanceof Array)$desc=$desc[1]
Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
function Z6(JE,Jz){this.JE=JE
this.Jz=Jz}Z6.builtin$cls="Z6"
if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
if($desc instanceof Array)$desc=$desc[1]
ku.prototype=$desc
ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
function xQ(){}xQ.builtin$cls="xQ"
if(!"name" in xQ)xQ.name="xQ"
$desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
v.prototype.gnw=function(){return this.nw}
v.prototype.gjm=function(){return this.jm}
v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
if(!"name" in Pe)Pe.name="Pe"
$desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
if($desc instanceof Array)$desc=$desc[1]
Eq.prototype=$desc
Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
function tD(dw,Iq,is,p6){this.dw=dw
this.Iq=Iq
this.is=is
@@ -27405,8 +27830,7 @@
Y2.prototype.gwd.$reflectable=1
Y2.prototype.goH=function(){return this.oH}
Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
this.AP=AP
this.Lk=Lk}XN.builtin$cls="XN"
if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
G6.prototype.gBW.$reflectable=1
G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -27459,7 +27883,7 @@
$desc=$collectedClasses.Tg
if($desc instanceof Array)$desc=$desc[1]
Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -27476,15 +27900,15 @@
$desc=$collectedClasses.Jc
if($desc instanceof Array)$desc=$desc[1]
Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -27524,11 +27948,11 @@
Be.prototype.gXx.$reflectable=1
Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
this.HX=HX
this.Uy=Uy
@@ -27560,11 +27984,11 @@
E0.prototype.gUy.$reflectable=1
E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
this.Hu=Hu
this.nx=nx
@@ -27677,21 +28101,21 @@
$desc=$collectedClasses.rR
if($desc instanceof Array)$desc=$desc[1]
rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
function SU7(){}SU7.builtin$cls="SU7"
if(!"name" in SU7)SU7.name="SU7"
$desc=$collectedClasses.SU7
if($desc instanceof Array)$desc=$desc[1]
SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
function w2Y(){}w2Y.builtin$cls="w2Y"
if(!"name" in w2Y)w2Y.name="w2Y"
$desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
$desc=$collectedClasses.t0
if($desc instanceof Array)$desc=$desc[1]
t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
this.V5=V5
this.Fo=Fo
this.n6=n6
this.jE=jE
this.Ay=Ay
this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
function Sz(Ax,xq){this.Ax=Ax
this.xq=xq}Sz.builtin$cls="Sz"
if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
$desc=$collectedClasses.b8
if($desc instanceof Array)$desc=$desc[1]
b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
function Ia(){}Ia.builtin$cls="Ia"
if(!"name" in Ia)Ia.name="Ia"
$desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
$desc=$collectedClasses.aY
if($desc instanceof Array)$desc=$desc[1]
aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
this.cP=cP
this.Jl=Jl
this.pU=pU
this.Fh=Fh
this.Xp=Xp
-this.aj=aj
+this.fb=fb
this.rb=rb
this.Zq=Zq
this.rF=rF
@@ -28559,16 +28989,16 @@
zG.prototype.gpU=function(){return this.pU}
zG.prototype.gFh=function(){return this.Fh}
zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
zG.prototype.grb=function(){return this.rb}
zG.prototype.gZq=function(){return this.Zq}
zG.prototype.gJS=function(receiver){return this.JS}
zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
function dl(){}dl.builtin$cls="dl"
if(!"name" in dl)dl.name="dl"
$desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
$desc=$collectedClasses.Ha
if($desc instanceof Array)$desc=$desc[1]
Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
function R8(){}R8.builtin$cls="R8"
if(!"name" in R8)R8.name="R8"
$desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
$desc=$collectedClasses.by
if($desc instanceof Array)$desc=$desc[1]
by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
if(!"name" in Cf)Cf.name="Cf"
$desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
$desc=$collectedClasses.z0
if($desc instanceof Array)$desc=$desc[1]
z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
function Rw(WF,ZP,EN){this.WF=WF
this.ZP=ZP
this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
$desc=$collectedClasses.I4
if($desc instanceof Array)$desc=$desc[1]
I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
function RO(uv,Ph,Sg){this.uv=uv
this.Ph=Ph
this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
$desc=$collectedClasses.RX
if($desc instanceof Array)$desc=$desc[1]
RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
if(!"name" in bO)bO.name="bO"
$desc=$collectedClasses.bO
if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
$desc=$collectedClasses.QS
if($desc instanceof Array)$desc=$desc[1]
QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
function ej(){}ej.builtin$cls="ej"
if(!"name" in ej)ej.name="ej"
$desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
$desc=$collectedClasses.Nx
if($desc instanceof Array)$desc=$desc[1]
Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
function Dg(){}Dg.builtin$cls="Dg"
if(!"name" in Dg)Dg.name="Dg"
$desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
E9.prototype.gPy.$reflectable=1
E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
this.Ab=Ab
this.Ln=Ln
@@ -29904,11 +30369,11 @@
rm.prototype.gy4.$reflectable=1
rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
function YW(a){this.a=a}YW.builtin$cls="YW"
if(!"name" in YW)YW.name="YW"
$desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
Gk.prototype.gvt.$reflectable=1
Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
this.Pe=Pe
this.AP=AP
this.Lk=Lk
@@ -29971,11 +30441,28 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
this.AP=AP
this.Lk=Lk
@@ -29997,11 +30484,81 @@
mk.prototype.gZ8.$reflectable=1
mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
this.J0=J0
this.Oc=Oc
@@ -30068,11 +30625,11 @@
jY.prototype.gX3.$reflectable=1
jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
function nx(a){this.a=a}nx.builtin$cls="nx"
if(!"name" in nx)nx.name="nx"
$desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
$desc=$collectedClasses.xL
if($desc instanceof Array)$desc=$desc[1]
xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
function As(){}As.builtin$cls="As"
if(!"name" in As)As.name="As"
$desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
$desc=$collectedClasses.GS
if($desc instanceof Array)$desc=$desc[1]
GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
this.Lk=Lk
@@ -30200,11 +30767,11 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
function Js(a){this.a=a}Js.builtin$cls="Js"
if(!"name" in Js)Js.name="Js"
$desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
hx.prototype.gXh.$reflectable=1
hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
this.AP=AP
this.Lk=Lk
@@ -30257,11 +30824,30 @@
u7.prototype.gtf.$reflectable=1
u7.prototype.stf=function(receiver,v){return receiver.tf=v}
u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
this.tT=tT
this.eT=eT
@@ -30278,17 +30864,15 @@
qm.prototype.gB1=function(receiver){return this.B1}
qm.prototype.gtT=function(receiver){return this.tT}
qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
this.FT=FT
this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
this.qO=qO
this.Hm=Hm
this.AP=AP
@@ -30302,48 +30886,65 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
function SV(a){this.a=a}SV.builtin$cls="SV"
if(!"name" in SV)SV.name="SV"
$desc=$collectedClasses.SV
if($desc instanceof Array)$desc=$desc[1]
SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -30355,20 +30956,63 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
this.kf=kf
this.AP=AP
@@ -30395,11 +31039,11 @@
vj.prototype.gkf.$reflectable=1
vj.prototype.skf=function(receiver,v){return receiver.kf=v}
vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -30439,11 +31083,11 @@
KL.prototype.gN7.$reflectable=1
KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
this.eT=eT
this.n2=n2
@@ -30497,12 +31141,12 @@
$desc=$collectedClasses.Lb
if($desc instanceof Array)$desc=$desc[1]
Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
function tzK(){}tzK.builtin$cls="tzK"
if(!"name" in tzK)tzK.name="tzK"
$desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
if($desc instanceof Array)$desc=$desc[1]
jA.prototype=$desc
jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
function oBi(){}oBi.builtin$cls="oBi"
if(!"name" in oBi)oBi.name="oBi"
$desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
aQ.prototype.gJo.$reflectable=1
aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
this.V4=V4
this.AP=AP
@@ -30600,11 +31244,11 @@
Qa.prototype.gV4.$reflectable=1
Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
this.SB=SB
this.Hq=Hq
@@ -30636,11 +31280,11 @@
Ww.prototype.gHq.$reflectable=1
Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
this.AP=AP
this.Lk=Lk
@@ -30662,11 +31306,11 @@
tz.prototype.gJo.$reflectable=1
tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
this.iy=iy
this.AP=AP
@@ -30693,11 +31337,11 @@
fl.prototype.giy.$reflectable=1
fl.prototype.siy=function(receiver,v){return receiver.iy=v}
fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
this.Jo=Jo
this.AP=AP
@@ -30724,11 +31368,11 @@
Zt.prototype.gJo.$reflectable=1
Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
this.Jo=Jo
this.AP=AP
@@ -30755,13 +31399,13 @@
iL.prototype.gJo.$reflectable=1
iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -30782,15 +31426,15 @@
lI.prototype.gk5.$reflectable=1
lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
this.Lk=Lk
this.dZ=dZ
@@ -30891,11 +31535,11 @@
DA.prototype=$desc
DA.prototype.gWA=function(receiver){return this.WA}
DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
function vly(){}vly.builtin$cls="vly"
if(!"name" in vly)vly.name="vly"
$desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
$desc=$collectedClasses.ir
if($desc instanceof Array)$desc=$desc[1]
ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
zs.prototype.gKM=function(receiver){return receiver.X0}
zs.prototype.gKM.$reflectable=1
function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
$desc=$collectedClasses.pM
if($desc instanceof Array)$desc=$desc[1]
pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
function W6(){}W6.builtin$cls="W6"
if(!"name" in W6)W6.name="W6"
$desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
$desc=$collectedClasses.Ed
if($desc instanceof Array)$desc=$desc[1]
Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
if(!"name" in G1)G1.name="G1"
$desc=$collectedClasses.G1
if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
iT.prototype=$desc
iT.prototype.ghP=function(){return this.hP}
iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
function ey(d){this.d=d}ey.builtin$cls="ey"
if(!"name" in ey)ey.name="ey"
$desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
$desc=$collectedClasses.J1
if($desc instanceof Array)$desc=$desc[1]
J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
this.bm=bm}fk.builtin$cls="fk"
if(!"name" in fk)fk.name="fk"
$desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
JG.prototype.gkW.$reflectable=1
JG.prototype.skW=function(receiver,v){return receiver.kW=v}
JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
this.AP=AP
this.Lk=Lk
@@ -31906,11 +32550,11 @@
knI.prototype.gzw.$reflectable=1
knI.prototype.szw=function(receiver,v){return receiver.zw=v}
knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
this.HJ=HJ
this.AP=AP
@@ -31937,25 +32581,25 @@
fI.prototype.gHJ.$reflectable=1
fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
function G8(F1){this.F1=F1}G8.builtin$cls="G8"
if(!"name" in G8)G8.name="G8"
$desc=$collectedClasses.G8
if($desc instanceof Array)$desc=$desc[1]
G8.prototype=$desc
G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
if(!"name" in fJ)fJ.name="fJ"
$desc=$collectedClasses.fJ
if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
$desc=$collectedClasses.q1
if($desc instanceof Array)$desc=$desc[1]
q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
if(!"name" in jx)jx.name="jx"
$desc=$collectedClasses.jx
if($desc instanceof Array)$desc=$desc[1]
jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
function Cn(){}Cn.builtin$cls="Cn"
if(!"name" in Cn)Cn.name="Cn"
$desc=$collectedClasses.Cn
if($desc instanceof Array)$desc=$desc[1]
Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
if(!"name" in du)du.name="du"
$desc=$collectedClasses.du
if($desc instanceof Array)$desc=$desc[1]
du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
if(!"name" in xc)xc.name="xc"
$desc=$collectedClasses.xc
if($desc instanceof Array)$desc=$desc[1]
xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
this.fq=fq
this.ne=ne
this.PH=PH
@@ -32006,7 +32674,12 @@
this.LE=LE
this.Cf=Cf
this.W1=W1
+this.p2=p2
+this.Hw=Hw
this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
this.AP=AP
this.Lk=Lk
this.Fm=Fm
@@ -32028,16 +32701,20 @@
bv.prototype.sGR=function(v){return this.f5=v}
bv.prototype.gLE=function(){return this.LE}
bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
function D3(){}D3.builtin$cls="D3"
if(!"name" in D3)D3.name="D3"
$desc=$collectedClasses.D3
if($desc instanceof Array)$desc=$desc[1]
D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
function Qq(a){this.a=a}Qq.builtin$cls="Qq"
if(!"name" in Qq)Qq.name="Qq"
$desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
$desc=$collectedClasses.JB
if($desc instanceof Array)$desc=$desc[1]
JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
function BH(a){this.a=a}BH.builtin$cls="BH"
if(!"name" in BH)BH.name="BH"
$desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
Vi.prototype=$desc
Vi.prototype.gtT=function(receiver){return this.tT}
Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
this.jv=jv
this.Du=Du
this.fF=fF
@@ -32208,6 +32896,7 @@
this.yP=yP
this.mM=mM
this.qH=qH
+this.Ni=Ni
this.MO=MO
this.oc=oc
this.zz=zz
@@ -32264,16 +32953,6 @@
$desc=$collectedClasses.fx
if($desc instanceof Array)$desc=$desc[1]
fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
function UZ(a,b,c){this.a=a
this.b=b
this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
$desc=$collectedClasses.UZ
if($desc instanceof Array)$desc=$desc[1]
UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
if(!"name" in XK)XK.name="XK"
$desc=$collectedClasses.XK
if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
$desc=$collectedClasses.dT
if($desc instanceof Array)$desc=$desc[1]
dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
this.yb=yb
this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
if(!"name" in ho)ho.name="ho"
$desc=$collectedClasses.ho
if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
ob.prototype.gmC.$reflectable=1
ob.prototype.smC=function(receiver,v){return receiver.mC=v}
ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -32379,11 +33035,47 @@
xI.prototype.gPe.$reflectable=1
xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
this.AP=AP
this.Lk=Lk
@@ -32405,11 +33097,11 @@
nm.prototype.gVa.$reflectable=1
nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
this.AP=AP
this.Lk=Lk
@@ -32431,11 +33123,11 @@
Vu.prototype.gB3.$reflectable=1
Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
function V2(N1,mD,Ck){this.N1=N1
this.mD=mD
this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
$desc=$collectedClasses.VD
if($desc instanceof Array)$desc=$desc[1]
VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 7edc4c9..c0f9dc6 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -170,10 +170,11 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
<nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+ <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
<content></content>
</nav-menu>
@@ -226,44 +227,12 @@
<polymer-element name="service-ref" extends="observatory-element">
</polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
</polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
- <template>
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <div class="panel panel-danger">
- <div class="panel-heading">{{ error.kind }}</div>
- <div class="panel-body">
- <p>{{ error.message }}</p>
- </div>
- </div>
- </div>
- </div>
- </template>
-
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
- <template if="{{ ref['final'] }}"> final </template>
- <template if="{{ ref['const'] }}"> const </template>
- <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
- var
- </template>
- <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
- <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
- </template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
<template>
<style>
.idle {
@@ -306,9 +275,17 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 1px 0 1px 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div>
@@ -332,6 +309,7 @@
<template if="{{ isClosure(ref.serviceType) }}">
<a href="{{ url }}">
+ <!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc']['user_name'] }}
</a>
</template>
@@ -339,28 +317,34 @@
<template if="{{ isInstance(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
<curly-block callback="{{ expander() }}">
- <table>
- <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
- <td class="member">{{ field['decl']['user_name'] }}</td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ field in ref['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ {{ field['decl']['user_name'] }}
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ isList(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
<curly-block callback="{{ expander() }}">
- <table>
- <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ element in ref['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
@@ -368,184 +352,7 @@
</template>
</polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
- <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
- <template>
- <nav-bar>
- <top-nav-menu></top-nav-menu>
- <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
- <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
- <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
- <nav-refresh callback="{{ refresh }}"></nav-refresh>
- </nav-bar>
-
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <div class="panel panel-warning">
- <div class="panel-heading">
- class <strong>{{ cls.name }}</strong>
- <template if="{{ cls['super']['type'] != 'Null' }}">
- extends
- <class-ref ref="{{ cls['super'] }}"></class-ref>
- </template>
- <p></p>
- <library-ref ref="{{ cls['library'] }}"></library-ref>
- </div>
- <div class="panel-body">
- <table class="table table-hover">
- <tbody>
- <tr>
- <td>Abstract</td><td>{{ cls['abstract'] }}</td>
- </tr>
- <tr>
- <td>Const</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Finalized</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Implemented</td><td>{{ cls['implemented'] }}</td>
- </tr>
- <tr>
- <td>Patch</td><td>{{ cls['patch'] }}</td>
- </tr>
- <tr>
- <td>VM Name</td><td>{{ cls['name'] }}</td>
- </tr>
- </tbody>
- </table>
- <template if="{{ cls['error'] == null }}">
- <blockquote><strong>Fields</strong></blockquote>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ field in cls['fields'] }}">
- <td><field-ref ref="{{ field }}"></field-ref></td>
- <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <blockquote><strong>Functions</strong></blockquote>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>User Name</th>
- <th>VM Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{ function in cls['functions'] }}">
- <td><function-ref ref="{{ function }}"></function-ref></td>
- <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
- </tr>
- </tbody>
- </table>
- </template>
- <template if="{{ cls['error'] != null }}">
- <error-view error_obj="{{ cls['error'] }}"></error-view>
- </template>
- </div>
- </div>
- </div>
- </div>
- </template>
-
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
- <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
- <template>
- <nav-bar>
- <top-nav-menu></top-nav-menu>
- <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
- <nav-refresh callback="{{ refresh }}"></nav-refresh>
- </nav-bar>
- <style>
- .content {
- padding-left: 10%;
- font: 400 14px 'Montserrat', sans-serif;
- }
- h1 {
- font: 400 18px 'Montserrat', sans-serif;
- }
- .member, .memberHeader {
- 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;
- }
- </style>
- <div class="content">
- <h1>Code for {{ code.name }}</h1>
- <table>
- <tbody><tr>
- <td class="memberHeader">kind</td>
- <td class="member">{{code.kind}}</td>
- </tr>
- <tr>
- <td class="memberHeader">function</td>
- <td class="member">
- <function-ref ref="{{code.function}}">
- </function-ref>
- </td>
- </tr>
- <tr>
- <td class="memberHeader">Inclusive</td>
- <td class="member">{{ code.formattedInclusiveTicks }}</td>
- </tr>
- <tr>
- <td class="memberHeader">Exclusive</td>
- <td class="member">{{ code.formattedExclusiveTicks }}</td>
- </tr>
- </tbody></table>
- </div>
- <hr>
- <div class="content">
- <template if="{{ code.hasDisassembly }}">
- <div class="row">
- <div class="col-md-2 memberHeader">Inclusive</div>
- <div class="col-md-2 memberHeader">Exclusive</div>
- <div class="col-md-2 memberHeader">Address</div>
- <div class="col-md-6 memberHeader">Disassembly</div>
- </div>
- </template>
- <template repeat="{{ instruction in code.instructions }}">
- <div class="row">
- <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
- <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
- <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
- <div class="col-md-6 monospace">{{ instruction.human }}</div>
- </div>
- </template>
- </div>
- </template>
-
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
- <template>
- <div class="well row">
- <a on-click="toggleDisplay" class="btn muted unselectable">
- Raw message... <i class="{{ iconClass }}"></i>
- </a>
- <div style="display: {{ displayValue }}" class="well">
- <content></content>
- </div>
- </div>
- </template>
-
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
<template>
<style>
.textbox {
@@ -626,7 +433,314 @@
</polymer-element>
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+ <template if="{{ ref['final'] }}"> final </template>
+ <template if="{{ ref['const'] }}"> const </template>
+ <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
+ var
+ </template>
+ <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+ <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+ </template>
+ <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
+ <template><!-- These comments are here to allow newlines.
+ --><template if="{{ qualified && !hasParent && hasClass }}"><!--
+ --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+ --><template if="{{ qualified && hasParent }}"><!--
+ --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+ </function-ref>.<!--
+ --></template><a href="{{ url }}">{{ name }}</a><!--
+ --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+ <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+ <template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+ <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+ <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+
+ <div class="content">
+ <h1>
+ <template if="{{ cls['abstract'] }}">
+ abstract
+ </template>
+ <template if="{{ cls['patch'] }}">
+ patch
+ </template>
+ class {{ cls.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ cls['library'] }}"></library-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">script</div>
+ <div class="memberValue">
+ <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+ </script-ref>
+ </div>
+ </div>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['super']['type'] != 'Null' }}">
+ <div class="memberItem">
+ <div class="memberName">extends</div>
+ <div class="memberValue">
+ <class-ref ref="{{ cls['super'] }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls['subclasses'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">extended by</div>
+ <div class="memberValue">
+ <template repeat="{{ subclass in cls['subclasses'] }}">
+ <class-ref ref="{{ subclass }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['interfaces'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">implements</div>
+ <div class="memberValue">
+ <template repeat="{{ interface in cls['interfaces'] }}">
+ <class-ref ref="{{ interface }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls.name != cls.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ cls.vmName }}</div>
+ </div>
+ </template>
+ </div>
+ </div>
+
+ <template if="{{ cls['error'] != null }}">
+ <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+ <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+ </template>
+
+ <hr>
+
+ <div class="content">
+ <template if="{{ cls['fields'].isNotEmpty }}">
+ fields ({{ cls['fields'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in cls['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ cls['functions'].isNotEmpty }}">
+ functions ({{ cls['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in cls['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}" qualified="{{ false }}">
+ </function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+ <template>
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+ <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+ <div class="content">
+ <h1>Code for {{ code.name }}</h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">kind</div>
+ <div class="memberValue">{{code.kind}}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">function</div>
+ <div class="memberValue">
+ <function-ref ref="{{code.function}}">
+ </function-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Inclusive</div>
+ <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Exclusive</div>
+ <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Constant object pool</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr>
+ <div class="content">
+ <template if="{{ code.hasDisassembly }}">
+ <div class="row">
+ <div class="col-md-2 memberHeader">Inclusive</div>
+ <div class="col-md-2 memberHeader">Exclusive</div>
+ <div class="col-md-2 memberHeader">Address</div>
+ <div class="col-md-6 memberHeader">Disassembly</div>
+ </div>
+ </template>
+ <template repeat="{{ instruction in code.instructions }}">
+ <div class="row">
+ <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+ <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+ <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+ <div class="col-md-6 monospace">{{ instruction.human }}</div>
+ </div>
+ </template>
+ </div>
+ </template>
+
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+ <template>
+ <div class="well row">
+ <a on-click="toggleDisplay" class="btn muted unselectable">
+ Raw message... <i class="{{ iconClass }}"></i>
+ </a>
+ <div style="display: {{ displayValue }}" class="well">
+ <content></content>
+ </div>
+ </div>
+ </template>
+
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+ <template>
+ <div class="row">
+ <div class="col-md-8 col-md-offset-2">
+ <div class="panel panel-danger">
+ <div class="panel-heading">{{ error.kind }}</div>
+ <div class="panel-body">
+ <p>{{ error.message }}</p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
<template>
<nav-bar>
<top-nav-menu></top-nav-menu>
@@ -742,9 +856,26 @@
</template>
</polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+ <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+ <div class="row">
+ <p style="text-align:center">{{ status }}</p>
+ </div>
+ <div class="row">
+ <canvas id="fragmentation" width="1px" height="1px"></canvas>
+ </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ ref.name }}</a>
</template>
</polymer-element>
@@ -761,14 +892,7 @@
<div class="col-md-4">
<div class="row">
- <template if="{{ isolate.entry['id'] != null }}">
- <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
- {{ isolate.name }}
- </a>
- </template>
- <template if="{{ isolate.entry['id'] == null }}">
- {{ isolate.name }}
- </template>
+ <isolate-ref ref="{{ isolate }}"></isolate-ref>
</div>
<div class="row">
@@ -811,6 +935,7 @@
<a href="{{ isolate.relativeHashLink('allocationprofile') }}">
{{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
</a>
+ ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
</div>
<div class="col-md-2">
<template if="{{ isolate.topFrame == null }}">
@@ -856,6 +981,158 @@
</template>
</polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+ <template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ .sourceInset {
+ padding-left: 15%;
+ padding-right: 15%;
+ }
+ </style>
+
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+ </isolate-nav-menu>
+ </nav-bar>
+
+ <div class="content">
+ <h1>isolate '{{ isolate.name }}'</h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">status</div>
+ <div class="memberValue">
+ <template if="{{ isolate.topFrame == null }}">
+ <strong>idle</strong>
+ </template>
+ <template if="{{ isolate.topFrame != null }}">
+ <strong>running</strong>
+ @
+ <function-ref ref="{{ isolate.topFrame['function'] }}">
+ </function-ref>
+ (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+ </template>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <template if="{{ isolate.topFrame != null }}">
+ <br>
+ <div class="sourceInset">
+ <pre> {{ isolate.topFrame['line'] }} {{ isolate.topFrame['lineString'] }}</pre>
+ </div>
+ </template>
+
+ <br>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <template if="{{ isolate.entry != null }}">
+ <div class="memberName">entry</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.entry }}"></function-ref>
+ </div>
+ </template>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">id</div>
+ <div class="memberValue">{{ isolate.vmName }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+
+ <br>
+
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
<polymer-element name="instance-view" extends="observatory-element">
<template>
<nav-bar>
@@ -875,12 +1152,14 @@
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
- .member {
- vertical-align: top;
- padding: 3px 0 3px 1em;
- font: 400 14px 'Montserrat', sans-serif;
+ .memberList {
+ display: table;
}
- .memberBold {
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 14px 'Montserrat', sans-serif;
@@ -895,23 +1174,25 @@
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<h1>instance of {{ instance['class']['user_name'] }}</h1>
- <table>
- <tbody><tr>
- <td class="memberBold">class</td>
- <td class="member">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">class</div>
+ <div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
</class-ref>
- </td>
- </tr>
- <tr template="" if="{{ instance['preview'] != null }}">
- <td class="memberBold">preview</td>
- <td class="member">{{ instance['preview'] }}</td>
- </tr>
- <tr>
- <td class="memberBold">size</td>
- <td class="member">{{ instance['size'] | formatSize }}</td>
- </tr>
- </tbody></table>
+ </div>
+ </div>
+ <template if="{{ instance['preview'] != null }}">
+ <div class="memberItem">
+ <div class="memberName">preview</div>
+ <div class="memberValue">{{ instance['preview'] }}</div>
+ </div>
+ </template>
+ <div class="memberItem">
+ <div class="memberName">size</div>
+ <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+ </div>
+ </div>
</div>
<hr>
@@ -920,44 +1201,50 @@
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
- <td class="member">
- <field-ref ref="{{ field['decl'] }}"></field-ref>
- </td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ field in instance['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field['decl'] }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
- <td class="member">[{{ field['index']}}]</td>
- <td class="member">[{{ field['value']}}]</td>
- </tr>
- </tbody></table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in instance['nativeFields'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ field['index']}}]</div>
+ <div class="memberValue">[{{ field['value']}}]</div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}">
- </instance-ref>
- </td>
- </tr>
- </tbody></table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ element in instance['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}">
+ </instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
</div>
@@ -1004,6 +1291,28 @@
</polymer-element>
<polymer-element name="library-view" extends="observatory-element">
<template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1011,68 +1320,195 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="alert alert-info">Scripts</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ script in library['scripts']}}">
- <td>
- {{ script.kind }}
- </td>
- <td>
- <script-ref ref="{{ script }}"></script-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Imported Libraries</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ lib in library['libraries'] }}">
- <td>
- <library-ref ref="{{ lib }}"></library-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Variables</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ variable in library['variables'] }}">
- <td><field-ref ref="{{ variable }}"></field-ref></td>
- <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Functions</div>
- <table class="table table-hover">
- <tbody>
- <tr template="" repeat="{{ func in library['functions'] }}">
- <td>
- <function-ref ref="{{ func }}"></function-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Classes</div>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>Name</th>
- <th>Internal Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{ cls in library['classes'] }}">
- <td>
- <class-ref ref="{{ cls }}"></class-ref>
- </td>
- <td>
- <class-ref ref="{{ cls }}" internal=""></class-ref>
- </td>
- </tr>
- </tbody>
- </table>
+ <div class="content">
+ <h1>
+ <!-- TODO(turnidge): Handle unnamed libraries -->
+ library {{ library.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">url</div>
+ <div class="memberValue">{{ library['url'] }}</div>
+ </div>
+ <template if="{{ library['imports'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">imports</div>
+ <div class="memberValue">
+ <template repeat="{{ import in library['imports'] }}">
+ <library-ref ref="{{ import }}"></library-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ library.name != library.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ library.vmName }}</div>
+ </div>
+ </template>
+ </div>
+ </div>
+ <hr>
+
+ <div class="content">
+ <template if="{{ library['scripts'].isNotEmpty }}">
+ scripts ({{ library['scripts'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ script in library['scripts'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <script-ref ref="{{ script }}"></script-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['classes'].isNotEmpty }}">
+ classes ({{ library['classes'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ cls in library['classes'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <class-ref ref="{{ cls }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['variables'].isNotEmpty }}">
+ variables ({{ library['variables'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in library['variables'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['functions'].isNotEmpty }}">
+ functions ({{ library['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in library['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}"></function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+ <template>
+ <style>
+ .switch {
+ position: relative;
+ width: 121px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ }
+ .hide {
+ display: none;
+ }
+ .label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ }
+ .content {
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
+ }
+ .content:before, .content:after {
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 30px;
+ color: white;
+ font: 400 14px 'Montserrat', sans-serif;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .content:before {
+ content: {{ checkedText }};
+ padding-left: 10px;
+ background-color: #0489C3;
+ }
+ .content:after {
+ content: {{ uncheckedText }};
+ padding-right: 10px;
+ background-color: #EEEEEE;
+ color: #999999;
+ text-align: right;
+ }
+ .dot {
+ width: 14px;
+ margin: 8px;
+ background: #FFFFFF;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 87px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
+ }
+ :checked + .label .content {
+ margin-left: 0;
+ }
+ :checked + .label .dot {
+ right: 0px;
+ }
+ </style>
+ <div class="switch">
+ <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+ <label class="label" for="slide-switch">
+ <div class="content"></div>
+ <div class="dot"></div>
+ </label>
+ </div>
</template>
</polymer-element>
@@ -1084,38 +1520,81 @@
<nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="row">
- <div class="col-md-12">
- <span>Top</span>
- <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
- <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
- </select>
- <span>exclusive methods</span>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
- </div>
- </div>
- <table id="tableTree" class="table table-hover">
- <thead>
+ <style>
+ .content {
+ padding-left: 10%;
+ font: 400 14px 'Montserrat', sans-serif;
+ }
+ h1 {
+ font: 400 18px 'Montserrat', sans-serif;
+ }
+ .member, .memberHeader {
+ 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;
+ }
+ </style>
+ <div class="content">
+ <h1>Sampled CPU profile</h1>
+ <table>
+ <tbody><tr>
+ <td class="memberHeader">Timestamp</td>
+ <td class="member">{{ refreshTime }}</td>
+ </tr>
<tr>
- <th>Method</th>
- <th>Exclusive</th>
- <th>Caller</th>
+ <td class="memberHeader">Sample count</td>
+ <td class="member">{{ sampleCount }}</td>
</tr>
- </thead>
- <tbody>
- <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
- <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
- <code-ref ref="{{ row.code }}"></code-ref>
+ <tr>
+ <td class="memberHeader">Sample rate</td>
+ <td class="member">{{ sampleRate }} Hz</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Sample depth</td>
+ <td class="member">{{ sampleDepth }} stack frames</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Call graph tree</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ callGraphChecked }}">
</td>
- <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
- <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
- </tr>
- </tbody>
- </table>
+ </tr><tr>
+ <td class="memberHeader">Display cutoff</td>
+ <td class="member">{{ displayCutoff }}</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Hide tags</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ hideTagsChecked }}">
+ </td>
+ </tr>
+ </tbody></table>
+ <hr>
+ <table id="tableTree" class="table table-hover">
+ <thead>
+ <tr>
+ <th>Method</th>
+ <th>Caller</th>
+ <th>Exclusive</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+ <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+ <code-ref ref="{{ row.code }}"></code-ref>
+ </td>
+ <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+ <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</template>
</polymer-element>
@@ -1226,9 +1705,17 @@
<polymer-element name="stack-frame" extends="observatory-element">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 0 0 0 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div class="row">
@@ -1240,15 +1727,18 @@
<function-ref ref="{{ frame['function'] }}"></function-ref>
( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
</script-ref> )
+
<curly-block>
- <table>
- <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
- <td class="member">{{ v['name']}}</td>
- <td class="member">
- <instance-ref ref="{{ v['value'] }}"></instance-ref>
- </td>
- </tr>
- </tbody></table>
+ <div class="memberList">
+ <template repeat="{{ v in frame['vars'] }}">
+ <div class="memberItem">
+ <div class="memberName">{{ v['name']}}</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ v['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</div>
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 8bf51c1..decdb06 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
@@ -8542,7 +8542,7 @@
function DartObject(o) {
this.o = o;
}
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
(function($){function dart(){this.x=0}var A=new dart
delete A.x
var B=new dart
@@ -8597,7 +8597,7 @@
init()
$=I.p
var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
"use strict";
function map(x){x={x:x};delete x.x;return x}
function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return H.eQ(a)},
bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
kn:{
"^":"bool/Gv;",
bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
Q:{
"^":"List/Gv;",
h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
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)
return!0}return!1},"call$1","guH",2,0,null,132,[]],
ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
y.fixed$length=init
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)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
tg:[function(a,b){var z
for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
if(b)return H.VM(a.slice(),[H.Kp(a,0)])
else{z=H.VM(a.slice(),[H.Kp(a,0)])
z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
giO:function(a){return H.eQ(a)},
gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
a.length=b},
t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
$isList:true,
$isList:true,
$aszM:null,
@@ -8992,9 +8990,9 @@
if(b>20)throw H.b(P.C3(b))
z=a.toFixed(b)
if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
bu:[function(a){if(a===0&&1/a<0)return"-0.0"
else return""+a},"call$0","gXo",0,0,null],
giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
if(b<0)return z-b
else return z+b},"call$1","gQR",2,0,null,109,[]],
Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
return a>=b},"call$1","gNH",2,0,null,109,[]],
$isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
im:{
"^":"int/P;",
gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
gbx:function(a){return C.O4},
$isdouble:true,
$isnum:true},
-vT:{
+x1:{
"^":"im;"},
VP:{
-"^":"vT;"},
+"^":"x1;"},
BQ:{
"^":"VP;"},
O:{
@@ -9063,8 +9062,8 @@
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))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
wL:[function(a,b,c){var z,y,x,w
if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
z=a.length
@@ -9075,7 +9074,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)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
return a+b},"call$1","gF1n",2,0,null,109,[]],
Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
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)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
Nj:[function(a,b,c){var z
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
if(J.z8(c,a.length))throw H.b(P.N(c))
return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
z=a.trim()
y=z.length
if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
U:[function(a,b){var z,y
if(typeof b!=="number")return H.s(b)
if(0>=b)return""
@@ -9126,15 +9117,15 @@
for(z=a,y="";!0;){if((b&1)===1)y=z+y
b=b>>>1
if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
XU:[function(a,b,c){var z,y,x,w
if(b==null)H.vh(new P.AT(null))
if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
Pk:[function(a,b,c){var z,y,x
c=a.length
if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
gl0:function(a){return a.length===0},
gor:function(a){return a.length!==0},
iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
gB:function(a){return a.length},
t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
$isString:true,
static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
"^":"",
zd:[function(a,b){var z=a.vV(0,b)
init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
ox:[function(){var z=init.globalState.Xz
z.GL=z.GL-1},"call$0","q4",0,0,null],
oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
if(b==null){b=[]
z.a=b
y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("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
@@ -9208,7 +9205,7 @@
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()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
yl:[function(){var z=init.currentScript
if(z!=null)return String(z.src)
if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
self.postMessage(q)}else P.JS(y.t(z,"msg"))
break
case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
ZF:[function(a){var z,y,x,w
if(init.globalState.EF===!0){y=init.globalState.vd
x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,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))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
Ws:[function(a,b,c,d,e,f){var z,y,x,w
z=init.globalState.N0
y=z.jO
@@ -9294,21 +9291,21 @@
$.eb=$.eb+("_"+y)
y=z.EE
x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
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.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$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)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
PK:{
"^":"Tp:115;a,b",
call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
$.jk().onmessage=w
$.jk().dartPrint = function (object) {}}}},
aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
NR:[function(a){var z,y,x,w,v,u
if(!this.RW)return
z=this.lJ
@@ -9356,18 +9353,18 @@
if(w<0||w>=u)return H.e(v,w)
v[w]=x
if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
iK:[function(a){var z=this.Jp
if(z==null){z=[]
this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
Hh:[function(a){var z=this.Jp
if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
vV:[function(a,b){var z,y
z=init.globalState.N0
init.globalState.N0=this
@@ -9388,11 +9385,11 @@
break
case"ping":this.Wq(z.t(a,1),z.t(a,2))
break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
aU:[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)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
else this.UM()},"call$0","gi8",0,0,null],
UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
if(y)z.call$1(this.b)
else z.call$0()}}},"call$0",null,0,0,null,"call"],
$isEH:true},
-Iy:{
+dq:{
"^":"a;",
$isbC:true},
Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
zY:[function(a,b){var z,y,x,w,v
z={}
y=this.Jz
@@ -9483,11 +9480,9 @@
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))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return J.td(this.JE)},
$isZ6:true,
$isbC:true},
@@ -9499,19 +9494,17 @@
y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
$isEH:true},
ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
zY:[function(a,b){var z,y
z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
if(init.globalState.EF===!0){init.globalState.vd.toString
self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+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)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
x=this.bv
if(typeof x!=="number")return H.s(x)
return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
z.fW.Rz(0,y)
z.PC()},"call$0","gJK",0,0,null],
FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
$isyo:true,
static:{"^":"Vz"}},
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]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
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)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
II:{
"^":"AP;RZ",
Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
"^":"a;MD",
t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
Xq:[function(){var z,y,x
for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
X1:{
"^":"a;",
t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
Hn:[function(a){},"call$0","gb6",0,0,null],
Xq:[function(){},"call$0","gt6",0,0,null]},
HU:{
@@ -9582,19 +9575,19 @@
if(H.VO(a))return this.Pq(a)
this.il.Hn(0)
z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
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(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
Nt:{
"^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
wb:[function(a){var z,y,x,w,v,u
z=this.il.t(0,a)
if(z!=null)return z
@@ -9606,7 +9599,7 @@
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},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
TI:[function(a){var z,y
z={}
y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
this.il.u(0,a,y)
a.aN(0,new H.OW(z,this))
return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
$isEH:true},
Tf:{
"^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
wb:[function(a){var z,y
z=this.il.t(0,a)
if(z!=null)return["ref",z]
y=this.CN
this.CN=y+1
this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
TI:[function(a){var z,y
z=this.il.t(0,a)
if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
for(;w<y;++w){v=this.I8(z.t(a,w))
if(w>=x.length)return H.e(x,w)
x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
AP:{
"^":"a;",
QS:[function(a){if(H.ZR(a))return a
this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
XE:[function(a){var z,y
if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
z=J.U6(a)
@@ -9667,7 +9660,7 @@
case"map":return this.tv(a)
case"sendport":return this.Vf(a)
case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
Dj:[function(a){var z,y,x,w,v
z=J.U6(a)
y=z.t(a,1)
@@ -9678,7 +9671,7 @@
if(typeof w!=="number")return H.s(w)
v=0
for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
tv:[function(a){var z,y,x,w,v,u,t,s
z=P.L5(null,null,null,null,null)
y=J.U6(a)
@@ -9692,8 +9685,8 @@
t=J.U6(v)
s=0
for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
yH:{
"^":"a;Kf,zu,p9",
ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
n:[function(a,b){var z,y
if(b==null)return!1
if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
y=b.ng
return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
$isku:true,
$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
"^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
d:[function(a){var z
if(typeof a==="string")return a
if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
else if(a==null)return"null"
z=J.AG(a)
if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-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."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$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."))},"call$1","IT",2,0,null,31,[]],
eQ:[function(a){var z=a.$identityHash
if(z==null){z=Math.random()*0x3fffffff|0
a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
BU:[function(a,b,c){var z,y,x,w,v,u
if(c==null)c=H.Rm()
if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
if(!(v<u))break
y.j(w,0)
if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
IH:[function(a,b){var z,y
if(typeof a!=="string")H.vh(new P.AT(a))
if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
z=parseFloat(a)
if(isNaN(z)){y=J.rr(a)
if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
lh:[function(a){var z,y,x
z=C.AS(J.x(a))
if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
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},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
Cq:[function(a){var z,y,x
z=[]
z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
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.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
eT:[function(a){var z,y
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
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},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
zo:[function(a,b,c){var z,y,x
z={}
z.a=0
y=[]
x=[]
-if(b!=null){z.a=0+b.length
+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,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
Ek:[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*"]
@@ -9877,26 +9868,27 @@
if(z.a)return H.zo(a,b,c)
C.Nm.FV(b,v.gUQ(v))
return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
C.Nm.FV(r,b)
y=a["call$"+q]
if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+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.l0
+if(a=="List")return C.E3
if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+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},"call$1","EN",2,0,null,6,[]],
Pq:[function(){var z={x:0}
delete z.x
return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
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))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
b:[function(a){var z
if(a==null)a=new P.LK()
z=new Error()
@@ -9965,7 +9957,7 @@
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"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
tR:[function(a,b){var z
if(a==null)return
z=a.$identity
@@ -10001,7 +9993,7 @@
n=o.$callName
if(n!=null){m=d?o:H.SD(o,t)
w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
vq:[function(a,b){var z=H.eZ
switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
SD:[function(a,b){var z,y,x,w
if(b)return H.Oj(a)
z=a.length
@@ -10026,7 +10018,7 @@
$.bf=x}x=y+H.d(x)+","+w+");"
y=$.OK
$.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
Z4:[function(a,b,c){var z,y
z=H.eZ
y=H.yS
@@ -10037,7 +10029,7 @@
case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
Oj:[function(a){var z,y,x,w,v
z=a.$stubName
y=a.length
@@ -10049,33 +10041,33 @@
x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
w=$.OK
$.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
Kq:[function(a,b,c,d,e,f){b.fixed$length=init
c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],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))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
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)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
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)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
return a},"call$2","Ub",4,0,null,79,[],80,[]],
oX:[function(a){if(a==null)return
return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
Ko:[function(a,b){if(a==null)return"dynamic"
else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
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)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
uc:[function(a){var z=$.NF
return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
w3:[function(a){var z,y,x,w,v,u
z=$.NF.call$1(a)
y=$.nw[z]
@@ -10264,10 +10256,10 @@
else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
m2:[function(a,b,c){var z,y
if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+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)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
ys:[function(a,b,c){var z,y,x,w,v
if(typeof b==="string")if(b==="")if(a==="")return c
else{z=P.p9("")
@@ -10277,12 +10269,11 @@
w=z.vM+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{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
v.lastIndex=0
return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
"^":"a;"},
xQ:{
"^":"a;"},
@@ -10294,8 +10285,8 @@
gor:function(a){return!J.de(this.gB(this),0)},
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
$isZ0:true},
@@ -10304,10 +10295,10 @@
di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
x4:[function(a){if(typeof a!=="string")return!1
if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
aN:[function(a,b){var z,y,x
z=this.tc
for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
$isyN:true},
LD:{
"^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$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:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
$isEH:true},
XR:{
"^":"mW;Y3",
@@ -10331,14 +10322,13 @@
"^":"a;lK,uk,xI,rq,FX,Nc",
gWa:function(){var z,y,x
z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+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},
gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
"^":"a;e0",
gpf:function(){return!0},
Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
FD:{
"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
BX:[function(a,b){var z=this.Rv
if(typeof b!=="number")return b.C()
if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
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))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
KE:[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))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
e4:[function(a){var z,y,x,w,v,u,t
z={}
if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
H.rd(y,null)
H.bQ(y,new H.Nv(z,this,x))}z=this.NE
if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
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"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
gx5:function(){return this.mr.$reflectionName},
static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
w=z[1]
return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
call$1:[function(a){var z,y,x
z=this.b.NE
y=this.a
@@ -10472,18 +10462,18 @@
z[x]=y},"call$1",null,2,0,null,12,[],"call"],
$isEH:true},
Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
call$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=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
$isEH:true},
u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
call$2:[function(a,b){var z=this.b
if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
$isEH:true},
Zr:{
"^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
if(x!==-1)y.method=z[x+1]
x=this.EP
if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
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)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+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)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
var $argumentsExpr$ = '$arguments$'
try {
$expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
Am:{
"^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
return a},"call$1",null,2,0,null,159,[],"call"],
$isEH:true},
XO:{
@@ -10596,11 +10585,9 @@
"^":"Tp;"},
v:{
"^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y
z=this.EP
@@ -10619,11 +10606,11 @@
x=y
for(y=x.length,w=0;w<y;++w){v=x[w]
if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
"^":"a;QW"},
-D2:{
+dN:{
"^":"a;QW"},
-my:{
+GT:{
"^":"a;oc>"},
Pe:{
"^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
"^":"Ge;G1>",
bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
"^":"a;"},
tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
BD:[function(a){var z=this.rP(a)
return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
z={ "func": "dynafunc" }
y=this.dw
x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+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)
y=this.is
@@ -10656,7 +10643,7 @@
if(y!=null){w={}
v=H.kU(y)
for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
bu:[function(a){var z,y,x,w,v,u,t,s
z=this.Iq
if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
a=a
z=[]
for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
hJ:{
-"^":"lb;",
+"^":"lbp;",
bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
$ishJ:true},
tu:{
-"^":"lb;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},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
za:[function(){var z,y
z=this.Et
if(z!=null)return z
@@ -10701,7 +10688,7 @@
if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
Zz:{
"^":"Ge;K9",
@@ -10720,10 +10707,8 @@
this.ke=y
return y},"call$0","gXo",0,0,null],
giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
$iscu:true,
$isuq:true},
Lm:{
@@ -10733,11 +10718,11 @@
call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
$isEH:true},
wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
$isEH:true},
VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
$isEH:true},
VR:{
@@ -10758,16 +10743,16 @@
if(typeof a!=="string")H.vh(new P.AT(a))
z=this.Ej.exec(a)
if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
yk:[function(a,b){var z,y
z=this.gF4()
z.lastIndex=b
y=z.exec(a)
if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
Bh:[function(a,b){var z,y,x,w
z=this.gAT()
z.lastIndex=b
@@ -10778,13 +10763,13 @@
if(w<0)return H.e(y,w)
if(y[w]!=null)return
J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
wL:[function(a,b,c){var z
if(c>=0){z=J.q8(b)
if(typeof z!=="number")return H.s(z)
z=c>z}else z=!0
if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
$isVR:true,
$isSP:true,
static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
"^":"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]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
VO:function(a,b){},
$isOd:true,
static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
tQ:{
"^":"a;M,J9,zO",
t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
$isOd:true}}],["app","package:observatory/app.dart",,G,{
"^":"",
m7:[function(a){var z
@@ -10839,11 +10824,11 @@
$.NR=z
return z},"call$1","vN",2,0,112,113,[]],
mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
Da:[function(){var z=this.Z6
z.sec(this)
z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
"^":"a;Yb<",
goH:function(){return this.Yb.nQ("getNumberOfColumns")},
gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
RP:[function(a,b){var z=[]
C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
qu:{
"^":"a;vR,bG>",
u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
dZ:{
"^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
kI:[function(){var z=C.PP.aM(window)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
Pr:[function(){var z=this.R6()
if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
z=F.Wi(this,C.h1,this.JL,z)
this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
return!0}return!1},"call$0","goO",0,0,null],
rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
this.JL=F.Wi(this,C.h1,this.JL,z)
z=this.ec
y=this.Pr()
@@ -10921,10 +10906,10 @@
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
goE:function(a){return this.z3},
soE:function(a,b){var z=this.z3
this.z3=b
@@ -10934,28 +10919,19 @@
return this.z3},"call$0","gMk",0,0,null],
$isY2:true},
XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
rT:[function(a){var z,y
z=this.WT
y=J.w1(z)
y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
z=this.WT
y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
PP:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
z.soE(a,!1)
z=this.WT
w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
"^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_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/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.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/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/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/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/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_list.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/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
$.uP=!1
F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
"^":"",
G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.jy]},
static:{Dw:[function(a){var z,y,x,w
z=$.Nd()
@@ -10990,13 +10967,13 @@
C.J0.ZL(a)
C.J0.G6(a)
return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
"^":"uL+Pi;",
$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
"^":"",
Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.OS]},
static:{rt:[function(a){var z,y,x,w
z=$.Nd()
@@ -11011,13 +10988,14 @@
C.YZ.ZL(a)
C.YZ.G6(a)
return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
"^":"",
Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.oY]},
static:{zg:[function(a){var z,y,x,w
z=$.Nd()
@@ -11031,13 +11009,13 @@
C.kk.ZL(a)
C.kk.G6(a)
return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
"^":"uL+Pi;",
$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
"^":"",
CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.U8]},
static:{On:[function(a){var z,y,x,w
z=$.Nd()
@@ -11052,20 +11030,20 @@
C.IK.ZL(a)
C.IK.G6(a)
return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
"^":"",
Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Xx
if(z==null)return
J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
static:{Fe:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
C.YD.ZL(a)
C.YD.G6(a)
return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
"^":"uL+Pi;",
$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
"^":"",
E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
SS:[function(a){var z,y
z=a.Uy
y=a.zh
@@ -11104,7 +11082,7 @@
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")}},"call$0","glg",0,0,114,"_refresh"],
"@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -11119,29 +11097,29 @@
C.j8.ZL(a)
C.j8.G6(a)
return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
"^":"uL+Pi;",
$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
"^":"",
lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
Ki:function(a){return this.gFR(a).call$0()},
AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[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)},"call$0","goJ",0,0,114,"doneCallback"],
AZ:[function(a,b,c,d){var z=a.Hu
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)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
"@":function(){return[C.DKS]},
static:{fR:[function(a){var z,y,x,w
z=$.Nd()
@@ -11158,7 +11136,7 @@
C.O0.ZL(a)
C.O0.G6(a)
return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
LP:{
"^":"ir+Pi;",
$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
qG:[function(a,b,c,d,e){var z,y
H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
y=J.Wx(e)
if(y.C(e,0))throw H.b(new P.AT(e))
if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
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)
+if(!y.$isyN)c=y.tt(c,!1)
y=J.U6(c)
x=y.gB(c)
w=a.length
@@ -11220,9 +11199,13 @@
w=a.length
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.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[function(a,b,c){var z,y
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+for(z=J.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
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))
@@ -11247,7 +11230,7 @@
while(!0){u=J.Wx(v)
if(!(u.D(v,b)&&J.z8(d.call$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)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
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)
@@ -11357,7 +11340,7 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return J.de(this.gB(this),0)},
grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
zV:[function(a,b){var z,y,x,w,v,u
z=this.gB(this)
if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
for(;v<z;++v){u=this.Zv(0,v)
u=typeof u==="string"?u:H.d(u)
w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
es:[function(a,b,c){var z,y,x
z=this.gB(this)
@@ -11414,7 +11397,7 @@
if(!(x<y))break
y=this.Zv(0,x)
if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
$isyN:true},
nH:{
"^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
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)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
qZ:[function(a,b){var z,y,x
if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
z=this.AN
@@ -11479,11 +11462,10 @@
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))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
$asmW:function(a,b){return[b]},
$asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+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:{
"^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
"^":"aL;CR,T6",
mb:function(a){return this.T6.call$1(a)},
gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
$asaL:function(a,b){return[b]},
$asmW:function(a,b){return[b]},
$asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
z=J.GP(this.mb(y.gl()))
this.C2=z}else return!1}this.lo=this.C2.gl()
return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
"^":"a;",
G:[function(){return!1},"call$0","gqy",0,0,null],
gl:function(){return}},
SU7:{
"^":"a;",
sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
"^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
$isList:true,
$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
$isList:true,
$aszM:null,
$isyN:true,
@@ -11579,13 +11564,11 @@
Zv:[function(a,b){var z,y
z=this.CR
y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
GD:{
"^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z=J.v1(this.fN)
if(typeof z!=="number")return H.s(z)
return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
YC:[function(a){if(a==null)return
return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
jO:[function(a){var z,y
z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
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.pL(b)
+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(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
r=s["@"]
if(r==null){q=null
p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+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)
@@ -11657,15 +11638,13 @@
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},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+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)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+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},"call$2","un",4,0,null,140,[],141,[]],
MJ:[function(a,b){var z,y,x,w
z=[]
@@ -11686,8 +11665,8 @@
z={}
z.a=null
for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+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)
@@ -11696,8 +11675,7 @@
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.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
fb:[function(a,b){if(a==null)return b
return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
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)},"call$1","C7",2,0,null,147,[]],
jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+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
@@ -11724,7 +11702,7 @@
if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
Mk:[function(a,b){var z=J.U6(a)
if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
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}},"call$1","IX",2,0,null,12,[]],
Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
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,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
Sn:{
"^":"a;L5,F1>",
gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
jU:{
"^":"a;",
bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
$isej:true},
Lj:{
"^":"jU;MA",
@@ -11776,23 +11754,21 @@
return z.gUQ(z).XG(0,new H.mb())},
$isej:true},
mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
$isEH:true},
cb:{
"^":"jU;If<",
gUx:function(){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)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
$isNL:true,
$isej:true},
cw:{
"^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+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)},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){var z,y
z=J.v1(C.Gp.LU)
if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
gOO:function(){return"LibraryMirror"},
gUx:function(){return this.If},
gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+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())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+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
@@ -11847,12 +11822,10 @@
rN:[function(a){var z=this.gQH().nb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,[],null,null))
return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
z=this.SD
if(z!=null)return z
@@ -11935,7 +11908,6 @@
this.xO=z
return z},
gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isD4:true,
$isej:true,
$isNL:true},
@@ -11943,12 +11915,12 @@
"^":"cb+M2;",
$isej:true},
IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
YX:{
"^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
return z},
gUx:function(){return this.gIf()},
gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
gJi:function(){return this},
gNy:function(){throw H.b(P.SY(null))},
gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isMs:true,
$isej:true,
$isX9:true,
@@ -11990,7 +11961,7 @@
"^":"M2;Ax<,xq",
gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gK8:function(){var z,y,x
z=$.eb
y=this.Ax
@@ -12007,7 +11978,7 @@
y=v.ZU(this.Ax)
z[c]=y}else v=null
if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
PU:[function(a,b){var z=H.d(a.gfN(a))+"="
this.tu(H.YC(z),2,z,[b])
return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
t.v=t.m=w
return y},"call$1","gFf",2,0,null,70,[]],
ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
QN:[function(a,b){var z=J.x(this.Ax)
if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
n:[function(a,b){var z,y
if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+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},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isiu:true,
$isvr:true,
$isej:true},
mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){var z,y
z=a.gfN(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"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
$isEH:true},
bl:{
"^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
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)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
gHA:function(){return!1},
gJi:function(){return this.NK},
gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
gUx:function(){return this.NK.gUx()},
gYj:function(){return new H.cu(this.gCr(),null)},
gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isbl:true,
$isMs:true,
$isej:true,
$isX9:true,
$isNL:true},
tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
call$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))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
$isEH:true},
Oo:{
"^":"Tp:112;",
@@ -12173,15 +12141,13 @@
Ax:{
"^":"Tp:112;a",
call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"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,RH,jE,If",
gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+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
@@ -12211,7 +12177,7 @@
p=H.ys(n,"$",".")}}else continue
s=H.Sd(p,q,!o,o)
x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
gEO:function(){var z=this.qu
if(z!=null)return z
z=this.ly(this)
@@ -12227,7 +12193,7 @@
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},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
gTH:function(){var z=this.zE
if(z!=null)return z
z=this.ws(this)
@@ -12276,9 +12242,7 @@
else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
gXP:function(){var z,y
z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+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)
@@ -12310,12 +12274,12 @@
F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
if(z==null||!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))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
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.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+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])},"call$1","gki",2,0,null,145,[]],
gkZ:function(){var z=this.qm
if(z!=null)return z
@@ -12336,7 +12300,6 @@
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)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isWf:true,
$isMs:true,
$isej:true,
@@ -12346,19 +12309,19 @@
"^":"EE+M2;",
$isej:true},
Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
Ci:{
"^":"Tp:112;b",
call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
$isEH:true},
t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
-Ld:{
+XJ:{
"^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
gOO:function(){return"VariableMirror"},
gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
if(z==null){z=this.n6
z=z==null?C.xD:z()
this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
$isRY:true,
$isNL:true,
$isej:true,
@@ -12397,7 +12360,7 @@
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.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
if(a>=123&&a<=126)return a-117
if(a>=37&&a<=43)return a-27
return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
w=x.split("$")
if(1>=w.length)return H.e(w,1)
v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+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)
@@ -12426,7 +12389,6 @@
y.constructor[z]=s
return s},
bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
$isvr:true,
$isej:true},
Zk:{
@@ -12451,10 +12413,7 @@
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()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?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
+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.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
this.le=z}return z},
jd:[function(a,b){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))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
guU:function(){return!this.lT&&!this.hB&&!this.xV},
$isZk:true,
$isRS:true,
@@ -12507,8 +12466,8 @@
$isNL:true,
$isej:true},
wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
ng:{
"^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
gAY:function(){return H.vh(P.SY(null))},
gkZ:function(){return H.vh(P.SY(null))},
gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
gNy:function(){return H.vh(P.SY(null))},
gw8:function(){return H.vh(P.SY(null))},
gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
$isX9:true,
$isNL:true},
rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
call$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)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
call$1:[function(a){var z,y
z=this.b.call$1(a)
y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+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()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"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)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
gvc:function(a){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()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
$isZ0:true,
static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
z.fixed$length=init
return z},"call$1","wp",2,0,null,147,[]],
Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
$isEH:true}}],["dart.async","dart:async",,P,{
"^":"",
VH:[function(a,b){var z=H.N7()
z=H.KT(z,[z,z]).BD(a)
if(z)return b.O8(a)
else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
Cx:[function(){var z=$.S6
for(;z!=null;){J.cG(z)
z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
BG:[function(){var z
try{P.Cx()}catch(z){H.Ru(z)
P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
if(a==null)return
try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+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)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
dL:[function(){},"call$0","v3",0,0,114],
FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
rT:function(a,b){var z
if(J.de($.X3,C.NU))return $.X3.uN(a,b)
z=$.X3
@@ -12761,7 +12720,7 @@
gY8:function(){return this.Y8},
uR:[function(a){var z=this.Ae
if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
Ac:[function(){var z=this.Ae
if(typeof z!=="number")return z.w()
this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
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","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
cO:[function(a){var z,y
z=this.Gv
if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
y.sAe(z&4294967293)
y=w}else y=y.giE()
this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
P.ot(this.QC)},"call$0","gVg",0,0,null]},
dz:{
@@ -12866,7 +12825,7 @@
"^":"Tp;a",
call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
DL:{
"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
b8:{
"^":"a;",
$isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
Ia:{
"^":"a;"},
Zf:{
"^":"Ia;MM",
oo:[function(a,b){var z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
w0:[function(a,b){var z
if(a==null)throw H.b(new P.AT("Error must not be null"))
z=this.MM
if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
vs:{
"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
y=P.VH(a,z)
x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
YM:[function(a){var z,y
z=$.X3
y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
y.$builtinTypeInfo=this.$builtinTypeInfo
this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
gDL:function(){return this.jk},
gcG:function(){return this.jk},
Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
E6:[function(a,b){this.Gv=8
this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
L3:[function(){var z,y,x
z=this.jk
this.jk=null
@@ -12937,26 +12904,26 @@
z.sBQ(y)}return y},"call$0","gAw",0,0,null],
rX:[function(a){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
else P.k3(a,this)
else{y=this.L3()
this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
R8:[function(a){var z=this.L3()
this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
K5:[function(a,b){var z=this.L3()
this.E6(a,b)
P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
OH:[function(a){var z
if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+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)
return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
this.Gv=1
this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
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])
z.L7(a,b)
return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],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)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
z={}
z.e=a
for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
if(s!=null)$.X3=s
if(x.d)return
if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!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()
+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()
v=x.c
b.E6(J.w8(v),v.gI4())}z.e=b
y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
da:{
"^":"Tp:115;a,b",
call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
$isEH:true},
pV:{
"^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
$isEH:true},
rH:{
@@ -13040,7 +13004,7 @@
call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
$isEH:true},
rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
call$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)
@@ -13100,33 +13064,29 @@
u=this.b
if(v)u.c=this.c.e.gcG()
else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
v.swG(!0)
this.b.d=!0
z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
$isEH:true},
jZ:{
"^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
$isEH:true},
FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+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.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
$isEH:true},
OM:{
"^":"a;FR>,aw@",
Ki:function(a){return this.FR.call$0()}},
qh:{
"^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
tg:[function(a,b){var z,y
z={}
y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
y=P.Dt(null)
z.a=null
z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
Vr:[function(a,b){var z,y
z={}
y=P.Dt(J.kn)
z.a=null
z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
gB:function(a){var z,y
z={}
y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
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.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
gtH:function(a){var z,y
z={}
y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
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.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
$isqh:true},
YJ:{
"^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
$isEH:true},
LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
$isEH:true},
DO:{
"^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
$isEH:true},
pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
$isEH:true},
eN:{
"^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
$isEH:true},
lU:{
"^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$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:{
@@ -13280,7 +13240,7 @@
"^":"Tp;a,b",
call$1:[function(a){var z=this.a
z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Z5:{
@@ -13293,7 +13253,7 @@
"^":"Tp;a,b,c",
call$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)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$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:{
@@ -13320,13 +13280,11 @@
z.SJ=w
w.Ae=z.Gv&1
if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
$isO9:true},
yU:{
@@ -13338,18 +13296,18 @@
"^":"a;"},
KA:{
"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
Fv:[function(a,b){var z,y,x
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())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
QE:[function(){var z=this.Gv
if((z&8)!==0)return
if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
y=this.Gv
if((y&64)===0){y=(y|64)>>>0
this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
Iv:[function(a){var z=this.Gv
this.Gv=(z|32)>>>0
this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
if(x)this.uO()
else this.LP()
z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
$isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
Vo:{
"^":"Tp:114;a,b,c",
call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
z.fe(a)
z.fm(0,d)
z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
w4:[function(a){var z,y
z=$.X3
y=a?1:0
y=new P.KA(null,null,null,z,y,null,null)
y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
fIm:{
"^":"a;aw@"},
LV:{
"^":"fIm;P>,aw",
r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
DS:{
"^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
JF:{
"^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
gaw:function(){return},
saw:function(a){throw H.b(new P.lj("No events after a done."))}},
ht:{
@@ -13492,7 +13450,7 @@
if(z===1)return
if(z>=1){this.Gv=1
return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
CR:{
"^":"Tp:115;a,b",
call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
h:[function(a,b){var z=this.N6
if(z==null){this.N6=b
this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
TO:[function(a){var z,y
z=this.zR
y=z.gaw()
this.zR=y
if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
V1:[function(a){if(this.Gv===1)this.Gv=3
this.N6=null
this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
$isEH:true},
uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
$isEH:true},
GU:{
@@ -13543,8 +13501,8 @@
v.fe(a)
v.fm(0,d)
v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
$asqh:function(a,b){return[b]}},
fB:{
"^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
if(z!=null){this.Ee=null
z.ed()}return},"call$0","gQC",0,0,null],
vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
S8:function(a,b,c,d){var z,y
z=this.gOa()
@@ -13579,7 +13537,7 @@
y=v
x=new H.XO(w,null)
b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
$asYR:function(a){return[a,a]},
$asqh:null},
t3:{
@@ -13591,26 +13549,26 @@
y=v
x=new H.XO(w,null)
b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
tU:{
"^":"a;"},
aY:{
"^":"a;"},
zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
hk:function(a,b){return this.E2.call$2(a,b)},
Gr:function(a){return this.cP.call$1(a)},
FI:function(a,b){return this.Jl.call$2(a,b)},
mg:function(a,b,c){return this.pU.call$3(a,b,c)},
Al:function(a){return this.Fh.call$1(a)},
cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
wr:function(a){return this.rb.call$1(a)},
RK:function(a,b){return this.rb.call$2(a,b)},
uN:function(a,b){return this.Zq.call$2(a,b)},
Ch:function(a,b){return this.JS.call$1(b)},
iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
"^":"a;"},
dl:{
"^":"a;"},
@@ -13643,8 +13601,8 @@
return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
mz:[function(a,b){var z,y
z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
RK:[function(a,b){var z,y,x
z=this.oh
for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
WH:{
"^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
bH:[function(a){var z,y,x,w
try{x=this.Gr(a)
return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
xi:[function(a,b){var z=this.Al(a)
if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
oj:[function(a,b){var z=this.cR(a)
if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
PT:[function(a,b){var z=this.O8(a)
if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
TF:{
"^":"Tp:115;a,b",
call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
$isEH:true},
dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
$isEH:true},
ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
$isEH:true},
uo:{
@@ -13724,7 +13682,7 @@
z=this.R1
y=z.t(0,b)
if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
$isEH:true},
eM:{
"^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
z=this.c
P.JS("Uncaught Error: "+H.d(z))
y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
throw H.b(z)},"call$0",null,0,0,null,"call"],
$isEH:true},
Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
-W5:{
+nU:{
"^":"a;",
gE2:function(){return P.xP()},
hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
Al:function(a){return this.gFh().call$1(a)},
gXp:function(){return P.zi()},
cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
grb:function(){return P.G2()},
wr:function(a){return this.grb().call$1(a)},
RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
geT:function(a){return},
gzU:function(){return C.v8},
gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
return y==null?!1:y[a]!=null}else{x=this.OB
if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
di:[function(a){var z=this.Ig()
z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
t:[function(a,b){var z,y,x,w,v,u,t
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null)y=null
@@ -13893,7 +13849,7 @@
if(v==null)return
u=v[this.nm(b)]
t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
u:[function(a,b,c){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
if(u>=0)v[u+1]=c
else{v.push(b,c)
this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -13920,7 +13876,7 @@
if(x<0)return
this.X5=this.X5-1
this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
V1:[function(a){if(this.X5>0){this.wV=null
this.OB=null
this.OX=null
@@ -13930,7 +13886,7 @@
z=this.Ig()
for(y=z.length,x=0;x<y;++x){w=z[x]
b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
z=this.wV
if(z!=null)return z
@@ -13951,71 +13907,71 @@
for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
return y},"call$0","gtL",0,0,null],
dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
Nv:[function(a,b){var z
if(a!=null&&a[b]!=null){z=P.vL(a,b)
delete a[b]
this.X5=this.X5-1
this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
$isZ0:true,
static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
P.cW(z,"<non-identifier-key>",z)
delete z["<non-identifier-key>"]
return z},"call$0","Vd",0,0,null]}},
oi:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
ce:{
"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
DJ:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
PL:{
"^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
aH:[function(a,b){var z,y,x
if(a==null)return-1
z=a.length
for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
Fq:{
"^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
WV:function(a,b){return this.m6.call$2(a,b)},
H5:function(a){return this.Q6.call$1(a)},
Ef:function(a){return this.ac.call$1(a)},
t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
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:112;a",
call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
$isEH:true},
fG:{
"^":"mW;Fb",
@@ -14058,8 +14014,8 @@
if(y==null)return!1
return y[a]!=null}else{x=this.OB
if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
t:[function(a,b){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
v=w[this.nm(b)]
u=this.aH(v,b)
if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
u:[function(a,b,c){var z,y,x,w,v,u
if(typeof b==="string"&&b!=="__proto__"){z=this.vv
if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
if(v==null)x[w]=[this.pE(b,c)]
else{u=this.aH(v,b)
if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
to:[function(a,b){var z
if(this.x4(a))return this.t(0,a)
z=b.call$0()
this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
Rz:[function(a,b){var z,y,x,w
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)
@@ -14102,7 +14058,7 @@
if(x<0)return
w=y.splice(x,1)[0]
this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
V1:[function(a){if(this.X5>0){this.lX=null
this.H9=null
this.OB=null
@@ -14115,17 +14071,17 @@
y=this.zN
for(;z!=null;){b.call$2(z.gkh(),z.gS4())
if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
dg:[function(a,b,c){var z=a[b]
if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
Nv:[function(a,b){var z
if(a==null)return
z=a[b]
if(z==null)return
this.Vb(z)
delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
pE:[function(a,b){var z,y
z=new P.db(a,b,null,null)
if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
y.sDG(z)
this.lX=z}this.X5=this.X5+1
this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
Vb:[function(a){var z,y
z=a.gzQ()
y=a.gDG()
@@ -14143,13 +14099,13 @@
if(y==null)this.lX=z
else y.szQ(z)
this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
$isFo:true,
$isZ0:true,
@@ -14159,15 +14115,15 @@
return z},"call$0","Bs",0,0,null]}},
a1:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
ou:{
"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
$isEH:true},
S9:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
db:{
@@ -14249,7 +14205,7 @@
this.DM=null
return!0}},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -14300,18 +14256,19 @@
if(a==null)return-1
z=a.length
for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
YO:{
"^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
aH:[function(a,b){var z,y,x
if(a==null)return-1
z=a.length
for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
oz:{
"^":"a;O2,DM,zi,fD",
gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
y=this.zN
for(;z!=null;){b.call$1(z.gGc())
if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
grZ:function(a){var z=this.lX
if(z==null)throw H.b(new P.lj("No elements"))
return z.gGc()},
@@ -14381,7 +14338,7 @@
else{if(this.aH(u,b)>=0)return!1
u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
Rz:[function(a,b){var z,y,x
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)
@@ -14426,13 +14383,14 @@
if(y==null)this.lX=z
else y.szQ(z)
this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
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
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -14451,7 +14409,7 @@
Yp:{
"^":"w2Y;G4",
gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
lN:{
"^":"mW;",
tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
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},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -14484,11 +14443,11 @@
else{y.KF(H.d(z.gl()))
for(;z.G();){y.vM=y.vM+b
x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
Vr:[function(a,b){var z
for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
gB:function(a){var z,y
z=this.gA(this)
for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
return y},
qA:[function(a,b,c){var z,y
for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
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))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
$isQV:true,
$asQV:null},
@@ -14523,13 +14482,13 @@
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)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
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.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return J.de(this.gB(a),0)},
gor:function(a){return!this.gl0(a)},
grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
if(typeof z!=="number")return H.s(z)
y=0
for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
zV:[function(a,b){var z
if(J.de(this.gB(a),0))return""
z=P.p9("")
z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
if(!(x<y))break
y=this.t(a,x)
if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
h:[function(a,b){var z=this.gB(a)
this.sB(a,J.WB(z,1))
this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
x=this.gB(a)
this.sB(a,J.WB(x,1))
this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
Mu:[function(a,b,c){this.pZ(a,b,c)
return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+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))},"call$2","gYH",4,0,null,123,[],124,[]],
YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
if(typeof z!=="number")return H.s(z)
z=b>z}else z=!0
if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
if(typeof x!=="number")return H.s(x)
if(e+y>x)throw H.b(new P.lj("Not enough elements"))
if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
XU:[function(a,b,c){var z,y
z=this.gB(a)
if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
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},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
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
return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
if(z)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))
this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+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)))
+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.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+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
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
bu:[function(a){var z
if($.xb().tg(0,a))return"[...]"
z=P.p9("")
@@ -14662,14 +14639,14 @@
$isQV:true,
$asQV:null},
ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$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)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
Sw:{
"^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
if(y<0||y>=x.length)return H.e(x,y)
b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
z=this.av
y=this.eZ
if(z===y)throw H.b(new P.lj("No elements"))
z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+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)
@@ -14702,21 +14678,23 @@
x=z.length
y=(y+b&x-1)>>>0
if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
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)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+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
w=this.v5
v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
if(typeof u!=="number")return H.s(u)
w=Array(u)
w.fixed$length=init
@@ -14724,15 +14702,16 @@
this.eZ=this.wR(t)
this.v5=t
this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=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=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+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=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
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)
@@ -14747,38 +14726,33 @@
this.av=0
this.qT=this.qT+1}},"call$0","gRa",0,0,null],
bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
z=this.v5
y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+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}},"call$1","gzv",2,0,null,456,[]],
VW:[function(){var z,y,x,w
z=Array(this.v5.length*2)
z.fixed$length=init
@@ -14793,25 +14767,29 @@
this.av=0
this.eZ=this.v5.length
this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
z=this.av
y=this.eZ
-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)
+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)
z=this.eZ
+if(typeof z!=="number")return H.s(z)
y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
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])
+static:{"^":"PO",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
if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
y.T8=null
y.Bb=null
this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
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},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
bB:[function(a){var z,y,x
if(this.aY==null)return
if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
else{y=this.Xu(y)
this.aY=y
y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
fS:[function(a,b){var z,y
this.P6=this.P6+1
this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
a.T8=y.T8
y.T8=null}else{a.T8=y
a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
Ba:{
"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
wS:function(a,b){return this.Cw.call$2(a,b)},
Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
if(this.Ef(b)!==!0)return
if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
Rz:[function(a,b){var z
if(this.Ef(b)!==!0)return
z=this.bB(b)
if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
u:[function(a,b,c){var z
if(b==null)throw H.b(new P.AT(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)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
gl0:function(a){return this.aY==null},
gor:function(a){return this.aY!=null},
aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
V1:[function(a){this.aY=null
this.P6=0
this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
gUQ:function(a){var z=new P.uM(this)
z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
An:{
"^":"Tp:112;a",
call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
$isEH:true},
bF:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
call$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.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
$isEH:true},
S6B:{
"^":"a;",
@@ -14976,7 +14954,7 @@
return this.Wb(z)},
p0:[function(a){var z
for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
G:[function(){var z,y,x
z=this.Dn
if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
$isyN:true},
DN:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
ZM:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
$asS6B:function(a,b){return[b]}},
HW:{
"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
"^":"",
VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
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)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
f1:{
"^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
for(y=this.a,x=0;x<w.length;++x){u=w[x]
v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Uk:{
"^":"a;"},
@@ -15073,12 +15051,12 @@
static:{TP:function(a){return new P.K8(a,null)}}},
by:{
"^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
gZE:function(){return C.Ap},
gHe:function(){return C.A3},
$asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
"^":"zF;Xi",
$aszF:function(){return[P.a,J.O]}},
Cf:{
@@ -15121,7 +15099,7 @@
this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
WD:[function(a){var z=this.qi
if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
rl:[function(a){var z,y,x,w,v
if(!this.IS(a)){x=a
w=this.qi
@@ -15144,7 +15122,7 @@
this.aK(a)
z.KF("\"")
return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
z=this.Vy
z.KF("[")
if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
z.vM=z.vM+","
this.rl(y.t(a,x));++x}}z.KF("]")
this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
w=this.Vy
w.KF("{")
z.a=!0
@@ -15163,13 +15141,13 @@
w.KF("}")
this.qi.Rz(0,a)
return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
b=P.BC()
z=P.p9("")
new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
call$2:[function(a,b){var z,y,x
z=this.a
y=this.b
@@ -15178,13 +15156,13 @@
x.KF("\"")}y.aK(a)
x.KF("\":")
y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
z0:{
"^":"Zi;lH",
goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
"^":"zF;",
WJ:[function(a){var z,y,x
z=J.U6(a)
@@ -15193,7 +15171,7 @@
y=H.VM(Array(y),[J.im])
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)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
$aszF:function(){return[J.O,[J.Q,J.im]]}},
Rw:{
"^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
this.ZP=y+1
if(y>=v)return H.e(z,y)
z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
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)
if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
z[s]=128|v>>>6&63
this.ZP=u+1
if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
"^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
hl:[function(a){var z,y,x,w,v,u
if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
FM:function(a){return new P.HG(a)},
ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,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,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+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,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
O8:function(a,b,c){var z,y,x
z=J.Qi(a,c)
if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
HM:function(a){return H.eT(a)},
fc:function(a){return P.HM(P.O8(1,a,J.im))},
HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
$isEH:true},
CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
call$2:[function(a,b){var z=this.a
if(z.b>0)z.a.KF(", ")
z.a.KF(J.GL(a))
z.a.KF(": ")
z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
p4:{
"^":"a;OF",
@@ -15336,10 +15314,8 @@
"^":"a;"},
iP:{
"^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+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},"call$1","gUJ",2,0,null,109,[]],
iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
EK:function(){H.o2(this)},
RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
$isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
if(z!=null){y=new P.MF()
x=z.QK
@@ -15405,32 +15381,30 @@
return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
return"0"+a},"call$1","wI",2,0,null,198,[]]}},
MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
$isEH:true},
Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
$isEH:true},
a6:{
"^":"a;Fq<",
g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
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)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return this.Fq&0x1FFFFFFF},
iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
$isa6:true,
static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
call$1:[function(a){if(a>=100000)return""+a
if(a>=10000)return"0"+a
if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
call$1:[function(a){if(a>=10)return""+a
return"0"+a},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
@@ -15549,7 +15523,7 @@
return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
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)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
Qz:[function(){var z,y
z=H.of(this,"expando$key")
if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
giO:function(a){return H.eQ(this)},
bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
gbx:function(a){return new H.cu(H.dJ(this),null)},
$isa:true},
Od:{
@@ -15622,7 +15596,7 @@
for(;z.G();){this.vM=this.vM+b
y=z.gl()
y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
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},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
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)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
SK:[function(a){var z,y,x,w,v
if(!this.uo(a))return a
z=[]
@@ -15673,12 +15647,12 @@
z.pop()}x=!0}else if("."===w)x=!0
else{z.push(w)
x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
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))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
bu:[function(a){var z,y
z=P.p9("")
y=this.Fi
@@ -15692,8 +15666,8 @@
z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
n:[function(a,b){var z,y
if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)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
@@ -15708,7 +15682,7 @@
else this.HC=e
this.r0=this.x6(c,d)},
$isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",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)
@@ -15875,18 +15849,18 @@
if(q&&!p)z.call$1("expected a part after last `:`")
if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
r=J.UQ(v,1)
if(typeof r!=="number")return H.s(r)
J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
s=J.UQ(v,3)
if(typeof s!=="number")return H.s(s)
J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$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))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
z=new P.rI()
y=P.p9("")
x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
y.vM=y.vM+u
z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
call$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},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
Kd:{
"^":"Tp:112;",
call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
$isEH:true},
yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z=this.a
if(!z.a)this.b.KF("&")
z.a=!1
@@ -15938,44 +15912,44 @@
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))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$1:[function(a){var z
if(!(48<=a&&a<=57))z=65<=a&&a<=70
else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
$isEH:true},
pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
$isEH:true},
Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
call$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},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
$isEH:true},
wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
call$1:[function(a){var z,y
z=this.b
y=C.xB.j(z,a)
if(this.d.call$1(y)===!0)return y-32
else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
call$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(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
$isEH:true},
Lk:{
"^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
$isEH:true},
XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
call$2:[function(a,b){var z=J.v1(a)
if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
$isEH:true},
Mx:{
"^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
$isEH:true},
C9:{
"^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
z=H.BU(a,null,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
$isEH:true},
kZ:{
"^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
$isEH:true},
JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
call$2:[function(a,b){var z,y
if(b-a>4)this.b.call$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)
@@ -16023,18 +15997,18 @@
"^":"Tp:112;c",
call$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)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z=J.Wx(a)
b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
$isEH:true}}],["dart.dom.html","dart:html",,W,{
"^":"",
UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
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},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
Pv:[function(a){if(a==null)return
return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
if(a==null)return
if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
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(new P.AT(d))
@@ -16118,7 +16088,7 @@
return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
qE:{
"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
zw:{
"^":"Gv;",
$isList:true,
@@ -16130,12 +16100,10 @@
Ps:{
"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
"%":"HTMLAnchorElement"},
Sb:{
"^":"qE;N:target=,cC:hash%,mH:href=",
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
"%":"HTMLAreaElement"},
Xk:{
"^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
Fy:{
"^":"qE;",
$isD0:true,
-$isGv:true,
"%":"HTMLBodyElement"},
QW:{
"^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
Zv:{
"^":"KV;Rn:data=,B:length=",
-$isGv:true,
"%":"Comment;CharacterData"},
Yr:{
"^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
QF:{
"^":"KV;",
JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
gi9:function(a){return C.mt.aM(a)},
gVl:function(a){return C.pi.aM(a)},
gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
$isQF:true,
"%":"Document|HTMLDocument|SVGDocument"},
Aj:{
@@ -16199,10 +16180,9 @@
x=J.w1(y)
x.V1(y)
x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
"%":";DocumentFragment"},
cm:{
"^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
y=this.gwd(a)
y.V1(0)
y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
i4:[function(a){},"call$0","gQd",0,0,null],
xo:[function(a){},"call$0","gbt",0,0,null],
aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
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"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
bA:[function(a,b){var z=a
do{if(J.RF(z,b))return!0
z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
gLm:function(a){return C.i3.f0(a)},
ZL:function(a){},
$iscv:true,
-$isGv:true,
$isD0:true,
"%":";Element"},
Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
"%":"HTMLEmbedElement"},
Ty:{
"^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
ea:{
"^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
$isea:true,
"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
D0:{
"^":"Gv;",
gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
$isD0:true,
"%":";EventTarget"},
as:{
@@ -16293,14 +16282,14 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16309,9 +16298,9 @@
$isXj:true,
"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
$iszU:true,
"%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
"^":"D0;",
"%":";XMLHttpRequestEventTarget"},
tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
"%":"HTMLIFrameElement"},
Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
$isSg:true,
"%":"ImageData"},
pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
oo:function(a,b){return a.complete.call$1(b)},
"%":"HTMLImageElement"},
Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
RR:function(a,b){return a.accept.call$1(b)},
r6:function(a,b){return a.value.call$1(b)},
$isMi:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true,
"%":"HTMLInputElement"},
In:{
"^":"qE;MB:form=,oc:name%,t5:type=",
"%":"HTMLKeygenElement"},
-wP:{
+pL:{
"^":"qE;P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
El:{
"^":"qE;kc:error=,LA:src=",
xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
zm:{
"^":"Gv;tT:code=",
"%":"MediaError"},
@@ -16400,16 +16388,17 @@
"^":"ea;Rn:data=",
"%":"MIDIMessageEvent"},
bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
"%":"MIDIOutput"},
-ab:{
+tH:{
"^":"D0;jO:id=,oc:name=,t5:type=",
"%":"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))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
$isWp:true,
"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
H9:{
@@ -16423,15 +16412,11 @@
y.call$2("subtree",i)
y.call$2("attributeOldValue",d)
y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
"%":"MutationObserver|WebKitMutationObserver"},
o4:{
"^":"Gv;jL:oldValue=,N:target=,t5:type=",
"%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
ih:{
"^":"Gv;G1:message=,oc:name=",
"%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
Tk:[function(a,b){var z,y
try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(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)},"call$2","gZM",4,0,null,332,[],333,[]],
bu:[function(a){var z=a.nodeValue
return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
$isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
yk:{
"^":"ma;",
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16475,7 +16465,7 @@
"^":"qE;t5:type%",
"%":"HTMLOListElement"},
G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
"%":"HTMLObjectElement"},
l9:{
"^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
"^":"qE;P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"HTMLProgressElement"},
-ew:{
+kQ:{
"^":"ea;",
-$isew:true,
+$iskQ:true,
"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
"%":"ResourceProgressEvent"},
j2:{
"^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
"%":"HTMLSelectElement"},
I0:{
"^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
$isI0:true,
"%":"ShadowRoot"},
QR:{
@@ -16548,7 +16538,7 @@
G5:{
"^":"ea;oc:name=",
"%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
"^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
"%":"StorageEvent"},
Lx:{
@@ -16579,7 +16569,7 @@
r6:function(a,b){return a.value.call$1(b)},
$isAE:true,
"%":"HTMLTextAreaElement"},
-xV:{
+R0:{
"^":"Mf;Rn:data=",
"%":"TextEvent"},
RH:{
@@ -16592,9 +16582,12 @@
Mf:{
"^":"ea;",
"%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
if(W.uC(z)===!0)return z
if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
return a._location_wrapper},
@@ -16619,41 +16612,35 @@
geT:function(a){return W.Pv(a.parent)},
cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
gi9:function(a){return C.mt.aM(a)},
gVl:function(a){return C.pi.aM(a)},
gLm:function(a){return C.i3.aM(a)},
$isu9:true,
-$isGv:true,
$isD0:true,
"%":"DOMWindow|Window"},
Bn:{
"^":"KV;oc:name=,P:value%",
r6:function(a,b){return a.value.call$1(b)},
"%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
"^":"qE;",
$isD0:true,
-$isGv: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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.KV]},
$isyN:true,
@@ -16666,14 +16653,14 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.yg]},
$isyN:true,
@@ -16681,19 +16668,19 @@
$asQV:function(){return[W.yg]},
$isXj:true,
"%":"SpeechInputResultList"},
-LO:{
+LOx:{
"^":"kEI;",
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.lj("No elements"))},
Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
$isList:true,
$aszM:function(){return[W.uj]},
$isyN:true,
@@ -16703,12 +16690,12 @@
"%":"SpeechRecognitionResultList"},
QZ:{
"^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
static:{"^":"wk"}},
VG:{
"^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
gB:function(a){return this.vG.length},
t:[function(a,b){var z=this.vG
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=this.vG
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
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=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
if(b.parentNode===z){z.removeChild(b)
return!0}}return!1},"call$1","guH",2,0,null,6,[]],
xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
z=this.vG
y=z.length
x=this.MW
if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
grZ:function(a){var z=this.MW.lastElementChild
if(z==null)throw H.b(new P.lj("No elements"))
return z},
@@ -16760,8 +16742,8 @@
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]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
return z}}},
B1:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
M5:{
"^":"Gv;"},
@@ -16813,11 +16794,11 @@
$asQV:function(){return[W.KV]}},
Kx:{
"^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
$isEH:true},
iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
$isEH:true},
bU:{
"^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
x=this.b
if(y){y=x.MM
if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
e7:{
"^":"ar;NL",
grZ:function(a){var z=this.NL.lastChild
if(z==null)throw H.b(new P.lj("No elements"))
return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-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)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+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())},"call$1","gDY",2,0,null,116,[]],
xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
z=this.NL
y=z.childNodes
x=y.length
if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+oF:[function(a,b,c){var z,y
z=this.NL
y=z.childNodes
if(b<0||b>=y.length)return H.e(y,b)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
z=this.NL
if(z!==b.parentNode)return!1
z.removeChild(b)
@@ -16869,15 +16853,16 @@
z=this.NL
y=z.childNodes
if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
gA:function(a){return C.t5.gA(this.NL.childNodes)},
GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
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]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
$asar:function(){return[W.KV]},
$aszM:function(){return[W.KV]},
$asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
$asQV:function(){return[W.KV]}},
Ou:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
yoo:{
"^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
$asQV:function(){return[W.uj]}},
tJ:{
"^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
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},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
V1:[function(a){var z
for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
$isZ0:true,
$asZ0:function(){return[J.O,J.O]}},
Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
i7:{
"^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
Rz:[function(a,b){var z,y
z=this.MW
y=z.getAttribute(b)
z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
nF:{
"^":"As;QX,Kd",
lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
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)},"call$1","gVH",2,0,null,91,[]],
OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
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)
@@ -17002,27 +16986,27 @@
return z}}},
FK:{
"^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Si:{
"^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
vf:{
"^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Iw:{
"^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Fc:{
"^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
$isEH:true},
I4:{
"^":"As;MW",
@@ -17032,35 +17016,35 @@
if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
p5:[function(a){P.F(a,!0,null)
J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
"^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
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)
z.$builtinTypeInfo=this.$builtinTypeInfo
z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
eu:{
"^":"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])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
$isqh:true},
ie:{
"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
Ea:{
"^":"Tp:112;b",
call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"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])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
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.KS(null)
@@ -17068,16 +17052,16 @@
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)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
$isqh:true},
i2:{
"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
b0:{
"^":"Tp:112;b",
call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Ov:{
"^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
return},"call$0","gZS",0,0,null],
Fv:[function(a,b){if(this.uv==null)return
this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
gRW:function(){return this.VP>0},
QE:[function(){if(this.uv==null||this.VP<=0)return
this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
z=this.eM
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()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
cO:[function(a){var z,y
for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
z.V1(0)
@@ -17116,19 +17100,21 @@
call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
$isEH:true},
bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
Gm:{
"^":"a;",
gA:function(a){return H.VM(new W.W9(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."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
$isList:true,
$aszM:null,
$isyN:true,
@@ -17143,17 +17129,17 @@
V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
t:[function(a,b){var z=this.xa
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=this.xa
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
sB:function(a,b){J.wg(this.xa,b)},
GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
Qg:{
"^":"a;je",
G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
call$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)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
$isEH:true},
dW:{
"^":"a;Ui",
geT:function(a){return W.P1(this.Ui.parent)},
cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+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."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
$isD0:true,
-$isGv:true,
static:{P1:[function(a){if(a===window)return a
else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
Dk:{
@@ -17195,8 +17180,7 @@
gmH:function(a){return this.WK.href},
VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
"^":"",
hF:{
"^":"Gv;",
@@ -17205,156 +17189,92 @@
"^":"",
Dh:{
"^":"zp;N:target=,mH:href=",
-$isGv:true,
"%":"SVGAElement"},
Ue:{
"^":"Eo;mH:href=",
-$isGv:true,
"%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEBlendElement"},
lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
"%":"SVGFEColorMatrixElement"},
pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEComponentTransferElement"},
NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
"%":"SVGFECompositeElement"},
W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEConvolveMatrixElement"},
mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEDiffuseLightingElement"},
kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEDisplacementMapElement"},
bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEFloodElement"},
Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEGaussianBlurElement"},
me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGFEImageElement"},
oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEMergeElement"},
EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
"%":"SVGFEMorphologyElement"},
MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGFETileElement"},
Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
"%":"SVGFETurbulenceElement"},
QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGFilterElement"},
N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
"%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
"^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
zp:{
"^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
"%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
"%":"SVGRectElement"},
j24:{
"^":"d5;t5:type%,mH:href=",
-$isGv:true,
"%":"SVGScriptElement"},
-Lu:{
+ki:{
"^":"d5;t5:type%",
"%":"SVGStyleElement"},
d5:{
@@ -17369,61 +17289,27 @@
gVl:function(a){return C.pi.f0(a)},
gLm:function(a){return C.i3.f0(a)},
$isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|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"},
hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
$ishy:true,
-$isGv:true,
"%":"SVGSVGElement"},
-mq:{
+mHq:{
"^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
"%":";SVGTextContentElement"},
Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
"%":"SVGTextPathElement"},
Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
wD:{
"^":"d5;mH:href=",
-$isGv:true,
"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
O7:{
"^":"As;LO",
lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
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},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
return},"call$2","Cb",4,0,null,96,[],12,[]],
wY:[function(a){var z
if(a==null)return
else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
else z=!0
else z=!0
if(z)return a
else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+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()))}}},"call$1","En",2,0,112,96,[]],
hE:[function(a,b,c){var z=P.Om(a,b)
if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
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=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!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
@@ -17487,12 +17373,10 @@
t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
bu:[function(a){var z,y
try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
V7:[function(a,b){var z,y
z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
$isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
z=P.wY(a)
if(b==null)return P.ND(new z())
y=[null]
@@ -17519,10 +17402,10 @@
z=this.a
if(z.x4(a))return z.t(0,a)
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
z.u(0,a,x)
for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
z.u(0,a,v)
C.Nm.FV(v,y.ez(a,this))
return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
"^":"E4;eh"},
Tz:{
"^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
t:[function(a,b){var z
if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>=z}else z=!0
else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z
if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>=z}else z=!0
else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
if(typeof z!=="number")return H.s(z)
z=b>z}else z=!0
if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
if(J.de(y,0))return
if(e<0)throw H.b(new P.AT(e))
x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
Wk:{
"^":"E4+lD;",
@@ -17607,6 +17488,12 @@
call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
$isEH:true}}],["dart.math","dart:math",,P,{
"^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
J:[function(a,b){var z
if(typeof a!=="number")throw H.b(new P.AT(a))
if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
if(a===0)z=b===0?1/b<0:b<0
else z=!1
if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
if(typeof b!=="number")throw H.b(new P.AT(b))
if(a>b)return a
@@ -17624,17 +17511,166 @@
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},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"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},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+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
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3: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)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*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:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+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},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(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)
+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.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+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)
+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.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+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)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
"^":"",
re:[function(a){var z,y
z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
ej:{
"^":"a;",
$isej:true},
@@ -17692,26 +17728,26 @@
$isZ0:true},
B8q:{
"^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
$isZ0:true},
Nx:{
"^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
gl0:function(a){return this.EV.X5===0},
gor:function(a){return this.EV.X5!==0},
gvc:function(a){var z=this.EV
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)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
gUQ:function(a){var z=this.EV
return z.gUQ(z)},
$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
"^":"Gv;",
J2:[function(a,b,c){var z=J.Wx(b)
if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
$ispF:true,
$isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
df:{
"^":"pF;",
gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
gbx:function(a){return C.hN},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
gbx:function(a){return C.lk},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
gbx:function(a){return C.jV},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
gbx:function(a){return C.Im},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
gbx:function(a){return C.la},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
$asQV:function(){return[J.im]},
$isHY:true,
"%":"Int8Array"},
-aH:{
+us:{
"^":"Pg;",
gbx:function(a){return C.iN},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
gbx:function(a){return C.Vh},
t:[function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
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)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
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)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
u:[function(a,b,c){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
$isList:true,
$aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
$asQV:function(){return[J.im]},
$isHY:true,
"%":";Uint8Array"},
-LZ:{
+b0B:{
"^":"pF;",
gB:function(a){return a.length},
oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
x=d.length
if(x-e<y)throw H.b(new P.lj("Not enough elements"))
if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
$isXj:true},
Dg:{
"^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
$isDg:true,
$isList:true,
$aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
$isQV:true,
$asQV:function(){return[J.GW]}},
Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
$isList:true,
$aszM:function(){return[J.GW]},
$isyN:true,
@@ -17936,9 +17971,8 @@
"^":"Ui+SU7;"},
Pg:{
"^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
$isPg:true,
$isList:true,
$aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
$isQV:true,
$asQV:function(){return[J.im]}},
ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
$isList:true,
$aszM:function(){return[J.im]},
$isyN:true,
@@ -17959,12 +17993,12 @@
return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
return}if(typeof window=="object")return
if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
"^":"",
E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
"@":function(){return[C.uW]},
static:{TW:[function(a){var z,y,x,w
z=$.Nd()
@@ -17978,29 +18012,29 @@
C.OD.ZL(a)
C.OD.G6(a)
return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
"^":"uL+Pi;",
$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
"^":"",
rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
Ki:function(a){return this.gFR(a).call$0()},
VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
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.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
J.xW(b)
z=a.fn
a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
x=R.Jk(y)
J.kW(x,"expr",z)
J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
"@":function(){return[C.Qz]},
static:{Rp:[function(a){var z,y,x,w,v
z=R.Jk([])
@@ -18027,18 +18061,18 @@
C.Gh.ZL(a)
C.Gh.G6(a)
return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
"^":"uL+Pi;",
$isd3:true},
YW:{
"^":"Tp:112;a-82",
call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
$isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
"^":"",
m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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()
@@ -18053,14 +18087,14 @@
C.MC.ZL(a)
C.MC.G6(a)
return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
"^":"",
Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
static:{bH:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
C.LT.ZL(a)
C.LT.G6(a)
return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
"^":"uL+Pi;",
$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
"^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
static:{ZV:[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.Pe=!1
a.SO=z
a.B7=y
@@ -18094,13 +18147,16 @@
C.Xo.ZL(a)
C.Xo.G6(a)
return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
"^":"",
mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.nu]},
static:{N0:[function(a){var z,y,x,w
z=$.Nd()
@@ -18114,37 +18170,154 @@
C.Yu.ZL(a)
C.Yu.G6(a)
return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
"^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[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.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$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))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
"^":"",
jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
i4:[function(a){var z,y
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
a.q3=y
y.bG.u(0,"allowHtml",!0)
J.kW(J.wc(a.q3),"sortColumn",1)
J.kW(J.wc(a.q3),"sortAscending",!1)
y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
a.J0=z
z.bG.u(0,"title","New Space")
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
a.CO=y
y.bG.u(0,"title","Old Space")
y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
a.kg=z
z.bG.u(0,"allowHtml",!0)
J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
hZ:[function(a){var z,y,x,w,v,u
z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
z=J.U6(u)
J.N5(a.GQ,["Used",z.t(u,"used")])
J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
z=J.U6(u)
J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
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},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
iF:[function(a,b,c){var z
switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
case 6:return J.UQ(J.UQ(b,"old"),5)
case 7:return J.UQ(J.UQ(b,"old"),1)
case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
VI:[function(a,b,c){var z
switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
case 6:z=J.U6(b)
return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
ii:[function(a,b,c,d){var z=a.Ol
if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
pM:[function(a,b){this.hZ(a)
this.ct(a,C.Aq,[],this.gOd(a))
this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
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"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
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"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
Q0:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.LY=z
z.Gl("string","Class")
a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
a.LY.Gl("number","Allocated Since GC (old)")
a.LY.Gl("number","Total before GC (old)")
a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.GQ=z
z.Gl("string","Type")
a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.Oc=z
z.Gl("string","Type")
a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
a.bV=z
z.Gl("string","Class")
a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
a.bV.Gl("number","Total before GC")
a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
"@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -18289,44 +18459,51 @@
C.Vc.G6(a)
C.Vc.Dd(a)
return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
"^":"uL+Pi;",
$isd3:true},
nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
$isEH:true},
-"+ nx":[489],
+"+ nx":[501],
jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
$isEH:true},
-"+ jm":[489],
+"+ jm":[501],
ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
$isEH:true},
-"+ ke":[489],
+"+ ke":[501],
xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
$isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
"^":"",
bL:[function(a){var z,y
z=[]
y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$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)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
dg:function(){var z=$.L4
if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
$.L4=z}return z},
@@ -18341,19 +18518,19 @@
for(x=0;x<y;++x)if(z[x]===a)return x
z.push(a)
this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
call$1:[function(a){var z=this.d
if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
call$2:[function(a,b){var z=this.e
if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
$isEH:true},
wO:{
"^":"Tp:115;",
@@ -18368,14 +18545,14 @@
if(typeof a==="number")return a
if(typeof a==="string")return a
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
w=this.UI.call$1(x)
z.a=w
if(w!=null)return w
@@ -18383,7 +18560,7 @@
z.a=w
this.bK.call$2(x,w)
y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
x=this.f.call$1(a)
w=this.UI.call$1(x)
if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
u=0
for(;u<v;++u){z=this.call$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"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true},
CA:{
"^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
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},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
$isEH:true},
YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
call$1:[function(a){var z=this.c
if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
$isEH:true},
KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
call$2:[function(a,b){var z=this.d
if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
$isEH:true},
xL:{
"^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
u=J.w1(y)
t=0
for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
As:{
"^":"a;",
bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
if(!z.tg(0,a)===!0){z.h(0,a)
y=!0}else{z.Rz(0,a)
y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
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)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
ez:[function(a,b){var z=this.lF()
return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
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)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
Rz:[function(a,b){var z,y
if(typeof b!=="string")return!1
z=this.lF()
y=z.Rz(0,b)
this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
grZ:function(a){var z=this.lF().lX
if(z==null)H.vh(new P.lj("No elements"))
return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
OS:[function(a){var z,y
z=this.lF()
y=a.call$1(z)
this.p5(z)
return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
$isyN:true,
$isQV:true,
$asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
u:[function(a,b,c){var z=this.gzT()
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
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(new P.AT("Invalid list length"))
this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
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.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
return!0}}return!1},"call$1","guH",2,0,null,132,[]],
gB:function(a){return this.gzT().length},
t:[function(a,b){var z=this.gzT()
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
gA:function(a){var z=this.gzT()
return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
hT:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
GS:{
"^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
"^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
z=a.tY
if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
else{y=J.w1(z)
y.u(z,"fields",null)
y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
"@":function(){return[C.VW]},
static:{b4:[function(a){var z,y,x,w
z=$.Nd()
@@ -18592,7 +18772,7 @@
C.cp.ZL(a)
C.cp.G6(a)
return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
Js:{
"^":"Tp:112;a-82",
call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
$isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
"^":"",
hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.be]},
static:{HC:[function(a){var z,y,x,w
z=$.Nd()
@@ -18621,20 +18801,20 @@
a.SO=z
a.B7=y
a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
"^":"",
u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
static:{Cu:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
C.b9.ZL(a)
C.b9.G6(a)
return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
"^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+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())
+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))}},"call$0","gz7",0,0,null],
o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
z=H.VM([],[G.Y2])
y=c!=null?J.WB(c.yt,1):0
z=new X.qm(a,b,c,y,z,[],!1,null,null)
z.Af(a,b,c)
return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,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,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
z=a.pD
if(z==null)return
y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
a.FT=this.ct(a,C.XU,a.FT,z)
z=x.bu(0)
a.vk=this.ct(a,C.Dj,a.vk,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")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,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)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+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)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
YF:[function(a,b,c,d){var z,y,x
z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
x=z.rowIndex
if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
"@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-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.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[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.FT=""
a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
C.XH.ZL(a)
C.XH.G6(a)
return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
"^":"uL+Pi;",
$isd3:true},
SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
call$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))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
$isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
"^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+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.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
"@":function(){return[C.aM]},
static:{JR:[function(a){var z,y,x,w
z=$.Nd()
@@ -18787,39 +19041,60 @@
C.Qt.ZL(a)
C.Qt.G6(a)
return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[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.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
"^":"uL+Pi;",
$isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
"^":"",
vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
gkG:[function(a){var z=a.kf
a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
gvc:[function(a){var z,y
z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
"@":function(){return[C.KH]},
static:{mA:[function(a){var z,y,x,w
z=$.Nd()
@@ -18835,13 +19110,13 @@
C.Yt.ZL(a)
C.Yt.G6(a)
return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
"^":"uL+Pi;",
$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
"^":"",
LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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()
@@ -18856,14 +19131,15 @@
C.Z3.ZL(a)
C.Z3.G6(a)
return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
"^":"",
KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"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)
@@ -18876,8 +19152,8 @@
C.MG.ZL(a)
C.MG.G6(a)
return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
"^":"uL+Pi;",
$isd3:true}}],["logging","package:logging/logging.dart",,N,{
"^":"",
@@ -18896,7 +19172,7 @@
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},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
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)
@@ -18906,19 +19182,19 @@
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)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
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()},"call$0","gnc",0,0,null],
od:[function(a,b){var z=this.Gs
if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
QL:function(a,b,c){var z=this.eT
if(z!=null)J.Tr(z).u(0,this.oc,this)},
$isTJ:true,
@@ -18939,10 +19215,8 @@
qV:{
"^":"a;oc>,P>",
r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
C:[function(a,b){var z=J.Vm(b)
if(typeof z!=="number")return H.s(z)
return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
giO:function(a){return this.P},
bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
$isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
HV:{
"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
$isEH:true},
Lb:{
"^":"Tp:112;",
@@ -18985,22 +19259,22 @@
A.Ok()},"call$1",null,2,0,null,113,[],"call"],
$isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
"^":"",
-T4:{
+jh:{
"^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
tzK:{
"^":"a;"},
jA:{
"^":"a;oc>"},
-PO:{
+Jo:{
"^":"a;"},
oBi:{
"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
"^":"",
F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19012,16 +19286,16 @@
C.kD.ZL(a)
C.kD.G6(a)
return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
static:{AJ:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
C.SU.ZL(a)
C.SU.G6(a)
return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
"^":"uL+Pi;",
$isd3:true},
Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
"@":function(){return[C.nh]},
static:{EL:[function(a){var z,y,x,w
z=$.Nd()
@@ -19062,27 +19336,27 @@
C.nn.ZL(a)
C.nn.G6(a)
return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
"^":"uL+Pi;",
$isd3:true},
Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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",368,387],
Ki:function(a){return this.gFR(a).call$0()},
VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
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.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
"@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19096,14 +19370,14 @@
C.J7.ZL(a)
C.J7.G6(a)
return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
"^":"uL+Pi;",
$isd3:true},
tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.NT]},
static:{J8:[function(a){var z,y,x,w
z=$.Nd()
@@ -19118,16 +19392,16 @@
C.lx.ZL(a)
C.lx.G6(a)
return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
"^":"uL+Pi;",
$isd3:true},
fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
"@":function(){return[C.zaS]},
static:{Du:[function(a){var z,y,x,w
z=$.Nd()
@@ -19142,16 +19416,16 @@
C.RR.ZL(a)
C.RR.G6(a)
return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
"^":"uL+Pi;",
$isd3:true},
Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.KI]},
static:{IV:[function(a){var z,y,x,w
z=$.Nd()
@@ -19166,16 +19440,16 @@
C.ct.ZL(a)
C.ct.G6(a)
return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
"^":"uL+Pi;",
$isd3:true},
iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
"@":function(){return[C.t9]},
static:{lT:[function(a){var z,y,x,w
z=$.Nd()
@@ -19190,30 +19464,30 @@
C.xE.ZL(a)
C.xE.G6(a)
return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
"^":"",
lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
z.pC()
z.PI()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
z.pC()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
"@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19227,17 +19501,17 @@
C.k0.G6(a)
C.k0.ZB(a)
return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
"^":"",
uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
Om:[function(a,b){var z,y,x,w
if(b==null)return"-"
z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
z=C.jn.Y(z,60000)
w=C.jn.cU(z,1000)
z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
A5:[function(a,b){var z=J.Wx(b)
if(z.C(b,1024))return H.d(b)+"B"
else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"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"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
"@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
z=$.Nd()
y=P.Py(null,null,null,J.O,W.I0)
x=J.O
@@ -19287,8 +19561,8 @@
for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
if(typeof w!=="number")H.vh(new P.AT(w))
if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
"^":"",
Pi:{
"^":"a;",
@@ -19306,16 +19580,16 @@
x=H.VM(new P.Yp(z),[T.z2])
if(y.Gv>=4)H.vh(y.q7())
y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
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)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
nq:[function(a,b){if(!this.gnz(a))return
if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
"^":"",
z2:{
@@ -19330,7 +19604,7 @@
"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
kb:function(a){return this.rk.call$1(a)},
gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
wE:[function(a){var z,y,x,w,v
if(this.YX)return
@@ -19381,22 +19655,21 @@
$.tW=w
for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+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()
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();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+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},"call$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)},"call$0","Zq",0,0,null],
o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
call$2:[function(a,b){var z=this.a
if(z.a)return
z.a=!0
@@ -19418,14 +19691,14 @@
return this.f.call$0()},"call$0",null,0,0,null,"call"],
$isEH:true},
id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
call$4:[function(a,b,c,d){if(d==null)return d
return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
$isEH:true},
iV:{
"^":"Tp:112;bK,Gq,Rm,w3",
call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
"^":"",
f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
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},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
z=a.length
y=z-1
@@ -19498,10 +19771,10 @@
v=p
y=w}else{u.push(2)
v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
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},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
xU:[function(a,b,c){var z,y,x,w,v,u
z=J.U6(a)
y=z.gB(a)
@@ -19512,7 +19785,7 @@
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},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.Wx(c)
y=J.Wx(f)
@@ -19562,7 +19835,7 @@
s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
break
default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.RE(b)
y=z.gWA(b)
@@ -19581,7 +19854,8 @@
y=J.WB(z,J.q8(u.ok.G4))
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
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
z=J.xH(q.dM,J.q8(q.ok.G4))
if(typeof z!=="number")return H.s(z)
s-=z
@@ -19602,11 +19876,11 @@
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)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
xl:[function(a,b){var z,y
z=H.VM([],[G.DA])
for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
u2:[function(a,b){var z,y,x,w,v,u
if(b.length===1)return b
z=[]
@@ -19616,7 +19890,7 @@
if(u>>>0!==u||u>=x.length)return H.e(x,u)
if(!J.de(v,x[u]))z.push(w)
continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+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},"call$2","W5",4,0,null,73,[],255,[]],
DA:{
"^":"a;WA>,ok,Il<,jr,dM",
gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
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},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
$isDA:true,
static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
z.$builtinTypeInfo=[null]
return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
"^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
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},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
d3:{
"^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
$isd3:true},
lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$2:[function(a,b){var z,y,x,w,v
z=this.b
y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
"^":"",
xh:{
"^":"Pi;L1,AP,Lk",
-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",358],
+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",368],
r6:function(a,b){return this.gP(this).call$1(b)},
-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")},230,[],"value",358],
+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")},230,[],"value",368],
bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
"^":"",
wn:{
@@ -19737,7 +19951,7 @@
if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
this.xg=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
sB:[function(a,b){var z,y,x,w,v,u
z=this.h3
y=z.length
@@ -19765,10 +19979,10 @@
u=[]
w=new P.Yp(u)
w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
t:[function(a,b){var z=this.h3
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
u:[function(a,b,c){var z,y,x,w
z=this.h3
if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
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},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
h:[function(a,b){var z,y,x,w
z=this.h3
y=z.length
@@ -19791,7 +20015,7 @@
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))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
FV:[function(a,b){var z,y,x,w
z=this.h3
y=z.length
@@ -19808,7 +20032,7 @@
UZ:[function(a,b,c){var z,y,x,w,v,u,t
z=b>=0
if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
x=c-b
w=this.h3
@@ -19827,14 +20051,31 @@
z=new H.nH(w,b,c)
z.$builtinTypeInfo=[null]
if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
if(b>c)H.vh(P.TE(b,0,c))
z=z.br(0)
y=new P.Yp(z)
y.$builtinTypeInfo=[null]
this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+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
+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))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
z=this.h3
y=z.length
if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
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(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
iH:[function(a){var z,y
z=this.xg
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)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
nU:[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))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
oC:[function(){var z,y,x
z=this.b3
if(z==null)return!1
@@ -19879,7 +20114,7 @@
if(x){x=H.VM(new P.Yp(y),[G.DA])
if(z.Gv>=4)H.vh(z.q7())
z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
$iswn:true,
static:{uX:function(a,b){var z=H.VM([],[b])
return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
qC:{
"^":"Pi;Zp,AP,Lk",
gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
u:[function(a,b,c){var z,y,x,w,v
z=this.Zp
y=z.gB(z)
@@ -19923,7 +20158,7 @@
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]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+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]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
Rz:[function(a,b){var z,y,x,w,v
z=this.Zp
@@ -19933,7 +20168,7 @@
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},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
V1:[function(a){var z,y,x,w
z=this.Zp
y=z.gB(z)
@@ -19950,76 +20185,61 @@
z.FV(0,a)
return z},Bq:function(a,b,c){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!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])
+if(!!z.$isBa)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}}},
zT:{
"^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
"^":"",
Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+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},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
if(a==null)return
x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+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(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+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.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
if(a==null)return!1
x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+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)){z.PU(b,c)
return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+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.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],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},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+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
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+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},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
pY:[function(a){var z,y
try{z=a.gAY()
@@ -20042,7 +20262,7 @@
if(z!=null){y=z.iE
z=y==null?z!=null:y!==z}else z=!1
if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
sP:[function(a,b){var z,y,x,w
z=this.BK
@@ -20059,7 +20279,7 @@
if(w>=z.length)return H.e(z,w)
if(L.h6(x,z[w],b)){z=this.kN
if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
k0:[function(a){O.Pi.prototype.k0.call(this,this)
this.ov()
this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
if(w===y&&x)u=this.E4(u)
v=this.kN;++w
if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
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
@@ -20102,7 +20322,7 @@
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)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
Rl:[function(a,b){var z,y
if(b==null)b=this.BK.length
if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
if(z>=y.length)return H.e(y,z)
y=y[z]
if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
Kh:[function(a){var z,y,x,w,v
z=this.kN
if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
z=this.BK
if(a>=z.length)return H.e(z,a)
x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
w=y.gvp().w4(!1)
v=w.Lj
w.dB=v.cR(new L.Px(this,a,x))
w.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.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
w=z.gUj(y).w4(!1)
z=w.Lj
w.dB=z.cR(new L.C4(this,a,x))
w.o7=P.VH(P.AY(),z)
w.Bd=z.Al(P.v3())
if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
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
@@ -20156,16 +20375,16 @@
call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
call$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}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
$isEH:true},
C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
call$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}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
$isEH:true},
Md:{
"^":"Tp:115;",
@@ -20174,16 +20393,16 @@
"^":"",
Jk:[function(a){var z,y,x
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
x=Q.uX(null,null)
x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
"^":"",
JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
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())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+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.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+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();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+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=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
Oy:[function(a,b){var z,y
do{z=a.gYK().nb.t(0,b)
y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
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))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
YG:[function(a,b,c){var z,y,x
z=$.cM()
if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
if(y==null)return
x=J.UQ(y,"ShadowCSS")
if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
if(a==null)return""
w=J.RE(a)
z=w.gmH(a)
@@ -20246,36 +20462,34 @@
w.send()
w=w.responseText
return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+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}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
Ad:[function(a,b){var z
if(b==null)b=C.hG
$.Ej().u(0,a,b)
z=$.p2().Rz(0,a)
if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
if(a==null)return
b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
z9:[function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
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},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
ZI:[function(a,b){var z,y
if(a==null)return
@@ -20283,25 +20497,23 @@
J.c9(z,J.nJ(a))
y=a.getAttribute("element")
if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
pX:[function(){var z=window
C.ol.hr(z)
C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),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},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+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
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
z.Gr(A.PB())
return z}A.ei()
@@ -20333,14 +20545,14 @@
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.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+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.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
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
@@ -20392,12 +20604,11 @@
y.$builtinTypeInfo=[H.Kp(r,0)]
for(;y.G();){l=z.gl()
for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+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)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
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
@@ -20421,11 +20632,10 @@
gt5:function(a){return a.zx},
gP1:function(a){return a.aa},
goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?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
@@ -20452,17 +20662,15 @@
A.YG(this.gZf(a),y,z)
w=P.re(a.zx)
v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
this.Ba(a,y)
A.yV(a.RT)},"call$0","gGy",0,0,null],
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},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
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")
@@ -20490,14 +20698,14 @@
if(typeof console!="undefined")console.warn(t)
continue}y=a.Q7
if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
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))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
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)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
y=z.br(z)
x=this.gZf(a)
if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
kO:[function(a,b){var z,y,x,w,v,u
z=P.p9("")
y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
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=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
J3:[function(a,b,c){var z
if(b==="")return
z=document.createElement("style",null)
J.c9(z,b)
z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
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
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+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())}}},"call$1","gHv",2,0,null,257,[]],
qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
du:function(a){a.RT=a.getAttribute("name")
this.yx(a)},
$isXP:true,
@@ -20567,16 +20774,16 @@
call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
$isEH:true},
CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$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)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
ZG:{
"^":"Tp:112;",
@@ -20587,8 +20794,8 @@
call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
$isEH:true},
MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
w12:{
"^":"Tp:115;",
@@ -20597,14 +20804,14 @@
return z},"call$0",null,0,0,null,"call"],
$isEH:true},
r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
$isEH:true},
yL:{
-"^":"nd;",
+"^":"ndx;",
$isyL:true},
zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
gpQ:function(a){return!1},
Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
this.BT(a,!0)},"call$0","gQd",0,0,null],
xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[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)
else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
Se:[function(a,b){var z,y
if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
y=z.ZK(a,a.SO)
this.jx(a,y)
this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
Tp:[function(a,b){var z,y
if(b==null)return
this.gIW(a)
@@ -20649,14 +20854,13 @@
$.od().u(0,z,a)
z.applyAuthorStyles=this.gpQ(a)
z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
z.appendChild(y.ZK(a,a.SO))
this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
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)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
aC:[function(a,b,c,d){var z=J.x(b)
if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
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.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
B2:[function(a,b){var z=J.ak(a.dZ)
if(z==null)return
return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
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)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
Id:[function(a,b){var z,y
z=H.vn(a).rN(b).gAx()
y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
t.bw(a,y,c,d)
this.Id(a,z.gIf())
J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
gCd:function(a){return J.QE(M.Ky(a))},
Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
z=a.oq
if(z!=null){z.TP(0)
a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
Xl:[function(a){var z,y,x,w,v,u
z=J.xR(a.dZ)
y=J.YP(a.dZ)
x=z==null
if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+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()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
rJ:[function(a,b,c,d){var z,y,x,w,v
z=J.xR(a.dZ)
if(z==null)return
y=z.t(0,b)
if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+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")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+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)
x=w.Lj
@@ -20762,7 +20963,7 @@
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)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
l5:[function(a,b){var z=a.Sa.Rz(0,b)
if(z==null)return!1
z.ed()
@@ -20786,7 +20987,7 @@
t=new W.Ov(0,w.uv,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)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
iw:[function(a,b){var z,y,x,w,v,u,t
z=J.RE(b)
if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
u=J.UQ($.QX(),v)
t=w.t(0,u!=null?u:v)
if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+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))+")")},"call$1","gD4",2,0,583,378,[]],
+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))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(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(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
$iszs:true,
$isTU:true,
$isd3:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true},
WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=J.Vs(this.a)
if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
Xi:{
"^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
$isEH:true},
TV:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
$isEH:true},
Mq:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
$isEH:true},
Oa:{
"^":"Tp:115;a",
call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
$isEH:true},
n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
call$2:[function(a,b){var z,y,x
z=this.e
if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
if(y!=null){z=this.b
x=J.RE(b)
J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
$isEH:true},
xf:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
call$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+"())")
@@ -20866,26 +21064,26 @@
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])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
$isEH:true},
Rs:{
"^":"Tp:112;c,d,e",
call$1:[function(a){var z,y,x,w,v,u
z=this.e
y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+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.ao(v,C.xB.yn(w,1),null)
w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
$isEH:true},
uJ:{
"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
$isEH:true},
hm:{
"^":"Tp:112;",
@@ -20908,16 +21106,15 @@
X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
EC:[function(a){this.dY=a
this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
G6:function(a){this.Pa(a)},
static:{oa:function(a){var z,y,x,w
z=$.Nd()
@@ -20931,17 +21128,16 @@
C.Iv.ZL(a)
C.Iv.G6(a)
return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
$iszs:true,
$isTU:true,
$isd3:true,
$iscv:true,
-$isGv:true,
$isD0:true,
$isKV:true},
GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
$isd3:true},
bS:{
"^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
$isEH:true},
Fn:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
$isEH:true},
e3:{
"^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
$isEH:true},
pM:{
"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
$isEH:true},
-jh:{
+Mh:{
"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
"^":"",
Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
if(z!=null)return z.call$2(a,b)
try{y=C.xr.kV(J.JA(a,"'","\""))
return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
W6:{
"^":"Tp:115;",
call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
return z},"call$0",null,0,0,null,"call"],
$isEH:true},
Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z,y
try{z=P.Gl(a)
return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
$isEH:true},
ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
mf:{
"^":"Tp:112;a",
call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
$isEH:true},
HK:{
"^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
"^":"",
ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
o8:{
"^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
$isEH:true},
ex:{
"^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
$isEH:true},
e9:{
"^":"ve;",
@@ -21065,65 +21259,60 @@
y.w5()
x=y.o9()
if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$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?H.B7([],P.L5(null,null,null,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)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
$isEH:true},
uK:{
"^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$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?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
$isEH:true},
mY:{
"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
u0:function(a){return this.uI.call$1(a)},
KX:[function(a){var z,y
z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+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)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(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:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
mB:{
"^":"Tp:112;a,b",
call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
$isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
"^":"",
XF:{
@@ -21136,31 +21325,29 @@
bX:{
"^":"Tp;a,b",
call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
"^":"",
OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
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.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
x.push(w.gT8())
z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
t=z.a.ghP()
u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+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.call$0()
u=J.vF(z.a)}else{y.call$0()
u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
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)))
if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){var z=H.Og(P.a)
z=H.KT(z,[z]).BD(b)
if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
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(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
else w=!0
if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+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"))},"call$1","gIA",2,0,null,12,[]],
tI:[function(a){var z
@@ -21286,12 +21472,12 @@
gju: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)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
DX:[function(a){var z
this.yc(0,a)
z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
yc:[function(a,b){var z,y,x
z=this.tj
if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
z=this.Lv
if(z==null?y!=null:z!==y){x=this.k6
if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
$ishw:true},
Ed:{
"^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
co:[function(a){var z,y
z=J.UK(a.ghP(),this)
y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
CU:[function(a){var z,y,x
z=J.UK(a.ghP(),this)
y=J.UK(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)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
ZR:[function(a){var z,y,x,w,v
z=J.UK(a.ghP(),this)
y=a.gre()
@@ -21333,21 +21519,21 @@
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){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
o0:[function(a){var z,y
z=H.VM(new H.A8(a.gPu(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},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
YV:[function(a){var z,y,x
z=J.UK(a.gG3(a),this)
y=J.UK(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)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
im:[function(a){var z,y,x
z=J.UK(a.gBb(),this)
y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
y=J.UK(a.gT8(),this)
x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
Os:{
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
Wh:{
"^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.EZ]},
$isEZ:true,
$ishw:true},
@@ -21391,27 +21577,27 @@
return z.gP(z)},
r6:function(a,b){return this.gP(this).call$1(b)},
Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
$asAy: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())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.kB]},
$iskB:true,
$ishw:true},
ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
$isEH:true},
qR:{
"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.ae]},
$isae:true,
$ishw:true},
@@ -21424,21 +21610,20 @@
z=this.KL
this.Lv=J.UQ(a,z.gP(z))
y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+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)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.w6]},
$isw6:true,
$ishw:true},
Qv:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
Xm:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
mv:{
"^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
y=$.ww().t(0,z.gkp(z))
if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.jK]},
$isjK:true,
$ishw:true},
@@ -21458,7 +21643,7 @@
"^":"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,w
+Qh:[function(a){var z,y,x
z=this.KL
y=$.e6().t(0,z.gkp(z))
if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
else{x=this.Bb
if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+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.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.uk]},
$isuk:true,
$ishw:true},
@@ -21491,20 +21672,19 @@
return}y=this.KL
x=new H.GD(H.u1(y.goc(y)))
this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.x9]},
$isx9:true,
$ishw:true},
Li:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
WK:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
iT:{
"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
return}y=this.Jn.gLv()
x=J.U6(z)
this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.zX]},
$iszX:true,
$ishw:true},
-ja:{
+tE:{
"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
ey:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
fa:{
"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
x=this.hP.gLv()
if(x==null){this.Lv=null
return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.Jy]},
$isJy:true,
$ishw:true},
@@ -21553,13 +21732,12 @@
call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
$isEH:true},
vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
$isEH:true},
a9:{
"^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
$isEH:true},
VA:{
"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
z=this.Bb
y=this.T8.gLv()
x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+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))
x=J.Vm(z)
w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
$asAy:function(){return[U.K9]},
$isK9:true,
$ishw:true},
@@ -21581,11 +21759,11 @@
call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
$isEH:true},
fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
$isfk:true},
wL:{
"^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
$iswL:true,
$isEH:true},
B0:{
@@ -21600,33 +21778,33 @@
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},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
Zm:[function(a,b){var z=J.WB(a,b)
if(typeof z!=="number")return H.s(z)
a=536870911&z
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
Up:[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)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
tc:{
"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
hw:{
"^":"a;",
$ishw:true},
EZ:{
"^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
$isEZ:true},
no:{
"^":"hw;P>",
r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){var z=this.P
return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
$isno:true},
kB:{
"^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return U.au(this.Pu)},
$iskB:true},
ae:{
"^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.G3.P)
y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
$isae:true},
XC:{
"^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return J.v1(this.wz)},
$isXC:true},
w6:{
"^":"hw;P>",
r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return this.P},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){return J.v1(this.P)},
$isw6:true},
jK:{
"^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.kp)
y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
$isjK:true},
uk:{
"^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y,x
z=J.v1(this.kp)
y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
$isuk:true},
K9:{
"^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=this.Bb
z=z.giO(z)
@@ -21722,12 +21896,10 @@
$isK9:true},
zX:{
"^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+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)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.hP)
y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
$iszX:true},
x9:{
"^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y
z=J.v1(this.hP)
y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
$isx9:true},
Jy:{
"^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
n:[function(a,b){var z
if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+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)},"call$1","gUJ",2,0,null,96,[]],
giO:function(a){var z,y,x
z=J.v1(this.hP)
y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
$isJy:true},
xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
"^":"",
FX:{
@@ -21771,10 +21943,10 @@
if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
else z=!0
if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
o9:[function(){if(this.fL.lo==null){this.Sk.toString
return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
BH:[function(a,b){var z,y,x,w,v
for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
z.toString
@@ -21782,25 +21954,21 @@
z.toString
a=new U.zX(a,w)}else break
else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}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()
v=this.o9()
z.toString
a=new U.K9(a,v)}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},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){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)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
Tw:[function(a){var z,y,x
z=this.fL.lo
this.w5()
@@ -21832,7 +22000,7 @@
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()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
Ai:[function(){var z,y,x
switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
y=J.x(z)
@@ -21907,28 +22075,26 @@
this.Sk.toString
y=H.VM(new U.no(z),[null])
this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
yj:[function(a){var z,y
z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
this.Sk.toString
y=H.VM(new U.no(z),[null])
this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
"^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+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)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"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.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
"+IndexedValue":[0],
Bt:{
"^":"mW;YR",
@@ -21945,7 +22111,7 @@
return z},
Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
$asmW:function(a){return[[K.Ae,a]]},
$asQV:function(a){return[[K.Ae,a]]}},
vR:{
@@ -21965,14 +22131,14 @@
z=a.gAY()
if(z!=null&&!J.de(z.gUx(),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},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
"^":"",
wX:[function(a){switch(a){case 102:return 12
case 110:return 10
case 114:return 13
case 116:return 9
case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
Pn:{
"^":"a;fY>,P>,G8<",
r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
x=H.eT(v)
z.vM=z.vM+x
this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
hA:{
"^":"a;G1>",
bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
"^":"",
fr:{
"^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
d2:{
"^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
CU:[function(a){J.UK(a.ghP(),this)
J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
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)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
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)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
YV:[function(a){J.UK(a.gG3(a),this)
J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
im:[function(a){J.UK(a.gBb(),this)
J.UK(a.gT8(),this)
this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
this.xn(a)},"call$1","ghe",2,0,null,96,[]],
ky:[function(a){J.UK(a.gBb(),this)
J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
"^":"",
JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
"@":function(){return[C.Is]},
static:{Zo:[function(a){var z,y,x,w
z=$.Nd()
@@ -22128,27 +22294,27 @@
C.Cc.ZL(a)
C.Cc.G6(a)
return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
"^":"uL+Pi;",
$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
"^":"",
knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
gD5:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
z=J.u6(a.zw,0)
y=a.tY
if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
goc:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
z=J.u6(a.zw,0)
y=a.tY
if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
"@":function(){return[C.Ur]},
static:{Th:[function(a){var z,y,x,w
z=$.Nd()
@@ -22164,17 +22330,17 @@
C.c0.ZL(a)
C.c0.G6(a)
return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
"^":"xI+Pi;",
$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
"^":"",
fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Uz
@@ -22188,9 +22354,9 @@
y=J.UQ(z.gu9(),J.f2(b))
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"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
"@":function(){return[C.I3]},
static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
z=$.Nd()
@@ -22205,16 +22371,16 @@
C.cJ.ZL(a)
C.cJ.G6(a)
return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
"^":"uL+Pi;",
$isd3:true},
-qq:{
+l0:{
"^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
$isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
"^":"",
Er:[function(a){var z
if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
return z},"call$1","XI",2,0,null,190,[]],
Io:[function(a){var z=J.rY(a)
if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
f3:[function(a,b,c){var z,y,x,w,v
for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
z.H4(b,c)
@@ -22252,31 +22419,29 @@
z.$builtinTypeInfo=[null,null]
z=new D.SI(z,b,null,null,null,null,null,null,null)
z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
G8:{
"^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
Jb:[function(a){var z,y
z=J.U6(a)
y=z.t(a,"id")
z.t(a,"type")
if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.cI().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y,x
z=this.F1
y=J.im
@@ -22284,58 +22449,44 @@
x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
x.H4(z,a)
return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
$asG8:function(){return[D.rj]},
static:{"^":"RI"}},
q1:{
"^":"Tp:112;a",
call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
$isEH:true},
jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.xN().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y,x
z=this.F1
y=J.im
x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
x.H4(z,a)
return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
pl:[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()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
$asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
$isEH:true},
du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.Yk().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y
z=this.F1
y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
$asG8:function(){return[D.SI]},
static:{"^":"Oi"}},
xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
pJ:[function(a){var z=$.uG().Ej
if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
tR:[function(a){var z,y
z=this.F1
y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
return y},"call$1","gUU",2,0,null,98,[]],
$asG8:function(){return[D.SI]},
static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
gPj:function(a){return this.KG},
gHP:function(){return"#/"+H.d(this.KG)},
gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
z=D.SI
y=J.O
this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
this.fq.toString
z=$.cI().Ej
y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
z=$.uG().Ej
if(y)H.vh(new P.AT(a))
if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
tM:[function(a,b){var z,y,x,w
D.Ch(b,this.zf,this)
this.nr=!1
@@ -22432,9 +22660,9 @@
y=F.Wi(this,C.tP,this.cL,y)
this.cL=y
y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
x=H.B7([],P.L5(null,null,null,null,null))
J.kH(z.t(b,"timers"),new D.Qq(x))
y=this.LE
@@ -22446,33 +22674,71 @@
w.u(y,"dart",x.t(0,"time_dart_execution"))
y=J.UQ(z.t(b,"heap"),"usedNew")
this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+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)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[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)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[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()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
$isbv:true},
D3:{
"^":"af+Pi;",
$isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
call$1:[function(a){var z=this.a
return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
$isEH:true},
Qq:{
"^":"Tp:112;a",
call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
$isEH:true},
Qd:{
"^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
gzf:function(){return this.Gt},
VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
l9:[function(a){var z=[]
J.kH(this.i2,new D.i6(a,z))
H.bQ(z,new D.r2(this))
J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
AQ:[function(a){var z,y,x,w
z=this.i2
y=J.U6(z)
@@ -22480,14 +22746,14 @@
if(x!=null)return x
w=P.L5(null,null,null,J.O,J.GW)
w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
x.nr=C.xB.nC("@Isolate","@")
x.mQ=D.Io("@Isolate")
x.DC(0)
x.pC()
y.u(z,a,x)
x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
Ze:[function(a){var z,y,x,w,v
z=J.UQ(a,"id")
y=this.i2
@@ -22496,21 +22762,21 @@
if(w!=null){w.eC(a)
return w}v=P.L5(null,null,null,J.O,J.GW)
v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
w.H4(null,a)
w.pC()
x.u(y,z,w)
w.xW(0)
return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true},
r2:{
"^":"Tp:112;c",
call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
$isEH:true},
JB:{
"^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
w=J.U6(x)
if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
u.H4(null,a)
u.pC()
N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
$isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
$isEH:true},
BH:{
"^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
$isEH:true},
SI:{
"^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
y=y.t(0,"name")
this.GR=this.ct(this,C.KS,this.GR,y)
y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
gl0:function(a){var z=this.RF.Zp
return z.gB(z)===0},
gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
gB:function(a){var z=this.RF.Zp
return z.gB(z)},
BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
k0:[function(a){return},"call$0","gqw",0,0,114],
ni:[function(a){this.RF.AP=null
return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
$isd3:true},
pt:{
"^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
tM:[function(a,b){var z,y
z=J.U6(b)
y=z.t(b,"kind")
this.J6=F.Wi(this,C.fy,this.J6,y)
z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,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)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
wVq:{
"^":"af+Pi;",
$isd3:true},
c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
$isc2:true},
rj:{
"^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
tM:[function(a,b){var z,y,x
z=J.U6(b)
if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
this.GR=this.ct(this,C.KS,this.GR,y)
y=z.t(b,"kind")
this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
aq:[function(a){var z,y,x,w,v
if(this.nr)this.xW(0)
z=J.U6(a)
@@ -22641,7 +22907,7 @@
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}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
W8:[function(a){var z,y,x,w,v
this.nr=!0
if(a==null)return
@@ -22653,7 +22919,7 @@
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]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
$isrj:true},
dZL:{
"^":"af+Pi;",
@@ -22662,50 +22928,56 @@
"^":"a;Yu<,Du<,fF<",
$isN8:true},
Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
xt:[function(){var z,y
z=this.Yu
y=J.x(z)
if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
Io:[function(a){var z
if(a==null)return""
z=J.UQ(a.gyP(),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())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
HU:[function(a){var z
if(a==null)return""
z=J.UQ(a.gyP(),this.Yu)
if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
WAE:{
"^":"a;uX",
bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
if(z.n(a,"Native"))return C.nj
else if(z.n(a,"Dart"))return C.l8
else if(z.n(a,"Collected"))return C.WA
else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
Vi:{
"^":"a;tT>,Av<",
$isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",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],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",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],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
this.Du=0
this.fF=0
@@ -22727,7 +22999,7 @@
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())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
eL:[function(a,b,c){var z,y
this.jv=F.Wi(this,C.QK,this.jv,c)
z=J.U6(a)
@@ -22739,8 +23011,8 @@
if(y!=null)this.pd(y)
z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
tM:[function(a,b){var z,y,x
z=J.U6(b)
this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
y=this.Fm
y=D.Lr(y.zf,y,z.t(b,"function"))
this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
x=z.t(b,"disassembly")
if(x!=null)this.xs(x)
z=this.va
y=J.U6(z)
this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
xs:[function(a){var z,y,x,w,v,u,t,s
z=this.va
y=J.w1(z)
@@ -22774,7 +23049,7 @@
t=x.t(a,w+2)
s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
pd:[function(a){var z,y,x,w,v,u
z=J.U6(a)
y=this.yP
@@ -22785,117 +23060,49 @@
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}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
F3:[function(a){var z,y,x
for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
Ov:[function(a,b){var z,y
for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
$iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
w8F:{
"^":"af+Pi;",
$isd3:true},
fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
$isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
call$2:[function(a,b){var z,y
z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
$isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
"^":"",
XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
z6:[function(a,b){var z=this.Yu
N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
dT:{
"^":"Tp:112;",
call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
$isEH:true},
ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
bI:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
z=this.ja
v=z.t(0,y)
z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
z6:[function(a,b){var z,y,x
z=""+this.yb
y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
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),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
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,{
"^":"",
ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
hu:[function(a){var z
switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
J.X8(z,a.mC)
return z
case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
return z
case"Code":z=W.r3("code-view",null)
J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
case"Function":z=W.r3("function-view",null)
J.dk(z,a.mC)
return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
J.ti(z,a.mC)
return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
case"IsolateList":z=W.r3("isolate-list",null)
J.oq(z,a.mC)
return z
@@ -22965,7 +23178,7 @@
case"StackTrace":z=W.r3("stack-trace",null)
J.yO(z,a.mC)
return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
fa:[function(a,b){var z,y,x
a.textContent=""
z=a.mC
@@ -22988,32 +23201,32 @@
C.ZO.ZL(a)
C.ZO.G6(a)
return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
"^":"uL+Pi;",
$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
"^":"",
xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
gO3:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
gOL:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
gD5:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
goc:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
"@":function(){return[C.JD]},
static:{lK:[function(a){var z,y,x,w
z=$.Nd()
@@ -23028,15 +23241,43 @@
C.wU.ZL(a)
C.wU.G6(a)
return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
"^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"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.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
"^":"",
nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
"@":function(){return[C.pE]},
static:{an:[function(a){var z,y,x,w
z=$.Nd()
@@ -23050,16 +23291,16 @@
C.dX.ZL(a)
C.dX.G6(a)
return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
"^":"uL+Pi;",
$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
"^":"",
Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",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,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",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,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
"@":function(){return[C.js]},
static:{bV:[function(a){var z,y,x,w
z=$.Nd()
@@ -23073,20 +23314,20 @@
C.bg.ZL(a)
C.bg.G6(a)
return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
"^":"uL+Pi;",
$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
"^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
case"radio":case"select-multiple":case"select-one":return z.gi9(a)
default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
iX:[function(a,b){var z,y,x,w,v,u,t,s
z=M.pN(a,b)
y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+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
@@ -23094,7 +23335,7 @@
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)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
HP:[function(a,b,c,d,e){var z,y,x
if(b==null)return
if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
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)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
bM:[function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
pN:[function(a,b){var z,y
z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+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},"call$2","vw",4,0,null,263,[],285,[]],
F5:[function(a,b){var z,y,x
z={}
z.a=null
@@ -23124,9 +23365,9 @@
if(y==null){x=[]
z.a=x
y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
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),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+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)
@@ -23154,7 +23395,7 @@
t.push(L.ao(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)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
z=a.length
if(z===0)return
@@ -23172,30 +23413,30 @@
v=t+2}if(v===z)w.push("")
z=new M.HS(w,null)
z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
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}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
Ky:[function(a){var z,y,x,w
z=$.rw()
z.toString
y=H.of(a,"expando$values")
x=y==null?null:H.of(y,z.Qz())
if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+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.$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 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=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
else z=!0
else z=!1
return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
"^":"TU;N1,mD,Ck",
Z1:[function(a,b,c,d){var z,y,x,w,v
J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
y=this.gN1()
if(z){H.Go(y,"$isQl")
y.toString
@@ -23221,29 +23460,29 @@
z=d!=null?d:""
x=new M.D8(w,y,c,null,null,v,z)
x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
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)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
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,u
+EC:[function(a){var z,y,x,w,v
z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+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)},"call$1","gH0",2,0,null,230,[]]},
H2:{
"^":"TR;",
cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
$isEH:true},
fTP:{
"^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
ppY:{
"^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
$isEH:true},
NP:{
"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
FC:[function(a){var z=J.Vm(this.gH())
J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
jt:{
"^":"H2;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)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
z=J.Hf(X.TR.prototype.gH.call(this))
J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$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();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+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()},"call$1","gqf",2,0,157,21,[]],
static:{kv:[function(a){var z,y,x
z=J.RE(a)
if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
call$1:[function(a){var z,y
z=this.a
y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)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},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
$isEH:true},
jz:{
"^":"Tp:112;b",
call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
$isEH:true},
SA:{
"^":"H2;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
@@ -23347,14 +23585,14 @@
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)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,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},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
$isEH:true},
nv:{
"^":"Tp:112;",
@@ -23367,8 +23605,7 @@
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()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+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
@@ -23382,7 +23619,7 @@
x.Og(z,"checked",c,d)
x.Ca=M.IP(z).yI(x.gqf())
z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
K6:{
"^":"a;Cd>,wd>,N2<,Te<"},
TU:{
@@ -23392,7 +23629,7 @@
z=$.pl()
y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
Ih:[function(a,b){var z
if(this.mD==null)return
z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
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,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
$isTU:true},
yp:{
"^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
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()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+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())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
DT:{
"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+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
@@ -23462,7 +23693,7 @@
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)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
Ih:[function(a,b){var z
switch(b){case"bind":z=this.kr
if(z==null)return
@@ -23495,32 +23726,30 @@
P.rb(z.gjM())}},"call$0","geB",0,0,null],
a5:[function(a,b,c){var z,y,x,w,v,u,t
z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(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("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+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},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
gk8:function(){return this.lr},
gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+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.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
gjb:function(a){var z
this.Sy()
z=this.jH
@@ -23529,43 +23758,38 @@
if(this.mj===!0)return!1
M.oR()
this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+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(new P.AT("instanceRef should not be supplied for attribute templates."))
v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
$isDT:true,
static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+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.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
z=J.VN(a)
if(W.Pv(z.defaultView)==null)return z
y=$.LQ().t(0,z)
if(y==null){y=z.implementation.createHTMLDocument("")
for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],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)
@@ -23580,38 +23804,37 @@
v.removeAttribute(w)
y.setAttribute(w,u)
break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
z=J.nX(a)
if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
z=new M.OB()
y=J.MK(a,$.cz())
if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],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)},"call$0","Lv",0,0,null]}},
OB:{
"^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
$isEH:true},
Uf:{
"^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"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())},
r6:function(a,b){return this.gP(this).call$1(b)},
sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
return L.ao(this.lr,this.ay,null)},
cO:[function(a){var z=this.ud
if(z==null)return
@@ -23620,7 +23843,7 @@
this.ud=null},"call$0","gJK",0,0,null],
$isTR:true},
NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
call$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
@@ -23632,7 +23855,7 @@
z.a=w
z=w}else z=x
z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
$isEH:true},
HS:{
"^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
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])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[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])
@@ -23662,7 +23885,7 @@
if(t>=z.length)return H.e(z,t)
u=z[t]
u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
Yn:function(a){this.bX=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",
@@ -23687,11 +23910,11 @@
Az:[function(a){var z,y,x,w
z=this.xG
this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+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&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+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:[]
@@ -23709,7 +23932,7 @@
if(z)return x
w=M.Ky(x).gkr()
if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
lP:[function(a,b,c,d){var z,y,x,w,v,u
z=J.Wx(a)
y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
v=J.TZ(this.e9.N1)
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)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
MC:[function(a){var z,y,x,w,v,u,t,s
z=[]
z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
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)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
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=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+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(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+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(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+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,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),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))},"call$1","gZX",2,0,632,251,[]],
+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))},"call$1","gZX",2,0,650,254,[]],
uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
Gb:[function(){var z=this.IY
if(z==null)return
z.ed()
@@ -23783,20 +24004,20 @@
this.pq=!0},"call$0","gJK",0,0,null]},
VU:{
"^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
$isEH:true},
Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
call$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]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
$isEH:true},
R7:{
"^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
$isEH:true},
Ya:{
"^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
x=new M.ic(y,c,null,null,"text",x)
x.Og(y,"text",c,d)
z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
ic:{
"^":"TR;qP,ZY,xS,PB,eS,ay",
EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
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()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+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())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
"^":"",
ve:{
"^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
this.qP=null
this.ZY=null},"call$0","gJK",0,0,null],
Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+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.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
VD:{
"^":"Tp:112;a",
call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
$isEH:true}}],])
I.$finishClasses($$,$,null)
$$=null
@@ -24001,9 +24220,9 @@
P.Ys.$isej=true
P.Ys.$isa=true
X.TR.$isa=true
-F.d3.$isa=true
P.MO.$isMO=true
P.MO.$isa=true
+F.d3.$isa=true
W.ea.$isea=true
W.ea.$isa=true
P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
D.bv.$isaf=true
D.bv.$isa=true
D.c2.$isa=true
-D.Vi.$isVi=true
D.Vi.$isa=true
D.Q4.$isa=true
D.N8.$isa=true
W.zU.$isD0=true
W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
W.tV.$iscv=true
W.tV.$isKV=true
W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
H.Uz.$isej=true
H.Uz.$isej=true
H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
P.dl.$isdl=true
P.dl.$isa=true
V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
J.AA=function(a){return J.RE(a).GB(a)}
J.AB=function(a){return J.RE(a).gkU(a)}
J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
J.EC=function(a){return J.RE(a).giC(a)}
J.EY=function(a,b){return J.RE(a).od(a,b)}
J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
J.F6=function(a,b){return J.RE(a).stD(a,b)}
J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
J.GL=function(a){return J.RE(a).gfN(a)}
J.GP=function(a){return J.w1(a).gA(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.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
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.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+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.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.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
J.Mz=function(a){return J.rY(a).hc(a)}
J.N5=function(a,b){return J.RE(a).RP(a,b)}
J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
J.Ng=function(a){return J.RE(a).gxX(a)}
+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.OE=function(a,b){return J.RE(a).sfg(a,b)}
J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
J.QC=function(a){return J.w1(a).wg(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.QQ=function(a,b){return J.RE(a).sRu(a,b)}
J.Qr=function(a,b){return J.RE(a).skc(a,b)}
J.RF=function(a,b){return J.RE(a).WO(a,b)}
J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
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.Vm=function(a){return J.RE(a).gP(a)}
J.Vq=function(a){return J.RE(a).xo(a)}
J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
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.YP=function(a){return J.RE(a).gQ7(a)}
J.YV=function(a){return J.RE(a).goE(a)}
J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
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.c1=function(a,b){return J.Wx(a).O(a,b)}
J.c9=function(a,b){return J.RE(a).sa4(a,b)}
J.cG=function(a){return J.RE(a).Ki(a)}
J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
J.f5=function(a){return J.RE(a).gI(a)}
J.fH=function(a,b){return J.RE(a).stT(a,b)}
J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
J.i4=function(a,b){return J.w1(a).Zv(a,b)}
J.iG=function(a,b){return J.RE(a).szZ(a,b)}
J.iZ=function(a){return J.RE(a).gzZ(a)}
J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
J.jf=function(a,b){return J.x(a).T(a,b)}
J.kE=function(a,b){return J.U6(a).tg(a,b)}
J.kH=function(a,b){return J.w1(a).aN(a,b)}
J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
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.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
J.oE=function(a,b){return J.Qc(a).iM(a,b)}
J.og=function(a,b){return J.RE(a).sIt(a,b)}
J.on=function(a){return J.RE(a).gtT(a)}
J.oq=function(a,b){return J.RE(a).si2(a,b)}
J.pO=function(a){return J.U6(a).gor(a)}
J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
J.pe=function(a,b){return J.RE(a).pr(a,b)}
J.q8=function(a){return J.U6(a).gB(a)}
J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
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.tH=function(a,b){return J.w1(a).KI(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)}
@@ -24308,8 +24543,10 @@
return J.Wx(a).C(a,b)}
J.uH=function(a,b){return J.rY(a).Fr(a,b)}
J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
J.v1=function(a){return J.x(a).giO(a)}
J.vF=function(a){return J.RE(a).gbP(a)}
+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.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
J.xR=function(a){return J.RE(a).ghf(a)}
J.xW=function(a){return J.RE(a).e6(a)}
J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
J.yO=function(a,b){return J.RE(a).stN(a,b)}
J.yj=function(a){return J.RE(a).gG1(a)}
J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
C.J0=B.G6.prototype
C.KZ=new H.hJ()
C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
C.Fm=new J.kn()
C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
C.x0=new J.Jh()
C.oD=new J.P()
C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
C.IU=new P.kF()
C.Us=new A.yL()
C.Nw=new K.vly()
C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
C.xE=A.iL.prototype
C.YZ=Q.Tg.prototype
C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
C.l8=new D.WAE("Dart")
C.nj=new D.WAE("Native")
C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
C.IK=O.CN.prototype
C.YD=F.Be.prototype
C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
C.nh=new A.V3("nav-menu-item")
C.KI=new A.V3("library-nav-menu")
C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
C.nu=new A.V3("function-view")
C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
C.U8=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.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
C.jy=new A.V3("breakpoint-list")
C.VW=new A.V3("instance-ref")
C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
C.zaS=new A.V3("isolate-nav-menu")
C.t9=new A.V3("class-nav-menu")
C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
C.JD=new A.V3("service-ref")
C.Ug=new A.V3("nav-bar")
C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
C.ny=new P.a6(0)
C.OD=F.E9.prototype
C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.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.kQ])
+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.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
C.MC=D.m8.prototype
C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
C.Vc=K.jY.prototype
C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
C.b9=L.u7.prototype
C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
C.Nm=J.Q.prototype
C.ON=J.GW.prototype
C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
}
C.xr=new P.by(null,null)
C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
C.Yt=Z.vj.prototype
C.VZ=new N.qV("FINER",400)
C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+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.MEG=I.makeConstantList(["enumerate"])
C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
C.cJ=U.fI.prototype
C.ZO=U.ob.prototype
C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
C.dX=K.nm.prototype
C.bg=X.Vu.prototype
C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
C.wh=new H.GD("app")
C.S4=new H.GD("busy")
C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
C.XA=new H.GD("cls")
C.b1=new H.GD("code")
C.h1=new H.GD("currentHash")
C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
C.Jw=new H.GD("displayValue")
C.nN=new H.GD("dynamic")
C.tP=new H.GD("entry")
C.YU=new H.GD("error")
C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
C.CX=new H.GD("fileAndLine")
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.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
C.rE=new H.GD("frame")
C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
C.YH=new H.GD("hitsStyle")
C.bA=new H.GD("hoverText")
C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
C.eh=new H.GD("lineMode")
C.dB=new H.GD("link")
C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
C.UX=new H.GD("msg")
C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
C.IO=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.ap=new H.GD("oldHeapUsed")
C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
C.kY=new H.GD("ref")
C.Dj=new H.GD("refreshTime")
C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
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.kA=new H.GD("sampleRate")
C.fX=new H.GD("script")
C.eC=new H.GD("[]=")
C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
C.QK=new H.GD("totalSamplesInProfile")
C.kw=new H.GD("trace")
C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
C.Fh=new H.GD("url")
C.ls=new H.GD("value")
C.eR=new H.GD("valueType")
C.KS=new H.GD("vmName")
C.v6=new H.GD("void")
C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
C.io=new H.Lm(C.Gsc,"E",0)
C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
C.vB=J.is.prototype
C.xM=new P.z0(!1)
C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
$.Bh=0
$.uP=!0
$.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
}
}())})
I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$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)})
@@ -24899,7 +25164,7 @@
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","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),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")})
@@ -24910,7 +25175,7 @@
I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$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])})
@@ -24918,7 +25183,7 @@
I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","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:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","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.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"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","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","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","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",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.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","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","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:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","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.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"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","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","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","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",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.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
I = I.$finishIsolateConstructor(I)
$=new I()
function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
$desc=$collectedClasses.Ny
if($desc instanceof Array)$desc=$desc[1]
Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
function Zv(){}Zv.builtin$cls="Zv"
if(!"name" in Zv)Zv.name="Zv"
$desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
$desc=$collectedClasses.Fs
if($desc instanceof Array)$desc=$desc[1]
Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
Fs.prototype.goc=function(receiver){return receiver.name}
Fs.prototype.soc=function(receiver,v){return receiver.name=v}
Fs.prototype.gLA=function(receiver){return receiver.src}
Fs.prototype.gt5=function(receiver){return receiver.type}
Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
function Ty(){}Ty.builtin$cls="Ty"
if(!"name" in Ty)Ty.name="Ty"
$desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
$desc=$collectedClasses.Uq
if($desc instanceof Array)$desc=$desc[1]
Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
function Rt(){}Rt.builtin$cls="Rt"
if(!"name" in Rt)Rt.name="Rt"
$desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
if($desc instanceof Array)$desc=$desc[1]
zU.prototype=$desc
zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
function wa(){}wa.builtin$cls="wa"
if(!"name" in wa)wa.name="wa"
$desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
$desc=$collectedClasses.tX
if($desc instanceof Array)$desc=$desc[1]
tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
tX.prototype.goc=function(receiver){return receiver.name}
tX.prototype.soc=function(receiver,v){return receiver.name=v}
tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
function Sg(){}Sg.builtin$cls="Sg"
if(!"name" in Sg)Sg.name="Sg"
$desc=$collectedClasses.Sg
if($desc instanceof Array)$desc=$desc[1]
Sg.prototype=$desc
Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
function pA(){}pA.builtin$cls="pA"
if(!"name" in pA)pA.name="pA"
$desc=$collectedClasses.pA
if($desc instanceof Array)$desc=$desc[1]
pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
function Mi(){}Mi.builtin$cls="Mi"
if(!"name" in Mi)Mi.name="Mi"
$desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
Mi.prototype.gTq=function(receiver){return receiver.checked}
Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
Mi.prototype.go6=function(receiver){return receiver.list}
Mi.prototype.goc=function(receiver){return receiver.name}
Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
Mi.prototype.st5=function(receiver,v){return receiver.type=v}
Mi.prototype.gP=function(receiver){return receiver.value}
Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
function Gt(){}Gt.builtin$cls="Gt"
if(!"name" in Gt)Gt.name="Gt"
$desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
In.prototype.goc=function(receiver){return receiver.name}
In.prototype.soc=function(receiver,v){return receiver.name=v}
In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
function eP(){}eP.builtin$cls="eP"
if(!"name" in eP)eP.name="eP"
$desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
$desc=$collectedClasses.bn
if($desc instanceof Array)$desc=$desc[1]
bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
function Ve(){}Ve.builtin$cls="Ve"
if(!"name" in Ve)Ve.name="Ve"
$desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
G7.prototype=$desc
G7.prototype.gRn=function(receiver){return receiver.data}
G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
G7.prototype.goc=function(receiver){return receiver.name}
G7.prototype.soc=function(receiver,v){return receiver.name=v}
G7.prototype.gt5=function(receiver){return receiver.type}
G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
function l9(){}l9.builtin$cls="l9"
if(!"name" in l9)l9.name="l9"
$desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
Xp.prototype.gt5=function(receiver){return receiver.type}
Xp.prototype.gP=function(receiver){return receiver.value}
Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
function mX(){}mX.builtin$cls="mX"
if(!"name" in mX)mX.name="mX"
$desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
HD.prototype.soc=function(receiver,v){return receiver.name=v}
HD.prototype.gP=function(receiver){return receiver.value}
HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
function jg(){}jg.builtin$cls="jg"
if(!"name" in jg)jg.name="jg"
$desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
jg.prototype=$desc
jg.prototype.gtT=function(receiver){return receiver.code}
jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
function nC(){}nC.builtin$cls="nC"
if(!"name" in nC)nC.name="nC"
$desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
KR.prototype=$desc
KR.prototype.gP=function(receiver){return receiver.value}
KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
function fs(){}fs.builtin$cls="fs"
if(!"name" in fs)fs.name="fs"
$desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
lp.prototype.gt5=function(receiver){return receiver.type}
lp.prototype.gP=function(receiver){return receiver.value}
lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
function I0(){}I0.builtin$cls="I0"
if(!"name" in I0)I0.name="I0"
$desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
if($desc instanceof Array)$desc=$desc[1]
G5.prototype=$desc
G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
function Lx(){}Lx.builtin$cls="Lx"
if(!"name" in Lx)Lx.name="Lx"
$desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
AE.prototype.gt5=function(receiver){return receiver.type}
AE.prototype.gP=function(receiver){return receiver.value}
AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
function FH(){}FH.builtin$cls="FH"
if(!"name" in FH)FH.name="FH"
$desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
RH.prototype.gph=function(receiver){return receiver.label}
RH.prototype.sph=function(receiver,v){return receiver.label=v}
RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
function OJ(){}OJ.builtin$cls="OJ"
if(!"name" in OJ)OJ.name="OJ"
$desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
$desc=$collectedClasses.dp
if($desc instanceof Array)$desc=$desc[1]
dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
function u9(){}u9.builtin$cls="u9"
if(!"name" in u9)u9.name="u9"
$desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
u9.prototype=$desc
u9.prototype.goc=function(receiver){return receiver.name}
u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
function Bn(){}Bn.builtin$cls="Bn"
if(!"name" in Bn)Bn.name="Bn"
$desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
$desc=$collectedClasses.tZ
if($desc instanceof Array)$desc=$desc[1]
tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
function AK(){}AK.builtin$cls="AK"
if(!"name" in AK)AK.name="AK"
$desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
$desc=$collectedClasses.ty
if($desc instanceof Array)$desc=$desc[1]
ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
function F2(){}F2.builtin$cls="F2"
if(!"name" in F2)F2.name="F2"
$desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
$desc=$collectedClasses.c5
if($desc instanceof Array)$desc=$desc[1]
c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
function Q7(){}Q7.builtin$cls="Q7"
if(!"name" in Q7)Q7.name="Q7"
$desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
$desc=$collectedClasses.y5
if($desc instanceof Array)$desc=$desc[1]
y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
function jQ(){}jQ.builtin$cls="jQ"
if(!"name" in jQ)jQ.name="jQ"
$desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
$desc=$collectedClasses.ui
if($desc instanceof Array)$desc=$desc[1]
ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
function DQ(){}DQ.builtin$cls="DQ"
if(!"name" in DQ)DQ.name="DQ"
$desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
$desc=$collectedClasses.eG
if($desc instanceof Array)$desc=$desc[1]
eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
function lv(){}lv.builtin$cls="lv"
if(!"name" in lv)lv.name="lv"
$desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
lv.prototype=$desc
lv.prototype.gt5=function(receiver){return receiver.type}
lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
function pf(){}pf.builtin$cls="pf"
if(!"name" in pf)pf.name="pf"
$desc=$collectedClasses.pf
if($desc instanceof Array)$desc=$desc[1]
pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
function NV(){}NV.builtin$cls="NV"
if(!"name" in NV)NV.name="NV"
$desc=$collectedClasses.NV
if($desc instanceof Array)$desc=$desc[1]
NV.prototype=$desc
NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
function W1(){}W1.builtin$cls="W1"
if(!"name" in W1)W1.name="W1"
$desc=$collectedClasses.W1
if($desc instanceof Array)$desc=$desc[1]
W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
function mCz(){}mCz.builtin$cls="mCz"
if(!"name" in mCz)mCz.name="mCz"
$desc=$collectedClasses.mCz
if($desc instanceof Array)$desc=$desc[1]
mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
function kK(){}kK.builtin$cls="kK"
if(!"name" in kK)kK.name="kK"
$desc=$collectedClasses.kK
if($desc instanceof Array)$desc=$desc[1]
kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
function n5(){}n5.builtin$cls="n5"
if(!"name" in n5)n5.name="n5"
$desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
$desc=$collectedClasses.bb
if($desc instanceof Array)$desc=$desc[1]
bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
function NdT(){}NdT.builtin$cls="NdT"
if(!"name" in NdT)NdT.name="NdT"
$desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
$desc=$collectedClasses.Ob
if($desc instanceof Array)$desc=$desc[1]
Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
function me(){}me.builtin$cls="me"
if(!"name" in me)me.name="me"
$desc=$collectedClasses.me
if($desc instanceof Array)$desc=$desc[1]
me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
me.prototype.gmH=function(receiver){return receiver.href}
function oB(){}oB.builtin$cls="oB"
if(!"name" in oB)oB.name="oB"
$desc=$collectedClasses.oB
if($desc instanceof Array)$desc=$desc[1]
oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
function NY(){}NY.builtin$cls="NY"
if(!"name" in NY)NY.name="NY"
$desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
if($desc instanceof Array)$desc=$desc[1]
EI.prototype=$desc
EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
function MI(){}MI.builtin$cls="MI"
if(!"name" in MI)MI.name="MI"
$desc=$collectedClasses.MI
if($desc instanceof Array)$desc=$desc[1]
MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
function rg(){}rg.builtin$cls="rg"
if(!"name" in rg)rg.name="rg"
$desc=$collectedClasses.rg
if($desc instanceof Array)$desc=$desc[1]
rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
function um(){}um.builtin$cls="um"
if(!"name" in um)um.name="um"
$desc=$collectedClasses.um
if($desc instanceof Array)$desc=$desc[1]
um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
function eW(){}eW.builtin$cls="eW"
if(!"name" in eW)eW.name="eW"
$desc=$collectedClasses.eW
if($desc instanceof Array)$desc=$desc[1]
eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
function kL(){}kL.builtin$cls="kL"
if(!"name" in kL)kL.name="kL"
$desc=$collectedClasses.kL
if($desc instanceof Array)$desc=$desc[1]
kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
function Fu(){}Fu.builtin$cls="Fu"
if(!"name" in Fu)Fu.name="Fu"
$desc=$collectedClasses.Fu
if($desc instanceof Array)$desc=$desc[1]
Fu.prototype=$desc
Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
function QN(){}QN.builtin$cls="QN"
if(!"name" in QN)QN.name="QN"
$desc=$collectedClasses.QN
if($desc instanceof Array)$desc=$desc[1]
QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
QN.prototype.gmH=function(receiver){return receiver.href}
function N9(){}N9.builtin$cls="N9"
if(!"name" in N9)N9.name="N9"
$desc=$collectedClasses.N9
if($desc instanceof Array)$desc=$desc[1]
N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
function BA(){}BA.builtin$cls="BA"
if(!"name" in BA)BA.name="BA"
$desc=$collectedClasses.BA
if($desc instanceof Array)$desc=$desc[1]
BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
function zp(){}zp.builtin$cls="zp"
if(!"name" in zp)zp.name="zp"
$desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
$desc=$collectedClasses.br
if($desc instanceof Array)$desc=$desc[1]
br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
br.prototype.gmH=function(receiver){return receiver.href}
function PIw(){}PIw.builtin$cls="PIw"
if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
$desc=$collectedClasses.Jq
if($desc instanceof Array)$desc=$desc[1]
Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
function kN(){}kN.builtin$cls="kN"
if(!"name" in kN)kN.name="kN"
$desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
$desc=$collectedClasses.Gr
if($desc instanceof Array)$desc=$desc[1]
Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
Gr.prototype.gmH=function(receiver){return receiver.href}
function XE(){}XE.builtin$cls="XE"
if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
$desc=$collectedClasses.NJ
if($desc instanceof Array)$desc=$desc[1]
NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
function j24(){}j24.builtin$cls="j24"
if(!"name" in j24)j24.name="j24"
$desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
$desc=$collectedClasses.rQ
if($desc instanceof Array)$desc=$desc[1]
rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
function LR(){}LR.builtin$cls="LR"
if(!"name" in LR)LR.name="LR"
$desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
$desc=$collectedClasses.hy
if($desc instanceof Array)$desc=$desc[1]
hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
function mq(){}mq.builtin$cls="mq"
if(!"name" in mq)mq.name="mq"
$desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
$desc=$collectedClasses.CG
if($desc instanceof Array)$desc=$desc[1]
CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
function y0(){}y0.builtin$cls="y0"
if(!"name" in y0)y0.name="y0"
$desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
$desc=$collectedClasses.Eo
if($desc instanceof Array)$desc=$desc[1]
Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
function Dn(){}Dn.builtin$cls="Dn"
if(!"name" in Dn)Dn.name="Dn"
$desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
$desc=$collectedClasses.pyk
if($desc instanceof Array)$desc=$desc[1]
pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
pyk.prototype.gmH=function(receiver){return receiver.href}
function ZD(){}ZD.builtin$cls="ZD"
if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
$desc=$collectedClasses.Ja
if($desc instanceof Array)$desc=$desc[1]
Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
function hW(){}hW.builtin$cls="hW"
if(!"name" in hW)hW.name="hW"
$desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
$desc=$collectedClasses.yR
if($desc instanceof Array)$desc=$desc[1]
yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
function xJ(){}xJ.builtin$cls="xJ"
if(!"name" in xJ)xJ.name="xJ"
$desc=$collectedClasses.xJ
if($desc instanceof Array)$desc=$desc[1]
xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
function Et(){}Et.builtin$cls="Et"
if(!"name" in Et)Et.name="Et"
$desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
$desc=$collectedClasses.Zn
if($desc instanceof Array)$desc=$desc[1]
Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
function tG(){}tG.builtin$cls="tG"
if(!"name" in tG)tG.name="tG"
$desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
$desc=$collectedClasses.IJ
if($desc instanceof Array)$desc=$desc[1]
IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
function N2(){}N2.builtin$cls="N2"
if(!"name" in N2)N2.name="N2"
$desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
$desc=$collectedClasses.GW
if($desc instanceof Array)$desc=$desc[1]
GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
function VP(){}VP.builtin$cls="VP"
if(!"name" in VP)VP.name="VP"
$desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
f0.prototype.gi2=function(receiver){return this.i2}
f0.prototype.si2=function(receiver,v){return this.i2=v}
f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
this.Gx=Gx
this.fW=fW
this.En=En
this.EE=EE
-this.Qy=Qy
+this.um=um
this.PX=PX
this.RW=RW
this.C9=C9
@@ -26901,11 +27326,11 @@
$desc=$collectedClasses.Vg
if($desc instanceof Array)$desc=$desc[1]
Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
function Z6(JE,Jz){this.JE=JE
this.Jz=Jz}Z6.builtin$cls="Z6"
if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
if($desc instanceof Array)$desc=$desc[1]
ku.prototype=$desc
ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
function xQ(){}xQ.builtin$cls="xQ"
if(!"name" in xQ)xQ.name="xQ"
$desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
v.prototype.gnw=function(){return this.nw}
v.prototype.gjm=function(){return this.jm}
v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
if(!"name" in Pe)Pe.name="Pe"
$desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
if($desc instanceof Array)$desc=$desc[1]
Eq.prototype=$desc
Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
function tD(dw,Iq,is,p6){this.dw=dw
this.Iq=Iq
this.is=is
@@ -27405,8 +27830,7 @@
Y2.prototype.gwd.$reflectable=1
Y2.prototype.goH=function(){return this.oH}
Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
this.AP=AP
this.Lk=Lk}XN.builtin$cls="XN"
if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
G6.prototype.gBW.$reflectable=1
G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -27459,7 +27883,7 @@
$desc=$collectedClasses.Tg
if($desc instanceof Array)$desc=$desc[1]
Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -27476,15 +27900,15 @@
$desc=$collectedClasses.Jc
if($desc instanceof Array)$desc=$desc[1]
Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -27524,11 +27948,11 @@
Be.prototype.gXx.$reflectable=1
Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
this.HX=HX
this.Uy=Uy
@@ -27560,11 +27984,11 @@
E0.prototype.gUy.$reflectable=1
E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
this.Hu=Hu
this.nx=nx
@@ -27677,21 +28101,21 @@
$desc=$collectedClasses.rR
if($desc instanceof Array)$desc=$desc[1]
rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
function SU7(){}SU7.builtin$cls="SU7"
if(!"name" in SU7)SU7.name="SU7"
$desc=$collectedClasses.SU7
if($desc instanceof Array)$desc=$desc[1]
SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
function w2Y(){}w2Y.builtin$cls="w2Y"
if(!"name" in w2Y)w2Y.name="w2Y"
$desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
$desc=$collectedClasses.t0
if($desc instanceof Array)$desc=$desc[1]
t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
this.V5=V5
this.Fo=Fo
this.n6=n6
this.jE=jE
this.Ay=Ay
this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
function Sz(Ax,xq){this.Ax=Ax
this.xq=xq}Sz.builtin$cls="Sz"
if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
$desc=$collectedClasses.b8
if($desc instanceof Array)$desc=$desc[1]
b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
function Ia(){}Ia.builtin$cls="Ia"
if(!"name" in Ia)Ia.name="Ia"
$desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
$desc=$collectedClasses.aY
if($desc instanceof Array)$desc=$desc[1]
aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
this.cP=cP
this.Jl=Jl
this.pU=pU
this.Fh=Fh
this.Xp=Xp
-this.aj=aj
+this.fb=fb
this.rb=rb
this.Zq=Zq
this.rF=rF
@@ -28559,16 +28989,16 @@
zG.prototype.gpU=function(){return this.pU}
zG.prototype.gFh=function(){return this.Fh}
zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
zG.prototype.grb=function(){return this.rb}
zG.prototype.gZq=function(){return this.Zq}
zG.prototype.gJS=function(receiver){return this.JS}
zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
function dl(){}dl.builtin$cls="dl"
if(!"name" in dl)dl.name="dl"
$desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
$desc=$collectedClasses.Ha
if($desc instanceof Array)$desc=$desc[1]
Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
function R8(){}R8.builtin$cls="R8"
if(!"name" in R8)R8.name="R8"
$desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
$desc=$collectedClasses.by
if($desc instanceof Array)$desc=$desc[1]
by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
if(!"name" in Cf)Cf.name="Cf"
$desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
$desc=$collectedClasses.z0
if($desc instanceof Array)$desc=$desc[1]
z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
function Rw(WF,ZP,EN){this.WF=WF
this.ZP=ZP
this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
$desc=$collectedClasses.I4
if($desc instanceof Array)$desc=$desc[1]
I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
function RO(uv,Ph,Sg){this.uv=uv
this.Ph=Ph
this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
$desc=$collectedClasses.RX
if($desc instanceof Array)$desc=$desc[1]
RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
if(!"name" in bO)bO.name="bO"
$desc=$collectedClasses.bO
if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
$desc=$collectedClasses.QS
if($desc instanceof Array)$desc=$desc[1]
QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
function ej(){}ej.builtin$cls="ej"
if(!"name" in ej)ej.name="ej"
$desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
$desc=$collectedClasses.Nx
if($desc instanceof Array)$desc=$desc[1]
Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
function Dg(){}Dg.builtin$cls="Dg"
if(!"name" in Dg)Dg.name="Dg"
$desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
E9.prototype.gPy.$reflectable=1
E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
this.Ab=Ab
this.Ln=Ln
@@ -29904,11 +30369,11 @@
rm.prototype.gy4.$reflectable=1
rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
function YW(a){this.a=a}YW.builtin$cls="YW"
if(!"name" in YW)YW.name="YW"
$desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
Gk.prototype.gvt.$reflectable=1
Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
this.Pe=Pe
this.AP=AP
this.Lk=Lk
@@ -29971,11 +30441,28 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
this.AP=AP
this.Lk=Lk
@@ -29997,11 +30484,81 @@
mk.prototype.gZ8.$reflectable=1
mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
this.J0=J0
this.Oc=Oc
@@ -30068,11 +30625,11 @@
jY.prototype.gX3.$reflectable=1
jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
function nx(a){this.a=a}nx.builtin$cls="nx"
if(!"name" in nx)nx.name="nx"
$desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
$desc=$collectedClasses.xL
if($desc instanceof Array)$desc=$desc[1]
xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
function As(){}As.builtin$cls="As"
if(!"name" in As)As.name="As"
$desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
$desc=$collectedClasses.GS
if($desc instanceof Array)$desc=$desc[1]
GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
this.Lk=Lk
@@ -30200,11 +30767,11 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
function Js(a){this.a=a}Js.builtin$cls="Js"
if(!"name" in Js)Js.name="Js"
$desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
hx.prototype.gXh.$reflectable=1
hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
this.AP=AP
this.Lk=Lk
@@ -30257,11 +30824,30 @@
u7.prototype.gtf.$reflectable=1
u7.prototype.stf=function(receiver,v){return receiver.tf=v}
u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
this.tT=tT
this.eT=eT
@@ -30278,17 +30864,15 @@
qm.prototype.gB1=function(receiver){return this.B1}
qm.prototype.gtT=function(receiver){return this.tT}
qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
this.FT=FT
this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
this.qO=qO
this.Hm=Hm
this.AP=AP
@@ -30302,48 +30886,65 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
function SV(a){this.a=a}SV.builtin$cls="SV"
if(!"name" in SV)SV.name="SV"
$desc=$collectedClasses.SV
if($desc instanceof Array)$desc=$desc[1]
SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -30355,20 +30956,63 @@
this.Wz=Wz
this.SO=SO
this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
this.kf=kf
this.AP=AP
@@ -30395,11 +31039,11 @@
vj.prototype.gkf.$reflectable=1
vj.prototype.skf=function(receiver,v){return receiver.kf=v}
vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -30439,11 +31083,11 @@
KL.prototype.gN7.$reflectable=1
KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
this.eT=eT
this.n2=n2
@@ -30497,12 +31141,12 @@
$desc=$collectedClasses.Lb
if($desc instanceof Array)$desc=$desc[1]
Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
function tzK(){}tzK.builtin$cls="tzK"
if(!"name" in tzK)tzK.name="tzK"
$desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
if($desc instanceof Array)$desc=$desc[1]
jA.prototype=$desc
jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
function oBi(){}oBi.builtin$cls="oBi"
if(!"name" in oBi)oBi.name="oBi"
$desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
aQ.prototype.gJo.$reflectable=1
aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
this.V4=V4
this.AP=AP
@@ -30600,11 +31244,11 @@
Qa.prototype.gV4.$reflectable=1
Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
this.SB=SB
this.Hq=Hq
@@ -30636,11 +31280,11 @@
Ww.prototype.gHq.$reflectable=1
Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
this.AP=AP
this.Lk=Lk
@@ -30662,11 +31306,11 @@
tz.prototype.gJo.$reflectable=1
tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
this.iy=iy
this.AP=AP
@@ -30693,11 +31337,11 @@
fl.prototype.giy.$reflectable=1
fl.prototype.siy=function(receiver,v){return receiver.iy=v}
fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
this.Jo=Jo
this.AP=AP
@@ -30724,11 +31368,11 @@
Zt.prototype.gJo.$reflectable=1
Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
this.Jo=Jo
this.AP=AP
@@ -30755,13 +31399,13 @@
iL.prototype.gJo.$reflectable=1
iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
this.AP=AP
this.Lk=Lk
this.AP=AP
@@ -30782,15 +31426,15 @@
lI.prototype.gk5.$reflectable=1
lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
this.Lk=Lk
this.dZ=dZ
@@ -30891,11 +31535,11 @@
DA.prototype=$desc
DA.prototype.gWA=function(receiver){return this.WA}
DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
function vly(){}vly.builtin$cls="vly"
if(!"name" in vly)vly.name="vly"
$desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
$desc=$collectedClasses.ir
if($desc instanceof Array)$desc=$desc[1]
ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
zs.prototype.gKM=function(receiver){return receiver.X0}
zs.prototype.gKM.$reflectable=1
function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
$desc=$collectedClasses.pM
if($desc instanceof Array)$desc=$desc[1]
pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
function W6(){}W6.builtin$cls="W6"
if(!"name" in W6)W6.name="W6"
$desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
$desc=$collectedClasses.Ed
if($desc instanceof Array)$desc=$desc[1]
Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
if(!"name" in G1)G1.name="G1"
$desc=$collectedClasses.G1
if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
iT.prototype=$desc
iT.prototype.ghP=function(){return this.hP}
iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
function ey(d){this.d=d}ey.builtin$cls="ey"
if(!"name" in ey)ey.name="ey"
$desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
$desc=$collectedClasses.J1
if($desc instanceof Array)$desc=$desc[1]
J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
this.bm=bm}fk.builtin$cls="fk"
if(!"name" in fk)fk.name="fk"
$desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
JG.prototype.gkW.$reflectable=1
JG.prototype.skW=function(receiver,v){return receiver.kW=v}
JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
this.AP=AP
this.Lk=Lk
@@ -31906,11 +32550,11 @@
knI.prototype.gzw.$reflectable=1
knI.prototype.szw=function(receiver,v){return receiver.zw=v}
knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
this.HJ=HJ
this.AP=AP
@@ -31937,25 +32581,25 @@
fI.prototype.gHJ.$reflectable=1
fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
function G8(F1){this.F1=F1}G8.builtin$cls="G8"
if(!"name" in G8)G8.name="G8"
$desc=$collectedClasses.G8
if($desc instanceof Array)$desc=$desc[1]
G8.prototype=$desc
G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
if(!"name" in fJ)fJ.name="fJ"
$desc=$collectedClasses.fJ
if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
$desc=$collectedClasses.q1
if($desc instanceof Array)$desc=$desc[1]
q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
if(!"name" in jx)jx.name="jx"
$desc=$collectedClasses.jx
if($desc instanceof Array)$desc=$desc[1]
jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
function Cn(){}Cn.builtin$cls="Cn"
if(!"name" in Cn)Cn.name="Cn"
$desc=$collectedClasses.Cn
if($desc instanceof Array)$desc=$desc[1]
Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
if(!"name" in du)du.name="du"
$desc=$collectedClasses.du
if($desc instanceof Array)$desc=$desc[1]
du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
if(!"name" in xc)xc.name="xc"
$desc=$collectedClasses.xc
if($desc instanceof Array)$desc=$desc[1]
xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
this.fq=fq
this.ne=ne
this.PH=PH
@@ -32006,7 +32674,12 @@
this.LE=LE
this.Cf=Cf
this.W1=W1
+this.p2=p2
+this.Hw=Hw
this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
this.AP=AP
this.Lk=Lk
this.Fm=Fm
@@ -32028,16 +32701,20 @@
bv.prototype.sGR=function(v){return this.f5=v}
bv.prototype.gLE=function(){return this.LE}
bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
function D3(){}D3.builtin$cls="D3"
if(!"name" in D3)D3.name="D3"
$desc=$collectedClasses.D3
if($desc instanceof Array)$desc=$desc[1]
D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
function Qq(a){this.a=a}Qq.builtin$cls="Qq"
if(!"name" in Qq)Qq.name="Qq"
$desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
$desc=$collectedClasses.JB
if($desc instanceof Array)$desc=$desc[1]
JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
function BH(a){this.a=a}BH.builtin$cls="BH"
if(!"name" in BH)BH.name="BH"
$desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
Vi.prototype=$desc
Vi.prototype.gtT=function(receiver){return this.tT}
Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
this.jv=jv
this.Du=Du
this.fF=fF
@@ -32208,6 +32896,7 @@
this.yP=yP
this.mM=mM
this.qH=qH
+this.Ni=Ni
this.MO=MO
this.oc=oc
this.zz=zz
@@ -32264,16 +32953,6 @@
$desc=$collectedClasses.fx
if($desc instanceof Array)$desc=$desc[1]
fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
function UZ(a,b,c){this.a=a
this.b=b
this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
$desc=$collectedClasses.UZ
if($desc instanceof Array)$desc=$desc[1]
UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
if(!"name" in XK)XK.name="XK"
$desc=$collectedClasses.XK
if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
$desc=$collectedClasses.dT
if($desc instanceof Array)$desc=$desc[1]
dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
this.yb=yb
this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
if(!"name" in ho)ho.name="ho"
$desc=$collectedClasses.ho
if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
ob.prototype.gmC.$reflectable=1
ob.prototype.smC=function(receiver,v){return receiver.mC=v}
ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
this.Pe=Pe
this.AP=AP
@@ -32379,11 +33035,47 @@
xI.prototype.gPe.$reflectable=1
xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
this.AP=AP
this.Lk=Lk
@@ -32405,11 +33097,11 @@
nm.prototype.gVa.$reflectable=1
nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
this.AP=AP
this.Lk=Lk
@@ -32431,11 +33123,11 @@
Vu.prototype.gB3.$reflectable=1
Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
function V2(N1,mD,Ck){this.N1=N1
this.mD=mD
this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
$desc=$collectedClasses.VD
if($desc instanceof Array)$desc=$desc[1]
VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 0b59620..61ce909 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -14,21 +14,25 @@
export 'package:observatory/src/elements/field_view.dart';
export 'package:observatory/src/elements/function_ref.dart';
export 'package:observatory/src/elements/function_view.dart';
+export 'package:observatory/src/elements/heap_map.dart';
+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/isolate_list.dart';
-export 'package:observatory/src/elements/isolate_summary.dart';
export 'package:observatory/src/elements/isolate_profile.dart';
-export 'package:observatory/src/elements/heap_profile.dart';
+export 'package:observatory/src/elements/isolate_ref.dart';
+export 'package:observatory/src/elements/isolate_summary.dart';
+export 'package:observatory/src/elements/isolate_view.dart';
export 'package:observatory/src/elements/json_view.dart';
export 'package:observatory/src/elements/library_ref.dart';
export 'package:observatory/src/elements/library_view.dart';
-export 'package:observatory/src/elements/service_view.dart';
export 'package:observatory/src/elements/nav_bar.dart';
export 'package:observatory/src/elements/observatory_application.dart';
export 'package:observatory/src/elements/response_viewer.dart';
export 'package:observatory/src/elements/script_ref.dart';
export 'package:observatory/src/elements/script_view.dart';
export 'package:observatory/src/elements/service_ref.dart';
+export 'package:observatory/src/elements/service_view.dart';
+export 'package:observatory/src/elements/sliding_checkbox.dart';
export 'package:observatory/src/elements/stack_frame.dart';
export 'package:observatory/src/elements/stack_trace.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index 4746eac..abfeed6 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -14,8 +14,11 @@
<link rel="import" href="src/elements/field_view.html">
<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/isolate_list.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">
<link rel="import" href="src/elements/instance_ref.html">
<link rel="import" href="src/elements/instance_view.html">
<link rel="import" href="src/elements/json_view.html">
@@ -29,6 +32,7 @@
<link rel="import" href="src/elements/script_view.html">
<link rel="import" href="src/elements/service_ref.html">
<link rel="import" href="src/elements/service_view.html">
+ <link rel="import" href="src/elements/sliding_checkbox.html">
<link rel="import" href="src/elements/stack_frame.html">
<link rel="import" href="src/elements/stack_trace.html">
</head>
diff --git a/runtime/bin/vmservice/client/lib/service.dart b/runtime/bin/vmservice/client/lib/service.dart
index e513701..4b328f9 100644
--- a/runtime/bin/vmservice/client/lib/service.dart
+++ b/runtime/bin/vmservice/client/lib/service.dart
@@ -13,4 +13,3 @@
part 'src/service/cache.dart';
part 'src/service/object.dart';
part 'src/service/service.dart';
-part 'src/service/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index dba7f88..e662f6f 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -10,7 +10,7 @@
class LocationManager extends Observable {
static const String defaultHash = '#/isolates/';
static final RegExp _currentIsolateMatcher = new RegExp(r'#/isolates/\d+');
- static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+/');
+ static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+(/|$)');
ObservatoryApplication _app;
@observable String currentHash = '';
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index e832dca..dda6c81 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -42,18 +42,16 @@
}
class TableTree extends Observable {
- final List<String> columnHeaders = [];
@observable final List<TableTreeRow> rows = toObservable([]);
/// Create a table tree with column [headers].
- TableTree(List<String> headers) {
- columnHeaders.addAll(headers);
- }
+ TableTree();
/// Initialize the table tree with the list of root children.
- void initialize(List<TableTreeRow> children) {
+ void initialize(TableTreeRow root) {
rows.clear();
- rows.addAll(children);
+ root.onShow();
+ rows.addAll(root.children);
}
/// Toggle expansion of row at [rowIndex].
@@ -70,20 +68,10 @@
int _index(TableTreeRow row) => rows.indexOf(row);
- void _insertRow(int index, TableTreeRow row) {
- if (index == -1) {
- rows.add(row);
- } else {
- rows.insert(index, row);
- }
- }
-
void _expand(TableTreeRow row) {
int index = _index(row);
assert(index != -1);
- for (var i = 0; i < row.children.length; i++) {
- _insertRow(index + i + 1, row.children[i]);
- }
+ rows.insertAll(index + 1, row.children);
}
void _collapse(TableTreeRow row) {
@@ -101,8 +89,6 @@
row.expanded = false;
// Remove all children.
int index = _index(row);
- for (var i = 0; i < childCount; i++) {
- rows.removeAt(index + 1);
- }
+ rows.removeRange(index + 1, index + 1 + childCount);
}
}
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 6893fd0..7e957be 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -2,8 +2,8 @@
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="class-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
<script type="application/dart" src="class_ref.dart"></script>
</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index fd53d20..8c35168 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -4,6 +4,7 @@
library class_view_element;
+import 'dart:async';
import 'observatory_element.dart';
import 'package:observatory/service.dart';
import 'package:polymer/polymer.dart';
@@ -13,7 +14,12 @@
@published ServiceMap cls;
ClassViewElement.created() : super.created();
+ Future<ServiceObject> eval(String text) {
+ return cls.isolate.get(
+ cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
+ }
+
void refresh(var done) {
cls.reload().whenComplete(done);
}
-}
\ No newline at end of file
+}
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 8bffd2c..29f2ed5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,14 +1,38 @@
<head>
- <link rel="import" href="error_view.html">
+ <link rel="import" href="curly_block.html">
+ <link rel="import" href="eval_box.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="library_ref.html">
<link rel="import" href="nav_bar.html">
<link rel="import" href="observatory_element.html">
+ <link rel="import" href="script_ref.html">
</head>
<polymer-element name="class-view" extends="observatory-element">
<template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -17,74 +41,125 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <div class="panel panel-warning">
- <div class="panel-heading">
- class <strong>{{ cls.name }}</strong>
- <template if="{{ cls['super']['type'] != 'Null' }}">
- extends
- <class-ref ref="{{ cls['super'] }}"></class-ref>
- </template>
- <p></p>
- <library-ref ref="{{ cls['library'] }}"></library-ref>
+ <div class="content">
+ <h1>
+ <template if="{{ cls['abstract'] }}">
+ abstract
+ </template>
+ <template if="{{ cls['patch'] }}">
+ patch
+ </template>
+ class {{ cls.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ cls['library'] }}"></library-ref>
+ </div>
</div>
- <div class="panel-body">
- <table class="table table-hover">
- <tbody>
- <tr>
- <td>Abstract</td><td>{{ cls['abstract'] }}</td>
- </tr>
- <tr>
- <td>Const</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Finalized</td><td>{{ cls['const'] }}</td>
- </tr>
- <tr>
- <td>Implemented</td><td>{{ cls['implemented'] }}</td>
- </tr>
- <tr>
- <td>Patch</td><td>{{ cls['patch'] }}</td>
- </tr>
- <tr>
- <td>VM Name</td><td>{{ cls['name'] }}</td>
- </tr>
- </tbody>
- </table>
- <template if="{{ cls['error'] == null }}">
- <blockquote><strong>Fields</strong></blockquote>
- <table class="table table-hover">
- <tbody>
- <tr template repeat="{{ field in cls['fields'] }}">
- <td><field-ref ref="{{ field }}"></field-ref></td>
- <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <blockquote><strong>Functions</strong></blockquote>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>User Name</th>
- <th>VM Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template repeat="{{ function in cls['functions'] }}">
- <td><function-ref ref="{{ function }}"></function-ref></td>
- <td><function-ref ref="{{ function }}" internal></function-ref></td>
- </tr>
- </tbody>
- </table>
- </template>
- <template if="{{ cls['error'] != null }}">
- <error-view error_obj="{{ cls['error'] }}"></error-view>
- </template>
+ <div class="memberItem">
+ <div class="memberName">script</div>
+ <div class="memberValue">
+ <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+ </script-ref>
+ </div>
</div>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['super']['type'] != 'Null' }}">
+ <div class="memberItem">
+ <div class="memberName">extends</div>
+ <div class="memberValue">
+ <class-ref ref="{{ cls['super'] }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls['subclasses'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">extended by</div>
+ <div class="memberValue">
+ <template repeat="{{ subclass in cls['subclasses'] }}">
+ <class-ref ref="{{ subclass }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+
+ <div class="memberItem"> </div>
+
+ <template if="{{ cls['interfaces'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">implements</div>
+ <div class="memberValue">
+ <template repeat="{{ interface in cls['interfaces'] }}">
+ <class-ref ref="{{ interface }}"></class-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ cls.name != cls.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ cls.vmName }}</div>
+ </div>
+ </template>
</div>
</div>
+
+ <template if="{{ cls['error'] != null }}">
+ <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+ <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+ </template>
+
+ <hr>
+
+ <div class="content">
+ <template if="{{ cls['fields'].isNotEmpty }}">
+ fields ({{ cls['fields'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in cls['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ cls['functions'].isNotEmpty }}">
+ functions ({{ cls['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in cls['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}" qualified="{{ false }}">
+ </function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
</div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
</template>
<script type="application/dart" src="class_view.dart"></script>
</polymer-element>
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 cc6166c..80c4cb8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,4 +1,5 @@
<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="nav_bar.html">
<polymer-element name="code-view" extends="observatory-element">
@@ -17,7 +18,14 @@
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
- .member, .memberHeader {
+ .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;
@@ -31,27 +39,33 @@
</style>
<div class="content">
<h1>Code for {{ code.name }}</h1>
- <table>
- <tr>
- <td class="memberHeader">kind</td>
- <td class="member">{{code.kind}}</td>
- </tr>
- <tr>
- <td class="memberHeader">function</td>
- <td class="member">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">kind</div>
+ <div class="memberValue">{{code.kind}}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">function</div>
+ <div class="memberValue">
<function-ref ref="{{code.function}}">
</function-ref>
- </td>
- </tr>
- <tr>
- <td class="memberHeader">Inclusive</td>
- <td class="member">{{ code.formattedInclusiveTicks }}</td>
- </tr>
- <tr>
- <td class="memberHeader">Exclusive</td>
- <td class="member">{{ code.formattedExclusiveTicks }}</td>
- </tr>
- </table>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Inclusive</div>
+ <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Exclusive</div>
+ <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">Constant object pool</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+ </div>
+ </div>
+ </div>
</div>
<hr>
<div class="content">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
index 3133ed7..0223bf1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
@@ -9,5 +9,21 @@
@CustomTag('function-ref')
class FunctionRefElement extends ServiceRefElement {
+ @published bool qualified = true;
+
+ void refChanged(oldValue) {
+ super.refChanged(oldValue);
+ notifyPropertyChange(#hasParent, 0, 1);
+ notifyPropertyChange(#hasClass, 0, 1);
+ hasParent = (ref != null && ref['parent'] != null);
+ hasClass = (ref != null &&
+ ref['class'] != null &&
+ ref['class']['name'] != null &&
+ ref['class']['name'] != '::');
+ }
+
+ @observable bool hasParent = false;
+ @observable bool hasClass = false;
+
FunctionRefElement.created() : super.created();
}
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 a6e4c09..2760ab0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -1,9 +1,15 @@
<head>
+<link rel="import" href="class_ref.html">
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="function-ref" extends="service-ref">
-<template>
- <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+ <template><!-- These comments are here to allow newlines.
+ --><template if="{{ qualified && !hasParent && hasClass }}"><!--
+ --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+ --><template if="{{ qualified && hasParent }}"><!--
+ --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+ </function-ref>.<!--
+ --></template><a href="{{ url }}">{{ name }}</a><!--
+ --></template>
<script type="application/dart" src="function_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
new file mode 100644
index 0000000..fccb62a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.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 heap_map_element;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:math';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
+import 'package:observatory/app.dart';
+
+/// Displays an Error response.
+@CustomTag('heap-map')
+class HeapMapElement extends ObservatoryElement {
+ var _fragmentationCanvas;
+ var _fragmentationData;
+
+ @observable String status;
+ @published ServiceMap fragmentation;
+
+ HeapMapElement.created() : super.created() {
+ }
+
+ void enteredView() {
+ super.enteredView();
+ _fragmentationCanvas = shadowRoot.querySelector("#fragmentation");
+ }
+
+ List<int> _classIdToRGBA(int classId) {
+ if (classId == fragmentation['free_class_id']) {
+ return [255, 255, 255, 255];
+ } else {
+ // TODO(koda): Pick random hue, but fixed saturation and value.
+ var rng = new Random(classId);
+ return [rng.nextInt(128),
+ rng.nextInt(128),
+ rng.nextInt(128),
+ 255];
+ }
+ }
+
+ void _updateFragmentationData() {
+ if (fragmentation == null || _fragmentationCanvas == null) {
+ return;
+ }
+ var pages = fragmentation['pages'];
+ // Calculate dimensions.
+ var numPixels = 0;
+ var colorMap = {};
+ for (var page in pages) {
+ for (int i = 0; i < page.length; i += 2) {
+ numPixels += page[i];
+ var classId = page[i + 1];
+ colorMap.putIfAbsent(classId, () => _classIdToRGBA(classId));
+ }
+ }
+ var width = _fragmentationCanvas.parent.client.width;
+ var height = (numPixels + width - 1) ~/ width;
+ // Render image.
+ _fragmentationData =
+ _fragmentationCanvas.context2D.createImageData(width, height);
+ _fragmentationCanvas.width = _fragmentationData.width;
+ _fragmentationCanvas.height = _fragmentationData.height;
+ _renderPages(0, 0, colorMap);
+ }
+
+ // Renders and draws asynchronously, one page at a time to avoid
+ // blocking the UI.
+ void _renderPages(int startPage, int dataIndex, var colorMap) {
+ var pages = fragmentation['pages'];
+ status = 'Loaded $startPage of ${pages.length} pages';
+ if (startPage >= pages.length) {
+ return;
+ }
+ var width = _fragmentationData.width;
+ var dirtyBegin = (dataIndex / 4) ~/ width;
+ var page = pages[startPage];
+ for (var i = 0; i < page.length; i += 2) {
+ var count = page[i];
+ var color = colorMap[page[i + 1]];
+ for (var j = 0; j < count; ++j) {
+ for (var component in color) {
+ _fragmentationData.data[dataIndex++] = component;
+ }
+ }
+ }
+ var dirtyEnd = (dataIndex / 4 + width - 1) ~/ width;
+ _fragmentationCanvas.context2D.putImageData(
+ _fragmentationData, 0, 0, 0, dirtyBegin, width, dirtyEnd - dirtyBegin);
+ // Continue with the next page, asynchronously.
+ new Future(() {
+ _renderPages(startPage + 1, dataIndex, colorMap);
+ });
+ }
+
+ void refresh(var done) {
+ if (fragmentation == null) {
+ return;
+ }
+ fragmentation.isolate.get('heapmap').then((ServiceMap response) {
+ assert(response['type'] == 'HeapMap');
+ fragmentation = response;
+ }).catchError((e, st) {
+ Logger.root.info('$e $st');
+ }).whenComplete(done);
+ }
+
+ void fragmentationChanged(oldValue) {
+ // Async, in case enteredView has not yet run (observed in JS version).
+ new Future(() {
+ _updateFragmentationData();
+ });
+ }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
new file mode 100644
index 0000000..510f1fe
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -0,0 +1,22 @@
+<head>
+ <link rel="import" href="class_ref.html">
+ <link rel="import" href="observatory_element.html">
+ <link rel="import" href="nav_bar.html">
+</head>
+<polymer-element name="heap-map" extends="observatory-element">
+<template>
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+ <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+ <nav-refresh callback="{{ refresh }}"></nav-refresh>
+ </nav-bar>
+ <div class="row">
+ <p style="text-align:center">{{ status }}</p>
+ </div>
+ <div class="row">
+ <canvas id="fragmentation" width="1px" height="1px"></canvas>
+ </div>
+</template>
+<script type="application/dart" src="heap_map.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 e03e1d2..4fae426 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -6,9 +6,17 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 1px 0 1px 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div>
@@ -32,6 +40,7 @@
<template if="{{ isClosure(ref.serviceType) }}">
<a href="{{ url }}">
+ <!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc']['user_name'] }}
</a>
</template>
@@ -39,28 +48,34 @@
<template if="{{ isInstance(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
<curly-block callback="{{ expander() }}">
- <table>
- <tr template repeat="{{ field in ref['fields'] }}">
- <td class="member">{{ field['decl']['user_name'] }}</td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </table>
+ <div class="memberList">
+ <template repeat="{{ field in ref['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ {{ field['decl']['user_name'] }}
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ isList(ref.serviceType) }}">
<a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
<curly-block callback="{{ expander() }}">
- <table>
- <tr template repeat="{{ element in ref['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}"></instance-ref>
- </td>
- </tr>
- </table>
+ <div class="memberList">
+ <template repeat="{{ element in ref['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
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 5a0f9ba..295dddf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -4,12 +4,11 @@
library instance_view_element;
+import 'dart:async';
import 'observatory_element.dart';
import 'package:observatory/service.dart';
import 'package:polymer/polymer.dart';
-import 'dart:async';
-
@CustomTag('instance-view')
class InstanceViewElement extends ObservatoryElement {
@published ServiceMap instance;
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 c39183d..6c400ca 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -26,12 +26,14 @@
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
- .member {
- vertical-align: top;
- padding: 3px 0 3px 1em;
- font: 400 14px 'Montserrat', sans-serif;
+ .memberList {
+ display: table;
}
- .memberBold {
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 14px 'Montserrat', sans-serif;
@@ -46,23 +48,25 @@
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<h1>instance of {{ instance['class']['user_name'] }}</h1>
- <table>
- <tr>
- <td class="memberBold">class</td>
- <td class="member">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">class</div>
+ <div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
</class-ref>
- </td>
- </tr>
- <tr template if="{{ instance['preview'] != null }}">
- <td class="memberBold">preview</td>
- <td class="member">{{ instance['preview'] }}</td>
- </tr>
- <tr>
- <td class="memberBold">size</td>
- <td class="member">{{ instance['size'] | formatSize }}</td>
- </tr>
- </table>
+ </div>
+ </div>
+ <template if="{{ instance['preview'] != null }}">
+ <div class="memberItem">
+ <div class="memberName">preview</div>
+ <div class="memberValue">{{ instance['preview'] }}</div>
+ </div>
+ </template>
+ <div class="memberItem">
+ <div class="memberName">size</div>
+ <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+ </div>
+ </div>
</div>
<hr>
@@ -71,44 +75,50 @@
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block>
- <table>
- <tr template repeat="{{ field in instance['fields'] }}">
- <td class="member">
- <field-ref ref="{{ field['decl'] }}"></field-ref>
- </td>
- <td class="member">
- <instance-ref ref="{{ field['value'] }}"></instance-ref>
- </td>
- </tr>
- </table>
+ <div class="memberList">
+ <template repeat="{{ field in instance['fields'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field['decl'] }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block>
- <table>
- <tr template repeat="{{ field in instance['nativeFields'] }}">
- <td class="member">[{{ field['index']}}]</td>
- <td class="member">[{{ field['value']}}]</td>
- </tr>
- </table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in instance['nativeFields'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ field['index']}}]</div>
+ <div class="memberValue">[{{ field['value']}}]</div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block>
- <table>
- <tr template repeat="{{ element in instance['elements'] }}">
- <td class="member">[{{ element['index']}}]</td>
- <td class="member">
- <instance-ref ref="{{ element['value'] }}">
- </instance-ref>
- </td>
- </tr>
- </table>
- </curly-block>
+ <div class="memberList">
+ <template repeat="{{ element in instance['elements'] }}">
+ <div class="memberItem">
+ <div class="memberName">[{{ element['index']}}]</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ element['value'] }}">
+ </instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 39092b3..1e244df 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -6,10 +6,61 @@
import 'dart:html';
import 'observatory_element.dart';
+import 'package:logging/logging.dart';
import 'package:observatory/service.dart';
import 'package:observatory/app.dart';
import 'package:polymer/polymer.dart';
+class ProfileCodeTrieNodeTreeRow extends TableTreeRow {
+ final ServiceMap profile;
+ @reflectable final CodeTrieNode root;
+ @reflectable final CodeTrieNode node;
+ @reflectable Code get code => node.code;
+
+ static String formatPercent(num a, num total) {
+ var percent = 100.0 * (a / total);
+ return '${percent.toStringAsFixed(2)}%';
+ }
+
+ ProfileCodeTrieNodeTreeRow(this.profile, this.root, this.node,
+ ProfileCodeTrieNodeTreeRow parent)
+ : super(parent) {
+ assert(root != null);
+ assert(node != null);
+ var totalSamples = root.count;
+ // When the row is created, fill out the columns.
+ if (parent == null) {
+ columns.add(formatPercent(node.count, root.count));
+ } else {
+ columns.add(formatPercent(node.count, parent.node.count));
+ }
+ columns.add(formatPercent(node.code.exclusiveTicks, totalSamples));
+ }
+
+ bool shouldDisplayChild(CodeTrieNode childNode, double threshold) {
+ return ((childNode.count / node.count) > threshold) ||
+ ((childNode.code.exclusiveTicks / root.count) > threshold);
+ }
+
+ void onShow() {
+ var threshold = profile['threshold'];
+ if (children.length > 0) {
+ // Child rows already created.
+ return;
+ }
+ for (var childNode in node.children) {
+ if (!shouldDisplayChild(childNode, threshold)) {
+ continue;
+ }
+ var row = new ProfileCodeTrieNodeTreeRow(profile, root, childNode, this);
+ children.add(row);
+ }
+ }
+
+ void onHide() {
+ }
+}
+
class ProfileCallerTreeRow extends TableTreeRow {
final ServiceMap profile;
@reflectable final Code code;
@@ -25,29 +76,41 @@
assert(code != null);
var totalSamples = profile['samples'];
// When the row is created, fill out the columns.
- columns.add(
- formatPercent(code.exclusiveTicks, totalSamples));
if (parent == null) {
- // Fill with dummy data.
- columns.add('');
+ var root = profile.isolate.codes.tagRoot();
+ var totalAttributedCalls = root.callersCount(code);
+ var totalParentCalls = root.sumCallersCount();
+ columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
} else {
var totalAttributedCalls = parent.code.callersCount(code);
var totalParentCalls = parent.code.sumCallersCount();
columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
}
+ columns.add(formatPercent(code.exclusiveTicks, totalSamples));
+ }
+
+ bool shouldDisplayChild(CodeCallCount childNode, totalSamples,
+ double threshold) {
+ var callerPercent = code.callersCount(childNode.code) /
+ code.sumCallersCount();
+ return (callerPercent > threshold) ||
+ ((childNode.code.exclusiveTicks / totalSamples) > threshold);
}
void onShow() {
+ var threshold = profile['threshold'];
+ var totalSamples = profile['samples'];
if (children.length > 0) {
// Child rows already created.
return;
}
- // Create child rows on demand.
- code.callers.forEach((CodeCallCount codeCaller) {
- var row =
- new ProfileCallerTreeRow(profile, codeCaller.code, this);
+ for (var codeCaller in code.callers) {
+ if (!shouldDisplayChild(codeCaller, totalSamples, threshold)) {
+ continue;
+ }
+ var row = new ProfileCallerTreeRow(profile, codeCaller.code, this);
children.add(row);
- });
+ }
}
void onHide() {
@@ -59,15 +122,20 @@
class IsolateProfileElement extends ObservatoryElement {
IsolateProfileElement.created() : super.created();
@published ServiceMap profile;
- @reflectable final topExclusiveCodes = new ObservableList<Code>();
- @observable int methodCountSelected = 0;
+ @observable bool callGraphChecked;
+ @observable bool hideTagsChecked;
@observable String sampleCount = '';
@observable String refreshTime = '';
+ @observable String sampleRate = '';
+ @observable String sampleDepth = '';
+ @observable String displayCutoff = '';
+ @reflectable double displayThreshold = 0.0001; // 0.5%.
- final List methodCounts = [10, 20, 50];
final _id = '#tableTree';
TableTree tree;
+ static const MICROSECONDS_PER_SECOND = 1000000.0;
+
void profileChanged(oldValue) {
if (profile == null) {
return;
@@ -76,21 +144,35 @@
var now = new DateTime.now();
sampleCount = totalSamples.toString();
refreshTime = now.toString();
+ sampleDepth = profile['depth'].toString();
+ var period = profile['period'];
+ sampleRate = (MICROSECONDS_PER_SECOND / period).toStringAsFixed(0);
+ displayCutoff = '${(displayThreshold * 100.0).toString()}%';
profile.isolate.processProfile(profile);
+ profile['threshold'] = displayThreshold;
_update();
}
+ void callGraphCheckedChanged(oldValue) {
+ _update();
+ }
+
+
void enteredView() {
- tree = new TableTree(['Method', 'Exclusive', 'Caller']);
+ tree = new TableTree();
_update();
}
- methodCountSelectedChanged(oldValue) {
- _update();
+ void hideTagsCheckedChanged(oldValue) {
+ refresh(null);
}
void refresh(var done) {
- profile.isolate.get('profile').then((ServiceMap m) {
+ var request = 'profile';
+ if ((hideTagsChecked != null) && hideTagsChecked) {
+ request += '?tags=hide';
+ }
+ profile.isolate.get(request).then((ServiceMap m) {
// Assert we got back the a profile.
assert(m.serviceType == 'Profile');
profile = m;
@@ -101,28 +183,46 @@
if (profile == null) {
return;
}
- _refreshTopMethods();
- _rebuildTree();
+ _buildTree();
}
- void _refreshTopMethods() {
+ void _buildCallersTree() {
assert(profile != null);
- var count = methodCounts[methodCountSelected];
- topExclusiveCodes.clear();
- topExclusiveCodes.addAll(profile.isolate.codes.topExclusive(count));
- }
-
- void _rebuildTree() {
- assert(profile != null);
- var rootChildren = [];
- for (var code in topExclusiveCodes) {
- var row = new ProfileCallerTreeRow(profile, code, null);
- rootChildren.add(row);
+ var root = profile.isolate.codes.tagRoot();
+ if (root == null) {
+ Logger.root.warning('No profile root tag.');
}
- tree.initialize(rootChildren);
+ try {
+ tree.initialize(new ProfileCallerTreeRow(profile, root, null));
+ } catch (e, stackTrace) {
+ Logger.root.warning('_buildCallersTree', e, stackTrace);
+ }
+
notifyPropertyChange(#tree, null, tree);
}
+ void _buildStackTree() {
+ var root = profile.isolate.profileTrieRoot;
+ if (root == null) {
+ Logger.root.warning('No profile trie root.');
+ }
+ try {
+ tree.initialize(
+ new ProfileCodeTrieNodeTreeRow(profile, root, root, null));
+ } catch (e, stackTrace) {
+ Logger.root.warning('_buildStackTree', e, stackTrace);
+ }
+ notifyPropertyChange(#tree, null, tree);
+ }
+
+ void _buildTree() {
+ if ((callGraphChecked) != null && callGraphChecked) {
+ _buildCallersTree();
+ } else {
+ _buildStackTree();
+ }
+ }
+
@observable String padding(TableTreeRow row) {
return 'padding-left: ${row.depth * 16}px;';
}
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 f8d14aa..af6c097 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -2,6 +2,7 @@
<link rel="import" href="code_ref.html">
<link rel="import" href="nav_bar.html">
<link rel="import" href="observatory_element.html">
+ <link rel="import" href="sliding_checkbox.html">
</head>
<polymer-element name="isolate-profile" extends="observatory-element">
<template>
@@ -11,40 +12,83 @@
<nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="row">
- <div class="col-md-12">
- <span>Top</span>
- <select selectedIndex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
- <option template repeat="{{count in methodCounts}}">{{count}}</option>
- </select>
- <span>exclusive methods</span>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
- </div>
- </div>
- <table id="tableTree" class="table table-hover">
- <thead>
+ <style>
+ .content {
+ padding-left: 10%;
+ font: 400 14px 'Montserrat', sans-serif;
+ }
+ h1 {
+ font: 400 18px 'Montserrat', sans-serif;
+ }
+ .member, .memberHeader {
+ 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;
+ }
+ </style>
+ <div class="content">
+ <h1>Sampled CPU profile</h1>
+ <table>
<tr>
- <th>Method</th>
- <th>Exclusive</th>
- <th>Caller</th>
+ <td class="memberHeader">Timestamp</td>
+ <td class="member">{{ refreshTime }}</td>
</tr>
- </thead>
- <tbody>
- <tr template repeat="{{row in tree.rows }}" style="{{}}">
- <td on-click="{{toggleExpanded}}"
- class="{{ coloring(row) }}"
- style="{{ padding(row) }}">
- <code-ref ref="{{ row.code }}"></code-ref>
+ <tr>
+ <td class="memberHeader">Sample count</td>
+ <td class="member">{{ sampleCount }}</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Sample rate</td>
+ <td class="member">{{ sampleRate }} Hz</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Sample depth</td>
+ <td class="member">{{ sampleDepth }} stack frames</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Call graph tree</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ callGraphChecked }}">
</td>
- <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
- <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
- </tr>
- </tbody>
- </table>
+ <tr>
+ <td class="memberHeader">Display cutoff</td>
+ <td class="member">{{ displayCutoff }}</td>
+ </tr>
+ <tr>
+ <td class="memberHeader">Hide tags</td>
+ <td class="member">
+ <input type="checkbox" checked="{{ hideTagsChecked }}">
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <table id="tableTree" class="table table-hover">
+ <thead>
+ <tr>
+ <th>Method</th>
+ <th>Caller</th>
+ <th>Exclusive</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr template repeat="{{row in tree.rows }}" style="{{}}">
+ <td on-click="{{toggleExpanded}}"
+ class="{{ coloring(row) }}"
+ style="{{ padding(row) }}">
+ <code-ref ref="{{ row.code }}"></code-ref>
+ </td>
+ <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+ <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</template>
<script type="application/dart" src="isolate_profile.dart"></script>
</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
new file mode 100644
index 0000000..730a438
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
@@ -0,0 +1,13 @@
+// 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 isolate_ref_element;
+
+import 'package:polymer/polymer.dart';
+import 'service_ref.dart';
+
+@CustomTag('isolate-ref')
+class IsolateRefElement extends ServiceRefElement {
+ IsolateRefElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
new file mode 100644
index 0000000..53d96b3
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -0,0 +1,9 @@
+<head>
+<link rel="import" href="service_ref.html">
+</head>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+ <a href="{{ url }}">{{ ref.name }}</a>
+</template>
+<script type="application/dart" src="isolate_ref.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index a5dbe18..9d3826a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,5 +1,6 @@
<head>
<link rel="import" href="function_ref.html">
+ <link rel="import" href="isolate_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="script_ref.html">
</head>
@@ -16,14 +17,7 @@
<div class="col-md-4">
<div class="row">
- <template if="{{ isolate.entry['id'] != null }}">
- <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
- {{ isolate.name }}
- </a>
- </template>
- <template if="{{ isolate.entry['id'] == null }}">
- {{ isolate.name }}
- </template>
+ <isolate-ref ref="{{ isolate }}"></isolate-ref>
</div>
<div class="row">
@@ -66,6 +60,7 @@
<a href="{{ isolate.relativeHashLink('allocationprofile') }}">
{{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
</a>
+ ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
</div>
<div class="col-md-2">
<template if="{{ isolate.topFrame == null }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
new file mode 100644
index 0000000..3693ce6
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -0,0 +1,25 @@
+// 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 isolate_view_element;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('isolate-view')
+class IsolateViewElement extends ObservatoryElement {
+ @published Isolate isolate;
+ IsolateViewElement.created() : super.created();
+
+ Future<ServiceObject> eval(String text) {
+ return isolate.get(
+ isolate.rootLib.id + "/eval?expr=${Uri.encodeComponent(text)}");
+ }
+
+ void refresh(var done) {
+ isolate.reload().whenComplete(done);
+ }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
new file mode 100644
index 0000000..209c73d
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -0,0 +1,163 @@
+<head>
+ <link rel="import" href="curly_block.html">
+ <link rel="import" href="eval_box.html">
+ <link rel="import" href="function_ref.html">
+ <link rel="import" href="library_ref.html">
+ <link rel="import" href="nav_bar.html">
+ <link rel="import" href="observatory_element.html">
+ <link rel="import" href="script_ref.html">
+</head>
+<polymer-element name="isolate-view" extends="observatory-element">
+ <template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ .sourceInset {
+ padding-left: 15%;
+ padding-right: 15%;
+ }
+ </style>
+
+ <nav-bar>
+ <top-nav-menu></top-nav-menu>
+ <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+ </isolate-nav-menu>
+ </nav-bar>
+
+ <div class="content">
+ <h1>isolate '{{ isolate.name }}'</h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">status</div>
+ <div class="memberValue">
+ <template if="{{ isolate.topFrame == null }}">
+ <strong>idle</strong>
+ </template>
+ <template if="{{ isolate.topFrame != null }}">
+ <strong>running</strong>
+ @
+ <function-ref ref="{{ isolate.topFrame['function'] }}">
+ </function-ref>
+ (<script-ref ref="{{ isolate.topFrame['script'] }}"
+ line="{{ isolate.topFrame['line'] }}"></script-ref>)
+ </template>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <template if="{{ isolate.topFrame != null }}">
+ <br>
+ <div class="sourceInset">
+ <pre>
+ {{ isolate.topFrame['line'] }} {{ isolate.topFrame['lineString'] }}</pre>
+ </div>
+ </template>
+
+ <br>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+ </div>
+ </div>
+ <div class="memberItem">
+ <template if="{{ isolate.entry != null }}">
+ <div class="memberName">entry</div>
+ <div class="memberValue">
+ <function-ref ref="{{ isolate.entry }}"></function-ref>
+ </div>
+ </template>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">id</div>
+ <div class="memberValue">{{ isolate.vmName }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+
+ <br>
+
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
+ </template>
+ <script type="application/dart" src="isolate_view.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index 398c508..f22e019 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -4,17 +4,23 @@
library library_view_element;
+import 'dart:async';
import 'observatory_element.dart';
import 'package:observatory/service.dart';
-
import 'package:polymer/polymer.dart';
+
@CustomTag('library-view')
class LibraryViewElement extends ObservatoryElement {
@published ServiceMap library;
LibraryViewElement.created() : super.created();
+ Future<ServiceObject> eval(String text) {
+ return library.isolate.get(
+ library.id + "/eval?expr=${Uri.encodeComponent(text)}");
+ }
+
void refresh(var done) {
library.reload().whenComplete(done);
}
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 b54eb21..3b4a368 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -1,5 +1,7 @@
<head>
<link rel="import" href="class_ref.html">
+ <link rel="import" href="curly_block.html">
+ <link rel="import" href="eval_box.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
@@ -10,6 +12,28 @@
</head>
<polymer-element name="library-view" extends="observatory-element">
<template>
+ <style>
+ .content {
+ padding-left: 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;
+ }
+ </style>
+
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -17,68 +41,111 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
- <div class="alert alert-info">Scripts</div>
- <table class="table table-hover">
- <tbody>
- <tr template repeat="{{ script in library['scripts']}}">
- <td>
- {{ script.kind }}
- </td>
- <td>
- <script-ref ref="{{ script }}"></script-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Imported Libraries</div>
- <table class="table table-hover">
- <tbody>
- <tr template repeat="{{ lib in library['libraries'] }}">
- <td>
- <library-ref ref="{{ lib }}"></library-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Variables</div>
- <table class="table table-hover">
- <tbody>
- <tr template repeat="{{ variable in library['variables'] }}">
- <td><field-ref ref="{{ variable }}"></field-ref></td>
- <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Functions</div>
- <table class="table table-hover">
- <tbody>
- <tr template repeat="{{ func in library['functions'] }}">
- <td>
- <function-ref ref="{{ func }}"></function-ref>
- </td>
- </tr>
- </tbody>
- </table>
- <div class="alert alert-info">Classes</div>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>Name</th>
- <th>Internal Name</th>
- </tr>
- </thead>
- <tbody>
- <tr template repeat="{{ cls in library['classes'] }}">
- <td>
- <class-ref ref="{{ cls }}"></class-ref>
- </td>
- <td>
- <class-ref ref="{{ cls }}" internal></class-ref>
- </td>
- </tr>
- </tbody>
- </table>
+ <div class="content">
+ <h1>
+ <!-- TODO(turnidge): Handle unnamed libraries -->
+ library {{ library.name }}
+ </h1>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">url</div>
+ <div class="memberValue">{{ library['url'] }}</div>
+ </div>
+ <template if="{{ library['imports'].length > 0 }}">
+ <div class="memberItem">
+ <div class="memberName">imports</div>
+ <div class="memberValue">
+ <template repeat="{{ import in library['imports'] }}">
+ <library-ref ref="{{ import }}"></library-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ <template if="{{ library.name != library.vmName }}">
+ <div class="memberItem">
+ <div class="memberName">vm name</div>
+ <div class="memberValue">{{ library.vmName }}</div>
+ </div>
+ </template>
+ </div>
+ </div>
+ <hr>
+
+ <div class="content">
+ <template if="{{ library['scripts'].isNotEmpty }}">
+ scripts ({{ library['scripts'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ script in library['scripts'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <script-ref ref="{{ script }}"></script-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['classes'].isNotEmpty }}">
+ classes ({{ library['classes'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ cls in library['classes'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <class-ref ref="{{ cls }}"></class-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['variables'].isNotEmpty }}">
+ variables ({{ library['variables'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ field in library['variables'] }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <field-ref ref="{{ field }}"></field-ref>
+ </div>
+ <div class="memberValue">
+ <template if="{{ field['value'] != null }}">
+ <instance-ref ref="{{ field['value'] }}"></instance-ref>
+ </template>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+
+ <template if="{{ library['functions'].isNotEmpty }}">
+ functions ({{ library['functions'].length }})
+ <curly-block>
+ <div class="memberList">
+ <template repeat="{{ function in library['functions'] }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <function-ref ref="{{ function }}"></function-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ </template>
+ </div>
+
+ <hr>
+
+ <div class="content">
+ <eval-box callback="{{ eval }}"></eval-box>
+ </div>
+ <br><br><br><br>
+ <br><br><br><br>
</template>
<script type="application/dart" 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 dbd2006..20e2907 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -159,13 +159,15 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
<nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
anchor="stack trace"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
anchor="cpu profile"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
anchor="heap profile"></nav-menu-item>
+ <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
+ anchor="heap map"></nav-menu-item>
<nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
anchor="breakpoints"></nav-menu-item>
<content></content>
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 2a81626..e739a45 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -48,6 +48,10 @@
FunctionViewElement element = new Element.tag('function-view');
element.function = object;
return element;
+ case 'HeapMap':
+ HeapMapElement element = new Element.tag('heap-map');
+ element.fragmentation = object;
+ return element;
case 'Array':
case 'Bool':
case 'Closure':
@@ -58,6 +62,10 @@
InstanceViewElement element = new Element.tag('instance-view');
element.instance = object;
return element;
+ case 'Isolate':
+ IsolateViewElement element = new Element.tag('isolate-view');
+ element.isolate = object;
+ return element;
case 'IsolateList':
IsolateListElement element = new Element.tag('isolate-list');
element.isolates = 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 93fadd0..23a7630 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -5,6 +5,7 @@
<link rel="import" href="error_view.html">
<link rel="import" href="field_view.html">
<link rel="import" href="function_view.html">
+ <link rel="import" href="heap_map.html">
<link rel="import" href="heap_profile.html">
<link rel="import" href="instance_view.html">
<link rel="import" href="isolate_list.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart
new file mode 100644
index 0000000..760fd11
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library sliding_checkbox_element;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('sliding-checkbox')
+class SlidingCheckboxElement extends PolymerElement {
+ SlidingCheckboxElement.created() : super.created();
+ @published bool checked;
+ @published String checkedText;
+ @published String uncheckedText;
+
+ void change(Event e, var details, Node target) {
+ CheckboxInputElement input = shadowRoot.querySelector('#slide-switch');
+ checked = input.checked;
+ }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
new file mode 100644
index 0000000..80f39aa
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -0,0 +1,87 @@
+<polymer-element name="sliding-checkbox">
+ <template>
+ <style>
+ .switch {
+ position: relative;
+ width: 121px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ }
+ .hide {
+ display: none;
+ }
+ .label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ }
+ .content {
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
+ }
+ .content:before, .content:after {
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 30px;
+ color: white;
+ font: 400 14px 'Montserrat', sans-serif;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .content:before {
+ content: {{ checkedText }};
+ padding-left: 10px;
+ background-color: #0489C3;
+ }
+ .content:after {
+ content: {{ uncheckedText }};
+ padding-right: 10px;
+ background-color: #EEEEEE;
+ color: #999999;
+ text-align: right;
+ }
+ .dot {
+ width: 14px;
+ margin: 8px;
+ background: #FFFFFF;
+ border: 2px solid #999999;
+ border-radius: 15px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 87px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
+ }
+ :checked + .label .content {
+ margin-left: 0;
+ }
+ :checked + .label .dot {
+ right: 0px;
+ }
+ </style>
+ <div class="switch">
+ <input type="checkbox"
+ class="hide"
+ id="slide-switch"
+ on-change="{{ change }}">
+ <label class="label" for="slide-switch">
+ <div class="content"></div>
+ <div class="dot"></div>
+ </label>
+ </div>
+ </template>
+ <script type="application/dart" 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 ca7313c..a965765 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -8,9 +8,17 @@
<polymer-element name="stack-frame" extends="observatory-element">
<template>
<style>
- .member {
+ .memberList {
+ display: table;
+ }
+ .memberItem {
+ display: table-row;
+ }
+ .memberName, .memberValue {
+ display: table-cell;
vertical-align: top;
- padding: 0 0 0 1em;
+ padding: 3px 0 3px 1em;
+ font: 400 14px 'Montserrat', sans-serif;
}
</style>
<div class="row">
@@ -22,15 +30,18 @@
<function-ref ref="{{ frame['function'] }}"></function-ref>
( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
</script-ref> )
+
<curly-block>
- <table>
- <tr template repeat="{{ v in frame['vars'] }}">
- <td class="member">{{ v['name']}}</td>
- <td class="member">
- <instance-ref ref="{{ v['value'] }}"></instance-ref>
- </td>
- </tr>
- </table>
+ <div class="memberList">
+ <template repeat="{{ v in frame['vars'] }}">
+ <div class="memberItem">
+ <div class="memberName">{{ v['name']}}</div>
+ <div class="memberValue">
+ <instance-ref ref="{{ v['value'] }}"></instance-ref>
+ </div>
+ </div>
+ </template>
+ </div>
</curly-block>
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/service/cache.dart b/runtime/bin/vmservice/client/lib/src/service/cache.dart
index 6feb94a..a1d8fe4 100644
--- a/runtime/bin/vmservice/client/lib/src/service/cache.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/cache.dart
@@ -42,9 +42,9 @@
assert(cachesId(id));
T cached = _cache[id];
if (cached != null) {
- return new Future.value(cached);
+ return cached.load();
}
- return isolate.get(id).then(_addToCache);
+ return isolate.getDirect(id);
}
/// If [obj] is cached, return the cached object. Otherwise, upgrades [obj]
@@ -113,6 +113,13 @@
return codeList;
}
+ static const TAG_ROOT_ID = 'code/tag-0';
+
+ /// Returns the Code object for the root tag.
+ Code tagRoot() {
+ return _cache[TAG_ROOT_ID];
+ }
+
void _resetProfileData() {
_cache.forEach((k, Code code) {
code.resetProfileData();
@@ -154,6 +161,7 @@
r'^functions/collected-.+|'
r'^functions/reused-.+|'
r'^functions/stub-.+|'
+ r'^functions/tag-.+|'
r'^classes/\d+/functions/.+|'
r'^classes/\d+/closures/.+|'
r'^classes/\d+/implicit_closures/.+|'
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index bbfe10a..63e253f 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -4,6 +4,169 @@
part of service;
+/// A [ServiceObject] is an object known to the VM service and is tied
+/// to an owning [Isolate].
+abstract class ServiceObject extends Observable {
+ Isolate _isolate;
+
+ /// Owning isolate.
+ @reflectable Isolate get isolate => _isolate;
+
+ /// Owning vm.
+ @reflectable VM get vm => _isolate.vm;
+
+ /// The complete service url of this object.
+ @reflectable String get link => isolate.relativeLink(_id);
+
+ /// The complete service url of this object with a '#/' prefix.
+ @reflectable String get hashLink => isolate.relativeHashLink(_id);
+ set hashLink(var o) { /* silence polymer */ }
+
+ String _id;
+ /// The id of this object.
+ @reflectable String get id => _id;
+
+ String _serviceType;
+ /// The service type of this object.
+ @reflectable String get serviceType => _serviceType;
+
+ bool _ref;
+
+ @observable String name;
+ @observable String vmName;
+
+ ServiceObject(this._isolate, this._id, this._serviceType) {
+ _ref = isRefType(_serviceType);
+ _serviceType = stripRef(_serviceType);
+ _created();
+ }
+
+ ServiceObject.fromMap(this._isolate, ObservableMap m) {
+ assert(isServiceMap(m));
+ _id = m['id'];
+ _ref = isRefType(m['type']);
+ _serviceType = stripRef(m['type']);
+ _created();
+ update(m);
+ }
+
+ /// If [this] was created from a reference, load the full object
+ /// from the service by calling [reload]. Else, return [this].
+ Future<ServiceObject> load() {
+ if (!_ref) {
+ // Not a reference.
+ return new Future.value(this);
+ }
+ // Call reload which will fill in the entire object.
+ return reload();
+ }
+
+ /// Reload [this]. Returns a future which completes to [this] or
+ /// a [ServiceError].
+ Future<ServiceObject> reload() {
+ assert(isolate != null);
+ if (id == '') {
+ // Errors don't have ids.
+ assert(serviceType == 'Error');
+ return new Future.value(this);
+ }
+ return isolate.vm.getAsMap(link).then(update);
+ }
+
+ /// Update [this] using [m] as a source. [m] can be a reference.
+ ServiceObject update(ObservableMap m) {
+ // Assert that m is a service map.
+ assert(ServiceObject.isServiceMap(m));
+ if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
+ // Got an unexpected error. Don't update the object.
+ return _upgradeToServiceObject(vm, isolate, m);
+ }
+ // TODO(johnmccutchan): Should we allow for a ServiceObject's id
+ // or type to change?
+ _id = m['id'];
+ _serviceType = stripRef(m['type']);
+ _update(m);
+ return this;
+ }
+
+ // update internal state from [map]. [map] can be a reference.
+ void _update(ObservableMap map);
+
+ /// Returns true if [this] has only been partially initialized via
+ /// a reference. See [load].
+ bool isRef() => _ref;
+
+ void _created() {
+ var refNotice = _ref ? ' Created from reference.' : '';
+ Logger.root.info('Created ServiceObject for \'${_id}\' with type '
+ '\'${_serviceType}\'.' + refNotice);
+ }
+
+ /// Returns true if [map] is a service map. i.e. it has the following keys:
+ /// 'id' and a 'type'.
+ static bool isServiceMap(ObservableMap m) {
+ return (m != null) && (m['id'] != null) && (m['type'] != null);
+ }
+
+ /// Returns true if [type] is a reference type. i.e. it begins with an
+ /// '@' character.
+ static bool isRefType(String type) {
+ return type.startsWith('@');
+ }
+
+ /// Returns the unreffed version of [type].
+ static String stripRef(String type) {
+ if (!isRefType(type)) {
+ return type;
+ }
+ // Strip off the '@' character.
+ return type.substring(1);
+ }
+}
+
+/// State for a VM being inspected.
+abstract class VM extends Observable {
+ @reflectable IsolateList _isolates;
+ @reflectable IsolateList get isolates => _isolates;
+
+ void _initOnce() {
+ assert(_isolates == null);
+ _isolates = new IsolateList(this);
+ }
+
+ VM() {
+ _initOnce();
+ }
+
+ /// Get [id] as an [ObservableMap] from the service directly.
+ Future<ObservableMap> getAsMap(String id) {
+ return getString(id).then((response) {
+ try {
+ var map = JSON.decode(response);
+ Logger.root.info('Decoded $id');
+ return toObservable(map);
+ } catch (e, st) {
+ return toObservable({
+ 'type': 'Error',
+ 'id': '',
+ 'kind': 'DecodeError',
+ 'message': '$e',
+ });
+ }
+ }).catchError((error) {
+ return toObservable({
+ 'type': 'Error',
+ 'id': '',
+ 'kind': 'LastResort',
+ 'message': '$error'
+ });
+ });
+ }
+
+ /// Get [id] as a [String] from the service directly. See [getAsMap].
+ Future<String> getString(String id);
+}
+
/// State for a running isolate.
class Isolate extends ServiceObject {
final VM vm;
@@ -61,11 +224,24 @@
}
_codes._resetProfileData();
_codes._updateProfileData(profile, codeTable);
+ var exclusiveTrie = profile['exclusive_trie'];
+ if (exclusiveTrie != null) {
+ profileTrieRoot = _processProfileTrie(exclusiveTrie, codeTable);
+ }
+ }
+
+ Future<ServiceObject> getDirect(String serviceId) {
+ return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
+ return _upgradeToServiceObject(vm, this, m);
+ });
}
/// Requests [serviceId] from [this]. Completes to a [ServiceObject].
/// Can return pre-existing, cached, [ServiceObject]s.
Future<ServiceObject> get(String serviceId) {
+ if (serviceId == '') {
+ return reload();
+ }
if (_scripts.cachesId(serviceId)) {
return _scripts.get(serviceId);
}
@@ -78,9 +254,7 @@
if (_functions.cachesId(serviceId)) {
return _functions.get(serviceId);
}
- return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
- return _upgradeToServiceObject(vm, this, m);
- });
+ return getDirect(serviceId);
}
@observable ServiceMap rootLib;
@@ -95,6 +269,8 @@
@observable int newHeapUsed = 0;
@observable int oldHeapUsed = 0;
+ @observable int newHeapCapacity = 0;
+ @observable int oldHeapCapacity = 0;
@observable String fileAndLine;
@@ -114,7 +290,7 @@
name = entry['name'];
} else {
// fred
- name = 'root isolate';
+ name = 'root';
}
if (map['topFrame'] != null) {
topFrame = map['topFrame'];
@@ -137,6 +313,53 @@
newHeapUsed = map['heap']['usedNew'];
oldHeapUsed = map['heap']['usedOld'];
+ newHeapCapacity = map['heap']['capacityNew'];
+ oldHeapCapacity = map['heap']['capacityOld'];
+ }
+
+ @reflectable CodeTrieNode profileTrieRoot;
+ // The profile trie is serialized as a list of integers. Each node
+ // is recreated by consuming some portion of the list. The format is as
+ // follows:
+ // [0] index into codeTable of code object.
+ // [1] tick count (number of times this stack frame occured).
+ // [2] child node count
+ // Reading the trie is done by recursively reading the tree depth-first
+ // pre-order.
+ CodeTrieNode _processProfileTrie(List<int> data, List<Code> codeTable) {
+ // Setup state shared across calls to _readTrieNode.
+ _trieDataCursor = 0;
+ _trieData = data;
+ if (_trieData == null) {
+ return null;
+ }
+ if (_trieData.length < 3) {
+ // Not enough integers for 1 node.
+ return null;
+ }
+ // Read the tree, returns the root node.
+ return _readTrieNode(codeTable);
+ }
+ int _trieDataCursor;
+ List<int> _trieData;
+ CodeTrieNode _readTrieNode(List<Code> codeTable) {
+ // Read index into code table.
+ var index = _trieData[_trieDataCursor++];
+ // Lookup code object.
+ var code = codeTable[index];
+ // Frame counter.
+ var count = _trieData[_trieDataCursor++];
+ // Create node.
+ var node = new CodeTrieNode(code, count);
+ // Number of children.
+ var children = _trieData[_trieDataCursor++];
+ // Recursively read child nodes.
+ for (var i = 0; i < children; i++) {
+ var child = _readTrieNode(codeTable);
+ node.children.add(child);
+ node.summedChildCount += child.count;
+ }
+ return node;
}
}
@@ -446,6 +669,8 @@
return Collected;
} else if (s == 'Reused') {
return Reused;
+ } else if (s == 'Tag') {
+ return Tag;
}
Logger.root.warning('Unknown code kind $s');
throw new FallThroughError();
@@ -454,6 +679,7 @@
static const Dart = const CodeKind._internal('Dart');
static const Collected = const CodeKind._internal('Collected');
static const Reused = const CodeKind._internal('Reused');
+ static const Tag = const CodeKind._internal('Tag');
}
class CodeCallCount {
@@ -462,6 +688,14 @@
CodeCallCount(this.code, this.count);
}
+class CodeTrieNode {
+ final Code code;
+ final int count;
+ final children = new List<CodeTrieNode>();
+ int summedChildCount = 0;
+ CodeTrieNode(this.code, this.count);
+}
+
class Code extends ServiceObject {
@observable CodeKind kind;
@observable int totalSamplesInProfile = 0;
@@ -475,7 +709,7 @@
@reflectable final addressTicks = new ObservableMap<int, CodeTick>();
@observable String formattedInclusiveTicks = '';
@observable String formattedExclusiveTicks = '';
-
+ @observable ServiceMap objectPool;
@observable ServiceMap function;
String name;
String vmName;
@@ -547,7 +781,7 @@
'($inclusiveTicks)';
formattedExclusiveTicks =
'${formatPercent(exclusiveTicks, totalSamplesInProfile)} '
- '($inclusiveTicks)';
+ '($exclusiveTicks)';
}
void _update(ObservableMap m) {
@@ -559,8 +793,8 @@
kind = CodeKind.fromString(m['kind']);
startAddress = int.parse(m['start'], radix:16);
endAddress = int.parse(m['end'], radix:16);
- // Upgrade the function.
- function = _upgradeToServiceObject(isolate.vm, isolate, m['function']);
+ function = _upgradeToServiceObject(vm, isolate, m['function']);
+ objectPool = _upgradeToServiceObject(vm, isolate, m['object_pool']);
var disassembly = m['disassembly'];
if (disassembly != null) {
_processDisassembly(disassembly);
diff --git a/runtime/bin/vmservice/client/lib/src/service/service.dart b/runtime/bin/vmservice/client/lib/src/service/service.dart
index 3671116..bc160d8 100644
--- a/runtime/bin/vmservice/client/lib/src/service/service.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/service.dart
@@ -4,126 +4,6 @@
part of service;
-/// A [ServiceObject] is an object known to the VM service and is tied
-/// to an owning [Isolate].
-abstract class ServiceObject extends Observable {
- Isolate _isolate;
-
- /// Owning isolate.
- @reflectable Isolate get isolate => _isolate;
-
- /// Owning vm.
- @reflectable VM get vm => _isolate.vm;
-
- /// The complete service url of this object.
- @reflectable String get link => isolate.relativeLink(_id);
-
- /// The complete service url of this object with a '#/' prefix.
- @reflectable String get hashLink => isolate.relativeHashLink(_id);
- set hashLink(var o) { /* silence polymer */ }
-
- String _id;
- /// The id of this object.
- @reflectable String get id => _id;
-
- String _serviceType;
- /// The service type of this object.
- @reflectable String get serviceType => _serviceType;
-
- bool _ref;
-
- @observable String name;
- @observable String vmName;
-
- ServiceObject(this._isolate, this._id, this._serviceType) {
- _ref = isRefType(_serviceType);
- _serviceType = stripRef(_serviceType);
- _created();
- }
-
- ServiceObject.fromMap(this._isolate, ObservableMap m) {
- assert(isServiceMap(m));
- _id = m['id'];
- _ref = isRefType(m['type']);
- _serviceType = stripRef(m['type']);
- _created();
- update(m);
- }
-
- /// If [this] was created from a reference, load the full object
- /// from the service by calling [reload]. Else, return [this].
- Future<ServiceObject> load() {
- if (!_ref) {
- // Not a reference.
- return new Future.value(this);
- }
- // Call refresh which will fill in the entire object.
- return reload();
- }
-
- /// Reload [this]. Returns a future which completes to [this] or
- /// a [ServiceError].
- Future<ServiceObject> reload() {
- assert(isolate != null);
- if (id == '') {
- // Errors don't have ids.
- assert(serviceType == 'Error');
- return new Future.value(this);
- }
- return isolate.vm.getAsMap(link).then(update);
- }
-
- /// Update [this] using [m] as a source. [m] can be a reference.
- ServiceObject update(ObservableMap m) {
- // Assert that m is a service map.
- assert(ServiceObject.isServiceMap(m));
- if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
- // Got an unexpected error. Don't update the object.
- return _upgradeToServiceObject(vm, isolate, m);
- }
- // TODO(johnmccutchan): Should we allow for a ServiceObject's id
- // or type to change?
- _id = m['id'];
- _serviceType = stripRef(m['type']);
- _update(m);
- return this;
- }
-
- // update internal state from [map]. [map] can be a reference.
- void _update(ObservableMap map);
-
- /// Returns true if [this] has only been partially initialized via
- /// a reference. See [load].
- bool isRef() => _ref;
-
- void _created() {
- var refNotice = _ref ? ' Created from reference.' : '';
- Logger.root.info('Created ServiceObject for \'${_id}\' with type '
- '\'${_serviceType}\'.' + refNotice);
- }
-
- /// Returns true if [map] is a service map. i.e. it has the following keys:
- /// 'id' and a 'type'.
- static bool isServiceMap(ObservableMap m) {
- return (m != null) && (m['id'] != null) && (m['type'] != null);
- }
-
- /// Returns true if [type] is a reference type. i.e. it begins with an
- /// '@' character.
- static bool isRefType(String type) {
- return type.startsWith('@');
- }
-
- /// Returns the unreffed version of [type].
- static String stripRef(String type) {
- if (!isRefType(type)) {
- return type;
- }
- // Strip off the '@' character.
- return type.substring(1);
- }
-}
-
/// Recursively upgrades all [ServiceObject]s inside [collection] which must
/// be an [ObservableMap] or an [ObservableList]. Upgraded elements will be
/// associated with [vm] and [isolate].
@@ -164,6 +44,9 @@
/// This acts like a factory which consumes an ObservableMap and returns
/// a fully upgraded ServiceObject.
ServiceObject _upgradeToServiceObject(VM vm, Isolate isolate, ObservableMap m) {
+ if (m == null) {
+ return null;
+ }
if (!ServiceObject.isServiceMap(m)) {
Logger.root.severe("Malformed service object: $m");
}
diff --git a/runtime/bin/vmservice/client/lib/src/service/vm.dart b/runtime/bin/vmservice/client/lib/src/service/vm.dart
deleted file mode 100644
index 4886517..0000000
--- a/runtime/bin/vmservice/client/lib/src/service/vm.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of service;
-
-abstract class VM extends Observable {
- @reflectable IsolateList _isolates;
- @reflectable IsolateList get isolates => _isolates;
-
- void _initOnce() {
- assert(_isolates == null);
- _isolates = new IsolateList(this);
- }
-
- VM() {
- _initOnce();
- }
-
- /// Get [id] as an [ObservableMap] from the service directly.
- Future<ObservableMap> getAsMap(String id) {
- return getString(id).then((response) {
- try {
- var map = JSON.decode(response);
- Logger.root.info('Decoded $id');
- return toObservable(map);
- } catch (e, st) {
- return toObservable({
- 'type': 'Error',
- 'id': '',
- 'kind': 'DecodeError',
- 'message': '$e',
- });
- }
- }).catchError((error) {
- return toObservable({
- 'type': 'Error',
- 'id': '',
- 'kind': 'LastResort',
- 'message': '$error'
- });
- });
- }
-
- /// Get [id] as a [String] from the service directly. See [getAsMap].
- Future<String> getString(String id);
-}
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index a75b564..8147b2d 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -7,4 +7,6 @@
bool operator ==(other) native "FunctionImpl_equals";
int get hashCode native "FunctionImpl_hashCode";
+
+ _FunctionImpl get call => this;
}
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 8f773f9..99d55dc 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -111,6 +111,16 @@
}
+RawTypedData* CreateRandomState(Isolate* isolate, uint64_t seed) {
+ const TypedData& result = TypedData::Handle(
+ isolate, TypedData::New(kTypedDataUint32ArrayCid, 2));
+ result.SetUint32(0, static_cast<uint32_t>(seed));
+ result.SetUint32(result.ElementSizeInBytes(),
+ static_cast<uint32_t>(seed >> 32));
+ return result.raw();
+}
+
+
uint64_t mix64(uint64_t n) {
// Thomas Wang 64-bit mix.
// http://www.concentric.net/~Ttwang/tech/inthash.htm
@@ -135,14 +145,12 @@
// if (hash == 0) {
// hash = 0x5A17;
// }
-// _state[kSTATE_LO] = hash & _MASK_32;
-// _state[kSTATE_HI] = hash >> 32;
-DEFINE_NATIVE_ENTRY(Random_setupSeed, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(1));
- const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
- ASSERT(!seed_int.IsNull());
- ASSERT(!array.IsNull());
+// var result = new Uint32List(2);
+// result[kSTATE_LO] = seed & _MASK_32;
+// result[kSTATE_HI] = seed >> 32;
+// return result;
+DEFINE_NATIVE_ENTRY(Random_setupSeed, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(0));
uint64_t seed = 0;
if (seed_int.IsBigint()) {
const Bigint& mask64 = Bigint::Handle(
@@ -172,10 +180,15 @@
if (seed == 0) {
seed = 0x5a17;
}
- array.SetUint32(0, static_cast<uint32_t>(seed));
- array.SetUint32(array.ElementSizeInBytes(),
- static_cast<uint32_t>(seed >> 32));
- return Object::null();
+ return CreateRandomState(isolate, seed);
+}
+
+
+DEFINE_NATIVE_ENTRY(Random_initialSeed, 0) {
+ Random* rnd = isolate->random();
+ uint64_t seed = rnd->NextUInt32();
+ seed |= (static_cast<uint64_t>(rnd->NextUInt32()) << 32);
+ return CreateRandomState(isolate, seed);
}
} // namespace dart
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index b1301e9..279a549 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -71,34 +71,23 @@
patch class Random {
/*patch*/ factory Random([int seed]) {
- if (seed == null) {
- seed = _Random._nextSeed();
- }
+ var state = _Random._setupSeed((seed == null) ? _Random._nextSeed() : seed);
// Crank a couple of times to distribute the seed bits a bit further.
- return new _Random().._setupSeed(seed)
- .._nextState()
- .._nextState()
- .._nextState()
- .._nextState();
+ return new _Random._withState(state).._nextState()
+ .._nextState()
+ .._nextState()
+ .._nextState();
}
}
class _Random implements Random {
// Internal state of the random number generator.
- final _state = new Uint32List(2);
+ final _state;
static const kSTATE_LO = 0;
static const kSTATE_HI = 1;
- // Implements:
- // do {
- // seed = (seed + 0x5A17) & _Random._MASK_64;
- // } while (seed == 0);
- // _state[kSTATE_LO] = seed & _MASK_32;
- // _state[kSTATE_HI] = seed >> 32;
- // This is a native to prevent 64-bit operations in Dart, which
- // fail with --throw_on_javascript_int_overflow.
- void _setupSeed(int seed) native "Random_setupSeed";
+ _Random._withState(Uint32List this._state);
// The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
// http://en.wikipedia.org/wiki/Multiply-with-carry
@@ -154,13 +143,15 @@
static const _A = 0xffffda61;
// Use a singleton Random object to get a new seed if no seed was passed.
- static var _prng = null;
+ static var _prng = new _Random._withState(_initialSeed());
+
+ // This is a native to prevent 64-bit operations in Dart, which
+ // fail with --throw_on_javascript_int_overflow.
+ static Uint32List _setupSeed(int seed) native "Random_setupSeed";
+ // Get a seed from the VM's random number provider.
+ static Uint32List _initialSeed() native "Random_initialSeed";
static int _nextSeed() {
- if (_prng == null) {
- // TODO(iposva): Use system to get a random seed.
- _prng = new Random(new DateTime.now().millisecondsSinceEpoch);
- }
// Trigger the PRNG once to change the internal state.
_prng._nextState();
return _prng._state[kSTATE_LO];
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 098ef1e..1ef4b3d 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1550,23 +1550,6 @@
}
-DEFINE_NATIVE_ENTRY(ClosureMirror_apply, 2) {
- GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(0));
- GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(1));
-
- const Array& args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
-
- const Object& result =
- Object::Handle(DartEntry::InvokeClosure(args, args_descriptor));
- if (result.IsError()) {
- ThrowInvokeError(Error::Cast(result));
- UNREACHABLE();
- }
- return result.raw();
-}
-
-
DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) {
if (!FLAG_support_find_in_context) {
return Object::empty_array().raw();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index bb8b56e..4da4e96 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -446,40 +446,9 @@
return _function;
}
- // TODO(12602): Remove this special case.
- delegate(Invocation invocation) {
- if (invocation.isMethod && (invocation.memberName == #call)) {
- return this.apply(invocation.positionalArguments,
- invocation.namedArguments).reflectee;
- }
- return super.delegate(invocation);
- }
-
InstanceMirror apply(List<Object> positionalArguments,
[Map<Symbol, Object> namedArguments]) {
- // TODO(12602): When closures get an ordinary call method, this can be
- // replaced with
- // return this.invoke(#call, positionalArguments, namedArguments);
- // and the native ClosureMirror_apply can be removed.
- int numPositionalArguments = positionalArguments.length + 1; // Receiver.
- int numNamedArguments = namedArguments != null ? namedArguments.length : 0;
- int numArguments = numPositionalArguments + numNamedArguments;
- List arguments = new List(numArguments);
- arguments[0] = _reflectee; // Receiver.
- arguments.setRange(1, numPositionalArguments, positionalArguments);
- List names = new List(numNamedArguments);
- int argumentIndex = numPositionalArguments;
- int nameIndex = 0;
- if (numNamedArguments > 0) {
- namedArguments.forEach((name, value) {
- arguments[argumentIndex++] = value;
- names[nameIndex++] = _n(name);
- });
- }
-
- // It is tempting to implement this in terms of Function.apply, but then
- // lazy compilation errors would be fatal.
- return reflect(_apply(arguments, names));
+ return this.invoke(#call, positionalArguments, namedArguments);
}
InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
@@ -500,9 +469,6 @@
String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'";
- static _apply(arguments, argumentNames)
- native 'ClosureMirror_apply';
-
static _computeFunction(reflectee)
native 'ClosureMirror_function';
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 6001a2f..1269903 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -474,24 +474,12 @@
#endif
#if !defined(TARGET_OS_WINDOWS)
-#if !defined(TEMP_FAILURE_RETRY)
-// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. The
-// definition below is copied from Linux and adapted to avoid lint
-// errors (type long int changed to intptr_t and do/while split on
-// separate lines with body in {}s).
-#define TEMP_FAILURE_RETRY(expression) \
- ({ intptr_t __result; \
- do { \
- __result = (expression); \
- } while ((__result == -1L) && (errno == EINTR)); \
- __result; })
-#endif // !defined(TEMP_FAILURE_RETRY)
-
-// This is a version of TEMP_FAILURE_RETRY which does not use the value
-// returned from the expression.
-#define VOID_TEMP_FAILURE_RETRY(expression) \
- (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
-
+#if defined(TEMP_FAILURE_RETRY)
+// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. We should
+// not use that version, but instead the one in signal_blocker.h, to ensure
+// we disable signal interrupts.
+#undef TEMP_FAILURE_RETRY
+#endif // defined(TEMP_FAILURE_RETRY)
#endif // !defined(TARGET_OS_WINDOWS)
#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
diff --git a/runtime/platform/platform_sources.gypi b/runtime/platform/platform_sources.gypi
index eadf674..ecfb801 100644
--- a/runtime/platform/platform_sources.gypi
+++ b/runtime/platform/platform_sources.gypi
@@ -9,6 +9,7 @@
'hashmap.cc',
'json.cc',
'floating_point_win.cc',
+ 'signal_blocker.h',
'thread_android.cc',
'thread_linux.cc',
'thread_macos.cc',
diff --git a/runtime/bin/signal_blocker.h b/runtime/platform/signal_blocker.h
similarity index 60%
rename from runtime/bin/signal_blocker.h
rename to runtime/platform/signal_blocker.h
index 2b5fe1e..4bfc228 100644
--- a/runtime/bin/signal_blocker.h
+++ b/runtime/platform/signal_blocker.h
@@ -2,8 +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.
-#ifndef BIN_SIGNAL_BLOCKER_H_
-#define BIN_SIGNAL_BLOCKER_H_
+#ifndef PLATFORM_SIGNAL_BLOCKER_H_
+#define PLATFORM_SIGNAL_BLOCKER_H_
#include "platform/globals.h"
@@ -16,7 +16,6 @@
#include "platform/thread.h"
namespace dart {
-namespace bin {
class ThreadSignalBlocker {
public:
@@ -54,7 +53,10 @@
};
-#define TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression) \
+// The definition below is copied from Linux and adapted to avoid lint
+// errors (type long int changed to intptr_t and do/while split on
+// separate lines with body in {}s) and to also block signals.
+#define TEMP_FAILURE_RETRY(expression) \
({ ThreadSignalBlocker tsb(SIGPROF); \
intptr_t __result; \
do { \
@@ -62,10 +64,21 @@
} while ((__result == -1L) && (errno == EINTR)); \
__result; })
-#define VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression) \
- (static_cast<void>(TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)))
+// This is a version of TEMP_FAILURE_RETRY which does not use the value
+// returned from the expression.
+#define VOID_TEMP_FAILURE_RETRY(expression) \
+ (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
-} // namespace bin
+// This macro can be used to insert checks that a call is made, that
+// was expected to not return EINTR, but did it anyway.
+#define NO_RETRY_EXPECTED(expression) \
+ ({ intptr_t __result = (expression); \
+ ASSERT(__result != -1L || errno != EINTR); \
+ __result; })
+
+#define VOID_NO_RETRY_EXPECTED(expression) \
+ (static_cast<void>(NO_RETRY_EXPECTED(expression)))
+
} // namespace dart
-#endif // BIN_SIGNAL_BLOCKER_H_
+#endif // PLATFORM_SIGNAL_BLOCKER_H_
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 72e6022..aca8af4 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -27,6 +27,7 @@
cc/ThreadInterrupterHigh: Skip
cc/ThreadInterrupterMedium: Skip
cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
[ $system == linux ]
cc/ThreadInterrupterHigh: Skip
@@ -42,6 +43,7 @@
cc/ThreadInterrupterHigh: Skip
cc/ThreadInterrupterMedium: Skip
cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
[ $arch == simmips && $arch == mips ]
cc/Service_Coverage: Skip # Dart bug 16250
@@ -70,7 +72,10 @@
[ $arch == mips ]
cc/Cop1CvtDL: Crash # Illegal instructions
cc/Cop1CvtDL_neg: Crash # Illegal instructions
-cc/StaticNonNullSumCallCodegen: Crash # dartbug.com/17440
+cc/StaticNonNullSumCallCodegen: Crash, Pass # dartbug.com/17440
+
+[ $arch == mips && $mode == debug ]
+cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 4bedd21..7a954ee 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2555,9 +2555,9 @@
void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
if (CanLoadFromObjectPool(object)) {
- ASSERT(reg != TMP);
- LoadObject(TMP, object, pp);
- cmpq(reg, TMP);
+ const int32_t offset =
+ Array::element_offset(FindObject(object, kNotPatchable));
+ cmpq(reg, Address(pp, offset-kHeapObjectTag));
} else {
CompareImmediate(
reg, Immediate(reinterpret_cast<int64_t>(object.raw())), pp);
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index 5fb336d..33d1836 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -98,6 +98,14 @@
static void AssertCurrent(BaseIsolate* isolate);
#endif
+ uword vm_tag() const {
+ return vm_tag_;
+ }
+
+ void set_vm_tag(uword tag) {
+ vm_tag_ = tag;
+ }
+
protected:
BaseIsolate()
: top_resource_(NULL),
@@ -107,7 +115,8 @@
no_handle_scope_depth_(0),
no_gc_scope_depth_(0),
#endif
- no_callback_scope_depth_(0)
+ no_callback_scope_depth_(0),
+ vm_tag_(0)
{}
~BaseIsolate() {
@@ -122,6 +131,7 @@
int32_t no_gc_scope_depth_;
#endif
int32_t no_callback_scope_depth_;
+ uword vm_tag_;
private:
DISALLOW_COPY_AND_ASSIGN(BaseIsolate);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 172952f..ca91be4 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -120,7 +120,8 @@
V(Math_log, 1) \
V(Math_doublePow, 2) \
V(Random_nextState, 1) \
- V(Random_setupSeed, 2) \
+ V(Random_setupSeed, 1) \
+ V(Random_initialSeed, 0) \
V(DateNatives_currentTimeMillis, 0) \
V(DateNatives_timeZoneName, 1) \
V(DateNatives_timeZoneOffsetInSeconds, 1) \
@@ -296,7 +297,6 @@
V(InstanceMirror_computeType, 1) \
V(ClosureMirror_find_in_context, 2) \
V(ClosureMirror_function, 1) \
- V(ClosureMirror_apply, 2) \
V(TypeMirror_subtypeTest, 2) \
V(TypeMirror_moreSpecificTest, 2) \
V(ClassMirror_library, 1) \
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0c284c2..1f77260 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1026,18 +1026,11 @@
ic_data,
&result)) {
ArgumentsDescriptor desc(args_descriptor);
- Function& target_function = Function::Handle();
- if (receiver.IsClosure() && target_name.Equals(Symbols::Call())) {
- target_function = receiver_class.GetInvocationDispatcher(
- target_name,
- args_descriptor,
- RawFunction::kInvokeClosureDispatcher);
- } else {
- target_function = receiver_class.GetInvocationDispatcher(
- target_name,
- args_descriptor,
- RawFunction::kNoSuchMethodDispatcher);
- }
+ const Function& target_function =
+ Function::Handle(receiver_class.GetInvocationDispatcher(
+ target_name,
+ args_descriptor,
+ RawFunction::kNoSuchMethodDispatcher));
// Update IC data.
ASSERT(!target_function.IsNull());
intptr_t receiver_cid = receiver.GetClassId();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 14e5a87..c0bbbe2 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -30,6 +30,7 @@
#include "vm/parser.h"
#include "vm/scanner.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
#include "vm/timer.h"
namespace dart {
@@ -261,6 +262,7 @@
TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
bool is_compiled = false;
Isolate* isolate = Isolate::Current();
+ VMTagScope tagScope(isolate, VMTag::kCompileTagId);
HANDLESCOPE(isolate);
isolate->set_cha_used(false);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7ea19a5..219b6fc 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -30,6 +30,7 @@
#include "vm/service.h"
#include "vm/stack_frame.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
#include "vm/timer.h"
#include "vm/unicode.h"
#include "vm/verifier.h"
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 69fc769..00ea8f8 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1474,7 +1474,6 @@
(kind == RawFunction::kMethodExtractor) ||
(kind == RawFunction::kNoSuchMethodDispatcher) ||
(kind == RawFunction::kInvokeFieldDispatcher) ||
- (kind == RawFunction::kInvokeClosureDispatcher) ||
func.IsImplicitConstructor()) {
return false;
}
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 1d49949..303bebd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -13,6 +13,7 @@
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
// Allow the use of ASan (AddressSanitizer). This is needed as ASan needs to be
// told about areas where the VM does the equivalent of a long-jump.
@@ -273,6 +274,7 @@
NoGCScope no_gc;
RawObject* raw_exception = exception_object.raw();
RawObject* raw_stacktrace = stacktrace_object.raw();
+ Isolate* isolate = Isolate::Current();
#if defined(USING_SIMULATOR)
// Unwinding of the C++ frames and destroying of their stack resources is done
@@ -282,12 +284,13 @@
// Continue simulating at the given pc in the given frame after setting up the
// exception object in the kExceptionObjectReg register and the stacktrace
// object (may be raw null) in the kStackTraceObjectReg register.
+ isolate->set_vm_tag(VMTag::kScriptTagId);
Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer,
raw_exception, raw_stacktrace);
#else
// Prepare for unwinding frames by destroying all the stack resources
// in the previous frames.
- Isolate* isolate = Isolate::Current();
+
while (isolate->top_resource() != NULL &&
(reinterpret_cast<uword>(isolate->top_resource()) < stack_pointer)) {
isolate->top_resource()->~StackResource();
@@ -304,6 +307,7 @@
uword current_sp = reinterpret_cast<uword>(&program_counter) - 1024;
__asan_unpoison_memory_region(reinterpret_cast<void*>(current_sp),
stack_pointer - current_sp);
+ isolate->set_vm_tag(VMTag::kScriptTagId);
func(program_counter, stack_pointer, frame_pointer,
raw_exception, raw_stacktrace);
#endif
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 4348d6b..18c26c6 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -15,6 +15,7 @@
#include "vm/raw_object.h"
#include "vm/scavenger.h"
#include "vm/stack_frame.h"
+#include "vm/tags.h"
#include "vm/verifier.h"
#include "vm/virtual_memory.h"
#include "vm/weak_table.h"
@@ -176,9 +177,11 @@
void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
+ Isolate* isolate = Isolate::Current();
bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
switch (space) {
case kNew: {
+ VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
RecordBeforeGC(kNew, kNewSpace);
UpdateClassHeapStatsBeforeGC(kNew);
new_space_->Scavenge(invoke_api_callbacks);
@@ -192,6 +195,7 @@
}
case kOld:
case kCode: {
+ VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
bool promotion_failure = new_space_->HadPromotionFailure();
RecordBeforeGC(kOld, promotion_failure ? kPromotionFailure : kOldSpace);
UpdateClassHeapStatsBeforeGC(kOld);
@@ -229,16 +233,23 @@
void Heap::CollectAllGarbage() {
- RecordBeforeGC(kNew, kFull);
- UpdateClassHeapStatsBeforeGC(kNew);
- new_space_->Scavenge(kInvokeApiCallbacks);
- RecordAfterGC();
- PrintStats();
- RecordBeforeGC(kOld, kFull);
- UpdateClassHeapStatsBeforeGC(kOld);
- old_space_->MarkSweep(kInvokeApiCallbacks);
- RecordAfterGC();
- PrintStats();
+ Isolate* isolate = Isolate::Current();
+ {
+ VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
+ RecordBeforeGC(kNew, kFull);
+ UpdateClassHeapStatsBeforeGC(kNew);
+ new_space_->Scavenge(kInvokeApiCallbacks);
+ RecordAfterGC();
+ PrintStats();
+ }
+ {
+ VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
+ RecordBeforeGC(kOld, kFull);
+ UpdateClassHeapStatsBeforeGC(kOld);
+ old_space_->MarkSweep(kInvokeApiCallbacks);
+ RecordAfterGC();
+ PrintStats();
+ }
}
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b5de9a3..0d32f42 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -28,6 +28,7 @@
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
#include "vm/thread.h"
#include "vm/thread_interrupter.h"
#include "vm/timer.h"
@@ -40,8 +41,10 @@
"Track function usage and report.");
DEFINE_FLAG(bool, trace_isolates, false,
"Trace isolate creation and shut down.");
-DEFINE_FLAG(bool, pin_isolates, false,
- "Stop isolates from being destroyed automatically.");
+DEFINE_FLAG(bool, pause_isolates_on_start, false,
+ "Pause isolates before starting.");
+DEFINE_FLAG(bool, pause_isolates_on_exit, false,
+ "Pause isolates exiting.");
void Isolate::RegisterClass(const Class& cls) {
@@ -298,7 +301,6 @@
message_notify_callback_(NULL),
name_(NULL),
start_time_(OS::GetCurrentTimeMicros()),
- pin_port_(0),
main_port_(0),
heap_(NULL),
object_store_(NULL),
@@ -336,6 +338,7 @@
REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
reusable_handles_() {
+ set_vm_tag(VMTag::kVMTagId);
}
#undef REUSABLE_HANDLE_SCOPE_INIT
#undef REUSABLE_HANDLE_INITIALIZERS
@@ -434,9 +437,8 @@
result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
result->set_main_port(PortMap::CreatePort(result->message_handler()));
result->BuildName(name_prefix);
- if (FLAG_pin_isolates) {
- result->CreatePinPort();
- }
+ 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);
@@ -452,28 +454,6 @@
}
-void Isolate::CreatePinPort() {
- ASSERT(FLAG_pin_isolates);
- // Only do this once.
- ASSERT(pin_port_ == 0);
- pin_port_ = PortMap::CreatePort(message_handler());
- ASSERT(pin_port_ != 0);
- PortMap::SetLive(pin_port_);
-}
-
-
-void Isolate::ClosePinPort() {
- if (pin_port_ == 0) {
- // Support multiple calls to close.
- return;
- }
- ASSERT(pin_port_ != 0);
- bool r = PortMap::ClosePort(pin_port_);
- ASSERT(r);
- pin_port_ = 0;
-}
-
-
void Isolate::BuildName(const char* name_prefix) {
ASSERT(name_ == NULL);
if (name_prefix == NULL) {
@@ -914,7 +894,16 @@
// inlined frames.
jsobj.AddProperty("depth", (intptr_t)0);
}
-
+ intptr_t live_ports = message_handler()->live_ports();
+ intptr_t control_ports = message_handler()->control_ports();
+ bool paused_on_exit = message_handler()->paused_on_exit();
+ bool pause_on_start = message_handler()->pause_on_start();
+ bool pause_on_exit = message_handler()->pause_on_exit();
+ jsobj.AddProperty("live_ports", live_ports);
+ jsobj.AddProperty("control_ports", control_ports);
+ jsobj.AddProperty("paused_on_exit", paused_on_exit);
+ jsobj.AddProperty("paused_on_start", pause_on_start);
+ jsobj.AddProperty("pause_on_exit", pause_on_exit);
const Library& lib =
Library::Handle(object_store()->root_library());
jsobj.AddProperty("rootLib", lib);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5410ab8..6743b33 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -142,12 +142,6 @@
int64_t start_time() const { return start_time_; }
- // Creates the pin port (responsible for stopping the isolate from being
- // destroyed).
- void CreatePinPort();
- // Closes pin port.
- void ClosePinPort();
-
Dart_Port main_port() { return main_port_; }
void set_main_port(Dart_Port port) {
ASSERT(main_port_ == 0); // Only set main port once.
@@ -176,6 +170,10 @@
return OFFSET_OF(Isolate, top_exit_frame_info_);
}
+ static intptr_t vm_tag_offset() {
+ return OFFSET_OF(Isolate, vm_tag_);
+ }
+
ApiState* api_state() const { return api_state_; }
void set_api_state(ApiState* value) { api_state_ = value; }
@@ -482,7 +480,6 @@
Dart_MessageNotifyCallback message_notify_callback_;
char* name_;
int64_t start_time_;
- Dart_Port pin_port_;
Dart_Port main_port_;
Heap* heap_;
ObjectStore* object_store_;
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 332a6e6..d76e060 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -34,6 +34,9 @@
oob_queue_(new MessageQueue()),
control_ports_(0),
live_ports_(0),
+ pause_on_start_(false),
+ pause_on_exit_(false),
+ paused_on_exit_(false),
pool_(NULL),
task_(NULL),
start_callback_(NULL),
@@ -197,6 +200,15 @@
// Initialize the message handler by running its start function,
// if we have one. For an isolate, this will run the isolate's
// main() function.
+ if (pause_on_start()) {
+ HandleMessages(false, false);
+ if (pause_on_start()) {
+ // Still paused.
+ task_ = NULL; // No task in queue.
+ return;
+ }
+ }
+
if (start_callback_) {
monitor_.Exit();
ok = start_callback_(callback_data_);
@@ -212,14 +224,19 @@
task_ = NULL; // No task in queue.
if (!ok || !HasLivePorts()) {
- if (FLAG_trace_isolates) {
+ if (pause_on_exit()) {
+ paused_on_exit_ = true;
+ } else {
+ if (FLAG_trace_isolates) {
OS::Print("[-] Stopping message handler (%s):\n"
"\thandler: %s\n",
(ok ? "no live ports" : "error"),
name());
+ }
+ pool_ = NULL;
+ run_end_callback = true;
+ paused_on_exit_ = false;
}
- pool_ = NULL;
- run_end_callback = true;
}
}
if (run_end_callback && end_callback_ != NULL) {
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index f7707aa..eb1056b 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -63,6 +63,35 @@
// A message handler tracks how many live ports it has.
bool HasLivePorts() const { return live_ports_ > control_ports_; }
+ intptr_t live_ports() const {
+ return live_ports_;
+ }
+
+ intptr_t control_ports() const {
+ return control_ports_;
+ }
+
+ bool pause_on_start() const {
+ return pause_on_start_;
+ }
+
+ void set_pause_on_start(bool pause_on_start) {
+ pause_on_start_ = pause_on_start;
+ }
+
+ bool pause_on_exit() const {
+ return pause_on_exit_;
+ }
+
+ void set_pause_on_exit(bool pause_on_exit) {
+ pause_on_exit_ = pause_on_exit;
+ }
+
+ bool paused_on_exit() const {
+ return paused_on_exit_;
+ }
+
+
#if defined(DEBUG)
// Check that it is safe to access this message handler.
//
@@ -129,6 +158,9 @@
MessageQueue* oob_queue_;
intptr_t control_ports_; // The number of open control ports usually 0 or 1.
intptr_t live_ports_; // The number of open ports, including control ports.
+ bool pause_on_start_;
+ bool pause_on_exit_;
+ bool paused_on_exit_;
ThreadPool* pool_;
ThreadPool::Task* task_;
StartCallback start_callback_;
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index af4bd96..525bfea 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -8,6 +8,8 @@
#include "vm/dart_api_impl.h"
#include "vm/dart_api_state.h"
+#include "vm/tags.h"
+
namespace dart {
@@ -51,6 +53,7 @@
VERIFY_ON_TRANSITION;
NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
Isolate* isolate = arguments->isolate();
+
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
ApiLocalScope* current_top_scope = state->top_scope();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ec96fea..4db8ff7 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -40,6 +40,7 @@
#include "vm/scopes.h"
#include "vm/stack_frame.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
#include "vm/timer.h"
#include "vm/unicode.h"
@@ -1680,9 +1681,15 @@
ASSERT((FakeObject::kClassId != kInstanceCid));
result.set_id(FakeObject::kClassId);
result.set_state_bits(0);
- // VM backed classes are almost ready: run checks and resolve class
- // references, but do not recompute size.
- result.set_is_prefinalized();
+ if (FakeObject::kClassId < kInstanceCid) {
+ // VM internal classes are done. There is no finalization needed or
+ // possible in this case.
+ result.set_is_finalized();
+ } else {
+ // VM backed classes are almost ready: run checks and resolve class
+ // references, but do not recompute size.
+ result.set_is_prefinalized();
+ }
result.set_type_arguments_field_offset_in_words(kNoTypeArguments);
result.set_num_type_arguments(0);
result.set_num_own_type_arguments(0);
@@ -2254,8 +2261,7 @@
};
ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
- kind == RawFunction::kInvokeFieldDispatcher ||
- kind == RawFunction::kInvokeClosureDispatcher);
+ kind == RawFunction::kInvokeFieldDispatcher);
Function& dispatcher = Function::Handle();
Array& cache = Array::Handle(invocation_dispatcher_cache());
ASSERT(!cache.IsNull());
@@ -3774,37 +3780,81 @@
jsobj.AddPropertyF("id", "classes/%" Pd "", id());
jsobj.AddProperty("name", internal_class_name);
jsobj.AddProperty("user_name", user_visible_class_name);
- if (!ref) {
- const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
- if (!err.IsNull()) {
- jsobj.AddProperty("error", err);
- }
- jsobj.AddProperty("implemented", is_implemented());
- jsobj.AddProperty("abstract", is_abstract());
- jsobj.AddProperty("patch", is_patch());
- jsobj.AddProperty("finalized", is_finalized());
- jsobj.AddProperty("const", is_const());
- jsobj.AddProperty("super", Class::Handle(SuperClass()));
- jsobj.AddProperty("library", Object::Handle(library()));
- {
- JSONArray fields_array(&jsobj, "fields");
- const Array& field_array = Array::Handle(fields());
- Field& field = Field::Handle();
- if (!field_array.IsNull()) {
- for (intptr_t i = 0; i < field_array.Length(); ++i) {
- field ^= field_array.At(i);
- fields_array.AddValue(field);
+ if (ref) {
+ return;
+ }
+
+ const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
+ if (!err.IsNull()) {
+ jsobj.AddProperty("error", err);
+ }
+ jsobj.AddProperty("implemented", is_implemented());
+ jsobj.AddProperty("abstract", is_abstract());
+ jsobj.AddProperty("patch", is_patch());
+ jsobj.AddProperty("finalized", is_finalized());
+ jsobj.AddProperty("const", is_const());
+ jsobj.AddProperty("super", Class::Handle(SuperClass()));
+ jsobj.AddProperty("library", Object::Handle(library()));
+ const Script& script = Script::Handle(this->script());
+ if (!script.IsNull()) {
+ intptr_t line_number = 0;
+ intptr_t column_number = 0;
+ script.GetTokenLocation(token_pos(), &line_number, &column_number);
+ jsobj.AddProperty("script", script);
+ jsobj.AddProperty("line", line_number);
+ jsobj.AddProperty("col", column_number);
+ }
+ {
+ JSONArray interfaces_array(&jsobj, "interfaces");
+ const Array& interface_array = Array::Handle(interfaces());
+ Type& interface_type = Type::Handle();
+ Class& interface_cls = Class::Handle();
+ if (!interface_array.IsNull()) {
+ for (intptr_t i = 0; i < interface_array.Length(); ++i) {
+ // TODO(turnidge): Use the Type directly once regis has added
+ // types to the vmservice.
+ interface_type ^= interface_array.At(i);
+ if (interface_type.HasResolvedTypeClass()) {
+ interface_cls = interface_type.type_class();
+ interfaces_array.AddValue(interface_cls);
}
}
}
- {
- JSONArray functions_array(&jsobj, "functions");
- const Array& function_array = Array::Handle(functions());
- Function& function = Function::Handle();
- if (!function_array.IsNull()) {
- for (intptr_t i = 0; i < function_array.Length(); i++) {
- function ^= function_array.At(i);
- functions_array.AddValue(function);
+ }
+ {
+ JSONArray fields_array(&jsobj, "fields");
+ const Array& field_array = Array::Handle(fields());
+ Field& field = Field::Handle();
+ if (!field_array.IsNull()) {
+ for (intptr_t i = 0; i < field_array.Length(); ++i) {
+ field ^= field_array.At(i);
+ fields_array.AddValue(field);
+ }
+ }
+ }
+ {
+ JSONArray functions_array(&jsobj, "functions");
+ const Array& function_array = Array::Handle(functions());
+ Function& function = Function::Handle();
+ if (!function_array.IsNull()) {
+ for (intptr_t i = 0; i < function_array.Length(); i++) {
+ function ^= function_array.At(i);
+ functions_array.AddValue(function);
+ }
+ }
+ }
+ {
+ JSONArray subclasses_array(&jsobj, "subclasses");
+ const GrowableObjectArray& subclasses =
+ GrowableObjectArray::Handle(direct_subclasses());
+ if (!subclasses.IsNull()) {
+ Class& subclass = Class::Handle();
+ if (!subclasses.IsNull()) {
+ for (intptr_t i = 0; i < subclasses.Length(); ++i) {
+ // TODO(turnidge): Use the Type directly once regis has added
+ // types to the vmservice.
+ subclass ^= subclasses.At(i);
+ subclasses_array.AddValue(subclass);
}
}
}
@@ -4657,8 +4707,7 @@
RawArray* Function::saved_args_desc() const {
ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
- kind() == RawFunction::kInvokeFieldDispatcher ||
- kind() == RawFunction::kInvokeClosureDispatcher);
+ kind() == RawFunction::kInvokeFieldDispatcher);
const Object& obj = Object::Handle(raw_ptr()->data_);
ASSERT(obj.IsArray());
return Array::Cast(obj).raw();
@@ -4667,8 +4716,7 @@
void Function::set_saved_args_desc(const Array& value) const {
ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
- kind() == RawFunction::kInvokeFieldDispatcher ||
- kind() == RawFunction::kInvokeClosureDispatcher);
+ kind() == RawFunction::kInvokeFieldDispatcher);
ASSERT(raw_ptr()->data_ == Object::null());
set_data(value);
}
@@ -4817,9 +4865,6 @@
case RawFunction::kInvokeFieldDispatcher:
return "kInvokeFieldDispatcher";
break;
- case RawFunction::kInvokeClosureDispatcher:
- return "kInvokeClosureDispatcher";
- break;
default:
UNREACHABLE();
return NULL;
@@ -6072,9 +6117,6 @@
case RawFunction::kInvokeFieldDispatcher:
kind_str = "invoke-field-dispatcher";
break;
- case RawFunction::kInvokeClosureDispatcher:
- kind_str = "invoke-closure-dispatcher";
- break;
default:
UNREACHABLE();
}
@@ -6092,7 +6134,7 @@
void Function::PrintToJSONStream(JSONStream* stream, bool ref) const {
const char* internal_name = String::Handle(name()).ToCString();
const char* user_name =
- String::Handle(QualifiedUserVisibleName()).ToCString();
+ String::Handle(UserVisibleName()).ToCString();
Class& cls = Class::Handle(Owner());
ASSERT(!cls.IsNull());
Error& err = Error::Handle();
@@ -6106,9 +6148,7 @@
} else if (IsImplicitClosureFunction()) {
id = cls.FindImplicitClosureFunctionIndex(*this);
selector = "implicit_closures";
- } else if (IsNoSuchMethodDispatcher() ||
- IsInvokeFieldDispatcher() ||
- IsInvokeClosureDispatcher()) {
+ } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
id = cls.FindInvocationDispatcherFunctionIndex(*this);
selector = "dispatchers";
} else {
@@ -6123,9 +6163,15 @@
jsobj.AddProperty("name", internal_name);
jsobj.AddProperty("user_name", user_name);
jsobj.AddProperty("class", cls);
+ const Function& parent = Function::Handle(parent_function());
+ if (!parent.IsNull()) {
+ jsobj.AddProperty("parent", parent);
+ }
const char* kind_string = Function::KindToCString(kind());
jsobj.AddProperty("kind", kind_string);
- if (ref) return;
+ if (ref) {
+ return;
+ }
jsobj.AddProperty("is_static", is_static());
jsobj.AddProperty("is_const", is_const());
jsobj.AddProperty("is_optimizable", is_optimizable());
@@ -7327,17 +7373,19 @@
void Script::Tokenize(const String& private_key) const {
- const TokenStream& tkns = TokenStream::Handle(tokens());
+ Isolate* isolate = Isolate::Current();
+ const TokenStream& tkns = TokenStream::Handle(isolate, tokens());
if (!tkns.IsNull()) {
// Already tokenized.
return;
}
-
// Get the source, scan and allocate the token stream.
+ VMTagScope tagScope(isolate, VMTag::kCompileTagId);
TimerScope timer(FLAG_compiler_stats, &CompilerStats::scanner_timer);
- const String& src = String::Handle(Source());
+ const String& src = String::Handle(isolate, Source());
Scanner scanner(src, private_key);
- set_tokens(TokenStream::Handle(TokenStream::New(scanner.GetStream(),
+ set_tokens(TokenStream::Handle(isolate,
+ TokenStream::New(scanner.GetStream(),
private_key)));
if (FLAG_compiler_stats) {
CompilerStats::src_length += src.Length();
@@ -8779,15 +8827,18 @@
void Library::PrintToJSONStream(JSONStream* stream, bool ref) const {
const char* library_name = String::Handle(name()).ToCString();
- const char* library_url = String::Handle(url()).ToCString();
intptr_t id = index();
ASSERT(id >= 0);
JSONObject jsobj(stream);
jsobj.AddProperty("type", JSONType(ref));
jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
+ jsobj.AddProperty("user_name", library_name);
jsobj.AddProperty("name", library_name);
- jsobj.AddProperty("user_name", library_url);
- if (ref) return;
+ if (ref) {
+ return;
+ }
+ const char* library_url = String::Handle(url()).ToCString();
+ jsobj.AddProperty("url", library_url);
{
JSONArray jsarr(&jsobj, "classes");
ClassDictionaryIterator class_iter(*this);
@@ -8801,7 +8852,7 @@
}
}
{
- JSONArray jsarr(&jsobj, "libraries");
+ JSONArray jsarr(&jsobj, "imports");
Library& lib = Library::Handle();
for (intptr_t i = 0; i < num_imports(); i++) {
lib = ImportLibraryAt(i);
@@ -10530,6 +10581,8 @@
if (ref) {
return;
}
+ const Array& array = Array::Handle(ObjectPool());
+ jsobj.AddProperty("object_pool", array);
JSONArray jsarr(&jsobj, "disassembly");
if (is_alive()) {
// Only disassemble alive code objects.
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7105637..ddbd50c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1544,10 +1544,6 @@
return kind() == RawFunction::kInvokeFieldDispatcher;
}
- bool IsInvokeClosureDispatcher() const {
- return kind() == RawFunction::kInvokeClosureDispatcher;
- }
-
// Returns true iff an implicit closure function has been created
// for this function.
bool HasImplicitClosureFunction() const {
@@ -1600,7 +1596,6 @@
case RawFunction::kMethodExtractor:
case RawFunction::kNoSuchMethodDispatcher:
case RawFunction::kInvokeFieldDispatcher:
- case RawFunction::kInvokeClosureDispatcher:
return true;
case RawFunction::kClosureFunction:
case RawFunction::kConstructor:
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 10a4034..797b523 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -28,6 +28,7 @@
#include "vm/scopes.h"
#include "vm/stack_frame.h"
#include "vm/symbols.h"
+#include "vm/tags.h"
#include "vm/timer.h"
#include "vm/zone.h"
@@ -353,8 +354,10 @@
void Parser::ParseCompilationUnit(const Library& library,
const Script& script) {
- ASSERT(Isolate::Current()->long_jump_base()->IsSafeToJump());
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate->long_jump_base()->IsSafeToJump());
TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
+ VMTagScope tagScope(isolate, VMTag::kCompileTagId);
Parser parser(script, library, 0);
parser.ParseTopLevel();
}
@@ -702,8 +705,9 @@
void Parser::ParseClass(const Class& cls) {
if (!cls.is_synthesized_class()) {
- TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
Isolate* isolate = Isolate::Current();
+ VMTagScope tagScope(isolate, VMTag::kCompileTagId);
+ TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
ASSERT(isolate->long_jump_base()->IsSafeToJump());
const Script& script = Script::Handle(isolate, cls.script());
const Library& lib = Library::Handle(isolate, cls.library());
@@ -760,9 +764,10 @@
void Parser::ParseFunction(ParsedFunction* parsed_function) {
+ Isolate* isolate = Isolate::Current();
+ VMTagScope tagScope(isolate, VMTag::kCompileTagId);
TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
CompilerStats::num_functions_compiled++;
- Isolate* isolate = Isolate::Current();
ASSERT(isolate->long_jump_base()->IsSafeToJump());
ASSERT(parsed_function != NULL);
const Function& func = parsed_function->function();
@@ -810,10 +815,6 @@
node_sequence =
parser.ParseInvokeFieldDispatcher(func, default_parameter_values);
break;
- case RawFunction::kInvokeClosureDispatcher:
- node_sequence =
- parser.ParseInvokeClosureDispatcher(func, default_parameter_values);
- break;
default:
UNREACHABLE();
}
@@ -1409,53 +1410,6 @@
}
-SequenceNode* Parser::ParseInvokeClosureDispatcher(const Function& func,
- Array& default_values) {
- TRACE_PARSER("ParseInvokeClosureDispatcher");
-
- ASSERT(func.IsInvokeClosureDispatcher());
- intptr_t token_pos = func.token_pos();
- ASSERT(func.token_pos() == 0);
- ASSERT(current_class().raw() == func.Owner());
-
- const Array& args_desc = Array::Handle(func.saved_args_desc());
- ArgumentsDescriptor desc(args_desc);
- ASSERT(desc.Count() > 0);
-
- // Set up scope for this function.
- BuildDispatcherScope(func, desc, default_values);
-
- // Receiver is local 0.
- LocalScope* scope = current_block_->scope;
- LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
-
- // Pass arguments 1..n to the closure call.
- ArgumentListNode* closure_args = new ArgumentListNode(token_pos);
- const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld));
- // Positional parameters.
- intptr_t i = 1;
- for (; i < desc.PositionalCount(); ++i) {
- closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
- }
- // Named parameters.
- for (; i < desc.Count(); i++) {
- closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
- intptr_t index = i - desc.PositionalCount();
- names.SetAt(index, String::Handle(desc.NameAt(index)));
- }
- closure_args->set_names(names);
-
- EnsureSavedCurrentContext();
- ClosureCallNode* closure_call = new ClosureCallNode(token_pos,
- receiver,
- closure_args);
-
- ReturnNode* return_node = new ReturnNode(token_pos, closure_call);
- current_block_->statements->Add(return_node);
- return CloseBlock();
-}
-
-
void Parser::SkipBlock() {
ASSERT(CurrentToken() == Token::kLBRACE);
GrowableArray<Token::Kind> token_stack(8);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 97ff35f..8760eab 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -450,8 +450,6 @@
Array& default_values);
SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
Array& default_values);
- SequenceNode* ParseInvokeClosureDispatcher(const Function& func,
- Array& default_values);
void BuildDispatcherScope(const Function& func,
const ArgumentsDescriptor& desc,
Array& default_values);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 112183a..68de13c 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -201,13 +201,109 @@
}
};
+
struct CallEntry {
intptr_t code_table_index;
intptr_t count;
};
+
typedef bool (*RegionCompare)(uword pc, uword region_start, uword region_end);
+
+class CodeRegionTrieNode : public ZoneAllocated {
+ public:
+ explicit CodeRegionTrieNode(intptr_t code_region_index)
+ : code_region_index_(code_region_index),
+ count_(0),
+ children_(new ZoneGrowableArray<CodeRegionTrieNode*>()) {
+ }
+
+ void Tick() {
+ ASSERT(code_region_index_ >= 0);
+ count_++;
+ }
+
+ intptr_t count() const {
+ ASSERT(code_region_index_ >= 0);
+ return count_;
+ }
+
+ intptr_t code_region_index() const {
+ return code_region_index_;
+ }
+
+ ZoneGrowableArray<CodeRegionTrieNode*>& children() const {
+ return *children_;
+ }
+
+ CodeRegionTrieNode* GetChild(intptr_t child_code_region_index) {
+ const intptr_t length = children_->length();
+ intptr_t i = 0;
+ while (i < length) {
+ CodeRegionTrieNode* child = (*children_)[i];
+ if (child->code_region_index() == child_code_region_index) {
+ return child;
+ }
+ if (child->code_region_index() > child_code_region_index) {
+ break;
+ }
+ i++;
+ }
+ // Add new CodeRegion, sorted by CodeRegionTable index.
+ CodeRegionTrieNode* child = new CodeRegionTrieNode(child_code_region_index);
+ if (i < length) {
+ // Insert at i.
+ children_->InsertAt(i, child);
+ } else {
+ // Add to end.
+ children_->Add(child);
+ }
+ return child;
+ }
+
+ // Sort this's children and (recursively) all descendants by count.
+ // This should only be called after the trie is completely built.
+ void SortByCount() {
+ children_->Sort(CodeRegionTrieNodeCompare);
+ ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+ intptr_t child_count = kids.length();
+ // Recurse.
+ for (intptr_t i = 0; i < child_count; i++) {
+ kids[i]->SortByCount();
+ }
+ }
+
+ void PrintToJSONArray(JSONArray* array) const {
+ ASSERT(array != NULL);
+ // Write CodeRegion index.
+ array->AddValue(code_region_index_);
+ // Write count.
+ array->AddValue(count_);
+ // Write number of children.
+ ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+ intptr_t child_count = kids.length();
+ array->AddValue(child_count);
+ // Recurse.
+ for (intptr_t i = 0; i < child_count; i++) {
+ kids[i]->PrintToJSONArray(array);
+ }
+ }
+
+ private:
+ static int CodeRegionTrieNodeCompare(CodeRegionTrieNode* const* a,
+ CodeRegionTrieNode* const* b) {
+ ASSERT(a != NULL);
+ ASSERT(b != NULL);
+ return (*b)->count() - (*a)->count();
+ }
+
+ const intptr_t code_region_index_;
+ intptr_t count_;
+ ZoneGrowableArray<CodeRegionTrieNode*>* children_;
+};
+
+
// A contiguous address region that holds code. Each CodeRegion has a "kind"
// which describes the type of code contained inside the region. Each
// region covers the following interval: [start, end).
@@ -221,19 +317,19 @@
kTagCode, // A special kind of code representing a tag.
};
- CodeRegion(Kind kind, uword start, uword end, int64_t timestamp) :
- kind_(kind),
- start_(start),
- end_(end),
- inclusive_ticks_(0),
- exclusive_ticks_(0),
- inclusive_tick_serial_(0),
- name_(NULL),
- compile_timestamp_(timestamp),
- creation_serial_(0),
- address_table_(new ZoneGrowableArray<AddressEntry>()),
- callers_table_(new ZoneGrowableArray<CallEntry>()),
- callees_table_(new ZoneGrowableArray<CallEntry>()) {
+ CodeRegion(Kind kind, uword start, uword end, int64_t timestamp)
+ : kind_(kind),
+ start_(start),
+ end_(end),
+ inclusive_ticks_(0),
+ exclusive_ticks_(0),
+ inclusive_tick_serial_(0),
+ name_(NULL),
+ compile_timestamp_(timestamp),
+ creation_serial_(0),
+ address_table_(new ZoneGrowableArray<AddressEntry>()),
+ callers_table_(new ZoneGrowableArray<CallEntry>()),
+ callees_table_(new ZoneGrowableArray<CallEntry>()) {
ASSERT(start_ < end_);
}
@@ -346,12 +442,12 @@
TickAddress(pc, exclusive);
}
- void AddCaller(intptr_t index) {
- AddCallEntry(callers_table_, index);
+ void AddCaller(intptr_t index, intptr_t count) {
+ AddCallEntry(callers_table_, index, count);
}
- void AddCallee(intptr_t index) {
- AddCallEntry(callees_table_, index);
+ void AddCallee(intptr_t index, intptr_t count) {
+ AddCallEntry(callees_table_, index, count);
}
void PrintNativeCode(JSONObject* profile_code_obj) {
@@ -417,6 +513,27 @@
}
}
+ void PrintTagCode(JSONObject* profile_code_obj) {
+ ASSERT(kind() == kTagCode);
+ JSONObject obj(profile_code_obj, "code");
+ obj.AddProperty("type", "@Code");
+ obj.AddProperty("kind", "Tag");
+ obj.AddPropertyF("id", "code/tag-%" Px "", start());
+ obj.AddProperty("name", name());
+ obj.AddProperty("user_name", name());
+ obj.AddPropertyF("start", "%" Px "", start());
+ obj.AddPropertyF("end", "%" Px "", end());
+ {
+ // Generate a fake function entry.
+ JSONObject func(&obj, "function");
+ func.AddProperty("type", "@Function");
+ func.AddProperty("kind", "Tag");
+ obj.AddPropertyF("id", "functions/tag-%" Px "", start());
+ func.AddProperty("name", name());
+ func.AddProperty("user_name", name());
+ }
+ }
+
void PrintToJSONArray(Isolate* isolate, JSONArray* events, bool full) {
JSONObject obj(events);
obj.AddProperty("type", "CodeRegion");
@@ -445,6 +562,13 @@
GenerateAndSetSymbolName("[Reused]");
}
PrintOverwrittenCode(&obj);
+ } else if (kind() == kTagCode) {
+ if (name() == NULL) {
+ const char* tag_name = start() == 0 ? "root" : VMTag::TagName(start());
+ ASSERT(tag_name != NULL);
+ SetName(tag_name);
+ }
+ PrintTagCode(&obj);
} else {
ASSERT(kind() == kNativeCode);
if (name() == NULL) {
@@ -511,13 +635,14 @@
}
- void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index) {
+ void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index,
+ intptr_t count) {
const intptr_t length = table->length();
intptr_t i = 0;
for (; i < length; i++) {
CallEntry& entry = (*table)[i];
if (entry.code_table_index == index) {
- entry.count++;
+ entry.count += count;
return;
}
if (entry.code_table_index > index) {
@@ -526,7 +651,7 @@
}
CallEntry entry;
entry.code_table_index = index;
- entry.count = 1;
+ entry.count = count;
if (i < length) {
table->InsertAt(i, entry);
} else {
@@ -567,6 +692,7 @@
DISALLOW_COPY_AND_ASSIGN(CodeRegion);
};
+
// A sorted table of CodeRegions. Does not allow for overlap.
class CodeRegionTable : public ValueObject {
public:
@@ -729,6 +855,8 @@
uword start, uword end) {
// We should never see overlapping Dart code regions.
ASSERT(region->kind() != CodeRegion::kDartCode);
+ // We should never see overlapping Tag code regions.
+ ASSERT(region->kind() != CodeRegion::kTagCode);
// When code regions overlap, they should be of the same kind.
ASSERT(region->kind() == code_region->kind());
region->AdjustExtent(start, end);
@@ -771,14 +899,17 @@
public:
CodeRegionTableBuilder(Isolate* isolate,
CodeRegionTable* live_code_table,
- CodeRegionTable* dead_code_table)
+ CodeRegionTable* dead_code_table,
+ CodeRegionTable* tag_code_table)
: SampleVisitor(isolate),
live_code_table_(live_code_table),
dead_code_table_(dead_code_table),
+ tag_code_table_(tag_code_table),
isolate_(isolate),
vm_isolate_(Dart::vm_isolate()) {
ASSERT(live_code_table_ != NULL);
ASSERT(dead_code_table_ != NULL);
+ ASSERT(tag_code_table_ != NULL);
frames_ = 0;
min_time_ = kMaxInt64;
max_time_ = 0;
@@ -794,6 +925,8 @@
if (timestamp < min_time_) {
min_time_ = timestamp;
}
+ // Make sure VM tag is created.
+ CreateTag(sample->vm_tag());
// Exclusive tick for bottom frame.
Tick(sample->At(0), true, timestamp);
// Inclusive tick for all frames.
@@ -814,6 +947,45 @@
int64_t max_time() const { return max_time_; }
private:
+ void CreateTag(uword tag) {
+ intptr_t index = tag_code_table_->FindIndex(tag);
+ if (index >= 0) {
+ // Already created.
+ return;
+ }
+ CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+ tag,
+ tag + 1,
+ 0);
+ index = tag_code_table_->InsertCodeRegion(region);
+ ASSERT(index >= 0);
+ region->set_creation_serial(visited());
+ }
+
+ void TickTag(uword tag, bool exclusive) {
+ CodeRegionTable::TickResult r;
+ intptr_t serial = exclusive ? -1 : visited();
+ r = tag_code_table_->Tick(tag, exclusive, serial, 0);
+ if (r == CodeRegionTable::kTicked) {
+ // Live code found and ticked.
+ return;
+ }
+ ASSERT(r == CodeRegionTable::kNotFound);
+ CreateAndTickTagCodeRegion(tag, exclusive, serial);
+ }
+
+ void CreateAndTickTagCodeRegion(uword tag, bool exclusive, intptr_t serial) {
+ // Need to create tag code.
+ CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+ tag,
+ tag + 1,
+ 0);
+ intptr_t index = tag_code_table_->InsertCodeRegion(region);
+ region->set_creation_serial(visited());
+ ASSERT(index >= 0);
+ tag_code_table_->At(index)->Tick(tag, exclusive, serial);
+ }
+
void Tick(uword pc, bool exclusive, int64_t timestamp) {
CodeRegionTable::TickResult r;
intptr_t serial = exclusive ? -1 : visited();
@@ -913,53 +1085,82 @@
int64_t max_time_;
CodeRegionTable* live_code_table_;
CodeRegionTable* dead_code_table_;
+ CodeRegionTable* tag_code_table_;
Isolate* isolate_;
Isolate* vm_isolate_;
};
-class CodeRegionTableCallersBuilder : public SampleVisitor {
+class CodeRegionExclusiveTrieBuilder : public SampleVisitor {
public:
- CodeRegionTableCallersBuilder(Isolate* isolate,
- CodeRegionTable* live_code_table,
- CodeRegionTable* dead_code_table)
+ CodeRegionExclusiveTrieBuilder(Isolate* isolate,
+ CodeRegionTable* live_code_table,
+ CodeRegionTable* dead_code_table,
+ CodeRegionTable* tag_code_table)
: SampleVisitor(isolate),
live_code_table_(live_code_table),
- dead_code_table_(dead_code_table) {
+ dead_code_table_(dead_code_table),
+ tag_code_table_(tag_code_table) {
ASSERT(live_code_table_ != NULL);
ASSERT(dead_code_table_ != NULL);
+ ASSERT(tag_code_table_ != NULL);
dead_code_table_offset_ = live_code_table_->Length();
+ tag_code_table_offset_ = dead_code_table_offset_ +
+ dead_code_table_->Length();
+ intptr_t root_index = tag_code_table_->FindIndex(0);
+ // Verify that the "0" tag does not exist.
+ ASSERT(root_index < 0);
+ // Insert the dummy tag CodeRegion that is used for the Trie root.
+ CodeRegion* region = new CodeRegion(CodeRegion::kTagCode, 0, 1, 0);
+ root_index = tag_code_table_->InsertCodeRegion(region);
+ ASSERT(root_index >= 0);
+ region->set_creation_serial(0);
+ root_ = new CodeRegionTrieNode(tag_code_table_offset_ + root_index);
+ // Use tags by default.
+ set_use_tags(true);
}
void VisitSample(Sample* sample) {
- int64_t timestamp = sample->timestamp();
- intptr_t current_index = FindFinalIndex(sample->At(0), timestamp);
- ASSERT(current_index >= 0);
- CodeRegion* current = At(current_index);
- intptr_t caller_index = -1;
- CodeRegion* caller = NULL;
- intptr_t callee_index = -1;
- CodeRegion* callee = NULL;
- for (intptr_t i = 1; i < FLAG_profile_depth; i++) {
+ // Give the root a tick.
+ root_->Tick();
+ CodeRegionTrieNode* current = root_;
+ if (use_tags()) {
+ intptr_t tag_index = FindTagIndex(sample->vm_tag());
+ current = current->GetChild(tag_index);
+ // Give the tag a tick.
+ current->Tick();
+ }
+ // Walk the sampled PCs.
+ for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
if (sample->At(i) == 0) {
break;
}
- caller_index = FindFinalIndex(sample->At(i), timestamp);
- ASSERT(caller_index >= 0);
- caller = At(caller_index);
- current->AddCaller(caller_index);
- if (callee != NULL) {
- current->AddCallee(callee_index);
- }
- // Move cursors.
- callee_index = current_index;
- callee = current;
- current_index = caller_index;
- current = caller;
+ intptr_t index = FindFinalIndex(sample->At(i), sample->timestamp());
+ current = current->GetChild(index);
+ current->Tick();
}
}
+ CodeRegionTrieNode* root() const {
+ return root_;
+ }
+
+ bool use_tags() const {
+ return use_tags_;
+ }
+
+ void set_use_tags(bool use_tags) {
+ use_tags_ = use_tags;
+ }
+
private:
+ intptr_t FindTagIndex(uword tag) const {
+ intptr_t index = tag_code_table_->FindIndex(tag);
+ ASSERT(index >= 0);
+ ASSERT((tag_code_table_->At(index))->contains(tag));
+ return tag_code_table_offset_ + index;
+ }
+
intptr_t FindFinalIndex(uword pc, int64_t timestamp) const {
intptr_t index = live_code_table_->FindIndex(pc);
ASSERT(index >= 0);
@@ -978,22 +1179,80 @@
return index;
}
+ bool use_tags_;
+ CodeRegionTrieNode* root_;
+ CodeRegionTable* live_code_table_;
+ CodeRegionTable* dead_code_table_;
+ CodeRegionTable* tag_code_table_;
+ intptr_t dead_code_table_offset_;
+ intptr_t tag_code_table_offset_;
+};
+
+
+class CodeRegionTableCallersBuilder {
+ public:
+ CodeRegionTableCallersBuilder(CodeRegionTrieNode* exclusive_root,
+ CodeRegionTable* live_code_table,
+ CodeRegionTable* dead_code_table,
+ CodeRegionTable* tag_code_table)
+ : exclusive_root_(exclusive_root),
+ live_code_table_(live_code_table),
+ dead_code_table_(dead_code_table),
+ tag_code_table_(tag_code_table) {
+ ASSERT(exclusive_root_ != NULL);
+ ASSERT(live_code_table_ != NULL);
+ ASSERT(dead_code_table_ != NULL);
+ ASSERT(tag_code_table_ != NULL);
+ dead_code_table_offset_ = live_code_table_->Length();
+ tag_code_table_offset_ = dead_code_table_offset_ +
+ dead_code_table_->Length();
+ }
+
+ void Build() {
+ ProcessNode(exclusive_root_);
+ }
+
+ private:
+ void ProcessNode(CodeRegionTrieNode* parent) {
+ const ZoneGrowableArray<CodeRegionTrieNode*>& children = parent->children();
+ intptr_t parent_index = parent->code_region_index();
+ ASSERT(parent_index >= 0);
+ CodeRegion* parent_region = At(parent_index);
+ ASSERT(parent_region != NULL);
+ for (intptr_t i = 0; i < children.length(); i++) {
+ CodeRegionTrieNode* node = children[i];
+ ProcessNode(node);
+ intptr_t index = node->code_region_index();
+ ASSERT(index >= 0);
+ CodeRegion* region = At(index);
+ ASSERT(region != NULL);
+ region->AddCallee(parent_index, node->count());
+ parent_region->AddCaller(index, node->count());
+ }
+ }
+
CodeRegion* At(intptr_t final_index) {
ASSERT(final_index >= 0);
if (final_index < dead_code_table_offset_) {
return live_code_table_->At(final_index);
- } else {
+ } else if (final_index < tag_code_table_offset_) {
return dead_code_table_->At(final_index - dead_code_table_offset_);
+ } else {
+ return tag_code_table_->At(final_index - tag_code_table_offset_);
}
}
+ CodeRegionTrieNode* exclusive_root_;
CodeRegionTable* live_code_table_;
CodeRegionTable* dead_code_table_;
+ CodeRegionTable* tag_code_table_;
intptr_t dead_code_table_offset_;
+ intptr_t tag_code_table_offset_;
};
+
void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream,
- bool full) {
+ bool full, bool use_tags) {
ASSERT(isolate == Isolate::Current());
// Disable profile interrupts while processing the buffer.
EndExecution(isolate);
@@ -1014,12 +1273,15 @@
CodeRegionTable live_code_table;
// Dead code holds Overwritten CodeRegions.
CodeRegionTable dead_code_table;
+ // Tag code holds Tag CodeRegions.
+ CodeRegionTable tag_code_table;
CodeRegionTableBuilder builder(isolate,
&live_code_table,
- &dead_code_table);
+ &dead_code_table,
+ &tag_code_table);
{
// Build CodeRegion tables.
- ScopeStopwatch sw("CodeTableBuild");
+ ScopeStopwatch sw("CodeRegionTableBuilder");
sample_buffer->VisitSamples(&builder);
}
intptr_t samples = builder.visited();
@@ -1027,25 +1289,40 @@
if (FLAG_trace_profiled_isolates) {
intptr_t total_live_code_objects = live_code_table.Length();
intptr_t total_dead_code_objects = dead_code_table.Length();
+ intptr_t total_tag_code_objects = tag_code_table.Length();
OS::Print("Processed %" Pd " frames\n", frames);
- OS::Print("CodeTables: live=%" Pd " dead=%" Pd "\n",
+ OS::Print("CodeTables: live=%" Pd " dead=%" Pd " tag=%" Pd "\n",
total_live_code_objects,
- total_dead_code_objects);
+ total_dead_code_objects,
+ total_tag_code_objects);
}
#if defined(DEBUG)
live_code_table.Verify();
dead_code_table.Verify();
+ tag_code_table.Verify();
if (FLAG_trace_profiled_isolates) {
OS::Print("CodeRegionTables verified to be ordered and not overlap.\n");
}
#endif
- CodeRegionTableCallersBuilder build_callers(isolate,
+ CodeRegionExclusiveTrieBuilder build_trie(isolate,
+ &live_code_table,
+ &dead_code_table,
+ &tag_code_table);
+ build_trie.set_use_tags(use_tags);
+ {
+ // Build CodeRegion trie.
+ ScopeStopwatch sw("CodeRegionExclusiveTrieBuilder");
+ sample_buffer->VisitSamples(&build_trie);
+ build_trie.root()->SortByCount();
+ }
+ CodeRegionTableCallersBuilder build_callers(build_trie.root(),
&live_code_table,
- &dead_code_table);
+ &dead_code_table,
+ &tag_code_table);
{
// Build CodeRegion callers.
- ScopeStopwatch sw("CodeTableCallersBuild");
- sample_buffer->VisitSamples(&build_callers);
+ ScopeStopwatch sw("CodeRegionTableCallersBuilder");
+ build_callers.Build();
}
{
ScopeStopwatch sw("CodeTableStream");
@@ -1054,7 +1331,15 @@
obj.AddProperty("type", "Profile");
obj.AddProperty("id", "profile");
obj.AddProperty("samples", samples);
+ obj.AddProperty("depth", static_cast<intptr_t>(FLAG_profile_depth));
+ obj.AddProperty("period", static_cast<intptr_t>(FLAG_profile_period));
obj.AddProperty("time_delta_micros", builder.TimeDeltaMicros());
+ {
+ JSONArray exclusive_trie(&obj, "exclusive_trie");
+ CodeRegionTrieNode* root = build_trie.root();
+ ASSERT(root != NULL);
+ root->PrintToJSONArray(&exclusive_trie);
+ }
JSONArray codes(&obj, "codes");
for (intptr_t i = 0; i < live_code_table.Length(); i++) {
CodeRegion* region = live_code_table.At(i);
@@ -1066,6 +1351,11 @@
ASSERT(region != NULL);
region->PrintToJSONArray(isolate, &codes, full);
}
+ for (intptr_t i = 0; i < tag_code_table.Length(); i++) {
+ CodeRegion* region = tag_code_table.At(i);
+ ASSERT(region != NULL);
+ region->PrintToJSONArray(isolate, &codes, full);
+ }
}
}
}
@@ -1096,7 +1386,7 @@
ASSERT(Isolate::Current() == isolate);
JSONStream stream(10 * MB);
intptr_t pid = OS::ProcessId();
- PrintToJSONStream(isolate, &stream, true);
+ PrintToJSONStream(isolate, &stream, true, false);
const char* format = "%s/dart-profile-%" Pd "-%" Pd ".json";
intptr_t len = OS::SNPrint(NULL, 0, format,
FLAG_profile_dir, pid, isolate->main_port());
@@ -1165,11 +1455,13 @@
ASSERT(sample_ != NULL);
}
- int walk(Heap* heap) {
+ int walk(Heap* heap, uword vm_tag) {
const intptr_t kMaxStep = 0x1000; // 4K.
const bool kWalkStack = true; // Walk the stack.
// Always store the exclusive PC.
sample_->SetAt(0, original_pc_);
+ // Always store the vm tag.
+ sample_->set_vm_tag(vm_tag);
if (!kWalkStack) {
// Not walking the stack, only took exclusive sample.
return 1;
@@ -1287,7 +1579,7 @@
}
ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
state.pc, state.fp, state.sp);
- stackWalker.walk(isolate->heap());
+ stackWalker.walk(isolate->heap(), isolate->vm_tag());
}
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 9fb098a..81dccd0 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -8,6 +8,7 @@
#include "vm/allocation.h"
#include "vm/code_observers.h"
#include "vm/globals.h"
+#include "vm/tags.h"
#include "vm/thread.h"
#include "vm/thread_interrupter.h"
@@ -37,7 +38,7 @@
static void EndExecution(Isolate* isolate);
static void PrintToJSONStream(Isolate* isolate, JSONStream* stream,
- bool full);
+ bool full, bool use_tags);
static void WriteProfile(Isolate* isolate);
static SampleBuffer* sample_buffer() {
@@ -109,6 +110,7 @@
timestamp_ = timestamp;
tid_ = tid;
isolate_ = isolate;
+ vm_tag_ = VMTag::kInvalidTagId;
for (intptr_t i = 0; i < kSampleFramesSize; i++) {
pcs_[i] = 0;
}
@@ -138,10 +140,19 @@
pcs_[i] = pc;
}
+ uword vm_tag() const {
+ return vm_tag_;
+ }
+ void set_vm_tag(uword tag) {
+ ASSERT(tag != VMTag::kInvalidTagId);
+ vm_tag_ = tag;
+ }
+
private:
int64_t timestamp_;
ThreadId tid_;
Isolate* isolate_;
+ uword vm_tag_;
uword pcs_[kSampleFramesSize];
};
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 087be7d..fcb27ab 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -592,7 +592,6 @@
kMethodExtractor, // converts method into implicit closure on the receiver.
kNoSuchMethodDispatcher, // invokes noSuchMethod.
kInvokeFieldDispatcher, // invokes a field as a closure.
- kInvokeClosureDispatcher // invokes this as a closure (implements .call)
};
private:
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 1903e4b..ece6c70 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -14,6 +14,7 @@
#include "vm/debugger.h"
#include "vm/isolate.h"
#include "vm/message.h"
+#include "vm/message_handler.h"
#include "vm/native_entry.h"
#include "vm/native_arguments.h"
#include "vm/object.h"
@@ -263,6 +264,9 @@
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.
@@ -366,6 +370,11 @@
MessageWriter writer(&data, &allocator);
writer.WriteMessage(list);
intptr_t len = writer.BytesWritten();
+ if (FLAG_trace_service) {
+ OS::Print("Isolate %s %" Pd64 " registered with service \n",
+ name.ToCString(),
+ Dart_GetMainPortId());
+ }
return PortMap::PostMessage(
new Message(port_, data, len, Message::kNormalPriority));
}
@@ -378,15 +387,22 @@
Isolate* isolate = Isolate::Current();
ASSERT(isolate != NULL);
HANDLESCOPE(isolate);
+ const String& name = String::Handle(String::New(isolate->name()));
+ ASSERT(!name.IsNull());
const Array& list = Array::Handle(
MakeServiceControlMessage(Dart_GetMainPortId(),
VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
- String::Handle(String::null())));
+ name));
ASSERT(!list.IsNull());
uint8_t* data = NULL;
MessageWriter writer(&data, &allocator);
writer.WriteMessage(list);
intptr_t len = writer.BytesWritten();
+ if (FLAG_trace_service) {
+ OS::Print("Isolate %s %" Pd64 " deregistered with service \n",
+ name.ToCString(),
+ Dart_GetMainPortId());
+ }
return PortMap::PostMessage(
new Message(port_, data, len, Message::kNormalPriority));
}
@@ -802,6 +818,29 @@
}
+static bool HandleClassesEval(Isolate* isolate, const Class& cls,
+ JSONStream* js) {
+ if (js->num_arguments() > 3) {
+ PrintError(js, "Command too long");
+ return true;
+ }
+ const char* expr = js->LookupOption("expr");
+ if (expr == NULL) {
+ PrintError(js, "eval expects an 'expr' option\n",
+ js->num_arguments());
+ return true;
+ }
+ const String& expr_str = String::Handle(isolate, String::New(expr));
+ const Object& result = Object::Handle(cls.Evaluate(expr_str));
+ if (result.IsNull()) {
+ Object::null_instance().PrintToJSONStream(js, true);
+ } else {
+ result.PrintToJSONStream(js, true);
+ }
+ return true;
+}
+
+
static bool HandleClassesDispatchers(Isolate* isolate, const Class& cls,
JSONStream* js) {
intptr_t id;
@@ -912,7 +951,9 @@
return true;
} else if (js->num_arguments() >= 3) {
const char* second = js->GetArgument(2);
- if (strcmp(second, "closures") == 0) {
+ if (strcmp(second, "eval") == 0) {
+ return HandleClassesEval(isolate, cls, js);
+ } else if (strcmp(second, "closures") == 0) {
return HandleClassesClosures(isolate, cls, js);
} else if (strcmp(second, "fields") == 0) {
return HandleClassesFields(isolate, cls, js);
@@ -932,6 +973,29 @@
}
+static bool HandleLibrariesEval(Isolate* isolate, const Library& lib,
+ JSONStream* js) {
+ if (js->num_arguments() > 3) {
+ PrintError(js, "Command too long");
+ return true;
+ }
+ const char* expr = js->LookupOption("expr");
+ if (expr == NULL) {
+ PrintError(js, "eval expects an 'expr' option\n",
+ js->num_arguments());
+ return true;
+ }
+ const String& expr_str = String::Handle(isolate, String::New(expr));
+ const Object& result = Object::Handle(lib.Evaluate(expr_str));
+ if (result.IsNull()) {
+ Object::null_instance().PrintToJSONStream(js, true);
+ } else {
+ result.PrintToJSONStream(js, true);
+ }
+ return true;
+}
+
+
static bool HandleLibraries(Isolate* isolate, JSONStream* js) {
// TODO(johnmccutchan): Support fields and functions on libraries.
REQUIRE_COLLECTION_ID("libraries");
@@ -944,7 +1008,19 @@
Library& lib = Library::Handle();
lib ^= libs.At(id);
ASSERT(!lib.IsNull());
- lib.PrintToJSONStream(js, false);
+ if (js->num_arguments() == 2) {
+ lib.PrintToJSONStream(js, false);
+ return true;
+ } else if (js->num_arguments() >= 3) {
+ const char* second = js->GetArgument(2);
+ if (strcmp(second, "eval") == 0) {
+ return HandleLibrariesEval(isolate, lib, js);
+ } else {
+ PrintError(js, "Invalid sub collection %s", second);
+ return true;
+ }
+ }
+ UNREACHABLE();
return true;
}
@@ -1113,7 +1189,11 @@
ASSERT(obj.IsInstance());
const Instance& instance = Instance::Cast(obj);
const Object& result = Object::Handle(instance.Evaluate(expr_str));
- result.PrintToJSONStream(js, true);
+ if (result.IsNull()) {
+ Object::null_instance().PrintToJSONStream(js, true);
+ } else {
+ result.PrintToJSONStream(js, true);
+ }
return true;
}
@@ -1310,7 +1390,16 @@
// A full profile includes disassembly of all Dart code objects.
// TODO(johnmccutchan): Add sub command to trigger full code dump.
bool full_profile = false;
- Profiler::PrintToJSONStream(isolate, js, full_profile);
+ const char* tags_option = js->LookupOption("tags");
+ bool use_tags = true;
+ if (tags_option != NULL) {
+ if (strcmp("hide", tags_option) != 0) {
+ PrintError(js, "Invalid tags option value: %s\n", tags_option);
+ return true;
+ }
+ use_tags = false;
+ }
+ Profiler::PrintToJSONStream(isolate, js, full_profile, use_tags);
return true;
}
@@ -1341,9 +1430,16 @@
}
-static bool HandleUnpin(Isolate* isolate, JSONStream* js) {
+static bool HandleResume(Isolate* isolate, JSONStream* js) {
// TODO(johnmccutchan): What do I respond with??
- isolate->ClosePinPort();
+ if (isolate->message_handler()->pause_on_start()) {
+ isolate->message_handler()->set_pause_on_start(false);
+ return true;
+ }
+ if (isolate->message_handler()->pause_on_exit()) {
+ isolate->message_handler()->set_pause_on_exit(false);
+ return true;
+ }
return true;
}
@@ -1367,7 +1463,7 @@
{ "libraries", HandleLibraries },
{ "objects", HandleObjects },
{ "profile", HandleProfile },
- { "unpin", HandleUnpin },
+ { "resume", HandleResume },
{ "scripts", HandleScripts },
{ "stacktrace", HandleStackTrace },
};
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 7c16a22..88d5ef8 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -497,6 +497,17 @@
"\"user_name\":\"int\"},\"preview\":\"222\"}",
handler.msg());
+ // eval returning null works
+ service_msg = Eval(lib,
+ "[port, ['objects', 'int-123', 'eval'], "
+ "['expr'], ['null']]");
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ handler.filterMsg("name");
+ EXPECT_STREQ(
+ "{\"type\":\"@Null\",\"id\":\"objects\\/null\",\"preview\":\"null\"}",
+ handler.msg());
+
// object id ring / invalid => expired
service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], "
"['expr'], ['this']]");
@@ -526,6 +537,64 @@
}
+TEST_CASE(Service_Libraries) {
+ const char* kScript =
+ "var port;\n" // Set to our mock port by C++.
+ "var libVar = 54321;\n"
+ "\n"
+ "main() {\n"
+ "}";
+
+ Isolate* isolate = Isolate::Current();
+ Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+ EXPECT_VALID(h_lib);
+ Library& lib = Library::Handle();
+ lib ^= Api::UnwrapHandle(h_lib);
+ EXPECT(!lib.IsNull());
+
+ // Find the current library.
+ intptr_t lib_id = -1;
+ const GrowableObjectArray& libs =
+ GrowableObjectArray::Handle(isolate->object_store()->libraries());
+ for (intptr_t i = 0; i < libs.Length(); i++) {
+ if (libs.At(i) == lib.raw()) {
+ lib_id = i;
+ }
+ }
+ ASSERT(lib_id > 0);
+
+ // Build a mock message handler and wrap it in a dart port.
+ ServiceTestMessageHandler handler;
+ Dart_Port port_id = PortMap::CreatePort(&handler);
+ Dart_Handle port =
+ Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+ EXPECT_VALID(port);
+ EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+ Instance& service_msg = Instance::Handle();
+
+ // Request library.
+ service_msg = EvalF(h_lib,
+ "[port, ['libraries', '%" Pd "'], [], []]", lib_id);
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
+ EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg());
+
+ // Evaluate an expression from a library.
+ service_msg = EvalF(h_lib,
+ "[port, ['libraries', '%" Pd "', 'eval'], "
+ "['expr'], ['libVar - 1']]", lib_id);
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ handler.filterMsg("name");
+ EXPECT_STREQ(
+ "{\"type\":\"@Smi\",\"id\":\"objects\\/int-54320\","
+ "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+ "\"user_name\":\"int\"},\"preview\":\"54320\"}",
+ handler.msg());
+}
+
TEST_CASE(Service_Classes) {
const char* kScript =
@@ -533,6 +602,7 @@
"\n"
"class A {\n"
" var a;\n"
+ " static var cobra = 11235;\n"
" dynamic b() {}\n"
" dynamic c() {\n"
" var d = () { b(); };\n"
@@ -581,11 +651,24 @@
service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid);
Service::HandleIsolateMessage(isolate, service_msg);
handler.HandleNextMessage();
-
EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
ExpectSubstringF(handler.msg(),
"\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
+ // Evaluate an expression from class A.
+ service_msg = EvalF(h_lib,
+ "[port, ['classes', '%" Pd "', 'eval'], "
+ "['expr'], ['cobra + 100000']]", cid);
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ handler.filterMsg("name");
+ EXPECT_STREQ(
+ "{\"type\":\"@Smi\",\"id\":\"objects\\/int-111235\","
+ "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+ "\"user_name\":\"int\"},\"preview\":\"111235\"}",
+ handler.msg());
+
+ // Request function 0 from class A.
service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0'],"
"[], []]", cid);
Service::HandleIsolateMessage(isolate, service_msg);
@@ -1024,4 +1107,51 @@
EXPECT_STREQ("beta", handler.msg());
}
+TEST_CASE(Service_Profile) {
+ const char* kScript =
+ "var port;\n" // Set to our mock port by C++.
+ "\n"
+ "var x = 7;\n"
+ "main() {\n"
+ " x = x * x;\n"
+ " x = x / 13;\n"
+ "}";
+
+ Isolate* isolate = Isolate::Current();
+ Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+ EXPECT_VALID(h_lib);
+ Library& lib = Library::Handle();
+ lib ^= Api::UnwrapHandle(h_lib);
+ EXPECT(!lib.IsNull());
+ Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+ EXPECT_VALID(result);
+
+ // Build a mock message handler and wrap it in a dart port.
+ ServiceTestMessageHandler handler;
+ Dart_Port port_id = PortMap::CreatePort(&handler);
+ Dart_Handle port =
+ Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+ EXPECT_VALID(port);
+ EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+ Instance& service_msg = Instance::Handle();
+ service_msg = Eval(h_lib, "[port, ['profile'], [], []]");
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ // Expect profile
+ EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+ service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hide']]");
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ // Expect profile
+ EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+ service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hidden']]");
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ // Expect error.
+ EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+}
+
} // namespace dart
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index f2949adf..ef2bd1e 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -43,8 +43,9 @@
static const int kCallerSpSlotFromFp = 3;
// Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -26;
-static const int kExitLinkSlotFromEntryFp = -25;
+static const int kSavedContextSlotFromEntryFp = -27;
+static const int kExitLinkSlotFromEntryFp = -26;
+static const int kSavedVMTagSlotFromEntryFp = -25;
} // namespace dart
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index f36863b..b7d5997 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -42,8 +42,9 @@
static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
// Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -5;
-static const int kExitLinkSlotFromEntryFp = -4;
+static const int kSavedContextSlotFromEntryFp = -6;
+static const int kExitLinkSlotFromEntryFp = -5;
+static const int kSavedVMTagSlotFromEntryFp = -4;
} // namespace dart
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index 84f8dc7..94c8c25 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -41,8 +41,9 @@
static const int kCallerSpSlotFromFp = 3;
// Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -23;
-static const int kExitLinkSlotFromEntryFp = -22;
+static const int kSavedContextSlotFromEntryFp = -24;
+static const int kExitLinkSlotFromEntryFp = -23;
+static const int kSavedVMTagSlotFromEntryFp = -22;
} // namespace dart
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index dcd964a..d85e8ec 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,8 +45,9 @@
static const int kSavedAboveReturnAddress = 3; // Saved above return address.
// Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -9;
-static const int kExitLinkSlotFromEntryFp = -8;
+static const int kSavedContextSlotFromEntryFp = -10;
+static const int kExitLinkSlotFromEntryFp = -9;
+static const int kSavedVMTagSlotFromEntryFp = -8;
} // namespace dart
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index aa913be..602253a 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -20,8 +20,8 @@
// List of stubs created in the VM isolate, these stubs are shared by different
// isolates running in this dart process.
#define VM_STUB_CODE_LIST(V) \
- V(CallToRuntime) \
V(PrintStopMessage) \
+ V(CallToRuntime) \
V(CallBootstrapCFunction) \
V(CallNativeCFunction) \
V(AllocateArray) \
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index ea1334f..6b40a5c 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -15,6 +15,7 @@
#include "vm/object_store.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
+#include "vm/tags.h"
#define __ assembler->
@@ -24,7 +25,6 @@
DEFINE_FLAG(bool, use_slow_path, false,
"Set to true for debugging & verifying the slow paths.");
DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
// Input parameters:
@@ -58,6 +58,21 @@
// Cache Isolate pointer into CTX while executing runtime code.
__ mov(CTX, ShifterOperand(R0));
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+ __ CompareImmediate(R6, VMTag::kScriptTagId);
+ __ b(&ok, EQ);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing VM code.
+ __ LoadImmediate(R6, VMTag::kVMTagId);
+ __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
// Reserve space for arguments and align frame before entering C++ world.
// NativeArguments are passed in registers.
ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -85,6 +100,10 @@
// Call runtime or redirection via simulator.
__ blx(R5);
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(R2, VMTag::kScriptTagId);
+ __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
// Reset exit frame information in Isolate structure.
__ LoadImmediate(R2, 0);
__ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -154,6 +173,21 @@
// Cache Isolate pointer into CTX while executing native code.
__ mov(CTX, ShifterOperand(R0));
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+ __ CompareImmediate(R6, VMTag::kScriptTagId);
+ __ b(&ok, EQ);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+ __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
// Reserve space for the native arguments structure passed on the stack (the
// outgoing pointer parameter to the native arguments structure is passed in
// R0) and align frame before entering the C++ world.
@@ -207,6 +241,10 @@
__ Bind(&done);
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(R2, VMTag::kScriptTagId);
+ __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
// Reset exit frame information in Isolate structure.
__ LoadImmediate(R2, 0);
__ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -257,6 +295,21 @@
// Cache Isolate pointer into CTX while executing native code.
__ mov(CTX, ShifterOperand(R0));
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+ __ CompareImmediate(R6, VMTag::kScriptTagId);
+ __ b(&ok, EQ);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+ __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
// Reserve space for the native arguments structure passed on the stack (the
// outgoing pointer parameter to the native arguments structure is passed in
// R0) and align frame before entering the C++ world.
@@ -288,6 +341,10 @@
// Call native function or redirection via simulator.
__ blx(R5);
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(R2, VMTag::kScriptTagId);
+ __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
// Reset exit frame information in Isolate structure.
__ LoadImmediate(R2, 0);
__ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -837,6 +894,15 @@
// Load Isolate pointer from Context structure into temporary register R8.
__ ldr(R8, FieldAddress(CTX, Context::isolate_offset()));
+ // Save the current VMTag on the stack.
+ ASSERT(kSavedVMTagSlotFromEntryFp == -25);
+ __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+ __ Push(R5);
+
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(R5, VMTag::kScriptTagId);
+ __ StoreToOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+
// Save the top exit frame info. Use R5 as a temporary register.
// StackFrameIterator reads the top exit frame info saved in this frame.
__ LoadFromOffset(kWord, R5, R8, Isolate::top_exit_frame_info_offset());
@@ -852,8 +918,8 @@
// The constants kSavedContextSlotFromEntryFp and
// kExitLinkSlotFromEntryFp must be kept in sync with the code below.
- ASSERT(kExitLinkSlotFromEntryFp == -25);
- ASSERT(kSavedContextSlotFromEntryFp == -26);
+ ASSERT(kExitLinkSlotFromEntryFp == -26);
+ ASSERT(kSavedContextSlotFromEntryFp == -27);
__ PushList((1 << R4) | (1 << R5));
// Load arguments descriptor array into R4, which is passed to Dart code.
@@ -903,6 +969,10 @@
__ StoreToOffset(kWord, R4, CTX, Isolate::top_context_offset());
__ StoreToOffset(kWord, R5, CTX, Isolate::top_exit_frame_info_offset());
+ // Restore the current VMTag from the stack.
+ __ Pop(R4);
+ __ StoreToOffset(kWord, R4, CTX, Isolate::vm_tag_offset());
+
// Restore C++ ABI callee-saved registers.
// Restore FPU registers. 2 D registers per Q register.
__ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 525e8ce..edc3f12 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -16,6 +16,7 @@
#include "vm/scavenger.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
+#include "vm/tags.h"
#define __ assembler->
@@ -26,7 +27,6 @@
DEFINE_FLAG(bool, use_slow_path, false,
"Set to true for debugging & verifying the slow paths.");
DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
// Input parameters:
@@ -58,6 +58,20 @@
// Cache Isolate pointer into CTX while executing runtime code.
__ movl(CTX, EAX);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movl(EAX, Address(CTX, Isolate::vm_tag_offset()));
+ __ cmpl(EAX, Immediate(VMTag::kScriptTagId));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing VM code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
// Reserve space for arguments and align frame before entering C++ world.
__ AddImmediate(ESP, Immediate(-sizeof(NativeArguments)));
if (OS::ActivationFrameAlignment() > 1) {
@@ -75,6 +89,10 @@
__ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
__ call(ECX);
+ // Mark that the isolate is executing Dart code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -148,6 +166,21 @@
// Cache Isolate pointer into CTX while executing native code.
__ movl(CTX, EDI);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+ __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kRuntimeNativeTagId));
+
// Reserve space for the native arguments structure, the outgoing parameters
// (pointer to the native arguments structure, the C function entry point)
// and align frame before entering the C++ world.
@@ -177,6 +210,10 @@
__ call(ECX);
__ Bind(&done);
+ // Mark that the isolate is executing Dart code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -229,6 +266,21 @@
// Cache Isolate pointer into CTX while executing native code.
__ movl(CTX, EDI);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+ __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kRuntimeNativeTagId));
+
// Reserve space for the native arguments structure, the outgoing parameter
// (pointer to the native arguments structure) and align frame before
// entering the C++ world.
@@ -247,6 +299,10 @@
__ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments.
__ call(ECX);
+ // Mark that the isolate is executing Dart code.
+ __ movl(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -816,11 +872,20 @@
// Load Isolate pointer from Context structure into EDI.
__ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
+ // Save the current VMTag on the stack.
+ ASSERT(kSavedVMTagSlotFromEntryFp == -4);
+ __ movl(ECX, Address(EDI, Isolate::vm_tag_offset()));
+ __ pushl(ECX);
+
+ // Mark that the isolate is executing Dart code.
+ __ movl(Address(EDI, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Save the top exit frame info. Use EDX as a temporary register.
// StackFrameIterator reads the top exit frame info saved in this frame.
// The constant kExitLinkSlotFromEntryFp must be kept in sync with the
// code below.
- ASSERT(kExitLinkSlotFromEntryFp == -4);
+ ASSERT(kExitLinkSlotFromEntryFp == -5);
__ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset()));
__ pushl(EDX);
__ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -832,7 +897,7 @@
// EntryFrame::SavedContext reads the context saved in this frame.
// The constant kSavedContextSlotFromEntryFp must be kept in sync with
// the code below.
- ASSERT(kSavedContextSlotFromEntryFp == -5);
+ ASSERT(kSavedContextSlotFromEntryFp == -6);
__ movl(ECX, Address(EDI, Isolate::top_context_offset()));
__ pushl(ECX);
@@ -892,6 +957,10 @@
__ popl(EDX);
__ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), EDX);
+ // Restore the current VMTag from the stack.
+ __ popl(ECX);
+ __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+
// Restore C++ ABI callee-saved registers.
__ popl(EDI);
__ popl(ESI);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ad15047..17ed5e6 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -15,6 +15,7 @@
#include "vm/object_store.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
+#include "vm/tags.h"
#define __ assembler->
@@ -24,7 +25,6 @@
DEFINE_FLAG(bool, use_slow_path, false,
"Set to true for debugging & verifying the slow paths.");
DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
// Input parameters:
@@ -62,6 +62,20 @@
// Cache Isolate pointer into CTX while executing runtime code.
__ mov(CTX, A0);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing VM code.
+ __ LoadImmediate(T0, VMTag::kVMTagId);
+ __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
// Reserve space for arguments and align frame before entering C++ world.
// NativeArguments are passed in registers.
ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -96,6 +110,10 @@
__ delay_slot()->addiu(A3, A2, Immediate(kWordSize));
__ TraceSimMsg("CallToRuntimeStub return");
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(A2, VMTag::kScriptTagId);
+ __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
// Reset exit frame information in Isolate structure.
__ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
@@ -171,6 +189,20 @@
// Cache Isolate pointer into CTX while executing native code.
__ mov(CTX, A0);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+ __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
// Initialize NativeArguments structure and call native function.
// Registers A0, A1, A2, and A3 are used.
@@ -231,6 +263,10 @@
__ Bind(&done);
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(A2, VMTag::kScriptTagId);
+ __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
// Reset exit frame information in Isolate structure.
__ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
@@ -287,6 +323,20 @@
// Cache Isolate pointer into CTX while executing native code.
__ mov(CTX, A0);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+ __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+ __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
// Initialize NativeArguments structure and call native function.
// Registers A0, A1, A2, and A3 are used.
@@ -324,6 +374,10 @@
__ jalr(T9);
__ TraceSimMsg("CallNativeCFunctionStub return");
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(A2, VMTag::kScriptTagId);
+ __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
// Reset exit frame information in Isolate structure.
__ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
@@ -945,8 +999,8 @@
// Save new context and C++ ABI callee-saved registers.
- // The new context, the top exit frame, and the old context.
- const intptr_t kPreservedContextSlots = 3;
+ // The new context, saved vm tag, the top exit frame, and the old context.
+ const intptr_t kPreservedContextSlots = 4;
const intptr_t kNewContextOffsetFromFp =
-(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
const intptr_t kPreservedRegSpace =
@@ -969,7 +1023,7 @@
__ swc1(r, Address(SP, slot * kWordSize));
}
- __ sw(A3, Address(SP, 2 * kWordSize));
+ __ sw(A3, Address(SP, 3 * kWordSize));
// We now load the pool pointer(PP) as we are about to invoke dart code and we
// could potentially invoke some intrinsic functions which need the PP to be
@@ -988,6 +1042,15 @@
// Load Isolate pointer from Context structure into temporary register R8.
__ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
+ // Save the current VMTag on the stack.
+ ASSERT(kSavedVMTagSlotFromEntryFp == -22);
+ __ lw(T1, Address(T2, Isolate::vm_tag_offset()));
+ __ sw(T1, Address(SP, 2 * kWordSize));
+
+ // Mark that the isolate is executing Dart code.
+ __ LoadImmediate(T0, VMTag::kScriptTagId);
+ __ sw(T0, Address(T2, Isolate::vm_tag_offset()));
+
// Save the top exit frame info. Use T0 as a temporary register.
// StackFrameIterator reads the top exit frame info saved in this frame.
__ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
@@ -1002,8 +1065,8 @@
// The constants kSavedContextSlotFromEntryFp and
// kExitLinkSlotFromEntryFp must be kept in sync with the code below.
- ASSERT(kExitLinkSlotFromEntryFp == -22);
- ASSERT(kSavedContextSlotFromEntryFp == -23);
+ ASSERT(kExitLinkSlotFromEntryFp == -23);
+ ASSERT(kSavedContextSlotFromEntryFp == -24);
__ sw(T0, Address(SP, 1 * kWordSize));
__ sw(T1, Address(SP, 0 * kWordSize));
@@ -1052,6 +1115,10 @@
// Load Isolate pointer from Context structure into CTX. Drop Context.
__ lw(CTX, FieldAddress(CTX, Context::isolate_offset()));
+ // Restore the current VMTag from the stack.
+ __ lw(T1, Address(SP, 2 * kWordSize));
+ __ sw(T1, Address(CTX, Isolate::vm_tag_offset()));
+
// Restore the saved Context pointer into the Isolate structure.
// Uses T1 as a temporary register for this.
// Restore the saved top exit frame info back into the Isolate structure.
@@ -1077,7 +1144,7 @@
__ lwc1(r, Address(SP, slot * kWordSize));
}
- __ lw(A3, Address(SP, 2 * kWordSize));
+ __ lw(A3, Address(SP, 3 * kWordSize));
__ addiu(SP, SP, Immediate(kPreservedRegSpace));
// Restore the frame pointer and return.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a079813..0580f513 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -16,7 +16,7 @@
#include "vm/scavenger.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
-
+#include "vm/tags.h"
#define __ assembler->
@@ -26,7 +26,6 @@
DEFINE_FLAG(bool, use_slow_path, false,
"Set to true for debugging & verifying the slow paths.");
DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
// Input parameters:
@@ -59,6 +58,20 @@
// Cache Isolate pointer into CTX while executing runtime code.
__ movq(CTX, RAX);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movq(RAX, Immediate(VMTag::kScriptTagId));
+ __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset()));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing VM code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
// Reserve space for arguments and align frame before entering C++ world.
__ subq(RSP, Immediate(sizeof(NativeArguments)));
if (OS::ActivationFrameAlignment() > 1) {
@@ -76,6 +89,10 @@
__ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments.
__ call(RBX);
+ // Mark that the isolate is executing Dart code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -140,12 +157,27 @@
// to transition to native code.
__ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
- // Save current Context pointer into Isolate structure.
+// Save current Context pointer into Isolate structure.
__ movq(Address(R8, Isolate::top_context_offset()), CTX);
// Cache Isolate pointer into CTX while executing native code.
__ movq(CTX, R8);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movq(R8, Immediate(VMTag::kScriptTagId));
+ __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kRuntimeNativeTagId));
+
// Reserve space for the native arguments structure passed on the stack (the
// outgoing pointer parameter to the native arguments structure is passed in
// RDI) and align frame before entering the C++ world.
@@ -174,6 +206,10 @@
__ call(RBX);
__ Bind(&done);
+ // Mark that the isolate is executing Dart code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -224,6 +260,21 @@
// Cache Isolate pointer into CTX while executing native code.
__ movq(CTX, R8);
+#if defined(DEBUG)
+ { Label ok;
+ // Check that we are always entering from Dart code.
+ __ movq(R8, Immediate(VMTag::kScriptTagId));
+ __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+ __ j(EQUAL, &ok, Assembler::kNearJump);
+ __ Stop("Not coming from Dart code.");
+ __ Bind(&ok);
+ }
+#endif
+
+ // Mark that the isolate is executing Native code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kRuntimeNativeTagId));
+
// Reserve space for the native arguments structure passed on the stack (the
// outgoing pointer parameter to the native arguments structure is passed in
// RDI) and align frame before entering the C++ world.
@@ -241,6 +292,10 @@
__ movq(RDI, RSP); // Pass the pointer to the NativeArguments.
__ call(RBX);
+ // Mark that the isolate is executing Dart code.
+ __ movq(Address(CTX, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Reset exit frame information in Isolate structure.
__ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -820,11 +875,20 @@
// Load Isolate pointer from Context structure into R8.
__ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+ // Save the current VMTag on the stack.
+ ASSERT(kSavedVMTagSlotFromEntryFp == -8);
+ __ movq(RAX, Address(R8, Isolate::vm_tag_offset()));
+ __ pushq(RAX);
+
+ // Mark that the isolate is executing Dart code.
+ __ movq(Address(R8, Isolate::vm_tag_offset()),
+ Immediate(VMTag::kScriptTagId));
+
// Save the top exit frame info. Use RAX as a temporary register.
// StackFrameIterator reads the top exit frame info saved in this frame.
// The constant kExitLinkSlotFromEntryFp must be kept in sync with the
// code below.
- ASSERT(kExitLinkSlotFromEntryFp == -8);
+ ASSERT(kExitLinkSlotFromEntryFp == -9);
__ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
__ pushq(RAX);
__ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -836,7 +900,7 @@
// EntryFrame::SavedContext reads the context saved in this frame.
// The constant kSavedContextSlotFromEntryFp must be kept in sync with
// the code below.
- ASSERT(kSavedContextSlotFromEntryFp == -9);
+ ASSERT(kSavedContextSlotFromEntryFp == -10);
__ movq(RAX, Address(R8, Isolate::top_context_offset()));
__ pushq(RAX);
@@ -893,6 +957,10 @@
__ popq(RDX);
__ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
+ // Restore the current VMTag from the stack.
+ __ popq(RDX);
+ __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
+
// Restore C++ ABI callee-saved registers.
__ popq(R15);
__ popq(R14);
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
new file mode 100644
index 0000000..84b40f4
--- /dev/null
+++ b/runtime/vm/tags.cc
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/tags.h"
+
+#include "vm/isolate.h"
+
+namespace dart {
+
+const char* VMTag::TagName(uword id) {
+ ASSERT(id != kInvalidTagId);
+ ASSERT(id < kNumVMTags);
+ const TagEntry& entry = entries_[id];
+ ASSERT(entry.id == id);
+ return entry.name;
+}
+
+
+VMTag::TagEntry VMTag::entries_[] = {
+ { "InvalidTag", kInvalidTagId, },
+#define DEFINE_VM_TAG_ENTRY(tag) \
+ { ""#tag, k##tag##TagId },
+ VM_TAG_LIST(DEFINE_VM_TAG_ENTRY)
+#undef DEFINE_VM_TAG_ENTRY
+ { "kNumVMTags", kNumVMTags },
+};
+
+
+VMTagScope::VMTagScope(Isolate* base_isolate, uword tag)
+ : StackResource(base_isolate) {
+ ASSERT(isolate() != NULL);
+ previous_tag_ = isolate()->vm_tag();
+ isolate()->set_vm_tag(tag);
+}
+
+
+VMTagScope::~VMTagScope() {
+ ASSERT(isolate() != NULL);
+ isolate()->set_vm_tag(previous_tag_);
+}
+
+
+} // namespace dart
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
new file mode 100644
index 0000000..98be468
--- /dev/null
+++ b/runtime/vm/tags.h
@@ -0,0 +1,58 @@
+// 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.
+
+#ifndef VM_TAGS_H_
+#define VM_TAGS_H_
+
+#include "vm/allocation.h"
+
+class Isolate;
+
+namespace dart {
+
+#define VM_TAG_LIST(V) \
+ V(VM) /* Catch all */ \
+ V(Compile) \
+ V(Script) \
+ V(GCNewSpace) \
+ V(GCOldSpace) \
+ V(RuntimeNative) \
+ V(Idle) \
+
+
+class VMTag : public AllStatic {
+ public:
+ enum VMTagId {
+ kInvalidTagId = 0,
+#define DEFINE_VM_TAG_ID(tag) \
+ k##tag##TagId,
+ VM_TAG_LIST(DEFINE_VM_TAG_ID)
+#undef DEFINE_VM_TAG_KIND
+ kNumVMTags,
+ };
+
+ static const char* TagName(uword id);
+
+ private:
+ struct TagEntry {
+ const char* name;
+ uword id;
+ };
+ static TagEntry entries_[];
+};
+
+class VMTagScope : StackResource {
+ public:
+ VMTagScope(Isolate* isolate, uword tag);
+ ~VMTagScope();
+ private:
+ uword previous_tag_;
+
+ DISALLOW_ALLOCATION();
+ DISALLOW_IMPLICIT_CONSTRUCTORS(VMTagScope);
+};
+
+} // namespace dart
+
+#endif // VM_TAGS_H_
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 2481ac61..94434e2 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -350,6 +350,8 @@
'stub_code_x64_test.cc',
'symbols.cc',
'symbols.h',
+ 'tags.cc',
+ 'tags.h',
'thread.h',
'thread_interrupter.cc',
'thread_interrupter.h',
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 72b7b3d..76de97a 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -43,7 +43,8 @@
if (node is FunctionExpression) {
translator.translateFunction(element, node);
} else if (element.isSynthesized) {
- return new ClosureClassMap(null, null, null, new ThisElement(element));
+ return new ClosureClassMap(null, null, null,
+ new ThisElement(element, compiler.types.dynamicType));
} else {
assert(element.isField());
VariableElement field = element;
@@ -53,7 +54,8 @@
} else {
assert(element.isInstanceMember());
closureMappingCache[node] =
- new ClosureClassMap(null, null, null, new ThisElement(element));
+ new ClosureClassMap(null, null, null,
+ new ThisElement(element, compiler.types.dynamicType));
}
}
assert(closureMappingCache[node] != null);
@@ -77,7 +79,7 @@
// more general solution.
class ClosureFieldElement extends ElementX implements VariableElement {
/// The source variable this element refers to.
- final Element variableElement;
+ final TypedElement variableElement;
ClosureFieldElement(String name,
this.variableElement,
@@ -94,9 +96,11 @@
bool isAssignable() => false;
DartType computeType(Compiler compiler) {
- return variableElement.computeType(compiler);
+ return variableElement.type;
}
+ DartType get type => variableElement.type;
+
String toString() => "ClosureFieldElement($name)";
accept(ElementVisitor visitor) => visitor.visitClosureFieldElement(this);
@@ -128,12 +132,12 @@
? compiler.boundClosureClass
: compiler.closureClass;
superclass.ensureResolved(compiler);
- supertype = superclass.computeType(compiler);
+ supertype = superclass.thisType;
interfaces = const Link<DartType>();
thisType = rawType = new InterfaceType(this);
allSupertypesAndSelf =
superclass.allSupertypesAndSelf.extendClass(thisType);
- callType = methodElement.computeType(compiler);
+ callType = methodElement.type;
}
bool isClosure() => true;
@@ -145,7 +149,7 @@
/**
* The most outer method this closure is declared into.
*/
- final Element methodElement;
+ final TypedElement methodElement;
// A [ClosureClassElement] is nested inside a function or initializer in terms
// of [enclosingElement], but still has to be treated as a top-level
@@ -160,11 +164,13 @@
// TODO(ahe): These classes continuously cause problems. We need to
// move these classes to elements/modelx.dart or see if we can find a
// more general solution.
-class BoxElement extends ElementX {
- BoxElement(String name, Element enclosingElement)
+class BoxElement extends ElementX implements TypedElement {
+ final DartType type;
+
+ BoxElement(String name, Element enclosingElement, this.type)
: super(name, ElementKind.VARIABLE_LIST, enclosingElement);
- DartType computeType(Compiler compiler) => compiler.types.dynamicType;
+ DartType computeType(Compiler compiler) => type;
accept(ElementVisitor visitor) => visitor.visitBoxElement(this);
}
@@ -172,17 +178,17 @@
// TODO(ngeoffray, ahe): These classes continuously cause problems. We need to
// move these classes to elements/modelx.dart or see if we can find a
// more general solution.
-class BoxFieldElement extends ElementX {
+class BoxFieldElement extends ElementX implements TypedElement {
BoxFieldElement(String name,
this.variableElement,
BoxElement enclosingBox)
: super(name, ElementKind.FIELD, enclosingBox);
- DartType computeType(Compiler compiler) {
- return variableElement.computeType(compiler);
- }
+ DartType computeType(Compiler compiler) => type;
- final Element variableElement;
+ DartType get type => variableElement.type;
+
+ final VariableElement variableElement;
accept(ElementVisitor visitor) => visitor.visitBoxFieldElement(this);
}
@@ -190,8 +196,10 @@
// TODO(ahe): These classes continuously cause problems. We need to
// move these classes to elements/modelx.dart or see if we can find a
// more general solution.
-class ThisElement extends ElementX {
- ThisElement(Element enclosing)
+class ThisElement extends ElementX implements TypedElement {
+ final DartType type;
+
+ ThisElement(Element enclosing, this.type)
: super('this', ElementKind.PARAMETER, enclosing);
bool isAssignable() => false;
@@ -454,7 +462,7 @@
!link.isEmpty;
link = link.tail) {
Node definition = link.head;
- Element element = elements[definition];
+ VariableElement element = elements[definition];
assert(element != null);
declareLocal(element);
// We still need to visit the right-hand sides of the init-assignments.
@@ -547,7 +555,8 @@
if (Elements.isLocal(element)) {
mutatedVariables.add(element);
if (compiler.enableTypeAssertions) {
- analyzeTypeVariables(element.computeType(compiler));
+ TypedElement typedElement = element;
+ analyzeTypeVariables(typedElement.type);
}
}
super.visitSendSet(node);
@@ -604,7 +613,8 @@
// TODO(floitsch): construct better box names.
String boxName =
namer.getClosureVariableName('box', closureFieldCounter++);
- box = new BoxElement(boxName, currentElement);
+ box = new BoxElement(
+ boxName, currentElement, compiler.types.dynamicType);
}
String elementName = element.name;
String boxedName =
@@ -700,7 +710,8 @@
return sb.toString();
}
- ClosureClassMap globalizeClosure(FunctionExpression node, Element element) {
+ ClosureClassMap globalizeClosure(FunctionExpression node,
+ TypedElement element) {
String closureName = computeClosureName(element);
ClassElement globalizedElement = new ClosureClassElement(
node, closureName, compiler, element, element.getCompilationUnit());
@@ -718,7 +729,7 @@
callElement, thisElement);
}
- void visitInvokable(Element element, Node node, void visitChildren()) {
+ void visitInvokable(TypedElement element, Node node, void visitChildren()) {
bool oldInsideClosure = insideClosure;
Element oldFunctionElement = currentElement;
ClosureClassMap oldClosureData = closureData;
@@ -732,7 +743,7 @@
outermostElement = element;
Element thisElement = null;
if (element.isInstanceMember() || element.isGenerativeConstructor()) {
- thisElement = new ThisElement(element);
+ thisElement = new ThisElement(element, compiler.types.dynamicType);
}
closureData = new ClosureClassMap(null, null, null, thisElement);
}
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index aeeae12..b02a293 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -118,8 +118,8 @@
if (compiler.enableTypeAssertions &&
value != null &&
element.isField()) {
- DartType elementType = element.computeType(compiler);
- if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) {
+ DartType elementType = element.type;
+ if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
if (isConst) {
ErroneousElement element = elementType.element;
compiler.reportFatalError(
@@ -312,7 +312,7 @@
bool onlyStringKeys = true;
Constant protoValue = null;
for (var key in keys) {
- if (key.isString()) {
+ if (key.isString) {
if (key.value == MapConstant.PROTO_PROPERTY) {
protoValue = map[key];
}
@@ -377,10 +377,10 @@
DartString expressionString;
if (expression == null) {
return signalNotCompileTimeConstant(part.expression);
- } else if (expression.isNum() || expression.isBool()) {
+ } else if (expression.isNum || expression.isBool) {
PrimitiveConstant primitive = expression;
expressionString = new DartString.literal(primitive.value.toString());
- } else if (expression.isString()) {
+ } else if (expression.isString) {
PrimitiveConstant primitive = expression;
expressionString = primitive.value;
} else {
@@ -395,7 +395,7 @@
}
Constant visitLiteralSymbol(LiteralSymbol node) {
- InterfaceType type = compiler.symbolClass.computeType(compiler);
+ InterfaceType type = compiler.symbolClass.rawType;
List<Constant> createArguments(_) {
return [constantSystem.createString(
new DartString.literal(node.slowNameString))];
@@ -404,17 +404,51 @@
node, type, compiler.symbolConstructor, createArguments);
}
- Constant makeTypeConstant(Element element) {
- DartType elementType = element.computeType(compiler).asRaw();
+ Constant makeTypeConstant(TypeDeclarationElement element) {
+ DartType elementType = element.rawType;
DartType constantType =
compiler.backend.typeImplementation.computeType(compiler);
return new TypeConstant(elementType, constantType);
}
+ /// Returns true if the prefix of the send resolves to a deferred import
+ /// prefix.
+ bool isDeferredUse(Send send) {
+ // We handle:
+ // 1. Send(Send(Send(null, Prefix), className), staticName)
+ // 2. Send(Send(Prefix, Classname), staticName)
+ // 3. Send(Send(null, Prefix), staticName | className)
+ // 4. Send(Send(Prefix), staticName | className)
+ // Nodes of the forms 2,4 occur in metadata.
+ if (send == null) return false;
+ while (send.receiver is Send) {
+ send = send.receiver;
+ }
+ Identifier prefixNode;
+ if (send.receiver is Identifier) {
+ prefixNode = send.receiver;
+ } else if (send.receiver == null &&
+ send.selector is Identifier) {
+ prefixNode = send.selector;
+ }
+ if (prefixNode != null) {
+ Element maybePrefix = elements[prefixNode.asIdentifier()];
+ if (maybePrefix != null && maybePrefix.isPrefix() &&
+ (maybePrefix as PrefixElement).isDeferred) {
+ return true;
+ }
+ }
+ return false;
+ }
+
// TODO(floitsch): provide better error-messages.
Constant visitSend(Send send) {
Element element = elements[send];
if (send.isPropertyAccess) {
+ if (isDeferredUse(send)) {
+ return signalNotCompileTimeConstant(send,
+ message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
+ }
if (Elements.isStaticOrTopLevelFunction(element)) {
return new FunctionConstant(element);
} else if (Elements.isStaticOrTopLevelField(element)) {
@@ -533,7 +567,7 @@
folded = constantSystem.greaterEqual.fold(left, right);
break;
case "==":
- if (left.isPrimitive() && right.isPrimitive()) {
+ if (left.isPrimitive && right.isPrimitive) {
folded = constantSystem.equal.fold(left, right);
}
break;
@@ -541,7 +575,7 @@
folded = constantSystem.identity.fold(left, right);
break;
case "!=":
- if (left.isPrimitive() && right.isPrimitive()) {
+ if (left.isPrimitive && right.isPrimitive) {
BoolConstant areEquals = constantSystem.equal.fold(left, right);
if (areEquals == null) {
folded = null;
@@ -570,7 +604,7 @@
Constant condition = evaluate(node.condition);
if (condition == null) {
return null;
- } else if (!condition.isBool()) {
+ } else if (!condition.isBool) {
DartType conditionType = condition.computeType(compiler);
if (isEvaluatingConstant) {
compiler.reportFatalError(
@@ -630,16 +664,9 @@
// Deferred types can not be used in const instance creation expressions.
// Check if the constructor comes from a deferred library.
- Send selectorSend = node.send.selector.asSend();
- if (selectorSend != null) {
- Identifier receiver = selectorSend.receiver.asIdentifier();
- if (receiver != null) {
- Element element = elements[receiver];
- if (element.isPrefix() && (element as PrefixElement).isDeferred) {
- return signalNotCompileTimeConstant(node,
- message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
- }
- }
+ if (isDeferredUse(node.send.selector.asSend())) {
+ return signalNotCompileTimeConstant(node,
+ message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION);
}
// TODO(ahe): This is nasty: we must eagerly analyze the
@@ -828,9 +855,11 @@
return super.visitSend(send);
}
- void potentiallyCheckType(Node node, Element element, Constant constant) {
+ void potentiallyCheckType(Node node,
+ TypedElement element,
+ Constant constant) {
if (compiler.enableTypeAssertions) {
- DartType elementType = element.computeType(compiler);
+ DartType elementType = element.type;
DartType constantType = constant.computeType(compiler);
// TODO(ngeoffray): Handle type parameters.
if (elementType.element.isTypeVariable()) return;
@@ -842,7 +871,7 @@
}
}
- void updateFieldValue(Node node, Element element, Constant constant) {
+ void updateFieldValue(Node node, TypedElement element, Constant constant) {
potentiallyCheckType(node, element, constant);
fieldValues[element] = constant;
}
@@ -854,7 +883,7 @@
*/
void assignArgumentsToParameters(List<Constant> arguments) {
// Assign arguments to parameters.
- FunctionSignature parameters = constructor.computeSignature(compiler);
+ FunctionSignature parameters = constructor.functionSignature;
int index = 0;
parameters.orderedForEachParameter((Element parameter) {
Constant argument = arguments[index++];
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 05fe6c7..b3044bb 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -803,9 +803,13 @@
try {
if (!hasCrashed) {
hasCrashed = true;
- reportDiagnostic(new SourceSpan(uri, 0, 0),
- MessageKind.COMPILER_CRASHED.message(),
- api.Diagnostic.CRASH);
+ if (error is SpannableAssertionFailure) {
+ reportAssertionFailure(error);
+ } else {
+ reportDiagnostic(new SourceSpan(uri, 0, 0),
+ MessageKind.COMPILER_CRASHED.message(),
+ api.Diagnostic.CRASH);
+ }
pleaseReportCrash();
}
} catch (doubleFault) {
@@ -1295,6 +1299,8 @@
element.isGetter() ||
element.isSetter(),
message: 'Unexpected element kind: ${element.kind}'));
+ assert(invariant(element, element is AnalyzableElement,
+ message: 'Element $element is not analyzable.'));
assert(invariant(element, element.isDeclaration));
ResolutionEnqueuer world = enqueuer.resolution;
TreeElements elements = world.getCachedElements(element);
@@ -1458,7 +1464,7 @@
String message = (ex.message != null) ? tryToString(ex.message)
: tryToString(ex);
SourceSpan span = spanFromSpannable(ex.node);
- reportError(ex.node, MessageKind.GENERIC, {'text': message});
+ reportInternalError(ex.node, MessageKind.GENERIC, {'text': message});
}
SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index cf86e65..df33125 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -10,7 +10,7 @@
final String name = '~';
const BitNotOperation();
Constant fold(Constant constant) {
- if (constant.isInt()) {
+ if (constant.isInt) {
IntConstant intConstant = constant;
return DART_CONSTANT_SYSTEM.createInt(~intConstant.value);
}
@@ -22,11 +22,11 @@
final String name = 'negate';
const NegateOperation();
Constant fold(Constant constant) {
- if (constant.isInt()) {
+ if (constant.isInt) {
IntConstant intConstant = constant;
return DART_CONSTANT_SYSTEM.createInt(-intConstant.value);
}
- if (constant.isDouble()) {
+ if (constant.isDouble) {
DoubleConstant doubleConstant = constant;
return DART_CONSTANT_SYSTEM.createDouble(-doubleConstant.value);
}
@@ -38,7 +38,7 @@
final String name = '!';
const NotOperation();
Constant fold(Constant constant) {
- if (constant.isBool()) {
+ if (constant.isBool) {
BoolConstant boolConstant = constant;
return DART_CONSTANT_SYSTEM.createBool(!boolConstant.value);
}
@@ -52,7 +52,7 @@
abstract class BinaryBitOperation implements BinaryOperation {
const BinaryBitOperation();
Constant fold(Constant left, Constant right) {
- if (left.isInt() && right.isInt()) {
+ if (left.isInt && right.isInt) {
IntConstant leftInt = left;
IntConstant rightInt = right;
int resultValue = foldInts(leftInt.value, rightInt.value);
@@ -111,7 +111,7 @@
abstract class BinaryBoolOperation implements BinaryOperation {
const BinaryBoolOperation();
Constant fold(Constant left, Constant right) {
- if (left.isBool() && right.isBool()) {
+ if (left.isBool && right.isBool) {
BoolConstant leftBool = left;
BoolConstant rightBool = right;
bool resultValue = foldBools(leftBool.value, rightBool.value);
@@ -140,18 +140,18 @@
abstract class ArithmeticNumOperation implements BinaryOperation {
const ArithmeticNumOperation();
Constant fold(Constant left, Constant right) {
- if (left.isNum() && right.isNum()) {
+ if (left.isNum && right.isNum) {
NumConstant leftNum = left;
NumConstant rightNum = right;
num foldedValue;
- if (left.isInt() && right.isInt()) {
+ if (left.isInt && right.isInt) {
foldedValue = foldInts(leftNum.value, rightNum.value);
} else {
foldedValue = foldNums(leftNum.value, rightNum.value);
}
// A division by 0 means that we might not have a folded value.
if (foldedValue == null) return null;
- if (left.isInt() && right.isInt() && !isDivide() ||
+ if (left.isInt && right.isInt && !isDivide() ||
isTruncatingDivide()) {
assert(foldedValue is int);
return DART_CONSTANT_SYSTEM.createInt(foldedValue);
@@ -221,12 +221,12 @@
final String name = '+';
const AddOperation();
Constant fold(Constant left, Constant right) {
- if (left.isInt() && right.isInt()) {
+ if (left.isInt && right.isInt) {
IntConstant leftInt = left;
IntConstant rightInt = right;
int result = leftInt.value + rightInt.value;
return DART_CONSTANT_SYSTEM.createInt(result);
- } else if (left.isNum() && right.isNum()) {
+ } else if (left.isNum && right.isNum) {
NumConstant leftNum = left;
NumConstant rightNum = right;
double result = leftNum.value + rightNum.value;
@@ -241,7 +241,7 @@
abstract class RelationalNumOperation implements BinaryOperation {
const RelationalNumOperation();
Constant fold(Constant left, Constant right) {
- if (!left.isNum() || !right.isNum()) return null;
+ if (!left.isNum || !right.isNum) return null;
NumConstant leftNum = left;
NumConstant rightNum = right;
bool foldedValue = foldNums(leftNum.value, rightNum.value);
@@ -284,7 +284,7 @@
final String name = '==';
const EqualsOperation();
Constant fold(Constant left, Constant right) {
- if (left.isNum() && right.isNum()) {
+ if (left.isNum && right.isNum) {
// Numbers need to be treated specially because: NaN != NaN, -0.0 == 0.0,
// and 1 == 1.0.
NumConstant leftNum = left;
@@ -292,7 +292,7 @@
bool result = leftNum.value == rightNum.value;
return DART_CONSTANT_SYSTEM.createBool(result);
}
- if (left.isConstructedObject()) {
+ if (left.isConstructedObject) {
// Unless we know that the user-defined object does not implement the
// equality operator we cannot fold here.
return null;
@@ -309,7 +309,7 @@
// In order to preserve runtime semantics which says that NaN !== NaN don't
// constant fold NaN === NaN. Otherwise the output depends on inlined
// variables and other optimizations.
- if (left.isNaN() && right.isNaN()) return null;
+ if (left.isNaN && right.isNaN) return null;
return DART_CONSTANT_SYSTEM.createBool(left == right);
}
apply(left, right) => identical(left, right);
@@ -353,11 +353,11 @@
BoolConstant createBool(bool value) => new BoolConstant(value);
NullConstant createNull() => new NullConstant();
- bool isInt(Constant constant) => constant.isInt();
- bool isDouble(Constant constant) => constant.isDouble();
- bool isString(Constant constant) => constant.isString();
- bool isBool(Constant constant) => constant.isBool();
- bool isNull(Constant constant) => constant.isNull();
+ bool isInt(Constant constant) => constant.isInt;
+ bool isDouble(Constant constant) => constant.isDouble;
+ bool isString(Constant constant) => constant.isString;
+ bool isBool(Constant constant) => constant.isBool;
+ bool isNull(Constant constant) => constant.isNull;
bool isSubtype(Compiler compiler, DartType s, DartType t) {
return compiler.types.isSubtype(s, t);
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 213f28b..b5bb3c0 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -23,31 +23,30 @@
abstract class Constant {
const Constant();
- // TODO: Make all the isXXX in Constant checks getters.
- bool isNull() => false;
- bool isBool() => false;
- bool isTrue() => false;
- bool isFalse() => false;
- bool isInt() => false;
- bool isDouble() => false;
- bool isNum() => false;
- bool isString() => false;
- bool isList() => false;
- bool isMap() => false;
- bool isConstructedObject() => false;
- bool isFunction() => false;
+ bool get isNull => false;
+ bool get isBool => false;
+ bool get isTrue => false;
+ bool get isFalse => false;
+ bool get isInt => false;
+ bool get isDouble => false;
+ bool get isNum => false;
+ bool get isString => false;
+ bool get isList => false;
+ bool get isMap => false;
+ bool get isConstructedObject => false;
+ bool get isFunction => false;
/** Returns true if the constant is null, a bool, a number or a string. */
- bool isPrimitive() => false;
+ bool get isPrimitive => false;
/** Returns true if the constant is a list, a map or a constructed object. */
- bool isObject() => false;
- bool isType() => false;
- bool isInterceptor() => false;
- bool isDummy() => false;
+ bool get isObject => false;
+ bool get isType => false;
+ bool get isInterceptor => false;
+ bool get isDummy => false;
- bool isNaN() => false;
- bool isMinusZero() => false;
- bool isZero() => false;
- bool isOne() => false;
+ bool get isNaN => false;
+ bool get isMinusZero => false;
+ bool get isZero => false;
+ bool get isOne => false;
// TODO(johnniwinther): Replace with a 'type' getter.
DartType computeType(Compiler compiler);
@@ -64,7 +63,7 @@
FunctionConstant(this.element);
- bool isFunction() => true;
+ bool get isFunction => true;
bool operator ==(var other) {
if (other is !FunctionConstant) return false;
@@ -92,7 +91,7 @@
abstract class PrimitiveConstant extends Constant {
get value;
const PrimitiveConstant();
- bool isPrimitive() => true;
+ bool get isPrimitive => true;
bool operator ==(var other) {
if (other is !PrimitiveConstant) return false;
@@ -115,7 +114,7 @@
factory NullConstant() => const NullConstant._internal();
const NullConstant._internal();
- bool isNull() => true;
+ bool get isNull => true;
get value => null;
DartType computeType(Compiler compiler) {
@@ -136,7 +135,7 @@
abstract class NumConstant extends PrimitiveConstant {
num get value;
const NumConstant();
- bool isNum() => true;
+ bool get isNum => true;
}
class IntConstant extends NumConstant {
@@ -160,15 +159,15 @@
}
}
const IntConstant._internal(this.value);
- bool isInt() => true;
+ bool get isInt => true;
bool isUInt31() => value >= 0 && value < (1 << 31);
bool isUInt32() => value >= 0 && value < (1 << 32);
bool isPositive() => value >= 0;
- bool isZero() => value == 0;
- bool isOne() => value == 1;
+ bool get isZero => value == 0;
+ bool get isOne => value == 1;
DartType computeType(Compiler compiler) {
- return compiler.intClass.computeType(compiler);
+ return compiler.intClass.rawType;
}
ti.TypeMask computeMask(Compiler compiler) {
@@ -212,15 +211,15 @@
}
}
const DoubleConstant._internal(this.value);
- bool isDouble() => true;
- bool isNaN() => value.isNaN;
+ bool get isDouble => true;
+ bool get isNaN => value.isNaN;
// We need to check for the negative sign since -0.0 == 0.0.
- bool isMinusZero() => value == 0.0 && value.isNegative;
- bool isZero() => value == 0.0;
- bool isOne() => value == 1.0;
+ bool get isMinusZero => value == 0.0 && value.isNegative;
+ bool get isZero => value == 0.0;
+ bool get isOne => value == 1.0;
DartType computeType(Compiler compiler) {
- return compiler.doubleClass.computeType(compiler);
+ return compiler.doubleClass.rawType;
}
ti.TypeMask computeMask(Compiler compiler) {
@@ -228,7 +227,7 @@
// -0.0 is an integer.
// TODO(17235): this kind of special casing should only happen in the
// backend.
- if (isMinusZero() && compiler.backend.constantSystem.isInt(this)) {
+ if (isMinusZero && compiler.backend.constantSystem.isInt(this)) {
return compiler.typesTask.uint31Type;
}
assert(!compiler.backend.constantSystem.isInt(this));
@@ -259,10 +258,10 @@
return value ? new TrueConstant() : new FalseConstant();
}
const BoolConstant._internal();
- bool isBool() => true;
+ bool get isBool => true;
DartType computeType(Compiler compiler) {
- return compiler.boolClass.computeType(compiler);
+ return compiler.boolClass.rawType;
}
ti.TypeMask computeMask(Compiler compiler) {
@@ -277,7 +276,7 @@
factory TrueConstant() => const TrueConstant._internal();
const TrueConstant._internal() : super._internal();
- bool isTrue() => true;
+ bool get isTrue => true;
FalseConstant negate() => new FalseConstant();
@@ -295,7 +294,7 @@
factory FalseConstant() => const FalseConstant._internal();
const FalseConstant._internal() : super._internal();
- bool isFalse() => true;
+ bool get isFalse => true;
TrueConstant negate() => new TrueConstant();
@@ -318,10 +317,10 @@
StringConstant(DartString value)
: this.value = value,
this.hashCode = value.slowToString().hashCode;
- bool isString() => true;
+ bool get isString => true;
DartType computeType(Compiler compiler) {
- return compiler.stringClass.computeType(compiler);
+ return compiler.stringClass.rawType;
}
ti.TypeMask computeMask(Compiler compiler) {
@@ -349,7 +348,7 @@
ObjectConstant(this.type);
- bool isObject() => true;
+ bool get isObject => true;
DartType computeType(Compiler compiler) => type;
}
@@ -360,7 +359,7 @@
TypeConstant(this.representedType, type) : super(type);
- bool isType() => true;
+ bool get isType => true;
bool operator ==(other) {
return other is TypeConstant && representedType == other.representedType;
@@ -387,7 +386,7 @@
: this.entries = entries,
hashCode = _computeHash(type, entries),
super(type);
- bool isList() => true;
+ bool get isList => true;
static int _computeHash(DartType type, List<Constant> entries) {
// TODO(floitsch): create a better hash.
@@ -463,7 +462,7 @@
: this.values = values,
this.hashCode = computeHash(type, values),
super(type);
- bool isMap() => true;
+ bool get isMap => true;
static int computeHash(DartType type, List<Constant> values) {
// TODO(floitsch): create a better hash.
@@ -529,7 +528,7 @@
InterceptorConstant(this.dispatchedType);
- bool isInterceptor() => true;
+ bool get isInterceptor => true;
bool operator ==(other) {
return other is InterceptorConstant
@@ -558,7 +557,7 @@
DummyConstant(this.typeMask);
- bool isDummy() => true;
+ bool get isDummy => true;
bool operator ==(other) {
return other is DummyConstant
@@ -590,7 +589,7 @@
super(type) {
assert(type != null);
}
- bool isConstructedObject() => true;
+ bool get isConstructedObject => true;
static int computeHash(DartType type, List<Constant> fields) {
// TODO(floitsch): create a better hash.
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index ed9fd82..5c058f4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -17,7 +17,8 @@
CompilationUnitElementX,
LibraryElementX,
PrefixElementX,
- VoidElementX;
+ VoidElementX,
+ AnalyzableElement;
import 'js_backend/js_backend.dart' as js_backend;
import 'native_handler.dart' as native;
import 'scanner/scannerlib.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 57e36da..19c3976 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -59,17 +59,17 @@
*/
bool isSafeToRemoveTypeDeclarations(
Map<ClassElement, Set<Element>> classMembers) {
+ ClassElement typeErrorElement = compiler.coreLibrary.find('TypeError');
+ if (classMembers.containsKey(typeErrorElement) ||
+ compiler.resolverWorld.isChecks.any(
+ (DartType type) => type.element == typeErrorElement)) {
+ return false;
+ }
Set<DartType> processedTypes = new Set<DartType>();
List<DartType> workQueue = new List<DartType>();
workQueue.addAll(
classMembers.keys.map((classElement) => classElement.thisType));
workQueue.addAll(compiler.resolverWorld.isChecks);
- Element typeErrorElement =
- compiler.coreLibrary.find('TypeError');
- DartType typeErrorType = typeErrorElement.computeType(compiler);
- if (workQueue.indexOf(typeErrorType) != -1) {
- return false;
- }
while (!workQueue.isEmpty) {
DartType type = workQueue.removeLast();
@@ -302,14 +302,8 @@
SynthesizedConstructorElementX constructor =
new SynthesizedConstructorElementX(
classElement.name, null, classElement, false);
- constructor.type = new FunctionType(
- constructor,
- compiler.types.voidType,
- const Link<DartType>(),
- const Link<DartType>(),
- const Link<String>(),
- const Link<DartType>()
- );
+ constructor.typeCache =
+ new FunctionType(constructor, compiler.types.voidType);
constructor.cachedNode = new FunctionExpression(
new Send(classNode.name, synthesizedIdentifier),
new NodeList(new StringToken.fromString(OPEN_PAREN_INFO, '(', -1),
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 6faf905..528673f 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -392,7 +392,7 @@
// Do not forget to rename them as well.
FunctionElement constructorFunction = constructor;
Link<Element> optionalParameters =
- constructorFunction.computeSignature(compiler).optionalParameters;
+ constructorFunction.functionSignature.optionalParameters;
for (final argument in send.argumentsNode) {
NamedArgument named = argument.asNamedArgument();
if (named == null) continue;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index aedc7ea..4177c5b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -8,7 +8,11 @@
import 'dart2jslib.dart' show Compiler, invariant, Script, Message;
import 'elements/modelx.dart'
- show VoidElementX, LibraryElementX, BaseClassElementX;
+ show VoidElementX,
+ LibraryElementX,
+ BaseClassElementX,
+ TypeDeclarationElementX,
+ TypedefElementX;
import 'elements/elements.dart';
import 'ordered_typeset.dart' show OrderedTypeSet;
import 'util/util.dart' show Link, LinkBuilder, CURRENT_ELEMENT_SPANNABLE;
@@ -356,11 +360,20 @@
}
abstract class GenericType extends DartType {
+ final TypeDeclarationElement element;
final Link<DartType> typeArguments;
- GenericType(Link<DartType> this.typeArguments);
-
- TypeDeclarationElement get element;
+ GenericType(TypeDeclarationElementX element,
+ Link<DartType> this.typeArguments,
+ {bool checkTypeArgumentCount: true})
+ : this.element = element {
+ assert(invariant(element,
+ !checkTypeArgumentCount ||
+ element.thisTypeCache == null ||
+ typeArguments.slowLength() == element.typeVariables.slowLength(),
+ message: () => 'Invalid type argument count on ${element.thisType}. '
+ 'Provided type arguments: $typeArguments.'));
+ }
/// Creates a new instance of this type using the provided type arguments.
GenericType createInstantiation(Link<DartType> newTypeArguments);
@@ -444,22 +457,18 @@
}
class InterfaceType extends GenericType {
- final ClassElement element;
-
- InterfaceType(this.element,
+ InterfaceType(BaseClassElementX element,
[Link<DartType> typeArguments = const Link<DartType>()])
- : super(typeArguments) {
+ : super(element, typeArguments) {
assert(invariant(element, element.isDeclaration));
- assert(invariant(element, element.thisType == null ||
- typeArguments.slowLength() == element.typeVariables.slowLength(),
- message: () => 'Invalid type argument count on ${element.thisType}. '
- 'Provided type arguments: $typeArguments.'));
}
- InterfaceType.forUserProvidedBadType(this.element,
+ InterfaceType.forUserProvidedBadType(BaseClassElementX element,
[Link<DartType> typeArguments =
const Link<DartType>()])
- : super(typeArguments);
+ : super(element, typeArguments, checkTypeArgumentCount: false);
+
+ ClassElement get element => super.element;
TypeKind get kind => TypeKind.INTERFACE;
@@ -749,27 +758,25 @@
}
class TypedefType extends GenericType {
- final TypedefElement element;
-
- // TODO(johnniwinther): Assert that the number of arguments and parameters
- // match, like for [InterfaceType].
- TypedefType(this.element,
+ TypedefType(TypedefElementX element,
[Link<DartType> typeArguments = const Link<DartType>()])
- : super(typeArguments);
+ : super(element, typeArguments);
- TypedefType createInstantiation(Link<DartType> newTypeArguments) {
- return new TypedefType(element, newTypeArguments);
- }
-
- TypedefType.forUserProvidedBadType(this.element,
+ TypedefType.forUserProvidedBadType(TypedefElementX element,
[Link<DartType> typeArguments =
const Link<DartType>()])
- : super(typeArguments);
+ : super(element, typeArguments, checkTypeArgumentCount: false);
+
+ TypedefElement get element => super.element;
TypeKind get kind => TypeKind.TYPEDEF;
String get name => element.name;
+ TypedefType createInstantiation(Link<DartType> newTypeArguments) {
+ return new TypedefType(element, newTypeArguments);
+ }
+
DartType unalias(Compiler compiler) {
// TODO(ahe): This should be [ensureResolved].
compiler.resolveTypedef(element);
@@ -1178,7 +1185,7 @@
LibraryElement library = new LibraryElementX(new Script(null, null, null));
VoidType voidType = new VoidType(new VoidElementX(library));
DynamicType dynamicType = new DynamicType(dynamicElement);
- dynamicElement.rawTypeCache = dynamicElement.thisType = dynamicType;
+ dynamicElement.rawTypeCache = dynamicElement.thisTypeCache = dynamicType;
MoreSpecificVisitor moreSpecificVisitor =
new MoreSpecificVisitor(compiler, dynamicType, voidType);
SubtypeVisitor subtypeVisitor =
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 3e92c1c..08c1775 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -497,7 +497,7 @@
for (Constant constant in allConstants) {
// If the constant is not a "constructed" constant, it can stay where
// it is.
- if (!constant.isConstructedObject()) continue;
+ if (!constant.isConstructedObject) continue;
OutputUnit constantUnit = _constantToOutputUnit[constant];
Setlet<Import> constantImports = constantUnit.imports;
ConstructedConstant constructed = constant;
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 63eb7ea..29f0ace 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -378,7 +378,7 @@
}
List contents = [];
if (emittedCode != null) {
- FunctionSignature signature = element.computeSignature(compiler);
+ FunctionSignature signature = element.functionSignature;
signature.forEachParameter((parameter) {
contents.add(new InferredInfoNode(
description: "parameter",
@@ -412,7 +412,7 @@
return null;
}
return new ElementInfoNode(
- type: element.type.toString(),
+ type: element.computeType(compiler).toString(),
kind: kindString,
name: nameString,
size: size,
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 010438f..1615fcf 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -186,8 +186,7 @@
/// Do not use [computeType] outside of the resolver; instead retrieve the
/// type from the corresponding field:
- /// - `variables.type` for fields and variables.
- /// - `type` for function elements.
+ /// - `type` for fields, variables, type variable, and function elements.
/// - `thisType` or `rawType` for [TypeDeclarationElement]s (classes and
/// typedefs), depending on the use case.
/// Trying to access a type that has not been computed in resolution is an
@@ -279,6 +278,8 @@
void diagnose(Element context, DiagnosticListener listener);
+ TreeElements get treeElements;
+
accept(ElementVisitor visitor);
}
@@ -765,7 +766,7 @@
void checkCyclicReference(Compiler compiler);
}
-abstract class VariableElement extends Element {
+abstract class VariableElement extends Element implements TypedElement {
Expression get initializer;
}
@@ -814,7 +815,8 @@
bool isCompatibleWith(FunctionSignature constructorSignature);
}
-abstract class FunctionElement extends Element implements ClosureContainer {
+abstract class FunctionElement extends Element
+ implements TypedElement, ClosureContainer {
FunctionExpression get cachedNode;
DartType get type;
FunctionSignature get functionSignature;
@@ -838,10 +840,13 @@
void set defaultImplementation(FunctionElement value);
void setPatch(FunctionElement patchElement);
- FunctionSignature computeSignature(Compiler compiler);
- int requiredParameterCount(Compiler compiler);
- int optionalParameterCount(Compiler compiler);
- int parameterCount(Compiler compiler);
+
+ /// Do not use [computeSignature] outside of the resolver; instead retrieve
+ /// the signature through the [functionSignature] field.
+ /// Trying to access a function signature that has not been computed in
+ /// resolution is an error and calling [computeSignature] covers that error.
+ /// This method will go away!
+ @deprecated FunctionSignature computeSignature(Compiler compiler);
FunctionExpression parseNode(DiagnosticListener listener);
}
@@ -902,7 +907,6 @@
bool get hasLocalScopeMembers;
// TODO(kasperl): These are bit fishy. Do we really need them?
- void set thisType(InterfaceType value);
void set supertype(DartType value);
void set interfaces(Link<DartType> value);
void set patch(ClassElement value);
@@ -927,7 +931,7 @@
/// Returns `true` if the class hierarchy for this class contains errors.
bool get hasIncompleteHierarchy;
- ClassElement ensureResolved(Compiler compiler);
+ void ensureResolved(Compiler compiler);
void addMember(Element element, DiagnosticListener listener);
void addToScope(Element element, DiagnosticListener listener);
@@ -1023,13 +1027,14 @@
LabelElement addLabel(Label label, String labelName);
}
-abstract class TypeVariableElement extends Element {
+/// The [Element] for a type variable declaration on a generic class or typedef.
+abstract class TypeVariableElement extends Element implements TypedElement {
+ /// The [type] defined by the type variable.
TypeVariableType get type;
- DartType get bound;
- // TODO(kasperl): Try to get rid of these.
- void set type(TypeVariableType value);
- void set bound(DartType value);
+ /// The upper bound on the type variable. If not explicitly declared, this is
+ /// `Object`.
+ DartType get bound;
}
abstract class MetadataAnnotation implements Spannable {
@@ -1048,6 +1053,11 @@
abstract class VoidElement extends Element {}
+/// An [Element] that has a type.
+abstract class TypedElement extends Element {
+ DartType get type;
+}
+
/// A [MemberSignature] is a member of an interface.
///
/// A signature is either a method or a getter or setter, possibly implicitly
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 707aaa8..eb48b99 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -67,6 +67,7 @@
metadata = metadata.prepend(annotation);
}
+
bool isFunction() => identical(kind, ElementKind.FUNCTION);
bool isConstructor() => isFactoryConstructor() || isGenerativeConstructor();
bool isClosure() => false;
@@ -298,6 +299,8 @@
FunctionElement get targetConstructor => null;
void diagnose(Element context, DiagnosticListener listener) {}
+
+ TreeElements get treeElements => enclosingElement.treeElements;
}
/**
@@ -577,7 +580,7 @@
}
}
-class CompilationUnitElementX extends ElementX
+class CompilationUnitElementX extends ElementX with AnalyzableElement
implements CompilationUnitElement {
final Script script;
PartOf partTag;
@@ -750,7 +753,8 @@
Element operator [](String name) => importScope[name];
}
-class LibraryElementX extends ElementX implements LibraryElement {
+class LibraryElementX extends ElementX with AnalyzableElement
+ implements LibraryElement {
final Uri canonicalUri;
CompilationUnitElement entryCompilationUnit;
Link<CompilationUnitElement> compilationUnits =
@@ -1043,30 +1047,12 @@
}
}
-class TypedefElementX extends ElementX implements TypedefElement {
+class TypedefElementX extends ElementX
+ with AnalyzableElement, TypeDeclarationElementX<TypedefType>
+ implements TypedefElement {
Typedef cachedNode;
/**
- * The type of this typedef in which the type arguments are the type
- * variables.
- *
- * This resembles the [ClassElement.thisType] though a typedef has no notion
- * of [:this:].
- *
- * This type is computed in [computeType].
- */
- TypedefType thisType;
-
- /**
- * Canonicalized raw version of [thisType].
- *
- * See [ClassElement.rawType] for motivation.
- *
- * The [rawType] is computed together with [thisType] in [computeType].
- */
- TypedefType rawType;
-
- /**
* The type annotation which defines this typedef.
*/
DartType alias;
@@ -1074,10 +1060,7 @@
/// [:true:] if the typedef has been checked for cyclic reference.
bool hasBeenCheckedForCycles = false;
- bool get isResolved => mapping != null;
-
- // TODO(johnniwinther): Store the mapping in the resolution enqueuer instead.
- TreeElements mapping;
+ bool get isResolved => hasTreeElements;
TypedefElementX(String name, Element enclosing)
: super(name, ElementKind.TYPEDEF, enclosing);
@@ -1093,26 +1076,16 @@
FunctionSignature functionSignature;
TypedefType computeType(Compiler compiler) {
- if (thisType != null) return thisType;
+ if (thisTypeCache != null) return thisTypeCache;
Typedef node = parseNode(compiler);
- Link<DartType> parameters =
- TypeDeclarationElementX.createTypeVariables(this, node.typeParameters);
- thisType = new TypedefType(this, parameters);
- if (parameters.isEmpty) {
- rawType = thisType;
- } else {
- var dynamicParameters = const Link<DartType>();
- parameters.forEach((_) {
- dynamicParameters =
- dynamicParameters.prepend(compiler.types.dynamicType);
- });
- rawType = new TypedefType(this, dynamicParameters);
- }
+ setThisAndRawTypes(compiler, createTypeVariables(node.typeParameters));
compiler.resolveTypedef(this);
- return thisType;
+ return thisTypeCache;
}
- Link<DartType> get typeVariables => thisType.typeArguments;
+ TypedefType createType(Link<DartType> typeArguments) {
+ return new TypedefType(this, typeArguments);
+ }
Scope buildScope() {
return new TypeDeclarationScope(enclosingElement.buildScope(), this);
@@ -1152,7 +1125,8 @@
DartType computeType(Element element, Compiler compiler) => type;
}
-class VariableElementX extends ElementX implements VariableElement {
+class VariableElementX extends ElementX with AnalyzableElement
+ implements VariableElement {
final Token token;
final VariableList variables;
VariableDefinitions definitionsCache;
@@ -1236,6 +1210,12 @@
return variables.computeType(this, compiler);
}
+ DartType get type {
+ assert(invariant(this, variables.type != null,
+ message: "Type has not been computed for $this."));
+ return variables.type;
+ }
+
bool isInstanceMember() => isMember() && !modifiers.isStatic();
// Note: cachedNode.getBeginToken() will not be correct in all
@@ -1489,9 +1469,10 @@
}
}
-class FunctionElementX extends ElementX implements FunctionElement {
+class FunctionElementX extends ElementX with AnalyzableElement
+ implements FunctionElement {
FunctionExpression cachedNode;
- DartType type;
+ DartType typeCache;
final Modifiers modifiers;
List<FunctionElement> nestedClosures = new List<FunctionElement>();
@@ -1622,10 +1603,16 @@
}
FunctionType computeType(Compiler compiler) {
- if (type != null) return type;
- type = compiler.computeFunctionType(declaration,
- computeSignature(compiler));
- return type;
+ if (typeCache != null) return typeCache;
+ typeCache = compiler.computeFunctionType(declaration,
+ computeSignature(compiler));
+ return typeCache;
+ }
+
+ FunctionType get type {
+ assert(invariant(this, typeCache != null,
+ message: "Type has not been computed for $this."));
+ return typeCache;
}
FunctionExpression parseNode(DiagnosticListener listener) {
@@ -1767,49 +1754,25 @@
accept(ElementVisitor visitor) => visitor.visitVoidElement(this);
}
-class TypeDeclarationElementX {
+abstract class TypeDeclarationElementX<T extends GenericType>
+ implements TypeDeclarationElement {
/**
- * Creates the type variables, their type and corresponding element, for the
- * type variables declared in [parameter] on [element]. The bounds of the type
- * variables are not set until [element] has been resolved.
- */
- static Link<DartType> createTypeVariables(TypeDeclarationElement element,
- NodeList parameters) {
- if (parameters == null) return const Link<DartType>();
-
- // Create types and elements for type variable.
- var arguments = new LinkBuilder<DartType>();
- for (Link link = parameters.nodes; !link.isEmpty; link = link.tail) {
- TypeVariable node = link.head;
- String variableName = node.name.source;
- TypeVariableElement variableElement =
- new TypeVariableElementX(variableName, element, node);
- TypeVariableType variableType = new TypeVariableType(variableElement);
- variableElement.type = variableType;
- arguments.addLast(variableType);
- }
- return arguments.toLink();
- }
-}
-
-abstract class BaseClassElementX extends ElementX implements ClassElement {
- final int id;
-
- /**
- * The type of [:this:] for this class declaration.
+ * The `this type` for this type declaration.
*
- * The type of [:this:] is the interface type based on this element in which
+ * The type of [:this:] is the generic type based on this element in which
* the type arguments are the declared type variables. For instance,
* [:List<E>:] for [:List:] and [:Map<K,V>:] for [:Map:].
*
+ * For a class declaration this is the type of [:this:].
+ *
* This type is computed in [computeType].
*/
- InterfaceType thisType;
+ T thisTypeCache;
/**
- * The raw type for this class declaration.
+ * The raw type for this type declaration.
*
- * The raw type is the interface type base on this element in which the type
+ * The raw type is the generic type base on this element in which the type
* arguments are all [dynamic]. For instance [:List<dynamic>:] for [:List:]
* and [:Map<dynamic,dynamic>:] for [:Map:]. For non-generic classes [rawType]
* is the same as [thisType].
@@ -1824,7 +1787,70 @@
*
* This type is computed together with [thisType] in [computeType].
*/
- InterfaceType rawTypeCache;
+ T rawTypeCache;
+
+ T get thisType {
+ assert(invariant(this, thisTypeCache != null,
+ message: 'This type has not been computed for $this'));
+ return thisTypeCache;
+ }
+
+ T get rawType {
+ assert(invariant(this, rawTypeCache != null,
+ message: 'Raw type has not been computed for $this'));
+ return rawTypeCache;
+ }
+
+ T createType(Link<DartType> typeArguments);
+
+ void setThisAndRawTypes(Compiler compiler, Link<DartType> typeParameters) {
+ assert(invariant(this, thisTypeCache == null,
+ message: "This type has already been set on $this."));
+ assert(invariant(this, rawTypeCache == null,
+ message: "Raw type has already been set on $this."));
+ thisTypeCache = createType(typeParameters);
+ if (typeParameters.isEmpty) {
+ rawTypeCache = thisTypeCache;
+ } else {
+ Link<DartType> dynamicParameters = const Link<DartType>();
+ typeParameters.forEach((_) {
+ dynamicParameters =
+ dynamicParameters.prepend(compiler.types.dynamicType);
+ });
+ rawTypeCache = createType(dynamicParameters);
+ }
+ }
+
+ Link<DartType> get typeVariables => thisType.typeArguments;
+
+ /**
+ * Creates the type variables, their type and corresponding element, for the
+ * type variables declared in [parameter] on [element]. The bounds of the type
+ * variables are not set until [element] has been resolved.
+ */
+ Link<DartType> createTypeVariables(NodeList parameters) {
+ if (parameters == null) return const Link<DartType>();
+
+ // Create types and elements for type variable.
+ LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
+ for (Link<Node> link = parameters.nodes; !link.isEmpty; link = link.tail) {
+ TypeVariable node = link.head;
+ String variableName = node.name.source;
+ TypeVariableElementX variableElement =
+ new TypeVariableElementX(variableName, this, node);
+ TypeVariableType variableType = new TypeVariableType(variableElement);
+ variableElement.typeCache = variableType;
+ arguments.addLast(variableType);
+ }
+ return arguments.toLink();
+ }
+}
+
+abstract class BaseClassElementX extends ElementX
+ with AnalyzableElement, TypeDeclarationElementX<InterfaceType>
+ implements ClassElement {
+ final int id;
+
DartType supertype;
Link<DartType> interfaces;
String nativeTagInfo;
@@ -1865,40 +1891,26 @@
bool get isUnnamedMixinApplication => false;
+ InterfaceType computeType(Compiler compiler) {
+ if (thisTypeCache == null) {
+ computeThisAndRawType(compiler, computeTypeParameters(compiler));
+ }
+ return thisTypeCache;
+ }
+
void computeThisAndRawType(Compiler compiler, Link<DartType> typeVariables) {
- if (thisType == null) {
+ if (thisTypeCache == null) {
if (origin == null) {
- Link<DartType> parameters = typeVariables;
- thisType = new InterfaceType(this, parameters);
- if (parameters.isEmpty) {
- rawTypeCache = thisType;
- } else {
- var dynamicParameters = const Link<DartType>();
- parameters.forEach((_) {
- dynamicParameters =
- dynamicParameters.prepend(compiler.types.dynamicType);
- });
- rawTypeCache = new InterfaceType(this, dynamicParameters);
- }
+ setThisAndRawTypes(compiler, typeVariables);
} else {
- thisType = origin.computeType(compiler);
+ thisTypeCache = origin.computeType(compiler);
rawTypeCache = origin.rawType;
}
}
}
- // TODO(johnniwinther): Add [thisType] getter similar to [rawType].
- InterfaceType computeType(Compiler compiler) {
- if (thisType == null) {
- computeThisAndRawType(compiler, computeTypeParameters(compiler));
- }
- return thisType;
- }
-
- InterfaceType get rawType {
- assert(invariant(this, rawTypeCache != null,
- message: 'Raw type has not been computed for $this'));
- return rawTypeCache;
+ InterfaceType createType(Link<DartType> typeArguments) {
+ return new InterfaceType(this, typeArguments);
}
Link<DartType> computeTypeParameters(Compiler compiler);
@@ -1909,13 +1921,10 @@
bool isObject(Compiler compiler) =>
identical(declaration, compiler.objectClass);
- Link<DartType> get typeVariables => thisType.typeArguments;
-
- ClassElement ensureResolved(Compiler compiler) {
+ void ensureResolved(Compiler compiler) {
if (resolutionState == STATE_NOT_STARTED) {
compiler.resolver.resolveClass(this);
}
- return this;
}
void setDefaultConstructor(FunctionElement constructor, Compiler compiler);
@@ -2299,8 +2308,7 @@
Link<DartType> computeTypeParameters(Compiler compiler) {
ClassNode node = parseNode(compiler);
- return TypeDeclarationElementX.createTypeVariables(
- this, node.typeParameters);
+ return createTypeVariables(node.typeParameters);
}
Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this);
@@ -2399,8 +2407,7 @@
"Type variables on unnamed mixin applications must be set on "
"creation.");
}
- return TypeDeclarationElementX.createTypeVariables(
- this, named.typeParameters);
+ return createTypeVariables(named.typeParameters);
}
accept(ElementVisitor visitor) => visitor.visitMixinApplicationElement(this);
@@ -2476,15 +2483,26 @@
class TypeVariableElementX extends ElementX implements TypeVariableElement {
final Node cachedNode;
- TypeVariableType type;
- DartType bound;
+ TypeVariableType typeCache;
+ DartType boundCache;
- TypeVariableElementX(String name, Element enclosing, this.cachedNode,
- [this.type, this.bound])
+ TypeVariableElementX(String name, Element enclosing, this.cachedNode)
: super(name, ElementKind.TYPE_VARIABLE, enclosing);
TypeVariableType computeType(compiler) => type;
+ TypeVariableType get type {
+ assert(invariant(this, typeCache != null,
+ message: "Type has not been set on $this."));
+ return typeCache;
+ }
+
+ DartType get bound {
+ assert(invariant(this, boundCache != null,
+ message: "Bound has not been set on $this."));
+ return boundCache;
+ }
+
Node parseNode(compiler) => cachedNode;
String toString() => "${enclosingElement.toString()}.${name}";
@@ -2558,3 +2576,4 @@
Token get endToken => metadata.getEndToken();
}
+
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 85c558e..c700d59 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -631,6 +631,8 @@
}
void internalAddToWorkList(Element element) {
+ assert(invariant(element, element is AnalyzableElement,
+ message: 'Element $element is not analyzable.'));
if (getCachedElements(element) != null) return;
if (queueIsClosed) {
throw new SpannableAssertionFailure(element,
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 3533dcc..e926165 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -1573,7 +1573,7 @@
FunctionElement function,
ArgumentsTypes<ConcreteType> argumentsTypes) {
final Map<Element, ConcreteType> result = new Map<Element, ConcreteType>();
- final FunctionSignature signature = function.computeSignature(compiler);
+ final FunctionSignature signature = function.functionSignature;
// guard 1: too many arguments
if (argumentsTypes.length > signature.parameterCount) {
@@ -1798,7 +1798,7 @@
ConcreteTypesEnvironment environment) {
// We trust the return type of native elements
if (isNativeElement(element)) {
- var elementType = element.computeType(compiler);
+ var elementType = element.type;
assert(elementType.kind == TypeKind.FUNCTION);
return typeOfNativeBehavior(
native.NativeBehavior.ofMethod(element, compiler));
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index f15a77f..5b7a33d 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -369,10 +369,10 @@
}
}
- void update(Element local, T type, Node node) {
+ void update(TypedElement local, T type, Node node) {
assert(type != null);
if (compiler.trustTypeAnnotations || compiler.enableTypeAssertions) {
- type = types.narrowType(type, local.computeType(compiler));
+ type = types.narrowType(type, local.type);
}
updateLocal() {
T currentType = locals[local];
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 03d318f..0cae963 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -470,7 +470,7 @@
}
FunctionElement function = analyzedElement;
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
signature.forEachOptionalParameter((element) {
ast.Expression defaultValue = element.initializer;
T type = (defaultValue == null) ? types.nullType : visit(defaultValue);
@@ -947,7 +947,7 @@
&& compiler.world.fieldNeverChanges(element)) {
var constant =
compiler.constantHandler.getConstantForVariable(element);
- if (constant != null && constant.isInt()) {
+ if (constant != null && constant.isInt) {
return constant.value;
}
}
@@ -1180,8 +1180,8 @@
T synthesizeForwardingCall(Spannable node, FunctionElement element) {
element = element.implementation;
FunctionElement function = analyzedElement;
- FunctionSignature signature = function.computeSignature(compiler);
- FunctionSignature calleeSignature = element.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
+ FunctionSignature calleeSignature = element.functionSignature;
if (!calleeSignature.isCompatibleWith(signature)) {
return types.nonNullEmpty();
}
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index bac4d44..cfe1661 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -646,7 +646,7 @@
Constant value =
compiler.constantHandler.getConstantForVariable(element);
if (value != null) {
- if (value.isFunction()) {
+ if (value.isFunction) {
FunctionConstant functionConstant = value;
type = types.allocateClosure(node, functionConstant.element);
} else {
@@ -761,7 +761,7 @@
types.allocatedClosures.add(info);
}
FunctionElement function = callee.implementation;
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
signature.forEachParameter((Element parameter) {
ElementTypeInformation info = types.getInferredTypeOf(parameter);
info.giveUp(this, clearAssignments: false);
@@ -770,7 +770,7 @@
}
} else {
FunctionElement function = callee.implementation;
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
int parameterIndex = 0;
bool visitingRequiredParameter = true;
signature.forEachParameter((Element parameter) {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index b411f48..2c45b4a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -325,7 +325,8 @@
assert(element.isFunction() ||
element.isGetter() ||
element.isSetter());
- var elementType = element.computeType(inferrer.compiler);
+ TypedElement typedElement = element;
+ var elementType = typedElement.type;
if (elementType.kind != TypeKind.FUNCTION) {
return type;
} else {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 2f0f639..1b87d53 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -10,7 +10,7 @@
import '../source_file.dart';
import '../tree/tree.dart' as ast;
import '../scanner/scannerlib.dart' show Token;
-import '../js_backend/js_backend.dart' show JavaScriptBackend;
+import '../dart_backend/dart_backend.dart' show DartBackend;
import 'ir_pickler.dart' show Unpickler, IrConstantPool;
/**
@@ -81,7 +81,6 @@
nodes[element] = function;
}
}
- ensureIr(element);
});
});
}
@@ -89,7 +88,7 @@
bool irEnabled() {
// TODO(lry): support checked-mode checks.
if (compiler.enableTypeAssertions ||
- compiler.backend is !JavaScriptBackend ||
+ compiler.backend is !DartBackend ||
compiler.enableConcreteTypeInference) {
return false;
}
@@ -102,20 +101,12 @@
if (function == null) return false;
// TODO(lry): support functions with parameters.
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
if (signature.parameterCount > 0) return false;
- // TODO(lry): support intercepted methods. Then the dependency on
- // JavaScriptBackend will go away.
- JavaScriptBackend backend = compiler.backend;
- if (backend.isInterceptedMethod(element)) return false;
-
// TODO(lry): support native functions (also in [visitReturn]).
if (function.isNative()) return false;
- // Methods annotated @IrRepresentation(false).
- if (enforceAstRepresentation(function)) return false;
-
return true;
}
@@ -125,50 +116,6 @@
return result;
}
- bool enforceAstRepresentation(Element element) {
- return irRepresentationValue(element, false);
- }
-
- bool enforceIrRepresentation(Element element) {
- return irRepresentationValue(element, true);
- }
-
- /**
- * In host-checked mode, the @IrRepresentation annotation can be used to
- * enforce the internal representation of a function.
- */
- bool irRepresentationValue(Element element, bool expected) {
- if (!inCheckedMode || compiler.backend is !JavaScriptBackend) return false;
- JavaScriptBackend backend = compiler.backend;
- for (MetadataAnnotation metadata in element.metadata) {
- if (metadata.value == null ||
- !metadata.value.isConstructedObject()) {
- continue;
- }
- ObjectConstant value = metadata.value;
- ClassElement cls = value.type.element;
- if (cls == backend.irRepresentationClass) {
- ConstructedConstant classConstant = value;
- BoolConstant constant = classConstant.fields[0];
- return constant.value == expected;
- }
- }
- return false;
- }
-
- void ensureIr(Element element) {
- // If no IR was built for [element], ensure it is not annotated
- // @IrRepresentation(true).
- if (inCheckedMode &&
- !compiler.irBuilder.hasIr(element) &&
- enforceIrRepresentation(element)) {
- compiler.reportFatalError(
- element,
- MessageKind.GENERIC,
- {'text': "Error: cannot build IR for $element."});
- }
- }
-
SourceFile elementSourceFile(Element element) {
if (element is FunctionElement) {
FunctionElement functionElement = element;
@@ -183,10 +130,10 @@
* to the [builder] and return the last added statement for trees that represent
* an expression.
*/
-class IrBuilder extends ResolvedVisitor<ir.Trivial> {
+class IrBuilder extends ResolvedVisitor<ir.Definition> {
final SourceFile sourceFile;
ir.Continuation returnContinuation = null;
-
+
// The IR builder maintains a context, which is an expression with a hole in
// it. The hole represents the focus where new expressions can be added.
// The context is implemented by 'root' which is the root of the expression
@@ -202,17 +149,17 @@
// expression and current is null.
//
// Conceptually again, visiting an expression takes a context as input and
- // returns either a pair of a new context and a trivial expression denoting
+ // returns either a pair of a new context and a definition denoting
// the expression's value, or else an expression without a hole if all
// control-flow paths through the expression have exited.
//
// We do not pass and return contexts, rather we use the current context
// (root, current) as the visitor state and mutate current. Visiting a
// statement returns null; visiting an expression optionally returns the
- // trivial expression denoting its value.
+ // definition denoting its value.
ir.Expression root = null;
ir.Expression current = null;
-
+
IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
: super(elements, compiler);
@@ -258,7 +205,7 @@
current = current.plug(expr);
}
}
-
+
/**
* Add an explicit [:return null:] for functions that don't have a return
* statement on each branch. This includes functions with an empty body,
@@ -271,13 +218,13 @@
add(new ir.InvokeContinuation(returnContinuation, constant));
current = null;
}
-
- ir.Trivial visitEmptyStatement(ast.EmptyStatement node) {
+
+ ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
assert(isOpen);
return null;
}
- ir.Trivial visitBlock(ast.Block node) {
+ ir.Definition visitBlock(ast.Block node) {
assert(isOpen);
for (var n in node.statements.nodes) {
n.accept(this);
@@ -289,11 +236,11 @@
// Build(Return) = let val x = null in InvokeContinuation(return, x)
// Build(Return(e)) = C[InvokeContinuation(return, x)]
// where (C, x) = Build(e)
- ir.Trivial visitReturn(ast.Return node) {
+ ir.Definition visitReturn(ast.Return node) {
assert(isOpen);
// TODO(lry): support native returns.
if (node.beginToken.value == 'native') return giveup();
- ir.Trivial value;
+ ir.Definition value;
if (node.expression == null) {
value = new ir.Constant(constantSystem.createNull());
add(new ir.LetVal(value));
@@ -305,10 +252,10 @@
current = null;
return null;
}
-
+
// For all simple literals:
// Build(Literal(c)) = (let val x = Constant(c) in [], x)
- ir.Trivial visitLiteralBool(ast.LiteralBool node) {
+ ir.Definition visitLiteralBool(ast.LiteralBool node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createBool(node.value));
@@ -316,7 +263,7 @@
return constant;
}
- ir.Trivial visitLiteralDouble(ast.LiteralDouble node) {
+ ir.Definition visitLiteralDouble(ast.LiteralDouble node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createDouble(node.value));
@@ -324,7 +271,7 @@
return constant;
}
- ir.Trivial visitLiteralInt(ast.LiteralInt node) {
+ ir.Definition visitLiteralInt(ast.LiteralInt node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createInt(node.value));
@@ -332,7 +279,7 @@
return constant;
}
- ir.Trivial visitLiteralString(ast.LiteralString node) {
+ ir.Definition visitLiteralString(ast.LiteralString node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createString(node.dartString));
@@ -340,7 +287,7 @@
return constant;
}
- ir.Trivial visitLiteralNull(ast.LiteralNull node) {
+ ir.Definition visitLiteralNull(ast.LiteralNull node) {
assert(isOpen);
ir.Constant constant = new ir.Constant(constantSystem.createNull());
add(new ir.LetVal(constant));
@@ -353,29 +300,29 @@
// IrNode visitLiteralMapEntry(LiteralMapEntry node) => visitNode(node);
// IrNode visitLiteralSymbol(LiteralSymbol node) => visitExpression(node);
- ir.Trivial visitAssert(ast.Send node) {
+ ir.Definition visitAssert(ast.Send node) {
return giveup();
}
- ir.Trivial visitClosureSend(ast.Send node) {
+ ir.Definition visitClosureSend(ast.Send node) {
return giveup();
}
- ir.Trivial visitDynamicSend(ast.Send node) {
+ ir.Definition visitDynamicSend(ast.Send node) {
return giveup();
}
- ir.Trivial visitGetterSend(ast.Send node) {
+ ir.Definition visitGetterSend(ast.Send node) {
return giveup();
}
- ir.Trivial visitOperatorSend(ast.Send node) {
+ ir.Definition visitOperatorSend(ast.Send node) {
return giveup();
}
// Build(StaticSend(f, a...)) = C[InvokeStatic(f, x...)]
// where (C, x...) = BuildList(a...)
- ir.Trivial visitStaticSend(ast.Send node) {
+ ir.Definition visitStaticSend(ast.Send node) {
assert(isOpen);
Element element = elements[node];
// TODO(lry): support static fields. (separate IR instruction?)
@@ -415,17 +362,17 @@
return v;
}
- ir.Trivial visitSuperSend(ast.Send node) {
+ ir.Definition visitSuperSend(ast.Send node) {
return giveup();
}
- ir.Trivial visitTypeReferenceSend(ast.Send node) {
+ ir.Definition visitTypeReferenceSend(ast.Send node) {
return giveup();
}
static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
- ir.Trivial giveup() => throw ABORT_IRNODE_BUILDER;
+ ir.Definition giveup() => throw ABORT_IRNODE_BUILDER;
ir.Function nullIfGiveup(ir.Function action()) {
try {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index b2ed5a6..4825e68 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -23,64 +23,64 @@
Expression plug(Expression expr) => throw 'impossible';
}
-// Trivial is the base class of things that variables can refer to: primitives,
-// continuations, function and continuation parameters, etc.
-abstract class Trivial extends Node {
+/// The base class of things that variables can refer to: primitives,
+/// continuations, function and continuation parameters, etc.
+abstract class Definition extends Node {
// The head of a linked-list of occurrences, in no particular order.
Variable firstUse = null;
}
-// Operands to invocations and primitives are always variables. They point to
-// their definition and are linked into a list of occurrences.
+/// Operands to invocations and primitives are always variables. They point to
+/// their definition and are linked into a list of occurrences.
class Variable {
- Trivial definition;
+ Definition definition;
Variable nextUse = null;
-
+
Variable(this.definition) {
nextUse = definition.firstUse;
definition.firstUse = this;
}
}
-// Binding a value (primitive or constant): 'let val x = V in E'. The bound
-// value is in scope in the body.
-// During one-pass construction a LetVal with an empty body is used to
-// represent one-level context 'let val x = V in []'.
+/// Binding a value (primitive or constant): 'let val x = V in E'. The bound
+/// value is in scope in the body.
+/// During one-pass construction a LetVal with an empty body is used to
+/// represent one-level context 'let val x = V in []'.
class LetVal extends Expression {
- final Trivial value;
+ final Definition value;
Expression body = null;
-
+
LetVal(this.value);
-
+
Expression plug(Expression expr) {
assert(body == null);
return body = expr;
}
-
+
accept(Visitor visitor) => visitor.visitLetVal(this);
}
-// Binding a continuation: 'let cont k(v) = E in E'. The bound continuation is
-// in scope in the body and the continuation parameter is in scope in the
-// continuation body.
-// During one-pass construction a LetCont with an empty continuation body is
-// used to represent the one-level context 'let cont k(v) = [] in E'.
+/// Binding a continuation: 'let cont k(v) = E in E'. The bound continuation
+/// is in scope in the body and the continuation parameter is in scope in the
+/// continuation body.
+/// During one-pass construction a LetCont with an empty continuation body is
+/// used to represent the one-level context 'let cont k(v) = [] in E'.
class LetCont extends Expression {
final Continuation continuation;
final Expression body;
-
+
LetCont(this.continuation, this.body);
-
+
Expression plug(Expression expr) {
assert(continuation.body == null);
return continuation.body = expr;
}
-
+
accept(Visitor visitor) => visitor.visitLetCont(this);
}
-// Invoke a static function in tail position.
+/// Invoke a static function in tail position.
class InvokeStatic extends Expression {
final FunctionElement target;
@@ -93,9 +93,9 @@
final Variable continuation;
final List<Variable> arguments;
-
+
InvokeStatic(this.target, this.selector, Continuation cont,
- List<Trivial> args)
+ List<Definition> args)
: continuation = new Variable(cont),
arguments = args.map((t) => new Variable(t)).toList(growable: false) {
assert(selector.kind == SelectorKind.CALL);
@@ -105,54 +105,52 @@
accept(Visitor visitor) => visitor.visitInvokeStatic(this);
}
-// Invoke a continuation in tail position.
+/// Invoke a continuation in tail position.
class InvokeContinuation extends Expression {
final Variable continuation;
final Variable argument;
-
- InvokeContinuation(Continuation cont, Trivial arg)
+
+ InvokeContinuation(Continuation cont, Definition arg)
: continuation = new Variable(cont),
argument = new Variable(arg);
-
+
accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
}
-// Constants are values, they are always bound by 'let val'.
-class Constant extends Trivial {
+class Constant extends Definition {
final dart2js.Constant value;
-
+
Constant(this.value);
-
+
accept(Visitor visitor) => visitor.visitConstant(this);
}
-// Function and continuation parameters are trivial.
-class Parameter extends Trivial {
+class Parameter extends Definition {
Parameter();
-
+
accept(Visitor visitor) => visitor.visitParameter(this);
}
-// Continuations are trivial. They are normally bound by 'let cont'. A
-// continuation with no parameter (or body) is used to represent a function's
-// return continuation.
-class Continuation extends Trivial {
+/// Continuations are normally bound by 'let cont'. A continuation with no
+/// parameter (or body) is used to represent a function's return continuation.
+/// The return continuation is bound by the Function, not by 'let cont'.
+class Continuation extends Definition {
final Parameter parameter;
Expression body = null;
-
+
Continuation(this.parameter);
-
+
Continuation.retrn() : parameter = null;
-
+
accept(Visitor visitor) => visitor.visitContinuation(this);
}
-// A function definition, consisting of parameters and a body. The parameters
-// include a distinguished continuation parameter.
-class Function extends Expression {
+/// A function definition, consisting of parameters and a body. The parameters
+/// include a distinguished continuation parameter.
+class Function extends Node {
final int endOffset;
final int namePosition;
-
+
final Continuation returnContinuation;
final Expression body;
@@ -168,39 +166,39 @@
abstract class Visitor<T> {
T visitNode(Node node) => node.accept(this);
-
+
T visitFunction(Function node) => visitNode(node);
T visitExpression(Expression node) => visitNode(node);
- T visitTrivial(Trivial node) => visitNode(node);
-
+ T visitDefinition(Definition node) => visitNode(node);
+
T visitLetVal(LetVal expr) => visitExpression(expr);
T visitLetCont(LetCont expr) => visitExpression(expr);
T visitInvokeStatic(InvokeStatic expr) => visitExpression(expr);
T visitInvokeContinuation(InvokeContinuation expr) => visitExpression(expr);
-
- T visitConstant(Constant triv) => visitTrivial(triv);
- T visitParameter(Parameter triv) => visitTrivial(triv);
- T visitContinuation(Continuation triv) => visitTrivial(triv);
+
+ T visitConstant(Constant triv) => visitDefinition(triv);
+ T visitParameter(Parameter triv) => visitDefinition(triv);
+ T visitContinuation(Continuation triv) => visitDefinition(triv);
}
-// Generate a Lisp-like S-expression representation of an IR node as a string.
-// The representation is not pretty-printed, but it can easily be quoted and
-// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
-// pretty-printed.
+/// Generate a Lisp-like S-expression representation of an IR node as a string.
+/// The representation is not pretty-printed, but it can easily be quoted and
+/// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
+/// pretty-printed.
class SExpressionStringifier extends Visitor<String> {
- final Map<Trivial, String> names = <Trivial, String>{};
-
+ final Map<Definition, String> names = <Definition, String>{};
+
int _valueCounter = 0;
int _continuationCounter = 0;
-
+
String newValueName() => 'v${_valueCounter++}';
String newContinuationName() => 'k${_continuationCounter++}';
-
+
String visitFunction(Function node) {
names[node.returnContinuation] = 'return';
return '(Function ${node.body.accept(this)})';
}
-
+
String visitLetVal(LetVal expr) {
String name = newValueName();
names[expr.value] = name;
@@ -208,7 +206,7 @@
String body = expr.body.accept(this);
return '(LetVal $name $value) $body';
}
-
+
String visitLetCont(LetCont expr) {
String cont = newContinuationName();
String param = newValueName();
@@ -218,7 +216,7 @@
String body = expr.body == null ? 'null' : expr.body.accept(this);
return '(LetCont ($cont $param) $contBody) $body';
}
-
+
String visitInvokeStatic(InvokeStatic expr) {
String name = expr.target.name;
String cont = names[expr.continuation.definition];
@@ -226,21 +224,21 @@
expr.arguments.map((v) => names[v.definition]).toList(growable: false);
return '(InvokeStatic $name $cont ${args.join(' ')})';
}
-
+
String visitInvokeContinuation(InvokeContinuation expr) {
String cont = names[expr.continuation.definition];
String arg = names[expr.argument.definition];
return '(InvokeContinuation $cont $arg)';
}
-
+
String visitConstant(Constant triv) {
return '(Constant ${triv.value})';
}
-
+
String visitParameter(Parameter triv) {
return '(Unexpected Parameter)';
}
-
+
String visitContinuation(Continuation triv) {
return '(Unexpected Continuation)';
}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 2ac626b..075d0f1 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -121,7 +121,7 @@
int tag = readByte();
switch (tag) {
case Pickles.NODE_CONSTANT:
- ir.Trivial constant = readConstantNode();
+ ir.Definition constant = readConstantNode();
unpickled[index++] = constant;
addExpression(new ir.LetVal(constant));
break;
@@ -169,9 +169,9 @@
return unpickled[entryIndex];
}
- List<ir.Trivial> readBackReferenceList() {
+ List<ir.Definition> readBackReferenceList() {
int length = readInt();
- List<ir.Trivial> result = new List<ir.Trivial>(length);
+ List<ir.Definition> result = new List<ir.Definition>(length);
for (int i = 0; i < length; i++) {
result[i] = readBackReference();
}
@@ -199,14 +199,14 @@
FunctionElement functionElement = readElement();
Selector selector = readSelector();
ir.Continuation continuation = readBackReference();
- List<ir.Trivial> arguments = readBackReferenceList();
+ List<ir.Definition> arguments = readBackReferenceList();
return new ir.InvokeStatic(functionElement, selector, continuation,
arguments);
}
ir.InvokeContinuation readInvokeContinuationNode() {
ir.Continuation continuation = readBackReference();
- ir.Trivial argument = readBackReference();
+ ir.Definition argument = readBackReference();
return new ir.InvokeContinuation(continuation, argument);
}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index d157b56..78f901f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -652,14 +652,14 @@
DartType type = constant.computeType(compiler);
registerInstantiatedConstantType(type, elements);
- if (constant.isFunction()) {
+ if (constant.isFunction) {
FunctionConstant function = constant;
compiler.enqueuer.codegen.registerGetOfStaticFunction(function.element);
- } else if (constant.isInterceptor()) {
+ } else if (constant.isInterceptor) {
// An interceptor constant references the class's prototype chain.
InterceptorConstant interceptor = constant;
registerInstantiatedConstantType(interceptor.dispatchedType, elements);
- } else if (constant.isType()) {
+ } else if (constant.isType) {
TypeConstant typeConstant = constant;
registerTypeLiteral(typeConstant.representedType.element,
compiler.enqueuer.codegen, elements);
@@ -1820,7 +1820,7 @@
bool hasNoSideEffects = false;
for (MetadataAnnotation metadata in element.metadata) {
metadata.ensureResolved(compiler);
- if (!metadata.value.isConstructedObject()) continue;
+ if (!metadata.value.isConstructedObject) continue;
ObjectConstant value = metadata.value;
ClassElement cls = value.type.element;
if (cls == noInlineClass) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 206b3df..68fb5dc7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -12,7 +12,7 @@
Constant fold(Constant constant) {
if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
// In JavaScript we don't check for -0 and treat it as if it was zero.
- if (constant.isMinusZero()) constant = DART_CONSTANT_SYSTEM.createInt(0);
+ if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
IntConstant intConstant = constant;
// We convert the result of bit-operations to 32 bit unsigned integers.
return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.value);
@@ -34,8 +34,8 @@
Constant fold(Constant left, Constant right) {
// In JavaScript we don't check for -0 and treat it as if it was zero.
- if (left.isMinusZero()) left = DART_CONSTANT_SYSTEM.createInt(0);
- if (right.isMinusZero()) right = DART_CONSTANT_SYSTEM.createInt(0);
+ if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
+ if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
IntConstant result = dartBitOperation.fold(left, right);
if (result != null) {
// We convert the result of bit-operations to 32 bit unsigned integers.
@@ -52,7 +52,7 @@
Constant fold(Constant left, Constant right) {
// Truncate the input value to 32 bits if necessary.
- if (left.isInt()) {
+ if (left.isInt) {
IntConstant intConstant = left;
int value = intConstant.value;
int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
@@ -81,7 +81,7 @@
String get name => dartNegateOperation.name;
Constant fold(Constant constant) {
- if (constant.isInt()) {
+ if (constant.isInt) {
IntConstant intConstant = constant;
if (intConstant.value == 0) {
return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
@@ -119,7 +119,7 @@
if (result == null || result.value) return result;
// In JavaScript -0.0 === 0 and all doubles are equal to their integer
// values. Furthermore NaN !== NaN.
- if (left.isNum() && right.isNum()) {
+ if (left.isNum && right.isNum) {
NumConstant leftNum = left;
NumConstant rightNum = right;
double leftDouble = leftNum.value.toDouble();
@@ -181,7 +181,7 @@
}
NumConstant convertToJavaScriptConstant(NumConstant constant) {
- if (constant.isInt()) {
+ if (constant.isInt) {
IntConstant intConstant = constant;
int intValue = intConstant.value;
if (integerBecomesNanOrInfinity(intValue)) {
@@ -193,11 +193,11 @@
if (floorValue != intValue) {
return new IntConstant(floorValue);
}
- } else if (constant.isDouble()) {
+ } else if (constant.isDouble) {
DoubleConstant doubleResult = constant;
double doubleValue = doubleResult.value;
if (!doubleValue.isInfinite && !doubleValue.isNaN &&
- !constant.isMinusZero()) {
+ !constant.isMinusZero) {
int intValue = doubleValue.truncate();
if (intValue == doubleValue) {
return new IntConstant(intValue);
@@ -217,12 +217,12 @@
NullConstant createNull() => new NullConstant();
// Integer checks don't verify that the number is not -0.0.
- bool isInt(Constant constant) => constant.isInt() || constant.isMinusZero();
+ bool isInt(Constant constant) => constant.isInt || constant.isMinusZero;
bool isDouble(Constant constant)
- => constant.isDouble() && !constant.isMinusZero();
- bool isString(Constant constant) => constant.isString();
- bool isBool(Constant constant) => constant.isBool();
- bool isNull(Constant constant) => constant.isNull();
+ => constant.isDouble && !constant.isMinusZero;
+ bool isString(Constant constant) => constant.isString;
+ bool isBool(Constant constant) => constant.isBool;
+ bool isNull(Constant constant) => constant.isNull;
bool isSubtype(Compiler compiler, DartType s, DartType t) {
// At runtime, an integer is both an integer and a double: the
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 2a9c15f..8fa9596 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -171,8 +171,8 @@
}
TypeConstant makeTypeConstant(ClassElement element) {
- DartType elementType = element.computeType(compiler).asRaw();
- DartType constantType = backend.typeImplementation.computeType(compiler);
+ DartType elementType = element.rawType;
+ DartType constantType = backend.typeImplementation.rawType;
return new TypeConstant(elementType, constantType);
}
@@ -187,7 +187,7 @@
if (member.isGenerativeConstructor()) {
// Ignore constructors that cannot be called with zero arguments.
FunctionElement constructor = member;
- FunctionSignature parameters = constructor.computeSignature(compiler);
+ FunctionSignature parameters = constructor.functionSignature;
if (parameters.requiredParameterCount == 0) {
result.add(member);
}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index e148cee..19519e8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -305,7 +305,7 @@
// In the current implementation it doesn't make sense to give names to
// function constants since the function-implementation itself serves as
// constant and can be accessed directly.
- assert(!constant.isFunction());
+ assert(!constant.isFunction);
String result = constantNames[constant];
if (result == null) {
String longName = constantLongName(constant);
@@ -382,7 +382,7 @@
if (element.isGenerativeConstructorBody()) {
name = Elements.reconstructConstructorNameSourceString(element);
}
- FunctionSignature signature = element.computeSignature(compiler);
+ FunctionSignature signature = element.functionSignature;
String methodName =
'${privateName(library, name)}\$${signature.parameterCount}';
if (signature.optionalParametersAreNamed &&
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index d6a2229..0f50edd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -370,19 +370,19 @@
List<jsAst.Statement> statements,
FunctionElement member,
List<jsAst.Parameter> stubParameters) {
- FunctionSignature parameters = member.computeSignature(compiler);
+ FunctionSignature parameters = member.functionSignature;
Element converter =
compiler.findHelper('convertDartClosureToJS');
String closureConverter = backend.namer.isolateAccess(converter);
Set<String> stubParameterNames = new Set<String>.from(
stubParameters.map((param) => param.name));
- parameters.forEachParameter((Element parameter) {
+ parameters.forEachParameter((ParameterElement parameter) {
String name = parameter.name;
// If [name] is not in [stubParameters], then the parameter is an optional
// parameter that was not provided for this stub.
for (jsAst.Parameter stubParameter in stubParameters) {
if (stubParameter.name == name) {
- DartType type = parameter.computeType(compiler).unalias(compiler);
+ DartType type = parameter.type.unalias(compiler);
if (type is FunctionType) {
// The parameter type is a function type either directly or through
// typedef(s).
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index df46098..0f0cb0c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -186,8 +186,8 @@
potentiallyAddForRti(contextClass);
}
if (type.kind == TypeKind.FUNCTION) {
- void analyzeMethod(Element method) {
- DartType memberType = method.computeType(compiler);
+ void analyzeMethod(TypedElement method) {
+ DartType memberType = method.type;
ClassElement contextClass = Types.getClassContext(memberType);
if (contextClass != null &&
compiler.types.isPotentialSubtype(memberType, type)) {
@@ -201,8 +201,8 @@
}
});
if (compiler.enableTypeAssertions) {
- void analyzeMethod(Element method) {
- DartType memberType = method.computeType(compiler);
+ void analyzeMethod(TypedElement method) {
+ DartType memberType = method.type;
ClassElement contextClass = Types.getClassContext(memberType);
if (contextClass != null) {
potentiallyAddForRti(contextClass);
@@ -282,14 +282,14 @@
}
}
for (FunctionElement element in universe.staticFunctionsNeedingGetter) {
- instantiatedTypes.add(element.computeType(compiler));
+ instantiatedTypes.add(element.type);
}
// TODO(johnniwinther): We should get this information through the
// [neededClasses] computed in the emitter instead of storing it and pulling
// it from resolution, but currently it would introduce a cyclic dependency
// between [computeRequiredChecks] and [computeNeededClasses].
- for (Element element in compiler.resolverWorld.closurizedMembers) {
- instantiatedTypes.add(element.computeType(compiler));
+ for (TypedElement element in compiler.resolverWorld.closurizedMembers) {
+ instantiatedTypes.add(element.type);
}
return instantiatedTypes;
}
@@ -432,7 +432,7 @@
return true;
}
- InterfaceType originalType = cls.computeType(compiler);
+ InterfaceType originalType = cls.thisType;
InterfaceType type = originalType.asInstanceOf(check);
// [type] is not a subtype of [check]. we do not generate a check and do not
// need a substitution.
@@ -498,7 +498,7 @@
// Unnamed mixin application classes do not need substitutions, because they
// are never instantiated and their checks are overwritten by the class that
// they are mixed into.
- InterfaceType type = cls.computeType(compiler);
+ InterfaceType type = cls.thisType;
InterfaceType target = type.asInstanceOf(check);
Link<DartType> typeVariables = cls.typeVariables;
if (typeVariables.isEmpty && !alwaysGenerateFunction) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index 746f7f8..a847d3e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -63,7 +63,7 @@
return;
}
- InterfaceType typeVariableType = typeVariableClass.computeType(compiler);
+ InterfaceType typeVariableType = typeVariableClass.thisType;
List<int> constants = <int>[];
evaluator = new CompileTimeConstantEvaluator(
compiler.constantHandler,
@@ -100,7 +100,8 @@
if (!enqueuer.isResolutionQueue || typeVariableClasses == null) return;
backend.enqueueClass(
enqueuer, typeVariableClass, compiler.globalDependencies);
- Link constructors = typeVariableClass.ensureResolved(compiler).constructors;
+ typeVariableClass.ensureResolved(compiler);
+ Link constructors = typeVariableClass.constructors;
if (constructors.isEmpty && constructors.tail.isEmpty) {
compiler.reportInternalError(
typeVariableClass,
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index b28becf..c3b54b1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -494,10 +494,10 @@
return field is ClosureFieldElement;
}
- bool canAvoidGeneratedCheckedSetter(Element member) {
+ bool canAvoidGeneratedCheckedSetter(VariableElement member) {
// We never generate accessors for top-level/static fields.
if (!member.isInstanceMember()) return true;
- DartType type = member.computeType(compiler);
+ DartType type = member.type;
return type.treatAsDynamic || (type.element == compiler.objectClass);
}
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 d0218e4..4cb149e 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
@@ -703,9 +703,9 @@
isConstructor = true;
name = Elements.reconstructConstructorName(function);
}
- requiredParameterCount = function.requiredParameterCount(compiler);
- optionalParameterCount = function.optionalParameterCount(compiler);
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
+ requiredParameterCount = signature.requiredParameterCount;
+ optionalParameterCount = signature.optionalParameterCount;
if (signature.optionalParametersAreNamed) {
var names = [];
for (Element e in signature.optionalParameters) {
@@ -922,7 +922,7 @@
}
String name = namer.constantName(constant);
- if (constant.isList()) emitMakeConstantListIfNotEmitted(buffer);
+ if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
jsAst.Expression init = js(
'${namer.globalObjectForConstant(constant)}.$name = #',
constantInitializerExpression(constant));
@@ -932,9 +932,9 @@
}
bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
- if (constant.isFunction()) return true; // Already emitted.
- if (constant.isPrimitive()) return true; // Inlined.
- if (constant.isDummy()) return true; // Inlined.
+ if (constant.isFunction) return true; // Already emitted.
+ if (constant.isPrimitive) return true; // Inlined.
+ if (constant.isDummy) return true; // Inlined.
// The name is null when the constant is already a JS constant.
// TODO(floitsch): every constant should be registered, so that we can
// share the ones that take up too much space (like some strings).
@@ -1009,7 +1009,7 @@
js('var rootProperty = "_${generateIsolateTagRoot()}"'),
js.for_('var i = 0', null, 'i++', [
- js('property = intern(rootProperty + "_" + i + "_")'),
+ js('var property = intern(rootProperty + "_" + i + "_")'),
js.if_('!(property in usedProperties)', [
js('usedProperties[property] = 1'),
js('init.isolateTag = property'),
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 836bc58..6111f23 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -30,7 +30,7 @@
Selector selector,
AddStubFunction addStub,
Set<String> alreadyGenerated) {
- FunctionSignature parameters = member.computeSignature(compiler);
+ FunctionSignature parameters = member.functionSignature;
int positionalArgumentCount = selector.positionalArgumentCount;
if (positionalArgumentCount == parameters.parameterCount) {
assert(selector.namedArgumentCount == 0);
@@ -103,7 +103,7 @@
if (value == null) {
argumentsBuffer[count] = task.constantReference(new NullConstant());
} else {
- if (!value.isNull()) {
+ if (!value.isNull) {
// If the value is the null constant, we should not pass it
// down to the native method.
indexOfLastOptionalArgumentInParameters = count;
@@ -349,7 +349,7 @@
if (code == null) return;
String name = namer.getNameOfMember(member);
task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
- FunctionSignature parameters = member.computeSignature(compiler);
+ FunctionSignature parameters = member.functionSignature;
bool needsStubs = !parameters.optionalParameters.isEmpty;
bool canTearOff = false;
bool isClosure = false;
@@ -472,9 +472,9 @@
DartType memberType;
if (member.isGenerativeConstructorBody()) {
var body = member;
- memberType = body.constructor.computeType(compiler);
+ memberType = body.constructor.type;
} else {
- memberType = member.computeType(compiler);
+ memberType = member.type;
}
if (memberType.containsTypeVariables) {
jsAst.Expression thisAccess = js(r'this.$receiver');
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
index b6eb5c8..43ec0dd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
@@ -43,7 +43,7 @@
}
List<int> reifyDefaultArguments(FunctionElement function) {
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
if (signature.optionalParameterCount == 0) return const [];
List<int> defaultValues = <int>[];
for (Element element in signature.optionalParameters) {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
index c3c2b39..e8f5a70 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
@@ -21,17 +21,12 @@
}
abstract class InstanceMirrorMixin implements InstanceMirror {
-
bool get hasReflectee => false;
get reflectee {
throw new UnsupportedError('InstanceMirror.reflectee unsupported.');
}
- Function operator [](Symbol name) {
- throw new UnsupportedError('InstanceMirror.operator [] unsupported.');
- }
-
delegate(Invocation invocation) {
throw new UnsupportedError('InstanceMirror.delegate unsupported');
}
@@ -68,8 +63,7 @@
////////////////////////////////////////////////////////////////////////////////
class Dart2JsConstantMirror extends Object
- with ObjectMirrorMixin, InstanceMirrorMixin
- implements InstanceMirror {
+ with ObjectMirrorMixin, InstanceMirrorMixin {
final Dart2JsMirrorSystem mirrorSystem;
final Constant _constant;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
index 132308b..82e593d 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
@@ -153,6 +153,8 @@
bool get isImport => _node.asImport() != null;
bool get isExport => _node.asExport() != null;
+
+ List<InstanceMirror> get metadata => const <InstanceMirror>[];
}
class Dart2JsCombinatorMirror implements CombinatorSourceMirror {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index 64ba2d3..0400664 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -136,11 +136,11 @@
List<ParameterMirror> get parameters {
return _parametersFromFunctionSignature(this,
- _function.computeSignature(mirrorSystem.compiler));
+ _function.functionSignature);
}
TypeMirror get returnType => owner._getTypeMirror(
- _function.computeSignature(mirrorSystem.compiler).returnType);
+ _function.functionSignature.returnType);
bool get isAbstract => _function.isAbstract;
@@ -194,8 +194,7 @@
bool get isConst => _variable.modifiers.isConst();
- TypeMirror get type =>
- owner._getTypeMirror(_variable.computeType(mirrorSystem.compiler));
+ TypeMirror get type => owner._getTypeMirror(_variable.type);
}
@@ -227,9 +226,8 @@
ParameterElement get _element => super._element;
- TypeMirror get type => owner._getTypeMirror(
- _element.computeType(mirrorSystem.compiler),
- _element.functionSignature);
+ TypeMirror get type => owner._getTypeMirror(_element.type,
+ _element.functionSignature);
bool get isFinal => false;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 5359a09..37f542b 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -343,13 +343,11 @@
return null;
}
- DeclarationMirror _getTypeDeclarationMirror(Element element) {
+ DeclarationMirror _getTypeDeclarationMirror(TypeDeclarationElement element) {
if (element.isClass()) {
- return new Dart2JsClassDeclarationMirror(
- this, element.computeType(compiler));
+ return new Dart2JsClassDeclarationMirror(this, element.thisType);
} else if (element.isTypedef()) {
- return new Dart2JsTypedefDeclarationMirror(this,
- element.computeType(compiler));
+ return new Dart2JsTypedefDeclarationMirror(this, element.thisType);
}
compiler.internalError("Unexpected element $element");
return null;
@@ -395,15 +393,16 @@
DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system,
Element element) {
if (element.isTypeVariable()) {
- return new Dart2JsTypeVariableMirror(
- system, element.computeType(system.compiler));
+ TypeVariableElement typeVariable = element;
+ return new Dart2JsTypeVariableMirror(system, typeVariable.type);
}
Dart2JsLibraryMirror library = system._libraryMap[element.getLibrary()];
if (element.isLibrary()) return library;
if (element.isTypedef()) {
+ TypedefElement typedefElement = element;
return new Dart2JsTypedefMirror.fromLibrary(
- library, element.computeType(system.compiler));
+ library, typedefElement.thisType);
}
Dart2JsDeclarationMirror container = library;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
index 3d3b668..1ac23d0 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -167,8 +167,7 @@
class Dart2JsInterfaceTypeMirror
extends Dart2JsGenericTypeMirror
- with ObjectMirrorMixin, InstanceMirrorMixin, ClassMirrorMixin,
- ContainerMixin
+ with ObjectMirrorMixin, ClassMirrorMixin, ContainerMixin
implements ClassMirror {
Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
InterfaceType interfaceType)
@@ -255,7 +254,7 @@
Dart2JsClassDeclarationMirror otherDeclaration =
other.originalDeclaration;
return _element.isSubclassOf(otherDeclaration._element);
- } else if (other is TypeMirror) {
+ } else if (other is FunctionTypeMirror) {
return false;
}
throw new ArgumentError(other);
@@ -351,8 +350,7 @@
}
class Dart2JsFunctionTypeMirror extends Dart2JsTypeMirror
- with ObjectMirrorMixin, InstanceMirrorMixin,
- ClassMirrorMixin, DeclarationMixin
+ with ObjectMirrorMixin, ClassMirrorMixin, DeclarationMixin
implements FunctionTypeMirror {
final FunctionSignature _functionSignature;
List<ParameterMirror> _parameters;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index d9e860d..034d209 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -395,16 +395,16 @@
/// and a hint is emitted).
List convertConstantToUsageList(
Constant constant, { bool onlyStrings: false }) {
- if (constant.isNull()) {
+ if (constant.isNull) {
return null;
- } else if (constant.isList()) {
+ } else if (constant.isList) {
ListConstant list = constant;
List result = onlyStrings ? <String> [] : [];
for (Constant entry in list.entries) {
- if (entry.isString()) {
+ if (entry.isString) {
StringConstant string = entry;
result.add(string.value.slowToString());
- } else if (!onlyStrings && entry.isType()) {
+ } else if (!onlyStrings && entry.isType) {
TypeConstant type = entry;
result.add(type.representedType);
} else {
@@ -418,10 +418,10 @@
}
}
return result;
- } else if (!onlyStrings && constant.isType()) {
+ } else if (!onlyStrings && constant.isType) {
TypeConstant type = constant;
return [type.representedType];
- } else if (constant.isString()) {
+ } else if (constant.isString) {
StringConstant string = constant;
var iterable =
string.value.slowToString().split(',').map((e) => e.trim());
@@ -445,7 +445,8 @@
if (type.kind == TypeKind.INTERFACE && library.isInternalLibrary) {
InterfaceType interface = type;
ClassElement cls = type.element;
- for (DartType supertype in cls.ensureResolved(compiler).allSupertypes) {
+ cls.ensureResolved(compiler);
+ for (DartType supertype in cls.allSupertypes) {
if (supertype.kind == TypeKind.INTERFACE
&& !supertype.element.getLibrary().isInternalLibrary) {
return interface.asInstanceOf(supertype.element);
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 12563b5..966c5b3 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -815,9 +815,9 @@
// TODO(sra): Optional arguments are currently missing from the
// DartType. This should be fixed so the following work-around can be
// removed.
- method.computeSignature(compiler).forEachOptionalParameter(
- (Element parameter) {
- behavior._escape(parameter.computeType(compiler), compiler);
+ method.functionSignature.forEachOptionalParameter(
+ (ParameterElement parameter) {
+ behavior._escape(parameter.type, compiler);
});
behavior._overrideWithAnnotations(method, compiler);
@@ -853,7 +853,7 @@
if (e is! ClassElement) return null;
ClassElement cls = e;
cls.ensureResolved(compiler);
- return cls.computeType(compiler);
+ return cls.thisType;
}
NativeEnqueuer enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
@@ -1090,7 +1090,7 @@
nativeEmitter.nativeMethods.add(element);
}
- FunctionSignature parameters = element.computeSignature(builder.compiler);
+ FunctionSignature parameters = element.functionSignature;
if (!hasBody) {
List<String> arguments = <String>[];
List<HInstruction> inputs = <HInstruction>[];
@@ -1099,8 +1099,8 @@
receiver = '#.';
inputs.add(builder.localsHandler.readThis());
}
- parameters.forEachParameter((Element parameter) {
- DartType type = parameter.computeType(compiler).unalias(compiler);
+ parameters.forEachParameter((ParameterElement parameter) {
+ DartType type = parameter.type.unalias(compiler);
HInstruction input = builder.localsHandler.readLocal(parameter);
if (type is FunctionType) {
// The parameter type is a function type either directly or through
diff --git a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
index c21996e..d9af606 100644
--- a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
+++ b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
@@ -121,7 +121,7 @@
void add(Compiler compiler, InterfaceType type) {
if (type.element == cls) {
if (type.element != compiler.objectClass) {
- allSupertypes.addLast(compiler.objectClass.computeType(compiler));
+ allSupertypes.addLast(compiler.objectClass.rawType);
}
_addAtDepth(compiler, type, maxDepth + 1);
} else {
@@ -141,7 +141,7 @@
if (existingType.element == type.element) {
compiler.reportInternalError(cls,
MessageKind.MULTI_INHERITANCE,
- {'thisType': cls.computeType(compiler),
+ {'thisType': cls.thisType,
'firstType': existingType,
'secondType': type});
return;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 3e5e15f..832b2cd 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -271,10 +271,6 @@
if (identical(kind, ElementKind.FIELD)) return resolveField(element);
- if (identical(kind, ElementKind.PARAMETER) ||
- identical(kind, ElementKind.FIELD_PARAMETER)) {
- return resolveParameter(element);
- }
if (element.isClass()) {
ClassElement cls = element;
cls.ensureResolved(compiler);
@@ -452,7 +448,7 @@
}
}
- TreeElements resolveMethodElement(FunctionElement element) {
+ TreeElements resolveMethodElement(FunctionElementX element) {
assert(invariant(element, element.isDeclaration));
return compiler.withCurrentElement(element, () {
bool isConstructor =
@@ -462,7 +458,7 @@
if (elements != null) {
// TODO(karlklose): Remove the check for [isConstructor]. [elememts]
// should never be non-null, not even for constructors.
- assert(invariant(element, isConstructor,
+ assert(invariant(element, element.isConstructor(),
message: 'Non-constructor element $element '
'has already been analyzed.'));
return elements;
@@ -477,7 +473,7 @@
compiler.enqueuer.resolution.registerStaticUse(
element.targetConstructor);
}
- return new TreeElementMapping(element);
+ return _ensureTreeElements(element);
}
if (element.isPatched) {
checkMatchingPatchSignatures(element, element.patch);
@@ -550,8 +546,7 @@
/// This method should only be used by this library (or tests of
/// this library).
ResolverVisitor visitorFor(Element element) {
- var mapping = new TreeElementMapping(element);
- return new ResolverVisitor(compiler, element, mapping);
+ return new ResolverVisitor(compiler, element, _ensureTreeElements(element));
}
TreeElements resolveField(VariableElementX element) {
@@ -580,6 +575,9 @@
compiler.reportError(element, MessageKind.CONST_WITHOUT_INITIALIZER);
} else if (modifiers.isFinal() && !element.isInstanceMember()) {
compiler.reportError(element, MessageKind.FINAL_WITHOUT_INITIALIZER);
+ } else {
+ compiler.enqueuer.resolution.registerInstantiatedClass(
+ compiler.nullClass, visitor.mapping);
}
if (Elements.isStaticOrTopLevelField(element)) {
@@ -593,9 +591,6 @@
// unnecessary registrations.
compiler.backend.registerLazyField(visitor.mapping);
}
- } else {
- compiler.enqueuer.resolution.registerInstantiatedClass(
- compiler.nullClass, visitor.mapping);
}
}
@@ -605,13 +600,6 @@
return visitor.mapping;
}
- TreeElements resolveParameter(ParameterElement element) {
- element.parseNode(compiler);
- ResolverVisitor visitor = visitorFor(element.enclosingElement);
- visitor.visit(element.initializer);
- return visitor.mapping;
- }
-
DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
DartType type = resolveReturnType(element, annotation);
if (type == compiler.types.voidType) {
@@ -768,11 +756,11 @@
* Warning: Do not call this method directly. Instead use
* [:element.ensureResolved(compiler):].
*/
- void resolveClass(ClassElement element) {
+ TreeElements resolveClass(BaseClassElementX element) {
_resolveTypeDeclaration(element, () {
// TODO(johnniwinther): Store the mapping in the resolution enqueuer.
- TreeElementMapping mapping = new TreeElementMapping(element);
- resolveClassInternal(element, mapping);
+ resolveClassInternal(element, _ensureTreeElements(element));
+ return element.treeElements;
});
}
@@ -1139,7 +1127,7 @@
}
- FunctionSignature resolveSignature(FunctionElement element) {
+ FunctionSignature resolveSignature(FunctionElementX element) {
MessageKind defaultValuesError = null;
if (element.isFactoryConstructor()) {
FunctionExpression body = element.parseNode(compiler);
@@ -1152,19 +1140,15 @@
compiler.parser.measure(() => element.parseNode(compiler));
return measure(() => SignatureResolver.analyze(
compiler, node.parameters, node.returnType, element,
- // TODO(johnniwinther): Use the [TreeElements] used for resolution of
- // the method body.
- new TreeElementMapping(element),
+ _ensureTreeElements(element),
defaultValuesError: defaultValuesError));
});
}
TreeElements resolveTypedef(TypedefElementX element) {
- if (element.isResolved) return element.mapping;
+ if (element.isResolved) return element.treeElements;
return _resolveTypeDeclaration(element, () {
- TreeElementMapping mapping = new TreeElementMapping(element);
- // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
- element.mapping = mapping;
+ TreeElementMapping mapping = _ensureTreeElements(element);
return compiler.withCurrentElement(element, () {
return measure(() {
Typedef node =
@@ -1218,6 +1202,8 @@
annotation.resolutionState = STATE_STARTED;
Node node = annotation.parseNode(compiler);
+ // TODO(johnniwinther): Find the right analyzable element to hold the
+ // [TreeElements] for the annotation.
Element annotatedElement = annotation.annotatedElement;
Element context = annotatedElement.enclosingElement;
if (context == null) {
@@ -2859,9 +2845,9 @@
world.registerDynamicInvocation(selector);
}
} else if (Elements.isStaticOrTopLevel(target)) {
- // TODO(kasperl): It seems like we're not supposed to register
- // the use of classes. Wouldn't it be simpler if we just did?
- if (!target.isClass()) {
+ // Avoid registration of type variables since they are not analyzable but
+ // instead resolved through their enclosing type declaration.
+ if (!target.isTypeVariable()) {
// [target] might be the implementation element and only declaration
// elements may be registered.
world.registerStaticUse(target.declaration);
@@ -3108,7 +3094,7 @@
Node argumentNode = node.send.arguments.head;
Constant name = compiler.constantHandler.compileNodeWithDefinitions(
argumentNode, mapping, isConst: true);
- if (!name.isString()) {
+ if (!name.isString) {
DartType type = name.computeType(compiler);
compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED,
{'type': type});
@@ -3141,7 +3127,7 @@
void checkConstMapKeysDontOverrideEquals(Spannable spannable,
MapConstant map) {
for (Constant key in map.keys.entries) {
- if (!key.isObject()) continue;
+ if (!key.isObject) continue;
ObjectConstant objectConstant = key;
DartType keyType = objectConstant.type;
ClassElement cls = keyType.element;
@@ -3160,7 +3146,7 @@
Constant constant = compiler.constantHandler.compileNodeWithDefinitions(
node, mapping, isConst: isConst);
- if (isConst && constant != null && constant.isMap()) {
+ if (isConst && constant != null && constant.isMap) {
checkConstMapKeysDontOverrideEquals(node, constant);
}
@@ -3169,7 +3155,7 @@
// native class dispatch record referencing the interceptor.
if (argumentsToJsInterceptorConstant != null &&
argumentsToJsInterceptorConstant.contains(node)) {
- if (constant.isType()) {
+ if (constant.isType) {
TypeConstant typeConstant = constant;
if (typeConstant.representedType is InterfaceType) {
world.registerInstantiatedType(typeConstant.representedType,
@@ -3508,13 +3494,13 @@
}
DartType typeOfConstant(Constant constant) {
- if (constant.isInt()) return compiler.intClass.rawType;
- if (constant.isBool()) return compiler.boolClass.rawType;
- if (constant.isDouble()) return compiler.doubleClass.rawType;
- if (constant.isString()) return compiler.stringClass.rawType;
- if (constant.isNull()) return compiler.nullClass.rawType;
- if (constant.isFunction()) return compiler.functionClass.rawType;
- assert(constant.isObject());
+ if (constant.isInt) return compiler.intClass.rawType;
+ if (constant.isBool) return compiler.boolClass.rawType;
+ if (constant.isDouble) return compiler.doubleClass.rawType;
+ if (constant.isString) return compiler.stringClass.rawType;
+ if (constant.isNull) return compiler.nullClass.rawType;
+ if (constant.isFunction) return compiler.functionClass.rawType;
+ assert(constant.isObject);
ObjectConstant objectConstant = constant;
return objectConstant.type;
}
@@ -3564,7 +3550,7 @@
} else if (caseType.element == compiler.functionClass) {
compiler.reportError(node, MessageKind.SWITCH_CASE_FORBIDDEN,
{'type': "Function"});
- } else if (constant.isObject() && overridesEquals(caseType)) {
+ } else if (constant.isObject && overridesEquals(caseType)) {
compiler.reportError(firstCase.expression,
MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
{'type': caseType});
@@ -3789,11 +3775,11 @@
}
nameSet.add(typeName);
- TypeVariableElement variableElement = typeVariable.element;
+ TypeVariableElementX variableElement = typeVariable.element;
if (typeNode.bound != null) {
DartType boundType = typeResolver.resolveTypeAnnotation(
this, typeNode.bound);
- variableElement.bound = boundType;
+ variableElement.boundCache = boundType;
void checkTypeVariableBound() {
Link<TypeVariableElement> seenTypeVariables =
@@ -3817,7 +3803,7 @@
}
addDeferredAction(element, checkTypeVariableBound);
} else {
- variableElement.bound = objectType;
+ variableElement.boundCache = objectType;
}
nodeLink = nodeLink.tail;
typeLink = typeLink.tail;
@@ -4112,9 +4098,9 @@
Link<DartType> link = typeVariables;
element.typeVariables.forEach((TypeVariableType type) {
TypeVariableType typeVariable = link.head;
- TypeVariableElement typeVariableElement = typeVariable.element;
- typeVariableElement.type = typeVariable;
- typeVariableElement.bound =
+ TypeVariableElementX typeVariableElement = typeVariable.element;
+ typeVariableElement.typeCache = typeVariable;
+ typeVariableElement.boundCache =
type.element.bound.subst(typeVariables, element.typeVariables);
link = link.tail;
});
@@ -4688,3 +4674,22 @@
Scope scope, String name) {
return Elements.unwrap(scope.lookup(name), compiler, node);
}
+
+TreeElements _ensureTreeElements(AnalyzableElement element) {
+ if (element._treeElements == null) {
+ element._treeElements = new TreeElementMapping(element);
+ }
+ return element._treeElements;
+}
+
+abstract class AnalyzableElement implements Element {
+ TreeElements _treeElements;
+
+ bool get hasTreeElements => _treeElements != null;
+
+ TreeElements get treeElements {
+ assert(invariant(this, _treeElements !=null,
+ message: "TreeElements have not been computed for $this."));
+ return _treeElements;
+ }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index fd29dc9..10ddfe0 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -8,6 +8,7 @@
* [SignatureResolver] resolves function signatures.
*/
class SignatureResolver extends MappingVisitor<ParameterElementX> {
+ final ResolverVisitor resolver;
final Element enclosingElement;
final Scope scope;
final MessageKind defaultValuesError;
@@ -23,6 +24,8 @@
{this.defaultValuesError})
: this.enclosingElement = enclosingElement,
this.scope = enclosingElement.buildScope(),
+ this.resolver =
+ new ResolverVisitor(compiler, enclosingElement, treeElements),
super(compiler, treeElements);
bool get defaultValuesAllowed => defaultValuesError == null;
@@ -84,8 +87,7 @@
void computeParameterType(ParameterElementX element) {
if (currentDefinitions.type != null) {
- element.type = compiler.resolver.resolveTypeAnnotation(element,
- currentDefinitions.type);
+ element.type = resolveTypeAnnotation(currentDefinitions.type);
} else {
// Is node.definitions exactly one FunctionExpression?
Link<Node> link = currentDefinitions.definitions.nodes;
@@ -254,15 +256,14 @@
}
DartType returnType;
if (element.isFactoryConstructor()) {
- returnType = element.getEnclosingClass().computeType(compiler);
+ returnType = element.getEnclosingClass().thisType;
// 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, new TreeElementMapping(element));
+ compiler.enqueuer.resolution.registerIsCheck(returnType, mapping);
}
} else {
- returnType = compiler.resolver.resolveReturnType(element, returnNode);
+ returnType = visitor.resolveReturnType(returnNode);
}
if (element.isSetter() && (requiredParameterCount != 1 ||
@@ -281,10 +282,27 @@
returnType);
}
+ DartType resolveTypeAnnotation(TypeAnnotation annotation) {
+ DartType type = resolveReturnType(annotation);
+ if (type == compiler.types.voidType) {
+ compiler.reportError(annotation, MessageKind.VOID_NOT_ALLOWED);
+ }
+ return type;
+ }
+
+ DartType resolveReturnType(TypeAnnotation annotation) {
+ if (annotation == null) return compiler.types.dynamicType;
+ DartType result = resolver.resolveTypeAnnotation(annotation);
+ if (result == null) {
+ return compiler.types.dynamicType;
+ }
+ return result;
+ }
+
// TODO(ahe): This is temporary.
void resolveExpression(Node node) {
if (node == null) return;
- node.accept(new ResolverVisitor(compiler, enclosingElement, mapping));
+ node.accept(resolver);
}
// TODO(ahe): This is temporary.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index f785e40..3202bdc 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -6,10 +6,10 @@
/**
* A special element for the extra parameter taken by intercepted
- * methods. We need to override [Element.computeType] because our
+ * methods. We need to implement [TypedElement.type] because our
* optimizers may look at its declared type.
*/
-class InterceptedElement extends ElementX {
+class InterceptedElement extends ElementX implements TypedElement {
final DartType type;
InterceptedElement(this.type, String name, Element enclosing)
: super(name, ElementKind.PARAMETER, enclosing);
@@ -60,7 +60,7 @@
assert(graph.isValid());
if (!identical(kind, ElementKind.FIELD)) {
FunctionElement function = element;
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
signature.forEachOptionalParameter((Element parameter) {
// This ensures the default value will be computed.
Constant constant =
@@ -231,7 +231,7 @@
if (element is FunctionElement) {
FunctionElement functionElement = element;
- FunctionSignature params = functionElement.computeSignature(compiler);
+ FunctionSignature params = functionElement.functionSignature;
params.orderedForEachParameter((Element parameterElement) {
if (element.isGenerativeConstructorBody()) {
ClosureScope scopeData = closureData.capturingScopes[node];
@@ -293,7 +293,7 @@
bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
String name = isInterceptorClass ? 'receiver' : '_';
Element parameter = new InterceptedElement(
- cls.computeType(compiler), name, element);
+ cls.thisType, name, element);
HParameterValue value =
new HParameterValue(parameter, builder.getTypeOfThis());
builder.graph.explicitReceiverParameter = value;
@@ -305,7 +305,7 @@
}
} else if (isNativeUpgradeFactory) {
Element parameter = new InterceptedElement(
- cls.computeType(compiler), 'receiver', element);
+ cls.thisType, 'receiver', element);
// Unlike `this`, receiver is nullable since direct calls to generative
// constructor call the constructor with `null`.
HParameterValue value =
@@ -885,7 +885,6 @@
* This class builds SSA nodes for functions represented in AST.
*/
class SsaBuilder extends ResolvedVisitor {
- final Compiler compiler;
final JavaScriptBackend backend;
final ConstantSystem constantSystem;
final CodegenWorkItem work;
@@ -964,10 +963,9 @@
List<HInstruction> stack = <HInstruction>[];
SsaBuilder(JavaScriptBackend backend,
- CodegenWorkItem work,
- this.nativeEmitter)
+ CodegenWorkItem work,
+ this.nativeEmitter)
: this.backend = backend,
- this.compiler = backend.compiler,
this.constantSystem = backend.constantSystem,
this.work = work,
this.rti = backend.rti,
@@ -1101,7 +1099,7 @@
FunctionElement function,
List<HInstruction> providedArguments) {
assert(selector.applies(function, compiler));
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
List<HInstruction> compiledArguments = new List<HInstruction>(
signature.parameterCount + 1); // Plus one for receiver.
@@ -1447,7 +1445,7 @@
// to be the first parameter.
graph.entry.addBefore(graph.entry.last, parameter);
HInstruction value =
- potentiallyCheckType(parameter, field.computeType(compiler));
+ potentiallyCheckType(parameter, field.type);
add(new HFieldSet(field, thisInstruction, value));
return closeFunction();
}
@@ -1458,7 +1456,7 @@
assert(variable.initializer != null);
visit(variable.initializer);
HInstruction value = pop();
- value = potentiallyCheckType(value, variable.computeType(compiler));
+ value = potentiallyCheckType(value, variable.type);
closeAndGotoExit(new HReturn(value));
return closeFunction();
}
@@ -1545,7 +1543,7 @@
compiledArguments[argumentIndex++]);
}
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
signature.orderedForEachParameter((Element parameter) {
HInstruction argument = compiledArguments[argumentIndex++];
localsHandler.updateLocal(parameter, argument);
@@ -1618,10 +1616,10 @@
* function.
*/
void potentiallyCheckInlinedParameterTypes(FunctionElement function) {
- FunctionSignature signature = function.computeSignature(compiler);
- signature.orderedForEachParameter((Element parameter) {
+ FunctionSignature signature = function.functionSignature;
+ signature.orderedForEachParameter((ParameterElement parameter) {
HInstruction argument = localsHandler.readLocal(parameter);
- potentiallyCheckType(argument, parameter.computeType(compiler));
+ potentiallyCheckType(argument, parameter.type);
});
}
@@ -1676,7 +1674,7 @@
}
int index = 0;
- FunctionSignature params = callee.computeSignature(compiler);
+ FunctionSignature params = callee.functionSignature;
params.orderedForEachParameter((Element parameter) {
HInstruction argument = compiledArguments[index++];
// Because we are inlining the initializer, we must update
@@ -1828,7 +1826,7 @@
classElement.forEachInstanceField(
(ClassElement enclosingClass, VariableElement member) {
compiler.withCurrentElement(member, () {
- TreeElements definitions = compiler.analyzeElement(member);
+ TreeElements definitions = member.treeElements;
ast.Node node = member.parseNode(compiler);
ast.Expression initializer = member.initializer;
if (initializer == null) {
@@ -1885,7 +1883,7 @@
buildFieldInitializers(classElement, fieldValues);
// Compile field-parameters such as [:this.x:].
- FunctionSignature params = functionElement.computeSignature(compiler);
+ FunctionSignature params = functionElement.functionSignature;
params.orderedForEachParameter((Element element) {
if (element.kind == ElementKind.FIELD_PARAMETER) {
// If the [element] is a field-parameter then
@@ -1906,7 +1904,7 @@
List<Element> fields = <Element>[];
classElement.forEachInstanceField(
- (ClassElement enclosingClass, Element member) {
+ (ClassElement enclosingClass, VariableElement member) {
HInstruction value = fieldValues[member];
if (value == null) {
// Uninitialized native fields are pre-initialized by the native
@@ -1914,13 +1912,20 @@
assert(isNativeUpgradeFactory);
} else {
fields.add(member);
- constructorArguments.add(
- potentiallyCheckType(value, member.computeType(compiler)));
+ DartType type = member.type;
+ if (enclosingClass.isMixinApplication) {
+ // TODO(johnniwinther): Add a member-like abstraction for fields
+ // that normalizes this.
+ type = type.substByContext(
+ enclosingClass.thisType.asInstanceOf(
+ member.enclosingElement));
+ }
+ constructorArguments.add(potentiallyCheckType(value, type));
}
},
includeSuperAndInjectedMembers: true);
- InterfaceType type = classElement.computeType(compiler);
+ InterfaceType type = classElement.thisType;
TypeMask ssaType = new TypeMask.nonNullExact(classElement.declaration);
List<DartType> instantiatedTypes;
addInlinedInstantiation(type);
@@ -2030,8 +2035,7 @@
List bodyCallInputs = <HInstruction>[];
if (isNativeUpgradeFactory) {
if (interceptor == null) {
- Constant constant = new InterceptorConstant(
- classElement.computeType(compiler));
+ Constant constant = new InterceptorConstant(classElement.thisType);
interceptor = graph.addConstant(constant, compiler);
}
bodyCallInputs.add(interceptor);
@@ -2043,7 +2047,7 @@
ClosureClassMap parameterClosureData =
compiler.closureToClassMapper.getMappingForNestedFunction(node);
- FunctionSignature functionSignature = body.computeSignature(compiler);
+ FunctionSignature functionSignature = body.functionSignature;
// Provide the parameters to the generative constructor body.
functionSignature.orderedForEachParameter((parameter) {
// If [parameter] is boxed, it will be a field in the box passed as the
@@ -2119,13 +2123,13 @@
if (element is FunctionElement) {
FunctionElement functionElement = element;
- FunctionSignature signature = functionElement.computeSignature(compiler);
+ FunctionSignature signature = functionElement.functionSignature;
// Put the type checks in the first successor of the entry,
// because that is where the type guards will also be inserted.
// This way we ensure that a type guard will dominate the type
// check.
- signature.orderedForEachParameter((Element parameterElement) {
+ signature.orderedForEachParameter((ParameterElement parameterElement) {
if (element.isGenerativeConstructorBody()) {
ClosureScope scopeData =
localsHandler.closureData.capturingScopes[node];
@@ -2139,7 +2143,7 @@
}
HInstruction newParameter = potentiallyCheckType(
localsHandler.directLocals[parameterElement],
- parameterElement.computeType(compiler));
+ parameterElement.type);
localsHandler.directLocals[parameterElement] = newParameter;
});
@@ -2235,7 +2239,7 @@
if (compiler.enableTypeAssertions) {
return potentiallyCheckType(
value,
- compiler.boolClass.computeType(compiler),
+ compiler.boolClass.rawType,
kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
}
HInstruction result = new HBoolify(value, backend.boolType);
@@ -3012,8 +3016,9 @@
pushInvokeStatic(location, element, <HInstruction>[value]);
pop();
} else {
+ VariableElement field = element;
value =
- potentiallyCheckType(value, element.computeType(compiler));
+ potentiallyCheckType(value, field.type);
addWithPosition(new HStaticStore(element, value), location);
}
stack.add(value);
@@ -3431,7 +3436,7 @@
// and implementation signatures. Currently it is need because the
// signatures have different elements for parameters.
FunctionElement implementation = function.implementation;
- FunctionSignature params = implementation.computeSignature(compiler);
+ FunctionSignature params = implementation.functionSignature;
if (params.optionalParameterCount != 0) {
compiler.cancel(
'"$name" does not handle closure with optional parameters',
@@ -4133,8 +4138,8 @@
stack.add(addConstant(node));
}
} else if (element.isTypeVariable()) {
- HInstruction value =
- addTypeVariableReference(element.computeType(compiler));
+ TypeVariableElement typeVariable = element;
+ HInstruction value = addTypeVariableReference(typeVariable.type);
pushInvokeStatic(node,
backend.getRuntimeTypeToString(),
[value],
@@ -4236,7 +4241,7 @@
FunctionElement function,
Link<ast.Node> argumentNodes) {
List<String> existingArguments = <String>[];
- FunctionSignature signature = function.computeSignature(compiler);
+ FunctionSignature signature = function.functionSignature;
signature.forEachParameter((Element parameter) {
existingArguments.add(parameter.name);
});
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index bd98b6b..5bcc8fe 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1413,7 +1413,7 @@
if (condition.isConstant()) {
HConstant constant = condition;
- if (constant.constant.isTrue()) {
+ if (constant.constant.isTrue) {
generateStatements(info.thenGraph);
} else {
generateStatements(info.elseGraph);
@@ -1746,11 +1746,11 @@
}
void generateConstant(Constant constant) {
- if (constant.isFunction()) {
+ if (constant.isFunction) {
FunctionConstant function = constant;
world.registerStaticUse(function.element);
}
- if (constant.isType()) {
+ if (constant.isType) {
// If the type is a web component, we need to ensure the constructors are
// available to 'upgrade' the native object.
TypeConstant type = constant;
@@ -2537,7 +2537,7 @@
// TODO(5022): We currently generate $isFunction checks for
// function types.
world.registerIsCheck(
- compiler.functionClass.computeType(compiler), work.resolutionTree);
+ compiler.functionClass.rawType, work.resolutionTree);
}
world.registerIsCheck(type, work.resolutionTree);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index 1e83906..5dbea83 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -285,16 +285,66 @@
markAsGenerateAtUseSite(instruction);
continue;
}
- if (instruction.isJsStatement()) {
- expectedInputs.clear();
- }
if (instruction.isPure()) {
if (pureInputs.contains(instruction)) {
tryGenerateAtUseSite(instruction);
} else {
// If the input is not in the [pureInputs] set, it has not
- // been visited.
+ // been visited or should not be generated at use-site. The most
+ // likely reason for the latter, is that the instruction is used
+ // in more than one location.
+ // We must either clear the expectedInputs, or move the pure
+ // instruction's inputs in front of the existing ones.
+ // Example:
+ // t1 = foo(); // side-effect.
+ // t2 = bar(); // side-effect.
+ // t3 = pure(t2); // used more than once.
+ // f(t1, t3); // expected inputs of 'f': t1.
+ // use(t3);
+ //
+ // If we don't clear the expected inputs we end up in a situation
+ // where pure pushes "t2" on top of "t1" leading to:
+ // t3 = pure(bar());
+ // f(foo(), t3);
+ // use(t3);
+ //
+ // If we clear the expected-inputs list we have the correct
+ // output:
+ // t1 = foo();
+ // t3 = pure(bar());
+ // f(t1, t3);
+ // use(t3);
+ //
+ // Clearing is, however, not optimal.
+ // Example:
+ // t1 = foo(); // t1 is now used by `pure`.
+ // t2 = bar(); // t2 is now used by `f`.
+ // t3 = pure(t1);
+ // f(t2, t3);
+ // use(t3);
+ //
+ // If we clear the expected-inputs we can't generate-at-use any of
+ // the instructions.
+ //
+ // The optimal solution is to move the inputs of 'pure' in
+ // front of the expectedInputs list. This makes sense, since we
+ // push expected-inputs from left-to right, and the `pure` function
+ // invocation is "more left" (i.e. before) the first argument of `f`.
+ // With that approach we end up with:
+ // t3 = pure(foo();
+ // f(bar(), t3);
+ // use(t3);
+ //
+ int oldLength = expectedInputs.length;
instruction.accept(this);
+ if (oldLength != 0 && oldLength != expectedInputs.length) {
+ // Move the pure instruction's inputs to the front.
+ List<HInstruction> newInputs = expectedInputs.sublist(oldLength);
+ int newCount = newInputs.length;
+ expectedInputs.setRange(
+ newCount, newCount + oldLength, expectedInputs);
+ expectedInputs.setRange(0, newCount, newInputs);
+ }
}
} else {
if (findInInputsAndPopNonMatching(instruction)) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 6e2f2fe..a25b079 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -149,8 +149,7 @@
return graph.thisInstruction;
}
- Constant constant = new InterceptorConstant(
- constantInterceptor.computeType(compiler));
+ Constant constant = new InterceptorConstant(constantInterceptor.thisType);
return graph.addConstant(constant, compiler);
}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 3b0443e..ba34bb2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1932,17 +1932,17 @@
accept(HVisitor visitor) => visitor.visitConstant(this);
bool isConstant() => true;
- bool isConstantBoolean() => constant.isBool();
- bool isConstantNull() => constant.isNull();
- bool isConstantNumber() => constant.isNum();
- bool isConstantInteger() => constant.isInt();
- bool isConstantString() => constant.isString();
- bool isConstantList() => constant.isList();
- bool isConstantMap() => constant.isMap();
- bool isConstantFalse() => constant.isFalse();
- bool isConstantTrue() => constant.isTrue();
+ bool isConstantBoolean() => constant.isBool;
+ bool isConstantNull() => constant.isNull;
+ bool isConstantNumber() => constant.isNum;
+ bool isConstantInteger() => constant.isInt;
+ bool isConstantString() => constant.isString;
+ bool isConstantList() => constant.isList;
+ bool isConstantMap() => constant.isMap;
+ bool isConstantFalse() => constant.isFalse;
+ bool isConstantTrue() => constant.isTrue;
- bool isInterceptor(Compiler compiler) => constant.isInterceptor();
+ bool isInterceptor(Compiler compiler) => constant.isInterceptor;
// Maybe avoid this if the literal is big?
bool isCodeMotionInvariant() => true;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 7931074..b575772 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -184,7 +184,7 @@
HInstruction input = inputs[0];
if (input is HConstant) {
HConstant constant = input;
- bool isTrue = constant.constant.isTrue();
+ bool isTrue = constant.constant.isTrue;
return graph.addConstantBool(!isTrue, compiler);
} else if (input is HNot) {
return input.inputs[0];
@@ -329,7 +329,7 @@
} else {
// TODO(ngeoffray): If the method has optional parameters,
// we should pass the default values.
- FunctionSignature parameters = method.computeSignature(compiler);
+ FunctionSignature parameters = method.functionSignature;
if (parameters.optionalParameterCount == 0
|| parameters.parameterCount == node.selector.argumentCount) {
node.element = element;
@@ -357,7 +357,7 @@
// foo() native 'return something';
// They should not be used.
- FunctionSignature signature = method.computeSignature(compiler);
+ FunctionSignature signature = method.functionSignature;
if (signature.optionalParametersAreNamed) return null;
// Return types on native methods don't need to be checked, since the
@@ -369,10 +369,10 @@
List<HInstruction> inputs = node.inputs.sublist(1);
int inputPosition = 1; // Skip receiver.
bool canInline = true;
- signature.forEachParameter((Element element) {
+ signature.forEachParameter((ParameterElement element) {
if (inputPosition < inputs.length && canInline) {
HInstruction input = inputs[inputPosition++];
- DartType type = element.computeType(compiler).unalias(compiler);
+ DartType type = element.type.unalias(compiler);
if (type is FunctionType) {
canInline = false;
}
@@ -405,7 +405,7 @@
if (index.isInteger(compiler)) return node;
if (index.isConstant()) {
HConstant constantInstruction = index;
- assert(!constantInstruction.constant.isInt());
+ assert(!constantInstruction.constant.isInt);
if (!constantSystem.isInt(constantInstruction.constant)) {
// -0.0 is a double but will pass the runtime integer check.
node.staticChecks = HBoundsCheck.ALWAYS_FALSE;
@@ -432,8 +432,8 @@
// We can only perform this rewriting on Integer, as it is not
// valid for -0.0.
if (left.isInteger(compiler) && right.isInteger(compiler)) {
- if (left is HConstant && left.constant.isZero()) return right;
- if (right is HConstant && right.constant.isZero()) return left;
+ if (left is HConstant && left.constant.isZero) return right;
+ if (right is HConstant && right.constant.isZero) return left;
}
return super.visitAdd(node);
}
@@ -442,8 +442,8 @@
HInstruction left = node.left;
HInstruction right = node.right;
if (left.isNumber(compiler) && right.isNumber(compiler)) {
- if (left is HConstant && left.constant.isOne()) return right;
- if (right is HConstant && right.constant.isOne()) return left;
+ if (left is HConstant && left.constant.isOne) return right;
+ if (right is HConstant && right.constant.isOne) return left;
}
return super.visitMultiply(node);
}
@@ -497,7 +497,7 @@
if (left.isConstantBoolean() && right.isBoolean(compiler)) {
HConstant constant = left;
- if (constant.constant.isTrue()) {
+ if (constant.constant.isTrue) {
return right;
} else {
return new HNot(right, backend.boolType);
@@ -506,7 +506,7 @@
if (right.isConstantBoolean() && left.isBoolean(compiler)) {
HConstant constant = right;
- if (constant.constant.isTrue()) {
+ if (constant.constant.isTrue) {
return left;
} else {
return new HNot(left, backend.boolType);
@@ -657,8 +657,8 @@
return inputType.isInMask(checkedType, compiler) ? input : node;
}
- Element findConcreteFieldForDynamicAccess(HInstruction receiver,
- Selector selector) {
+ VariableElement findConcreteFieldForDynamicAccess(HInstruction receiver,
+ Selector selector) {
TypeMask receiverType = receiver.instructionType;
return compiler.world.locateSingleField(
new TypedSelector(receiverType, selector));
@@ -746,14 +746,15 @@
}
HInstruction receiver = node.getDartReceiver(compiler);
- Element field = findConcreteFieldForDynamicAccess(receiver, node.selector);
+ VariableElement field =
+ findConcreteFieldForDynamicAccess(receiver, node.selector);
if (field == null || !field.isAssignable()) return node;
// Use [:node.inputs.last:] in case the call follows the
// interceptor calling convention, but is not a call on an
// interceptor.
HInstruction value = node.inputs.last;
if (compiler.enableTypeAssertions) {
- DartType type = field.computeType(compiler);
+ DartType type = field.type;
if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) {
// We cannot generate the correct type representation here, so don't
// inline this access.
@@ -816,7 +817,7 @@
if (input.isString(compiler)) return input;
if (input.isConstant()) {
HConstant constant = input;
- if (!constant.constant.isPrimitive()) return node;
+ if (!constant.constant.isPrimitive) return node;
PrimitiveConstant primitive = constant.constant;
return graph.addConstant(constantSystem.createString(
primitive.toDartString()), compiler);
@@ -1528,32 +1529,72 @@
List<HInstruction> ifUsers = <HInstruction>[];
List<HInstruction> notIfUsers = <HInstruction>[];
- for (HInstruction user in instruction.usedBy) {
- if (user is HIf) {
- ifUsers.add(user);
- } else if (user is HNot) {
- for (HInstruction notUser in user.usedBy) {
- if (notUser is HIf) notIfUsers.add(notUser);
- }
- }
- }
+
+ collectIfUsers(instruction, ifUsers, notIfUsers);
if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
TypeMask convertedType = new TypeMask.nonNullSubtype(element);
HInstruction input = instruction.expression;
+
for (HIf ifUser in ifUsers) {
changeUsesDominatedBy(ifUser.thenBlock, input, convertedType);
// TODO(ngeoffray): Also change uses for the else block on a type
// that knows it is not of a specific type.
}
-
for (HIf ifUser in notIfUsers) {
changeUsesDominatedBy(ifUser.elseBlock, input, convertedType);
// TODO(ngeoffray): Also change uses for the then block on a type
// that knows it is not of a specific type.
}
}
+
+ void visitIdentity(HIdentity instruction) {
+ // At HIf(HIdentity(x, null)) strengthens x to non-null on else branch.
+ HInstruction left = instruction.left;
+ HInstruction right = instruction.right;
+ HInstruction input;
+
+ if (left.isConstantNull()) {
+ input = right;
+ } else if (right.isConstantNull()) {
+ input = left;
+ } else {
+ return;
+ }
+
+ if (!input.instructionType.isNullable) return;
+
+ List<HInstruction> ifUsers = <HInstruction>[];
+ List<HInstruction> notIfUsers = <HInstruction>[];
+
+ collectIfUsers(instruction, ifUsers, notIfUsers);
+
+ if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
+
+ TypeMask nonNullType = input.instructionType.nonNullable();
+
+ for (HIf ifUser in ifUsers) {
+ changeUsesDominatedBy(ifUser.elseBlock, input, nonNullType);
+ // Uses in thenBlock are `null`, but probably not common.
+ }
+ for (HIf ifUser in notIfUsers) {
+ changeUsesDominatedBy(ifUser.thenBlock, input, nonNullType);
+ // Uses in elseBlock are `null`, but probably not common.
+ }
+ }
+
+ collectIfUsers(HInstruction instruction,
+ List<HInstruction> ifUsers,
+ List<HInstruction> notIfUsers) {
+ for (HInstruction user in instruction.usedBy) {
+ if (user is HIf) {
+ ifUsers.add(user);
+ } else if (user is HNot) {
+ collectIfUsers(user, notIfUsers, ifUsers);
+ }
+ }
+ }
}
/**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 775cd43..19e3ab9 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -135,7 +135,7 @@
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.add.fold(
constantSystem.createInt(value), constantSystem.createInt(other.value));
- if (!constant.isInt()) return const UnknownValue();
+ if (!constant.isInt) return const UnknownValue();
return info.newIntValue(constant.value);
}
@@ -145,7 +145,7 @@
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.subtract.fold(
constantSystem.createInt(value), constantSystem.createInt(other.value));
- if (!constant.isInt()) return const UnknownValue();
+ if (!constant.isInt) return const UnknownValue();
return info.newIntValue(constant.value);
}
@@ -154,7 +154,7 @@
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.negate.fold(
constantSystem.createInt(value));
- if (!constant.isInt()) return const UnknownValue();
+ if (!constant.isInt) return const UnknownValue();
return info.newIntValue(constant.value);
}
@@ -670,7 +670,7 @@
Range visitConstant(HConstant constant) {
if (!constant.isInteger(compiler)) return info.newUnboundRange();
NumConstant constantNum = constant.constant;
- if (constantNum.isMinusZero()) constantNum = new IntConstant(0);
+ if (constantNum.isMinusZero) constantNum = new IntConstant(0);
Value value = info.newIntValue(constantNum.value);
return info.newNormalizedRange(value, value);
}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index 559c5db..920aa45 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -437,17 +437,10 @@
: ownName = new Map<HInstruction, String>(),
copyHandlers = new Map<HBasicBlock, CopyHandler>(),
allUsedNames = new Set<String>(),
- swapTemp = computeFreshWithPrefix("t");
+ swapTemp = 't0';
int get numberOfVariables => allUsedNames.length;
- /** Returns a fresh variable with the given prefix. */
- static String computeFreshWithPrefix(String prefix) {
- String name = '${prefix}0';
- int i = 1;
- return name;
- }
-
String getName(HInstruction instruction) {
return ownName[instruction];
}
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index 048c1a8..401645f 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -156,8 +156,7 @@
assert(element != null);
}
- DartType computeType(Compiler compiler) =>
- compiler.typeClass.computeType(compiler);
+ DartType computeType(Compiler compiler) => compiler.typeClass.rawType;
String toString() => 'TypeLiteralAccess($element)';
}
@@ -297,7 +296,7 @@
DartType getKnownType(VariableElement element) {
TypePromotion typePromotion = getKnownTypePromotion(element);
if (typePromotion != null) return typePromotion.type;
- return element.computeType(compiler);
+ return element.type;
}
TypeCheckerVisitor(this.compiler, TreeElements elements, this.types)
@@ -312,7 +311,7 @@
listType = compiler.listClass.computeType(compiler);
if (currentClass != null) {
- thisType = currentClass.computeType(compiler);
+ thisType = currentClass.thisType;
superType = currentClass.supertype;
}
}
@@ -569,11 +568,10 @@
type = types.dynamicType;
returnType = types.voidType;
- element.functionSignature.forEachParameter((Element parameter) {
+ element.functionSignature.forEachParameter((ParameterElement parameter) {
if (parameter.isFieldParameter()) {
FieldParameterElement fieldParameter = parameter;
- checkAssignable(parameter,
- parameter.computeType(compiler),
+ checkAssignable(parameter, parameter.type,
fieldParameter.fieldElement.computeType(compiler));
}
});
@@ -1459,7 +1457,7 @@
}
DartType visitLiteralSymbol(LiteralSymbol node) {
- return compiler.symbolClass.computeType(compiler);
+ return compiler.symbolClass.rawType;
}
DartType computeConstructorType(Element constructor, DartType type) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index ee598d7..27da00d 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -194,7 +194,7 @@
return new Selector.indexSet();
}
FunctionSignature signature =
- element.asFunctionElement().computeSignature(compiler);
+ element.asFunctionElement().functionSignature;
int arity = signature.parameterCount;
List<String> namedArguments = null;
if (signature.optionalParametersAreNamed) {
@@ -407,7 +407,7 @@
assert(invariant(element, element.isImplementation));
if (!this.applies(element, compiler)) return false;
- FunctionSignature parameters = element.computeSignature(compiler);
+ FunctionSignature parameters = element.functionSignature;
parameters.forEachRequiredParameter((element) {
list.add(compileArgument(arguments.head));
arguments = arguments.tail;
@@ -465,7 +465,7 @@
compileConstant(Element element),
Compiler compiler) {
- FunctionSignature signature = caller.computeSignature(compiler);
+ FunctionSignature signature = caller.functionSignature;
Map mapping = new Map();
// TODO(ngeoffray): This is a hack that fakes up AST nodes, so
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index ca5d04d..abbcb91 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -61,7 +61,7 @@
}
void useConstant(dart2jslib.Constant constant, dart2jslib.ConstantSystem cs) {
- constant.isObject();
+ constant.isObject;
cs.isBool(constant);
}
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 0b51aed..dc4474e 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -37,7 +37,8 @@
final String message;
SpannableAssertionFailure(this.node, this.message);
- String toString() => 'Assertion failure: $message';
+ String toString() => 'Assertion failure'
+ '${message != null ? ': $message' : ''}';
}
/**
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index a67dc21..e1f4f33 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -554,7 +554,11 @@
"Not a compile-time constant.");
static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT = const MessageKind(
- "Deferred classes cannot be used to create compile-time constants.");
+ "A Deferred value cannot be used as a compile-time constant.");
+
+ static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION =
+ const MessageKind("A deferred class cannot be used to create a"
+ "compile-time constant.");
static const MessageKind CYCLIC_COMPILE_TIME_CONSTANTS = const MessageKind(
"Cycle in the compile-time constant computation.");
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 0bd0544..6e0821a 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -179,6 +179,9 @@
patch static void _setExitCode(int status) {
throw new UnsupportedError("ProcessUtils._setExitCode");
}
+ patch static int _getExitCode() {
+ throw new UnsupportedError("ProcessUtils._getExitCode");
+ }
patch static void _sleep(int millis) {
throw new UnsupportedError("ProcessUtils._sleep");
}
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 74df1a4..d707a13 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -2100,51 +2100,51 @@
case 1:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(){'
- 'return s(this)[n](r(this))'
+ 'return f.call(s(this),r(this))'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
case 2:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(a){'
- 'return s(this)[n](r(this),a)'
+ 'return f.call(s(this),r(this),a)'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
case 3:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(a,b){'
- 'return s(this)[n](r(this),a,b)'
+ 'return f.call(s(this),r(this),a,b)'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
case 4:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(a,b,c){'
- 'return s(this)[n](r(this),a,b,c)'
+ 'return f.call(s(this),r(this),a,b,c)'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
case 5:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(a,b,c,d){'
- 'return s(this)[n](r(this),a,b,c,d)'
+ 'return f.call(s(this),r(this),a,b,c,d)'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
case 6:
return JS(
'',
- 'function(n,s,r){'
+ 'function(f,s,r){'
'return function(a,b,c,d,e){'
- 'return s(this)[n](r(this),a,b,c,d,e)'
+ 'return f.call(s(this),r(this),a,b,c,d,e)'
'}'
- '}(#,#,#)', name, getSelf, getReceiver);
+ '}(#,#,#)', function, getSelf, getReceiver);
default:
return JS(
'',
@@ -2159,16 +2159,22 @@
}
static forwardInterceptedCallTo(function) {
+ String selfField = BoundClosure.selfFieldName();
+ String receiverField = BoundClosure.receiverFieldName();
String stubName = JS('String|Null', '#.\$stubName', function);
int arity = JS('int', '#.length', function);
bool isCsp = JS('bool', 'typeof dart_precompiled == "function"');
if (isCsp) {
return cspForwardInterceptedCall(arity, stubName, function);
} else if (arity == 1) {
- return JS('', 'new Function(#)',
- 'return this.${BoundClosure.selfFieldName()}.$stubName('
- 'this.${BoundClosure.receiverFieldName()});'
- '${functionCounter++}');
+ return JS(
+ '',
+ '(new Function("F",#))(#)',
+ 'return function(){'
+ 'return F.call(this.$selfField, this.$receiverField);'
+ '${functionCounter++}'
+ '}',
+ function);
} else if (1 < arity && arity < 28) {
String arguments = JS(
'String',
@@ -2176,12 +2182,12 @@
arity - 1);
return JS(
'',
- '(new Function(#))()',
+ '(new Function("F",#))(#)',
'return function($arguments){'
- 'return this.${BoundClosure.selfFieldName()}.$stubName('
- 'this.${BoundClosure.receiverFieldName()},$arguments);'
+ 'return F.call(this.$selfField, this.$receiverField, $arguments);'
'${functionCounter++}'
- '}');
+ '}',
+ function);
} else {
return cspForwardInterceptedCall(arity, stubName, function);
}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
new file mode 100644
index 0000000..43328e1
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/span.dart';
+
+import 'serialize/exception.dart';
+
+export 'serialize/exception.dart';
+export 'serialize/transform.dart';
+export 'serialize/transformer.dart';
+
+/// Converts [id] into a serializable map.
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path};
+
+/// Converts a serializable map into an [AssetId].
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
+
+/// Converts [span] into a serializable map.
+Map serializeSpan(Span span) {
+ // TODO(nweiz): convert FileSpans to FileSpans.
+ return {
+ 'type': 'fixed',
+ 'sourceUrl': span.sourceUrl,
+ 'start': serializeLocation(span.start),
+ 'text': span.text,
+ 'isIdentifier': span.isIdentifier
+ };
+}
+
+/// Converts a serializable map into a [Span].
+Span deserializeSpan(Map span) {
+ assert(span['type'] == 'fixed');
+ var location = deserializeLocation(span['start']);
+ return new FixedSpan(span['sourceUrl'], location.offset, location.line,
+ location.column, text: span['text'], isIdentifier: span['isIdentifier']);
+}
+
+/// Converts [location] into a serializable map.
+Map serializeLocation(Location location) {
+ // TODO(nweiz): convert FileLocations to FileLocations.
+ return {
+ 'type': 'fixed',
+ 'sourceUrl': location.sourceUrl,
+ 'offset': location.offset,
+ 'line': location.line,
+ 'column': location.column
+ };
+}
+
+/// Converts a serializable map into a [Location].
+Location deserializeLocation(Map location) {
+ assert(location['type'] == 'fixed');
+ return new FixedLocation(location['offset'], location['sourceUrl'],
+ location['line'], location['column']);
+}
+
+/// Wraps [message] and sends it across [port], then waits for a response which
+/// should be sent using [respond].
+///
+/// The returned Future will complete to the value or error returned by
+/// [respond].
+Future call(SendPort port, message) {
+ var receivePort = new ReceivePort();
+ port.send({
+ 'message': message,
+ 'replyTo': receivePort.sendPort
+ });
+
+ return receivePort.first.then((response) {
+ if (response['type'] == 'success') return response['value'];
+ assert(response['type'] == 'error');
+ var exception = deserializeException(response['error']);
+ return new Future.error(exception, exception.stackTrace);
+ });
+}
+
+/// Responds to a message sent by [call].
+///
+/// [wrappedMessage] is the raw message sent by [call]. This unwraps it and
+/// passes the contents of the message to [callback], then sends the return
+/// value of [callback] back to [call]. If [callback] returns a Future or
+/// throws an error, that will also be sent.
+void respond(wrappedMessage, callback(message)) {
+ var replyTo = wrappedMessage['replyTo'];
+ new Future.sync(() => callback(wrappedMessage['message']))
+ .then((result) => replyTo.send({'type': 'success', 'value': result}))
+ .catchError((error, stackTrace) {
+ replyTo.send({
+ 'type': 'error',
+ 'error': serializeException(error, stackTrace)
+ });
+ });
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart b/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart
new file mode 100644
index 0000000..26040a9
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize.exception;
+
+import 'package:barback/barback.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+import '../utils.dart';
+
+/// An exception that was originally raised in another isolate.
+///
+/// Exception objects can't cross isolate boundaries in general, so this class
+/// wraps as much information as can be consistently serialized.
+class CrossIsolateException implements Exception {
+ /// The name of the type of exception thrown.
+ ///
+ /// This is the return value of [error.runtimeType.toString()]. Keep in mind
+ /// that objects in different libraries may have the same type name.
+ final String type;
+
+ /// The exception's message, or its [toString] if it didn't expose a `message`
+ /// property.
+ final String message;
+
+ /// The exception's stack chain, or `null` if no stack chain was available.
+ final Chain stackTrace;
+
+ /// Loads a [CrossIsolateException] from a serialized representation.
+ ///
+ /// [error] should be the result of [CrossIsolateException.serialize].
+ CrossIsolateException.deserialize(Map error)
+ : type = error['type'],
+ message = error['message'],
+ stackTrace = error['stack'] == null ? null :
+ new Chain.parse(error['stack']);
+
+ /// Serializes [error] to an object that can safely be passed across isolate
+ /// boundaries.
+ static Map serialize(error, [StackTrace stack]) {
+ if (stack == null && error is Error) stack = error.stackTrace;
+ return {
+ 'type': error.runtimeType.toString(),
+ 'message': getErrorMessage(error),
+ 'stack': stack == null ? null : new Chain.forTrace(stack).toString()
+ };
+ }
+
+ String toString() => "$message\n$stackTrace";
+}
+
+/// An [AssetNotFoundException] that was originally raised in another isolate.
+class _CrossIsolateAssetNotFoundException extends CrossIsolateException
+ implements AssetNotFoundException {
+ final AssetId id;
+
+ String get message => "Could not find asset $id.";
+
+ /// Loads a [_CrossIsolateAssetNotFoundException] from a serialized
+ /// representation.
+ ///
+ /// [error] should be the result of
+ /// [_CrossIsolateAssetNotFoundException.serialize].
+ _CrossIsolateAssetNotFoundException.deserialize(Map error)
+ : id = new AssetId(error['package'], error['path']),
+ super.deserialize(error);
+
+ /// Serializes [error] to an object that can safely be passed across isolate
+ /// boundaries.
+ static Map serialize(AssetNotFoundException error, [StackTrace stack]) {
+ var map = CrossIsolateException.serialize(error);
+ map['package'] = error.id.package;
+ map['path'] = error.id.path;
+ return map;
+ }
+}
+
+/// Serializes [error] to an object that can safely be passed across isolate
+/// boundaries.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+Map serializeException(error, [StackTrace stack]) {
+ if (error is AssetNotFoundException) {
+ return _CrossIsolateAssetNotFoundException.serialize(error, stack);
+ } else {
+ return CrossIsolateException.serialize(error, stack);
+ }
+}
+
+/// Loads an exception from a serialized representation.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+CrossIsolateException deserializeException(Map error) {
+ if (error['type'] == 'AssetNotFoundException') {
+ return new _CrossIsolateAssetNotFoundException.deserialize(error);
+ } else {
+ return new CrossIsolateException.deserialize(error);
+ }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
new file mode 100644
index 0000000..cc5e052
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transform.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 pub.asset.serialize.transform;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import '../utils.dart';
+
+/// Converts [transform] into a serializable map.
+Map serializeTransform(Transform transform) {
+ var receivePort = new ReceivePort();
+ receivePort.listen((wrappedMessage) {
+ respond(wrappedMessage, (message) {
+ if (message['type'] == 'getInput') {
+ return transform.getInput(deserializeId(message['id']))
+ .then((asset) => serializeAsset(asset));
+ }
+
+ if (message['type'] == 'addOutput') {
+ transform.addOutput(deserializeAsset(message['output']));
+ return null;
+ }
+
+ if (message['type'] == 'consumePrimary') {
+ transform.consumePrimary();
+ return null;
+ }
+
+ assert(message['type'] == 'log');
+ var method;
+ if (message['level'] == 'Info') {
+ method = transform.logger.info;
+ } else if (message['level'] == 'Fine') {
+ method = transform.logger.fine;
+ } else if (message['level'] == 'Warning') {
+ method = transform.logger.warning;
+ } else {
+ assert(message['level'] == 'Error');
+ method = transform.logger.error;
+ }
+
+ var assetId = message['assetId'] == null ? null :
+ deserializeId(message['assetId']);
+ var span = message['span'] == null ? null :
+ deserializeSpan(message['span']);
+ method(message['message'], asset: assetId, span: span);
+ });
+ });
+
+ return {
+ 'port': receivePort.sendPort,
+ 'primaryInput': serializeAsset(transform.primaryInput)
+ };
+}
+
+/// A wrapper for a [Transform] that's in the host isolate.
+///
+/// This retrieves inputs from and sends outputs and logs to the host isolate.
+class ForeignTransform implements Transform {
+ /// The port with which we communicate with the host isolate.
+ ///
+ /// This port and all messages sent across it are specific to this transform.
+ final SendPort _port;
+
+ final Asset primaryInput;
+
+ TransformLogger get logger => _logger;
+ TransformLogger _logger;
+
+ /// Creates a transform from a serializable map sent from the host isolate.
+ ForeignTransform(Map transform)
+ : _port = transform['port'],
+ primaryInput = deserializeAsset(transform['primaryInput']) {
+ _logger = new TransformLogger((assetId, level, message, span) {
+ call(_port, {
+ 'type': 'log',
+ 'level': level.name,
+ 'message': message,
+ 'assetId': assetId == null ? null : serializeId(assetId),
+ 'span': span == null ? null : serializeSpan(span)
+ });
+ });
+ }
+
+ Future<Asset> getInput(AssetId id) {
+ return call(_port, {
+ 'type': 'getInput',
+ 'id': serializeId(id)
+ }).then(deserializeAsset);
+ }
+
+ Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+ if (encoding == null) encoding = UTF8;
+ return getInput(id).then((input) => input.readAsString(encoding: encoding));
+ }
+
+ Stream<List<int>> readInput(AssetId id) =>
+ futureStream(getInput(id).then((input) => input.read()));
+
+ Future<bool> hasInput(AssetId id) {
+ return getInput(id).then((_) => true).catchError((error) {
+ if (error is AssetNotFoundException && error.id == id) return false;
+ throw error;
+ });
+ }
+
+ void addOutput(Asset output) {
+ call(_port, {
+ 'type': 'addOutput',
+ 'output': serializeAsset(output)
+ });
+ }
+
+ void consumePrimary() {
+ call(_port, {'type': 'consumePrimary'});
+ }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
new file mode 100644
index 0000000..608eaa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize.transformer;
+
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import 'transform.dart';
+
+/// Converts [transformer] into a serializable map.
+Map serializeTransformer(Transformer transformer) {
+ var port = new ReceivePort();
+ port.listen((wrappedMessage) {
+ respond(wrappedMessage, (message) {
+ if (message['type'] == 'isPrimary') {
+ return transformer.isPrimary(deserializeAsset(message['asset']));
+ } else {
+ assert(message['type'] == 'apply');
+
+ // Make sure we return null so that if the transformer's [apply] returns
+ // a non-serializable value it doesn't cause problems.
+ return transformer.apply(
+ new ForeignTransform(message['transform'])).then((_) => null);
+ }
+ });
+ });
+
+ return {
+ 'type': 'Transformer',
+ 'toString': transformer.toString(),
+ 'port': port.sendPort
+ };
+}
+
+// Converts [group] into a serializable map.
+Map serializeTransformerGroup(TransformerGroup group) {
+ return {
+ 'type': 'TransformerGroup',
+ 'toString': group.toString(),
+ 'phases': group.phases.map((phase) {
+ return phase.map(serializeTransformerOrGroup).toList();
+ }).toList()
+ };
+}
+
+/// Converts [transformerOrGroup] into a serializable map.
+Map serializeTransformerOrGroup(transformerOrGroup) {
+ if (transformerOrGroup is Transformer) {
+ return serializeTransformer(transformerOrGroup);
+ } else {
+ assert(transformerOrGroup is TransformerGroup);
+ return serializeTransformerGroup(transformerOrGroup);
+ }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
new file mode 100644
index 0000000..5b6dfa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.transformer_isolate;
+
+import 'dart:convert';
+import 'dart:isolate';
+import 'dart:mirrors';
+
+import 'package:barback/barback.dart';
+
+import 'serialize.dart';
+
+/// Sets up the initial communication with the host isolate.
+void loadTransformers(SendPort replyTo) {
+ var port = new ReceivePort();
+ replyTo.send(port.sendPort);
+ port.first.then((wrappedMessage) {
+ respond(wrappedMessage, (message) {
+ var library = Uri.parse(message['library']);
+ var configuration = JSON.decode(message['configuration']);
+ var mode = new BarbackMode(message['mode']);
+ return _initialize(library, configuration, mode).
+ map(serializeTransformerOrGroup).toList();
+ });
+ });
+}
+
+/// Loads all the transformers and groups defined in [uri].
+///
+/// Loads the library, finds any Transformer or TransformerGroup subclasses in
+/// it, instantiates them with [configuration] and [mode], and returns them.
+Iterable _initialize(Uri uri, Map configuration, BarbackMode mode) {
+ var mirrors = currentMirrorSystem();
+ var transformerClass = reflectClass(Transformer);
+ var groupClass = reflectClass(TransformerGroup);
+
+ // TODO(nweiz): if no valid transformers are found, throw an error message
+ // describing candidates and why they were rejected.
+ return mirrors.libraries[uri].declarations.values.map((declaration) {
+ if (declaration is! ClassMirror) return null;
+ var classMirror = declaration;
+ if (classMirror.isPrivate) return null;
+ if (classMirror.isAbstract) return null;
+ if (!classMirror.isSubtypeOf(transformerClass) &&
+ !classMirror.isSubtypeOf(groupClass)) {
+ return null;
+ }
+
+ var constructor = _getConstructor(classMirror, 'asPlugin');
+ if (constructor == null) return null;
+ if (constructor.parameters.isEmpty) {
+ if (configuration.isNotEmpty) return null;
+ return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
+ }
+ if (constructor.parameters.length != 1) return null;
+
+ return classMirror.newInstance(const Symbol('asPlugin'),
+ [new BarbackSettings(configuration, mode)]).reflectee;
+ }).where((classMirror) => classMirror != null);
+}
+
+// TODO(nweiz): clean this up when issue 13248 is fixed.
+MethodMirror _getConstructor(ClassMirror classMirror, String constructor) {
+ var name = new Symbol("${MirrorSystem.getName(classMirror.simpleName)}"
+ ".$constructor");
+ var candidate = classMirror.declarations[name];
+ if (candidate is MethodMirror && candidate.isConstructor) return candidate;
+ return null;
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/utils.dart b/sdk/lib/_internal/pub/asset/dart/utils.dart
new file mode 100644
index 0000000..72150ed
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/utils.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Functions go in this file as opposed to lib/src/utils.dart if they need to
+/// be accessible to the transformer-loading isolate.
+library pub.asset.utils;
+
+import 'dart:async';
+
+/// A regular expression to match the exception prefix that some exceptions'
+/// [Object.toString] values contain.
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
+
+/// Get a string description of an exception.
+///
+/// Many exceptions include the exception class name at the beginning of their
+/// [toString], so we remove that if it exists.
+String getErrorMessage(error) =>
+ error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+ var subscription;
+ var controller;
+
+ future = future.catchError((e, stackTrace) {
+ // Since [controller] is synchronous, it's likely that emitting an error
+ // will cause it to be cancelled before we call close.
+ if (controller != null) controller.addError(e, stackTrace);
+ if (controller != null) controller.close();
+ controller = null;
+ });
+
+ onListen() {
+ future.then((stream) {
+ if (controller == null) return;
+ subscription = stream.listen(
+ controller.add,
+ onError: controller.addError,
+ onDone: controller.close);
+ });
+ }
+
+ onCancel() {
+ if (subscription != null) subscription.cancel();
+ subscription = null;
+ controller = null;
+ }
+
+ if (broadcast) {
+ controller = new StreamController.broadcast(
+ sync: true, onListen: onListen, onCancel: onCancel);
+ } else {
+ controller = new StreamController(
+ sync: true, onListen: onListen, onCancel: onCancel);
+ }
+ return controller.stream;
+}
+
+/// Returns a [Stream] that will emit the same values as the stream returned by
+/// [callback].
+///
+/// [callback] will only be called when the returned [Stream] gets a subscriber.
+Stream callbackStream(Stream callback()) {
+ var subscription;
+ var controller;
+ controller = new StreamController(onListen: () {
+ subscription = callback().listen(controller.add,
+ onError: controller.addError,
+ onDone: controller.close);
+ },
+ onCancel: () => subscription.cancel(),
+ onPause: () => subscription.pause(),
+ onResume: () => subscription.resume(),
+ sync: true);
+ return controller.stream;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
new file mode 100644
index 0000000..2c8cc19
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.build_environment;
+
+import 'dart:async';
+
+import 'package:watcher/watcher.dart';
+
+import 'build_environment.dart';
+import 'server.dart';
+
+/// A directory in the entrypoint package whose contents have been made
+/// available to barback and that are bound to a server.
+class BuildDirectory {
+ final BuildEnvironment _environment;
+
+ /// The relative directory path within the package.
+ final String directory;
+
+ /// The server bound to this directory.
+ BarbackServer get server => _server;
+ BarbackServer _server;
+
+ /// The subscription to the [DirectoryWatcher] used to watch this directory
+ /// for changes.
+ ///
+ /// If the directory is not being watched, this will be `null`.
+ StreamSubscription<WatchEvent> watchSubscription;
+
+ BuildDirectory(this._environment, this.directory);
+
+ /// Binds a server running on [hostname]:[port] to this directory.
+ Future<BarbackServer> serve(String hostname, int port) {
+ return BarbackServer.bind(_environment, hostname, port, directory)
+ .then((server) => _server = server);
+ }
+
+ /// Removes the build directory from the build environment.
+ ///
+ /// Closes the server, removes the assets from barback, and stops watching it.
+ Future close() {
+ var futures = [server.close()];
+
+ // Stop watching the directory.
+ if (watchSubscription != null) {
+ var cancel = watchSubscription.cancel();
+ if (cancel != null) futures.add(cancel);
+ }
+
+ return Future.wait(futures);
+ }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
index 9cc8128..99890b7 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -8,7 +8,7 @@
import 'dart:io';
import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
+import 'package:path/path.dart' as path;
import 'package:stack_trace/stack_trace.dart';
import 'package:watcher/watcher.dart';
@@ -17,6 +17,7 @@
import '../log.dart' as log;
import '../package.dart';
import '../package_graph.dart';
+import 'build_directory.dart';
import 'dart_forwarding_transformer.dart';
import 'dart2js_transformer.dart';
import 'load_all_transformers.dart';
@@ -52,7 +53,6 @@
/// transformers, and server are loaded and ready.
static Future<BuildEnvironment> create(Entrypoint entrypoint,
String hostname, int basePort, BarbackMode mode, WatcherType watcherType,
- Iterable<String> rootDirectories,
{bool useDart2JS: true}) {
return entrypoint.loadPackageGraph().then((graph) {
log.fine("Loaded package graph.");
@@ -60,63 +60,16 @@
barback.log.listen(_log);
var environment = new BuildEnvironment._(graph, barback, mode,
- watcherType, rootDirectories);
- return environment._startServers(hostname, basePort).then((_) {
- log.fine("Started servers.");
- // If the entrypoint package manually configures the dart2js
- // transformer, don't include it in the built-in transformer list.
- //
- // TODO(nweiz): if/when we support more built-in transformers, make
- // this more general.
- var containsDart2JS = graph.entrypoint.root.pubspec.transformers
- .any((transformers) => transformers
- .any((id) => id.package == '\$dart2js'));
+ watcherType, hostname, basePort);
- if (!containsDart2JS && useDart2JS) {
- environment._builtInTransformers.addAll([
- new Dart2JSTransformer(environment, mode),
- new DartForwardingTransformer(mode)
- ]);
- }
-
- return environment._load(barback).then((_) => environment);
- });
+ return environment._load(useDart2JS: useDart2JS)
+ .then((_) => environment);
});
}
- /// Start the [BarbackServer]s that will serve [rootDirectories].
- Future<List<BarbackServer>> _startServers(String hostname, int basePort) {
- _bind(port, rootDirectory) {
- if (basePort == 0) port = 0;
- return BarbackServer.bind(this, hostname, port, rootDirectory);
- }
-
- var rootDirectoryList = _rootDirectories.toList();
-
- // For consistency, "web/" should always have the first available port and
- // "test/" should always have the second. Other directories are assigned
- // the following ports in alphabetical order.
- var serverFutures = [];
- if (rootDirectoryList.remove('web')) {
- serverFutures.add(_bind(basePort, 'web'));
- }
- if (rootDirectoryList.remove('test')) {
- serverFutures.add(_bind(basePort + 1, 'test'));
- }
-
- var i = 0;
- for (var dir in rootDirectoryList) {
- serverFutures.add(_bind(basePort + 2 + i, dir));
- i += 1;
- }
-
- return Future.wait(serverFutures).then((boundServers) {
- servers.addAll(boundServers);
- });
- }
-
- /// The servers serving this environment's assets.
- final servers = <BarbackServer>[];
+ /// The public directories in the root package that are available for
+ /// building, keyed by their root directory.
+ final _directories = new Map<String, BuildDirectory>();
/// The [Barback] instance used to process assets in this environment.
final Barback barback;
@@ -137,13 +90,33 @@
/// How source files should be watched.
final WatcherType _watcherType;
- /// The set of top-level directories in the entrypoint package that will be
- /// exposed.
- final Set<String> _rootDirectories;
+ /// The hostname that servers are bound to.
+ final String _hostname;
+
+ /// The starting number for ports that servers will be bound to.
+ ///
+ /// Servers will be bound to ports starting at this number and then
+ /// incrementing from there. However, if this is zero, then ephemeral port
+ /// numbers will be selected for each server.
+ final int _basePort;
+
+ /// The modified source assets that have not been sent to barback yet.
+ ///
+ /// The build environment can be paused (by calling [pauseUpdates]) and
+ /// resumed ([resumeUpdates]). While paused, all source asset updates that
+ /// come from watching or adding new directories are not sent to barback.
+ /// When resumed, all pending source updates are sent to barback.
+ ///
+ /// This lets pub serve and pub build create an environment and bind several
+ /// servers before barback starts building and producing results
+ /// asynchronously.
+ ///
+ /// If this is `null`, then the environment is "live" and all updates will
+ /// go to barback immediately.
+ Set<AssetId> _modifiedSources;
BuildEnvironment._(this.graph, this.barback, this.mode, this._watcherType,
- Iterable<String> rootDirectories)
- : _rootDirectories = rootDirectories.toSet();
+ this._hostname, this._basePort);
/// Gets the built-in [Transformer]s that should be added to [package].
///
@@ -159,16 +132,154 @@
return _builtInTransformers;
}
- /// Gets the names of the top-level directories in [package] whose contents
- /// should be provided as source assets.
- Set<String> getPublicDirectories(String package) {
- var directories = ["asset", "lib"];
-
- if (package == graph.entrypoint.root.name) {
- directories.addAll(_rootDirectories);
+ /// Binds a new port to serve assets from within [rootDirectory] in the
+ /// entrypoint package.
+ ///
+ /// Adds and watches the sources within that directory. Returns a [Future]
+ /// that completes to the bound server.
+ ///
+ /// If [rootDirectory] is already being served, returns that existing server.
+ Future<BarbackServer> serveDirectory(String rootDirectory) {
+ // See if there is already a server bound to the directory.
+ var directory = _directories[rootDirectory];
+ if (directory != null) {
+ log.fine('Already serving $rootDirectory on ${directory.server.url}.');
+ return new Future.value(directory.server);
}
- return directories.toSet();
+ var port = _basePort;
+
+ // If not using an ephemeral port, find the lowest-numbered available one.
+ if (port != 0) {
+ var boundPorts = _directories.values
+ .map((directory) => directory.server.port).toSet();
+ while (boundPorts.contains(port)) {
+ port++;
+ }
+ }
+
+ var buildDirectory = new BuildDirectory(this, rootDirectory);
+ _directories[rootDirectory] = buildDirectory;
+
+ return _provideDirectorySources(rootPackage, rootDirectory)
+ .then((subscription) {
+ buildDirectory.watchSubscription = subscription;
+ return buildDirectory.serve(_hostname, port);
+ });
+ }
+
+ /// Stops the server bound to [rootDirectory].
+ ///
+ /// Also removes any source files within that directory from barback. Returns
+ /// the URL of the unbound server, of `null` if [rootDirectory] was not
+ /// bound to a server.
+ Future<Uri> unserveDirectory(String rootDirectory) {
+ log.fine("Unserving $rootDirectory.");
+ var directory = _directories.remove(rootDirectory);
+ if (directory == null) return new Future.value();
+
+ var url = directory.server.url;
+ return directory.close().then((_) {
+ // Remove the sources from barback, unless some other build directory
+ // includes them.
+ return _removeDirectorySources(rootDirectory);
+ }).then((_) => url);
+ }
+
+ /// Return all URLs serving [assetPath] in this environment.
+ List<Uri> getUrlsForAssetPath(String assetPath) {
+ // Check the three (mutually-exclusive) places the path could be pointing.
+ var urls = _lookUpPathInServerRoot(assetPath);
+ if (urls.isEmpty) urls = _lookUpPathInPackagesDirectory(assetPath);
+ if (urls.isEmpty) urls = _lookUpPathInDependency(assetPath);
+ return urls.toList();
+ }
+
+ /// Look up [assetPath] in the root directories of servers running in the
+ /// entrypoint package.
+ Iterable<Uri> _lookUpPathInServerRoot(String assetPath) {
+ // Find all of the servers whose root directories contain the asset and
+ // generate appropriate URLs for each.
+ return _directories.values
+ .where((dir) => path.isWithin(dir.directory, assetPath))
+ .map((dir) {
+ var relativePath = path.relative(assetPath, from: dir.directory);
+ return dir.server.url.resolveUri(path.toUri(relativePath));
+ });
+ }
+
+ /// Look up [assetPath] in the "packages" directory in the entrypoint package.
+ Iterable<Uri> _lookUpPathInPackagesDirectory(String assetPath) {
+ var components = path.split(path.relative(assetPath));
+ if (components.first != "packages") return [];
+ if (!graph.packages.containsKey(components[1])) return [];
+ return _directories.values.map((dir) =>
+ dir.server.url.resolveUri(path.toUri(assetPath)));
+ }
+
+ /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
+ /// package.
+ Iterable<Uri> _lookUpPathInDependency(String assetPath) {
+ for (var package in graph.packages.values) {
+ var libDir = path.join(package.dir, 'lib');
+ var assetDir = path.join(package.dir, 'asset');
+
+ var uri;
+ if (path.isWithin(libDir, assetPath)) {
+ uri = path.toUri(path.join('packages', package.name,
+ path.relative(assetPath, from: libDir)));
+ } else if (path.isWithin(assetDir, assetPath)) {
+ uri = path.toUri(path.join('assets', package.name,
+ path.relative(assetPath, from: assetDir)));
+ } else {
+ continue;
+ }
+
+ return _directories.values.map((dir) => dir.server.url.resolveUri(uri));
+ }
+
+ return [];
+ }
+
+ /// Given a URL to an asset served by this environment, returns the ID of the
+ /// asset that would be accessed by that URL.
+ ///
+ /// If no server can serve [url], returns `null`.
+ AssetId getAssetIdForUrl(Uri url) {
+ var directory = _directories.values.firstWhere(
+ (dir) => dir.server.address.host == url.host &&
+ dir.server.port == url.port,
+ orElse: () => null);
+ if (directory == null) return null;
+
+ return directory.server.urlToId(url);
+ }
+
+ /// Determines if [sourcePath] is contained within any of the directories in
+ /// the root package that are visible to this build environment.
+ bool containsPath(String sourcePath) {
+ var directories = ["asset", "lib"];
+ directories.addAll(_directories.keys);
+
+ return directories.any((dir) => path.isWithin(dir, sourcePath));
+ }
+
+ /// Pauses sending source asset updates to barback.
+ void pauseUpdates() {
+ // Cannot pause while already paused.
+ assert(_modifiedSources == null);
+
+ _modifiedSources = new Set<AssetId>();
+ }
+
+ /// Sends any pending source updates to barback and begins the asynchronous
+ /// build process.
+ void resumeUpdates() {
+ // Cannot resume while not paused.
+ assert(_modifiedSources != null);
+
+ barback.updateSources(_modifiedSources);
+ _modifiedSources = null;
}
/// Loads the assets and transformers for this environment.
@@ -178,16 +289,53 @@
/// in packages in [graph] and re-runs them as necessary when any input files
/// change.
///
+ /// If [useDart2JS] is `true`, then the [Dart2JSTransformer] is implicitly
+ /// added to end of the root package's transformer phases.
+ ///
/// Returns a [Future] that completes once all inputs and transformers are
/// loaded.
- Future _load(Barback barback) {
- return _provideSources(barback).then((_) {
+ Future _load({bool useDart2JS}) {
+ // If the entrypoint package manually configures the dart2js
+ // transformer, don't include it in the built-in transformer list.
+ //
+ // TODO(nweiz): if/when we support more built-in transformers, make
+ // this more general.
+ var containsDart2JS = graph.entrypoint.root.pubspec.transformers
+ .any((transformers) => transformers
+ .any((id) => id.package == '\$dart2js'));
+
+ if (!containsDart2JS && useDart2JS) {
+ _builtInTransformers.addAll([
+ new Dart2JSTransformer(this, mode),
+ new DartForwardingTransformer(mode)
+ ]);
+ }
+
+ // "$pub" is a psuedo-package that allows pub's transformer-loading
+ // infrastructure to share code with pub proper. We provide it only during
+ // the initial transformer loading process.
+ var dartPath = assetPath('dart');
+ var pubSources = listDir(dartPath, recursive: true).map((library) {
+ return new AssetId('\$pub',
+ path.join('lib', path.relative(library, from: dartPath)));
+ });
+
+ // Bind a server that we can use to load the transformers.
+ var transformerServer;
+ return BarbackServer.bind(this, _hostname, 0, null).then((server) {
+ transformerServer = server;
+
+ return log.progress("Loading source assets", () {
+ barback.updateSources(pubSources);
+ return _provideSources();
+ });
+ }).then((_) {
log.fine("Provided sources.");
var completer = new Completer();
- // If any errors get emitted either by barback or by the primary server,
- // including non-programmatic barback errors, they should take down the
- // whole program.
+ // If any errors get emitted either by barback or by the transformer
+ // server, including non-programmatic barback errors, they should take
+ // down the whole program.
var subscriptions = [
barback.errors.listen((error) {
if (error is TransformerException) {
@@ -207,16 +355,16 @@
if (completer.isCompleted) return;
completer.completeError(error, stackTrace);
}),
- // We only listen to the first server here because that's the one used
- // to initialize all the transformers during the initial load.
- servers.first.results.listen((_) {}, onError: (error, stackTrace) {
+ transformerServer.results.listen((_) {}, onError: (error, stackTrace) {
if (completer.isCompleted) return;
completer.completeError(error, stackTrace);
})
];
- loadAllTransformers(this).then((_) {
+ loadAllTransformers(this, transformerServer).then((_) {
log.fine("Loaded transformers.");
+ return transformerServer.close();
+ }).then((_) {
if (!completer.isCompleted) completer.complete();
}).catchError((error, stackTrace) {
if (!completer.isCompleted) {
@@ -229,125 +377,179 @@
subscription.cancel();
}
});
- });
+ }).then((_) => barback.removeSources(pubSources));
}
- /// Provides all of the source assets in the environment to barback.
+ /// Provides the public source assets in the environment to barback.
///
/// If [watcherType] is not [WatcherType.NONE], enables watching on them.
- Future _provideSources(Barback barback) {
- if (_watcherType != WatcherType.NONE) {
- return _watchSources(barback);
- }
-
- return _loadSources(barback);
- }
-
- /// Provides all of the source assets in the environment to barback.
- Future _loadSources(Barback barback) {
- return Future.wait(graph.packages.values.map(_updateSources));
- }
-
- /// Adds all of the source assets in this environment to barback and then
- /// watches the public directories for changes.
- ///
- /// Returns a Future that completes when the sources are loaded and the
- /// watchers are active.
- Future _watchSources(Barback barback) {
+ Future _provideSources() {
return Future.wait(graph.packages.values.map((package) {
- // If this package comes from a cached source, its contents won't change
- // so we don't need to monitor it. `packageId` will be null for the
- // application package, since that's not locked.
- var packageId = graph.lockFile.packages[package.name];
- if (packageId != null &&
- graph.entrypoint.cache.sources[packageId.source].shouldCache) {
- return _updateSources(package);
- }
-
- // Watch the visible package directories for changes.
- return Future.wait(getPublicDirectories(package.name).map((name) {
- var subdirectory = p.join(package.dir, name);
- if (!dirExists(subdirectory)) return new Future.value();
-
- // TODO(nweiz): close these watchers when [barback] is closed.
- var watcher = _watcherType.create(subdirectory);
- watcher.events.listen((event) {
- // Don't watch files symlinked into these directories.
- // TODO(rnystrom): If pub gets rid of symlinks, remove this.
- var parts = p.split(event.path);
- if (parts.contains("packages") || parts.contains("assets")) return;
-
- // Skip files that were (most likely) compiled from nearby ".dart"
- // files. These are created by the Editor's "Run as JavaScript"
- // command and are written directly into the package's directory.
- // When pub's dart2js transformer then tries to create the same file
- // name, we get a build error. To avoid that, just don't consider
- // that file to be a source.
- // TODO(rnystrom): Remove these when the Editor no longer generates
- // .js files and users have had enough time that they no longer have
- // these files laying around. See #15859.
- if (event.path.endsWith(".dart.js")) return;
- if (event.path.endsWith(".dart.js.map")) return;
- if (event.path.endsWith(".dart.precompiled.js")) return;
-
- var id = new AssetId(package.name,
- p.relative(event.path, from: package.dir));
- if (event.type == ChangeType.REMOVE) {
- barback.removeSources([id]);
- } else {
- barback.updateSources([id]);
- }
- });
- return watcher.ready;
- })).then((_) => _updateSources(package));
+ // Just include the "shared" directories in each package. We'll add the
+ // other build directories in the root package by calling
+ // [serveDirectory].
+ return Future.wait([
+ _provideDirectorySources(package, "asset"),
+ _provideDirectorySources(package, "lib")
+ ]);
}));
}
- /// Lists all of the visible files in [package] and updates them in barback.
+ /// Provides all of the source assets within [dir] in [package] to barback.
///
- /// This is the recursive contents of the "asset" and "lib" directories (if
- /// present). If [package] is the entrypoint package, it also includes the
- /// build directories.
+ /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
+ /// Returns the subscription to the watcher, or `null` if none was created.
+ Future<StreamSubscription<WatchEvent>> _provideDirectorySources(
+ Package package, String dir) {
+ log.fine("Providing sources for ${package.name}|$dir.");
+ // TODO(rnystrom): Handle overlapping directories. If two served
+ // directories overlap like so:
+ //
+ // $ pub serve example example/subdir
+ //
+ // Then the sources of the subdirectory will be updated and watched twice.
+ // See: #17454
+ if (_watcherType == WatcherType.NONE) {
+ return _updateDirectorySources(package, dir);
+ }
+
+ // Watch the directory before listing is so we don't miss files that
+ // are added between the initial list and registering the watcher.
+ return _watchDirectorySources(package, dir).then((_) {
+ return _updateDirectorySources(package, dir);
+ });
+ }
+
+ /// Updates barback with all of the files in [dir] inside [package].
+ Future _updateDirectorySources(Package package, String dir) {
+ return _listDirectorySources(package, dir).then((ids) {
+ if (_modifiedSources == null) {
+ barback.updateSources(ids);
+ } else {
+ _modifiedSources.addAll(ids);
+ }
+ });
+ }
+
+ /// Removes all of the files in [dir] in the root package from barback unless
+ /// some other build directory still contains them.
+ Future _removeDirectorySources(String dir) {
+ return _listDirectorySources(rootPackage, dir, where: (relative) {
+ // TODO(rnystrom): This is O(n*m) where n is the number of files and
+ // m is the number of served directories. Consider something more
+ // optimal if this becomes a bottleneck.
+ // Don't remove a source if some other directory still includes it.
+ return !_directories.keys.any((dir) => path.isWithin(dir, relative));
+ }).then((ids) {
+ if (_modifiedSources == null) {
+ barback.removeSources(ids);
+ } else {
+ _modifiedSources.removeAll(ids);
+ }
+ });
+ }
+
+ /// Lists all of the source assets in [dir] inside [package].
///
/// For large packages, listing the contents is a performance bottleneck, so
/// this is optimized for our needs in here instead of using the more general
/// but slower [listDir].
- Future _updateSources(Package package) {
- return Future.wait(getPublicDirectories(package.name).map((dirPath) {
- var dir = p.join(package.dir, dirPath);
- if (!dirExists(dir)) return new Future.value();
+ ///
+ /// If [where] is given, then it is used to filter the resulting list of
+ /// packages. Only assets whose relative path within [package] matches that
+ /// will be included in the results.
+ Future<List<AssetId>> _listDirectorySources(Package package, String dir,
+ {bool where(String relativePath)}) {
+ var subdirectory = path.join(package.dir, dir);
+ if (!dirExists(subdirectory)) return new Future.value([]);
- return new Directory(dir).list(recursive: true, followLinks: true)
- .expand((entry) {
- // Skip directories and (broken) symlinks.
- if (entry is Directory) return [];
- if (entry is Link) return [];
+ return new Directory(subdirectory).list(recursive: true, followLinks: true)
+ .expand((entry) {
+ // Skip directories and (broken) symlinks.
+ if (entry is Directory) return [];
+ if (entry is Link) return [];
- var relative = p.normalize(
- p.relative(entry.path, from: package.dir));
+ var relative = path.normalize(
+ path.relative(entry.path, from: package.dir));
- // Ignore hidden files or files in "packages" and hidden directories.
- if (p.split(relative).any((part) =>
- part.startsWith(".") || part == "packages")) {
- return [];
+ // Ignore hidden files or files in "packages" and hidden directories.
+ if (path.split(relative).any((part) =>
+ part.startsWith(".") || part == "packages")) {
+ return [];
+ }
+
+ // Skip files that were (most likely) compiled from nearby ".dart"
+ // files. These are created by the Editor's "Run as JavaScript"
+ // command and are written directly into the package's directory.
+ // When pub's dart2js transformer then tries to create the same file
+ // name, we get a build error. To avoid that, just don't consider
+ // that file to be a source.
+ // TODO(rnystrom): Remove these when the Editor no longer generates
+ // .js files and users have had enough time that they no longer have
+ // these files laying around. See #15859.
+ if (relative.endsWith(".dart.js")) return [];
+ if (relative.endsWith(".dart.js.map")) return [];
+ if (relative.endsWith(".dart.precompiled.js")) return [];
+
+ if (where != null && !where(relative)) return [];
+
+ return [new AssetId(package.name, relative)];
+ }).toList();
+ }
+
+ /// Adds a file watcher for [dir] within [package], if the directory exists
+ /// and the package needs watching.
+ Future<StreamSubscription<WatchEvent>> _watchDirectorySources(
+ Package package, String dir) {
+ // If this package comes from a cached source, its contents won't change so
+ // we don't need to monitor it. `packageId` will be null for the
+ // application package, since that's not locked.
+ var packageId = graph.lockFile.packages[package.name];
+ if (packageId != null &&
+ graph.entrypoint.cache.sources[packageId.source].shouldCache) {
+ return new Future.value();
+ }
+
+ var subdirectory = path.join(package.dir, dir);
+ if (!dirExists(subdirectory)) return new Future.value();
+
+ // TODO(nweiz): close this watcher when [barback] is closed.
+ var watcher = _watcherType.create(subdirectory);
+ var subscription = watcher.events.listen((event) {
+ // Don't watch files symlinked into these directories.
+ // TODO(rnystrom): If pub gets rid of symlinks, remove this.
+ var parts = path.split(event.path);
+ if (parts.contains("packages") || parts.contains("assets")) return;
+
+ // Skip files that were (most likely) compiled from nearby ".dart"
+ // files. These are created by the Editor's "Run as JavaScript"
+ // command and are written directly into the package's directory.
+ // When pub's dart2js transformer then tries to create the same file
+ // name, we get a build error. To avoid that, just don't consider
+ // that file to be a source.
+ // TODO(rnystrom): Remove these when the Editor no longer generates
+ // .js files and users have had enough time that they no longer have
+ // these files laying around. See #15859.
+ if (event.path.endsWith(".dart.js")) return;
+ if (event.path.endsWith(".dart.js.map")) return;
+ if (event.path.endsWith(".dart.precompiled.js")) return;
+
+ var id = new AssetId(package.name,
+ path.relative(event.path, from: package.dir));
+ if (event.type == ChangeType.REMOVE) {
+ if (_modifiedSources != null) {
+ _modifiedSources.remove(id);
+ } else {
+ barback.removeSources([id]);
}
+ } else if (_modifiedSources != null) {
+ _modifiedSources.add(id);
+ } else {
+ barback.updateSources([id]);
+ }
+ });
- // Skip files that were (most likely) compiled from nearby ".dart"
- // files. These are created by the Editor's "Run as JavaScript"
- // command and are written directly into the package's directory.
- // When pub's dart2js transformer then tries to create the same file
- // name, we get a build error. To avoid that, just don't consider
- // that file to be a source.
- // TODO(rnystrom): Remove these when the Editor no longer generates
- // .js files and users have had enough time that they no longer have
- // these files laying around. See #15859.
- if (relative.endsWith(".dart.js")) return [];
- if (relative.endsWith(".dart.js.map")) return [];
- if (relative.endsWith(".dart.precompiled.js")) return [];
-
- return [new AssetId(package.name, relative)];
- }).toList().then(barback.updateSources);
- }));
+ return watcher.ready.then((_) => subscription);
}
}
@@ -362,7 +564,7 @@
messageMentionsAsset(id) =>
messageMentions(id.toString()) ||
- messageMentions(p.joinAll(p.url.split(entry.assetId.path)));
+ messageMentions(path.fromUri(entry.assetId.path));
var prefixParts = [];
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 44225d6..de74c74 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -19,7 +19,6 @@
import '../../../../compiler/implementation/source_file.dart';
import '../barback.dart';
import '../dart.dart' as dart;
-import '../io.dart';
import '../pool.dart';
import '../utils.dart';
import 'build_environment.dart';
@@ -352,8 +351,7 @@
// other files in the root package are not visible to transformers, so
// should be loaded directly from disk.
var sourcePath = path.fromUri(url);
- if (_environment.getPublicDirectories(_environment.rootPackage.name)
- .any((dir) => path.isWithin(dir, sourcePath))) {
+ if (_environment.containsPath(sourcePath)) {
var relative = path.relative(sourcePath,
from: _environment.rootPackage.dir);
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 5376635..fcfb3d0 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -8,14 +8,16 @@
import 'package:barback/barback.dart';
+import '../barback.dart';
+import '../log.dart' as log;
+import '../package_graph.dart';
+import '../utils.dart';
import 'build_environment.dart';
import 'dart2js_transformer.dart';
import 'excluding_transformer.dart';
import 'load_transformers.dart';
import 'rewrite_import_transformer.dart';
-import '../barback.dart';
-import '../package_graph.dart';
-import '../utils.dart';
+import 'server.dart';
/// Loads all transformers depended on by packages in [environment].
///
@@ -25,7 +27,8 @@
///
/// Any built-in transformers that are provided by the environment will
/// automatically be added to the end of the root package's cascade.
-Future loadAllTransformers(BuildEnvironment environment) {
+Future loadAllTransformers(BuildEnvironment environment,
+ BarbackServer transformerServer) {
// In order to determine in what order we should load transformers, we need to
// know which transformers depend on which others. This is different than
// normal package dependencies. Let's begin with some terminology:
@@ -60,11 +63,12 @@
for (var package in environment.graph.packages.values) {
environment.barback.updateTransformers(package.name, [[rewrite]]);
}
+ environment.barback.updateTransformers(r'$pub', [[rewrite]]);
var orderingDeps = _computeOrderingDeps(environment.graph);
var packageTransformers = _computePackageTransformers(environment.graph);
- var loader = new _TransformerLoader(environment);
+ var loader = new _TransformerLoader(environment, transformerServer);
// The packages on which no packages have ordering dependencies -- that is,
// the packages that don't need to be loaded before any other packages. These
@@ -216,6 +220,8 @@
class _TransformerLoader {
final BuildEnvironment _environment;
+ final BarbackServer _transformerServer;
+
/// The loaded transformers defined in the library identified by each
/// transformer id.
final _transformers = new Map<TransformerId, Set<Transformer>>();
@@ -225,7 +231,7 @@
/// Used for error reporting.
final _transformerUsers = new Map<Pair<String, String>, Set<String>>();
- _TransformerLoader(this._environment) {
+ _TransformerLoader(this._environment, this._transformerServer) {
for (var package in _environment.graph.packages.values) {
for (var id in unionAll(package.pubspec.transformers)) {
_transformerUsers.putIfAbsent(
@@ -245,7 +251,9 @@
// TODO(nweiz): load multiple instances of the same transformer from the
// same isolate rather than spinning up a separate isolate for each one.
- return loadTransformers(_environment, id).then((transformers) {
+ return log.progress("Loading $id transformers",
+ () => loadTransformers(_environment, _transformerServer, id))
+ .then((transformers) {
if (!transformers.isEmpty) {
_transformers[id] = transformers;
return;
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 12e5c49..6726288 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -11,378 +11,43 @@
import 'package:barback/barback.dart';
// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
import 'package:barback/src/internal_asset.dart';
-import 'package:source_maps/source_maps.dart';
-import 'package:stack_trace/stack_trace.dart';
+import '../../../asset/dart/serialize.dart';
import '../barback.dart';
import '../dart.dart' as dart;
import '../log.dart' as log;
import '../utils.dart';
import 'build_environment.dart';
import 'excluding_transformer.dart';
-
-/// A Dart script to run in an isolate.
-///
-/// This script serializes one or more transformers defined in a Dart library
-/// and marshals calls to and from them with the host isolate.
-const _TRANSFORMER_ISOLATE = """
-import 'dart:async';
-import 'dart:isolate';
-import 'dart:convert';
-import 'dart:mirrors';
-
-import '<<URL_BASE>>/packages/source_maps/span.dart';
-import '<<URL_BASE>>/packages/stack_trace/stack_trace.dart';
-import '<<URL_BASE>>/packages/barback/barback.dart';
-// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
-import '<<URL_BASE>>/packages/barback/src/internal_asset.dart';
-
-/// Sets up the initial communication with the host isolate.
-void main(_, SendPort replyTo) {
- var port = new ReceivePort();
- replyTo.send(port.sendPort);
- port.first.then((wrappedMessage) {
- _respond(wrappedMessage, (message) {
- var library = Uri.parse(message['library']);
- var configuration = JSON.decode(message['configuration']);
- var mode = new BarbackMode(message['mode']);
- return initialize(library, configuration, mode).
- map(_serializeTransformerOrGroup).toList();
- });
- });
-}
-
-/// Loads all the transformers and groups defined in [uri].
-///
-/// Loads the library, finds any Transformer or TransformerGroup subclasses in
-/// it, instantiates them with [configuration] and [mode], and returns them.
-Iterable initialize(Uri uri, Map configuration, BarbackMode mode) {
- var mirrors = currentMirrorSystem();
- var transformerClass = reflectClass(Transformer);
- var groupClass = reflectClass(TransformerGroup);
-
- // TODO(nweiz): if no valid transformers are found, throw an error message
- // describing candidates and why they were rejected.
- return mirrors.libraries[uri].declarations.values.map((declaration) {
- if (declaration is! ClassMirror) return null;
- var classMirror = declaration;
- if (classMirror.isPrivate) return null;
- if (classMirror.isAbstract) return null;
- if (!classIsA(classMirror, transformerClass) &&
- !classIsA(classMirror, groupClass)) {
- return null;
- }
-
- var constructor = getConstructor(classMirror, 'asPlugin');
- if (constructor == null) return null;
- if (constructor.parameters.isEmpty) {
- if (configuration.isNotEmpty) return null;
- return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
- }
- if (constructor.parameters.length != 1) return null;
-
- return classMirror.newInstance(const Symbol('asPlugin'),
- [new BarbackSettings(configuration, mode)]).reflectee;
- }).where((classMirror) => classMirror != null);
-}
-
-/// A wrapper for a [Transform] that's in the host isolate.
-///
-/// This retrieves inputs from and sends outputs and logs to the host isolate.
-class ForeignTransform implements Transform {
- /// The port with which we communicate with the host isolate.
- ///
- /// This port and all messages sent across it are specific to this transform.
- final SendPort _port;
-
- final Asset primaryInput;
-
- TransformLogger get logger => _logger;
- TransformLogger _logger;
-
- /// Creates a transform from a serializable map sent from the host isolate.
- ForeignTransform(Map transform)
- : _port = transform['port'],
- primaryInput = deserializeAsset(transform['primaryInput']) {
- _logger = new TransformLogger((assetId, level, message, span) {
- _call(_port, {
- 'type': 'log',
- 'level': level.name,
- 'message': message,
- 'assetId': assetId == null ? null : _serializeId(assetId),
- 'span': span == null ? null : _serializeSpan(span)
- });
- });
- }
-
- Future<Asset> getInput(AssetId id) {
- return _call(_port, {
- 'type': 'getInput',
- 'id': _serializeId(id)
- }).then(deserializeAsset);
- }
-
- Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
- if (encoding == null) encoding = UTF8;
- return getInput(id).then((input) => input.readAsString(encoding: encoding));
- }
-
- Stream<List<int>> readInput(AssetId id) =>
- _futureStream(getInput(id).then((input) => input.read()));
-
- void addOutput(Asset output) {
- _call(_port, {
- 'type': 'addOutput',
- 'output': serializeAsset(output)
- });
- }
-}
-
-/// Returns the mirror for the root Object type.
-ClassMirror get objectMirror => reflectClass(Object);
-
-// TODO(nweiz): clean this up when issue 13248 is fixed.
-MethodMirror getConstructor(ClassMirror classMirror, String constructor) {
- var name = new Symbol("\${MirrorSystem.getName(classMirror.simpleName)}"
- ".\$constructor");
- var candidate = classMirror.declarations[name];
- if (candidate is MethodMirror && candidate.isConstructor) return candidate;
- return null;
-}
-
-// TODO(nweiz): get rid of this when issue 12439 is fixed.
-/// Returns whether or not [mirror] is a subtype of [superclass].
-///
-/// This includes [superclass] being mixed in to or implemented by [mirror].
-bool classIsA(ClassMirror mirror, ClassMirror superclass) {
- if (mirror == superclass) return true;
- if (mirror == objectMirror) return false;
- return classIsA(mirror.superclass, superclass) ||
- mirror.superinterfaces.any((int) => classIsA(int, superclass));
-}
-
-/// Converts [transformerOrGroup] into a serializable map.
-Map _serializeTransformerOrGroup(transformerOrGroup) {
- if (transformerOrGroup is Transformer) {
- return _serializeTransformer(transformerOrGroup);
- } else {
- assert(transformerOrGroup is TransformerGroup);
- return _serializeTransformerGroup(transformerOrGroup);
- }
-}
-
-/// Converts [transformer] into a serializable map.
-Map _serializeTransformer(Transformer transformer) {
- var port = new ReceivePort();
- port.listen((wrappedMessage) {
- _respond(wrappedMessage, (message) {
- if (message['type'] == 'isPrimary') {
- return transformer.isPrimary(deserializeAsset(message['asset']));
- } else {
- assert(message['type'] == 'apply');
-
- // Make sure we return null so that if the transformer's [apply] returns
- // a non-serializable value it doesn't cause problems.
- return transformer.apply(
- new ForeignTransform(message['transform'])).then((_) => null);
- }
- });
- });
-
- return {
- 'type': 'Transformer',
- 'toString': transformer.toString(),
- 'port': port.sendPort
- };
-}
-
-// Converts [group] into a serializable map.
-Map _serializeTransformerGroup(TransformerGroup group) {
- return {
- 'type': 'TransformerGroup',
- 'toString': group.toString(),
- 'phases': group.phases.map((phase) {
- return phase.map(_serializeTransformerOrGroup).toList();
- }).toList()
- };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Converts [span] into a serializable map.
-Map _serializeSpan(Span span) {
- // TODO(nweiz): convert FileSpans to FileSpans.
- return {
- 'type': 'fixed',
- 'sourceUrl': span.sourceUrl,
- 'start': _serializeLocation(span.start),
- 'text': span.text,
- 'isIdentifier': span.isIdentifier
- };
-}
-
-/// Converts [location] into a serializable map.
-Map _serializeLocation(Location location) {
- // TODO(nweiz): convert FileLocations to FileLocations.
- return {
- 'type': 'fixed',
- 'sourceUrl': location.sourceUrl,
- 'offset': location.offset,
- 'line': location.line,
- 'column': location.column
- };
-}
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
- var replyTo = wrappedMessage['replyTo'];
- new Future.sync(() => callback(wrappedMessage['message']))
- .then((result) => replyTo.send({'type': 'success', 'value': result}))
- .catchError((error, stackTrace) {
- // TODO(nweiz): at least MissingInputException should be preserved here.
- replyTo.send({
- 'type': 'error',
- 'error': CrossIsolateException.serialize(error, stackTrace)
- });
- });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
- var receivePort = new ReceivePort();
- port.send({
- 'message': message,
- 'replyTo': receivePort.sendPort
- });
-
- return receivePort.first.then((response) {
- if (response['type'] == 'success') return response['value'];
- assert(response['type'] == 'error');
- return new Future.error(
- new CrossIsolateException.deserialize(response['error']));
- });
-}
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
- /// The name of the type of exception thrown.
- ///
- /// This is the return value of [error.runtimeType.toString()]. Keep in mind
- /// that objects in different libraries may have the same type name.
- final String type;
-
- /// The exception's message, or its [toString] if it didn't expose a `message`
- /// property.
- final String message;
-
- /// The exception's stack chain, or `null` if no stack chain was available.
- final Chain stackTrace;
-
- /// Loads a [CrossIsolateException] from a serialized representation.
- ///
- /// [error] should be the result of [CrossIsolateException.serialize].
- CrossIsolateException.deserialize(Map error)
- : type = error['type'],
- message = error['message'],
- stackTrace = error['stack'] == null ? null :
- new Chain.parse(error['stack']);
-
- /// Serializes [error] to an object that can safely be passed across isolate
- /// boundaries.
- static Map serialize(error, [StackTrace stack]) {
- if (stack == null && error is Error) stack = error.stackTrace;
- return {
- 'type': error.runtimeType.toString(),
- 'message': getErrorMessage(error),
- 'stack': stack == null ? null : new Chain.forTrace(stack).toString()
- };
- }
-
- String toString() => "\$message\\n\$stackTrace";
-}
-
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
- error.toString().replaceFirst(_exceptionPrefix, '');
-
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes. If [future] completes to an
-/// error, the return value will emit that error and then close.
-Stream _futureStream(Future<Stream> future) {
- var controller = new StreamController(sync: true);
- future.then((stream) {
- stream.listen(
- controller.add,
- onError: controller.addError,
- onDone: controller.close);
- }).catchError((e, stackTrace) {
- controller.addError(e, stackTrace);
- controller.close();
- });
- return controller.stream;
-}
-
-Stream callbackStream(Stream callback()) {
- var subscription;
- var controller;
- controller = new StreamController(onListen: () {
- subscription = callback().listen(controller.add,
- onError: controller.addError,
- onDone: controller.close);
- },
- onCancel: () => subscription.cancel(),
- onPause: () => subscription.pause(),
- onResume: () => subscription.resume(),
- sync: true);
- return controller.stream;
-}
-""";
+import 'server.dart';
/// Load and return all transformers and groups from the library identified by
/// [id].
-Future<Set> loadTransformers(BuildEnvironment environment, TransformerId id) {
+Future<Set> loadTransformers(BuildEnvironment environment,
+ BarbackServer transformerServer, TransformerId id) {
return id.getAssetId(environment.barback).then((assetId) {
var path = assetId.path.replaceFirst('lib/', '');
// TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
- // We could load the transformers from any server, since they all serve the
- // packages' library files. We choose the first one arbitrarily.
- var baseUrl = baseUrlForAddress(environment.servers.first.address,
- environment.servers.first.port);
- var uri = '$baseUrl/packages/${id.package}/$path';
- var code = 'import "$uri";\n' +
- _TRANSFORMER_ISOLATE.replaceAll('<<URL_BASE>>', baseUrl);
+ var baseUrl = transformerServer.url;
+ var uri = baseUrl.resolve('packages/${id.package}/$path');
+ var code = """
+ import 'dart:isolate';
+
+ import '$uri';
+
+ import r'$baseUrl/packages/\$pub/transformer_isolate.dart';
+
+ void main(_, SendPort replyTo) => loadTransformers(replyTo);
+ """;
log.fine("Loading transformers from $assetId");
var port = new ReceivePort();
return dart.runInIsolate(code, port.sendPort)
.then((_) => port.first)
.then((sendPort) {
- return _call(sendPort, {
- 'library': uri,
+ return call(sendPort, {
+ 'library': uri.toString(),
'mode': environment.mode.name,
// TODO(nweiz): support non-JSON-encodable configuration maps.
'configuration': JSON.encode(id.configuration)
@@ -394,11 +59,11 @@
return transformers;
});
}).catchError((error, stackTrace) {
- if (error is! dart.CrossIsolateException) throw error;
+ if (error is! CrossIsolateException) throw error;
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].startsWith('import "$uri";')) {
+ if (!error.message.split('\n')[1].endsWith("import '$uri';")) {
throw error;
}
@@ -427,16 +92,16 @@
_toString = map['toString'];
Future<bool> isPrimary(Asset asset) {
- return _call(_port, {
+ return call(_port, {
'type': 'isPrimary',
'asset': serializeAsset(asset)
});
}
Future apply(Transform transform) {
- return _call(_port, {
+ return call(_port, {
'type': 'apply',
- 'transform': _serializeTransform(transform)
+ 'transform': serializeTransform(transform)
});
}
@@ -470,106 +135,3 @@
assert(map['type'] == 'TransformerGroup');
return new _ForeignGroup(id, map);
}
-
-/// Converts [transform] into a serializable map.
-Map _serializeTransform(Transform transform) {
- var receivePort = new ReceivePort();
- receivePort.listen((wrappedMessage) {
- _respond(wrappedMessage, (message) {
- if (message['type'] == 'getInput') {
- return transform.getInput(_deserializeId(message['id']))
- .then((asset) => serializeAsset(asset));
- }
-
- if (message['type'] == 'addOutput') {
- transform.addOutput(deserializeAsset(message['output']));
- return null;
- }
-
- assert(message['type'] == 'log');
- var method;
- if (message['level'] == 'Info') {
- method = transform.logger.info;
- } else if (message['level'] == 'Fine') {
- method = transform.logger.fine;
- } else if (message['level'] == 'Warning') {
- method = transform.logger.warning;
- } else {
- assert(message['level'] == 'Error');
- method = transform.logger.error;
- }
-
- var assetId = message['assetId'] == null ? null :
- _deserializeId(message['assetId']);
- var span = message['span'] == null ? null :
- _deserializeSpan(message['span']);
- method(message['message'], asset: assetId, span: span);
- });
- });
-
- return {
- 'port': receivePort.sendPort,
- 'primaryInput': serializeAsset(transform.primaryInput)
- };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts a serializable map into a [Span].
-Span _deserializeSpan(Map span) {
- assert(span['type'] == 'fixed');
- var location = _deserializeLocation(span['start']);
- return new FixedSpan(span['sourceUrl'], location.offset, location.line,
- location.column, text: span['text'], isIdentifier: span['isIdentifier']);
-}
-
-/// Converts a serializable map into a [Location].
-Location _deserializeLocation(Map location) {
- assert(location['type'] == 'fixed');
- return new FixedLocation(location['offset'], location['sourceUrl'],
- location['line'], location['column']);
-}
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
- var replyTo = wrappedMessage['replyTo'];
- syncFuture(() => callback(wrappedMessage['message']))
- .then((result) => replyTo.send({'type': 'success', 'value': result}))
- .catchError((error, stackTrace) {
- // TODO(nweiz): at least MissingInputException should be preserved here.
- replyTo.send({
- 'type': 'error',
- 'error': dart.CrossIsolateException.serialize(error, stackTrace)
- });
- });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
- var receivePort = new ReceivePort();
- port.send({
- 'message': message,
- 'replyTo': receivePort.sendPort
- });
-
- return Chain.track(receivePort.first).then((response) {
- if (response['type'] == 'success') return response['value'];
- assert(response['type'] == 'error');
- return new Future.error(
- new dart.CrossIsolateException.deserialize(response['error']),
- new Chain.current());
- });
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 9e1d7b4..dd90b9f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -10,18 +10,32 @@
import 'package:path/path.dart' as path;
import '../package_graph.dart';
+import '../io.dart';
/// An implementation of barback's [PackageProvider] interface so that barback
/// can find assets within pub packages.
class PubPackageProvider implements PackageProvider {
final PackageGraph _graph;
+ final List<String> packages;
- PubPackageProvider(this._graph);
-
- Iterable<String> get packages => _graph.packages.keys;
+ PubPackageProvider(PackageGraph graph)
+ : _graph = graph,
+ packages = new List.from(graph.packages.keys)..add(r"$pub");
Future<Asset> getAsset(AssetId id) {
- var file = path.join(_graph.packages[id.package].dir, id.path);
+ if (id.package != r'$pub') {
+ var nativePath = path.fromUri(id.path);
+ var file = path.join(_graph.packages[id.package].dir, nativePath);
+ return new Future.value(new Asset.fromPath(id, file));
+ }
+
+ // "$pub" is a psuedo-package that allows pub's transformer-loading
+ // infrastructure to share code with pub proper.
+ var components = path.url.split(id.path);
+ assert(components.isNotEmpty);
+ assert(components.first == 'lib');
+ components[0] = 'dart';
+ var file = assetPath(path.joinAll(components));
return new Future.value(new Asset.fromPath(id, file));
}
}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/server.dart b/sdk/lib/_internal/pub/lib/src/barback/server.dart
index 983e0c9..fabaddc 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/server.dart
@@ -34,17 +34,21 @@
/// The directory in the root which will serve as the root of this server as
/// a native platform path.
+ ///
+ /// This may be `null` in which case no files in the root package can be
+ /// served and only assets in public directories ("packages" and "assets")
+ /// are available.
final String rootDirectory;
- /// The root directory as an asset-style ("/") path.
- String get rootAssetPath => path.url.joinAll(path.split(rootDirectory));
-
/// The server's port.
final int port;
/// The server's address.
final InternetAddress address;
+ /// The server's base URL.
+ Uri get url => baseUrlForAddress(address, port);
+
/// Optional callback to determine if an asset should be served.
///
/// This can be set to allow outside code to filter out assets. Pub serve
@@ -70,6 +74,7 @@
static Future<BarbackServer> bind(BuildEnvironment environment,
String host, int port, String rootDirectory) {
return Chain.track(HttpServer.bind(host, port)).then((server) {
+ log.fine('Bound "$rootDirectory" to $host:$port.');
return new BarbackServer._(environment, server, rootDirectory);
});
}
@@ -87,7 +92,7 @@
/// Closes this server.
Future close() {
var futures = [_server.close(), _resultsController.close()];
- futures.addAll(_webSockets);
+ futures.addAll(_webSockets.map((socket) => socket.close()));
return Future.wait(futures);
}
@@ -98,6 +103,11 @@
var id = specialUrlToId(url);
if (id != null) return id;
+ if (rootDirectory == null) {
+ throw new FormatException(
+ "This server cannot serve out of the root directory. Got $url.");
+ }
+
// Otherwise, it's a path in current package's [rootDirectory].
var parts = path.url.split(url.path);
@@ -137,9 +147,10 @@
}
_logRequest(request, "Loading $id");
- _environment.barback.getAssetById(id)
- .then((asset) => _serveAsset(request, asset))
- .catchError((error, trace) {
+ _environment.barback.getAssetById(id).then((result) {
+ _logRequest(request, "getAssetById($id) returned");
+ return result;
+ }).then((asset) => _serveAsset(request, asset)).catchError((error, trace) {
if (error is! AssetNotFoundException) throw error;
return _environment.barback.getAssetById(id.addExtension("/index.html"))
.then((asset) {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
index 47ab14f..eeb804f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
@@ -8,11 +8,16 @@
import 'dart:convert';
import 'dart:io';
+import 'package:barback/barback.dart';
import 'package:path/path.dart' as path;
import 'package:stack_trace/stack_trace.dart';
+import '../log.dart' as log;
+import '../utils.dart';
import 'build_environment.dart';
+import '../log.dart' as log;
+
/// Implements the [WebSocket] API for communicating with a running pub serve
/// process, mainly for use by the Editor.
///
@@ -57,7 +62,9 @@
WebSocketApi(this._socket, this._environment) {
_commands = {
"urlToAssetId": _urlToAssetId,
- "assetIdToUrls": _assetIdToUrls
+ "pathToUrls": _pathToUrls,
+ "serveDirectory": _serveDirectory,
+ "unserveDirectory": _unserveDirectory
};
}
@@ -68,8 +75,10 @@
/// complete to `null`.
Future listen() {
return _socket.listen((data) {
- try {
- var command;
+ log.io("Web Socket command: $data");
+
+ var command;
+ return syncFuture(() {
try {
command = JSON.decode(data);
} on FormatException catch (ex) {
@@ -93,24 +102,37 @@
'Unknown command "${command["command"]}".');
}
- var response = handler(command);
-
+ return handler(command);
+ }).then((response) {
// If the command has an ID, include it in the response.
if (command.containsKey("id")) {
response["id"] = command["id"];
}
_socket.add(JSON.encode(response));
- } on _WebSocketException catch(ex) {
- _socket.add(JSON.encode({"code": ex.code, "error": ex.message}));
- } catch (ex, stack) {
- // Catch any other errors and pipe them through the web socket.
- _socket.add(JSON.encode({
- "code": _ErrorCode.UNEXPECTED_ERROR,
- "error": ex.toString(),
- "stackTrace": new Chain.forTrace(stack).toString()
- }));
- }
+ }).catchError((error, [stackTrace]) {
+ var response;
+ if (error is _WebSocketException) {
+ response = {
+ "code": error.code,
+ "error": error.message
+ };
+ } else {
+ // Catch any other errors and pipe them through the web socket.
+ response = {
+ "code": _ErrorCode.UNEXPECTED_ERROR,
+ "error": error.toString(),
+ "stackTrace": new Chain.forTrace(stackTrace).toString()
+ };
+ }
+
+ // If the command has an ID, include it in the response.
+ if (command is Map && command.containsKey("id")) {
+ response["id"] = command["id"];
+ }
+
+ _socket.add(JSON.encode(response));
+ });
}, cancelOnError: true).asFuture();
}
@@ -133,6 +155,10 @@
/// "path": "web/index.html"
/// }
///
+ /// The "path" key in the result is a URL path that's relative to the root
+ /// directory of the package identified by "package". The location of this
+ /// package may vary depending on which source it was installed from.
+ ///
/// An optional "line" key may be provided whose value must be an integer. If
/// given, the result will also include a "line" key that maps the line in
/// the served final file back to the corresponding source line in the asset
@@ -169,13 +195,11 @@
// If a line number was given, map it to the output line.
var line = _validateOptionalInt(command, "line");
- // Find the server.
- var server = _environment.servers.firstWhere(
- (server) => server.address.host == url.host && server.port == url.port,
- orElse: () => throw new _WebSocketException(_ErrorCode.NOT_SERVED,
- '"${url.host}:${url.port}" is not being served by pub.'));
-
- var id = server.urlToId(url);
+ var id = _environment.getAssetIdForUrl(url);
+ if (id == null) {
+ throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+ '"${url.host}:${url.port}" is not being served by pub.');
+ }
// TODO(rnystrom): When this is hooked up to actually talk to barback to
// see if assets exist, consider supporting implicit index.html at that
@@ -185,21 +209,22 @@
// Map the line.
// TODO(rnystrom): Right now, source maps are not supported and it just
- // passes through the original line. This lets the editor start using this
- // API before we've fully implemented it. See #12339 and #16061.
+ // passes through the original line. This lets the editor start using
+ // this API before we've fully implemented it. See #12339 and #16061.
if (line != null) result["line"] = line;
return result;
}
- /// Given an asset ID in the root package, returns the URLs served by pub
- /// that can be used to access that asset.
+ /// Given a path on the filesystem, returns the URLs served by pub that can be
+ /// used to access asset found at that path.
///
- /// The command name is "assetIdToUrl" and it takes a "path" key for the
- /// asset path being mapped:
+ /// The command name is "pathToUrls" and it takes a "path" key (a native OS
+ /// path which may be absolute or relative to the root directory of the
+ /// entrypoint package) for the path being mapped:
///
/// {
- /// "command": "assetIdToUrl",
+ /// "command": "pathToUrls",
/// "path": "web/index.html"
/// }
///
@@ -210,6 +235,26 @@
/// "urls": ["http://localhost:8080/index.html"]
/// }
///
+ /// The "path" key may refer to a path in another package, either by referring
+ /// to its location within the top-level "packages" directory or by referring
+ /// to its location on disk. Only the "lib" and "asset" directories are
+ /// visible in other packages:
+ ///
+ /// {
+ /// "command": "assetIdToUrl",
+ /// "path": "packages/http/http.dart"
+ /// }
+ ///
+ /// Assets in the "lib" and "asset" directories will usually have one URL for
+ /// each server:
+ ///
+ /// {
+ /// "urls": [
+ /// "http://localhost:8080/packages/http/http.dart",
+ /// "http://localhost:8081/packages/http/http.dart"
+ /// ]
+ /// }
+ ///
/// An optional "line" key may be provided whose value must be an integer. If
/// given, the result will also include a "line" key that maps the line in
/// the source file to the corresponding output line in the resulting asset
@@ -224,71 +269,130 @@
/// If the asset is not in a directory being served by pub, returns an error:
///
/// example/index.html -> NOT_SERVED error
- ///
- /// This cannot currently be used to access assets in other packages aside
- /// from the root. Nor can it be used to access assets in the root package's
- /// "lib" or "asset" directories.
- ///
- /// lib/myapp.dart -> BAD_ARGUMENT error
- Map _assetIdToUrls(Map command) {
- // TODO(rnystrom): Support assets in other packages. See #17146.
+ Map _pathToUrls(Map command) {
var assetPath = _validateString(command, "path");
-
- if (!path.url.isRelative(assetPath)) {
- throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
- '"path" must be a relative path. Got "$assetPath".');
- }
-
- if (!path.url.isWithin(".", assetPath)) {
- throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
- '"path" cannot reach out of its containing directory. '
- 'Got "$assetPath".');
- }
-
var line = _validateOptionalInt(command, "line");
- // Find all of the servers whose root directories contain the asset and
- // generate appropriate URLs for each.
- var urls = _environment.servers
- .where((server) => path.url.isWithin(server.rootAssetPath, assetPath))
- .map((server) =>
- "http://${server.address.host}:${server.port}/" +
- path.url.relative(assetPath, from: server.rootAssetPath))
- .toList();
-
+ var urls = _environment.getUrlsForAssetPath(assetPath);
if (urls.isEmpty) {
throw new _WebSocketException(_ErrorCode.NOT_SERVED,
'Asset path "$assetPath" is not currently being served.');
}
- var result = {"urls": urls};
+ var result = {"urls": urls.map((url) => url.toString()).toList()};
// Map the line.
// TODO(rnystrom): Right now, source maps are not supported and it just
- // passes through the original line. This lets the editor start using this
- // API before we've fully implemented it. See #12339 and #16061.
+ // passes through the original line. This lets the editor start using
+ // this API before we've fully implemented it. See #12339 and #16061.
if (line != null) result["line"] = line;
return result;
}
+ /// Given a relative directory path within the entrypoint package, binds a
+ /// new port to serve from that path and returns its URL.
+ ///
+ /// The command name is "serveDirectory" and it takes a "path" key (a native
+ /// OS path relative to the root of the entrypoint package) for the directory
+ /// being served:
+ ///
+ /// {
+ /// "command": "serveDirectory",
+ /// "path": "example/awesome"
+ /// }
+ ///
+ /// If successful, it returns a map containing the URL that can be used to
+ /// access the directory.
+ ///
+ /// {
+ /// "url": "http://localhost:8083"
+ /// }
+ ///
+ /// If the directory is already being served, returns the previous URL.
+ Future<Map> _serveDirectory(Map command) {
+ var rootDirectory = _validateRelativePath(command, "path");
+ return _environment.serveDirectory(rootDirectory).then((server) {
+ return {
+ "url": server.url.toString()
+ };
+ });
+ }
+
+ /// Given a relative directory path within the entrypoint package, unbinds
+ /// the server previously bound to that directory and returns its (now
+ /// unreachable) URL.
+ ///
+ /// The command name is "unserveDirectory" and it takes a "path" key (a
+ /// native OS path relative to the root of the entrypoint package) for the
+ /// directory being unserved:
+ ///
+ /// {
+ /// "command": "unserveDirectory",
+ /// "path": "example/awesome"
+ /// }
+ ///
+ /// If successful, it returns a map containing the URL that used to be used
+ /// to access the directory.
+ ///
+ /// {
+ /// "url": "http://localhost:8083"
+ /// }
+ ///
+ /// If no server is bound to that directory, it returns a `NOT_SERVED` error.
+ Future<Map> _unserveDirectory(Map command) {
+ var rootDirectory = _validateRelativePath(command, "path");
+ return _environment.unserveDirectory(rootDirectory).then((url) {
+ if (url == null) {
+ throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+ 'Directory "$rootDirectory" is not bound to a server.');
+ }
+
+ return {"url": url.toString()};
+ });
+ }
+
/// Validates that [command] has a field named [key] whose value is a string.
///
/// Returns the string if found, or throws a [_WebSocketException] if
/// validation failed.
- String _validateString(Map command, String key) {
- if (!command.containsKey(key)) {
+ String _validateString(Map command, String key, {bool optional: false}) {
+ if (!optional && !command.containsKey(key)) {
throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
'Missing "$key" argument.');
}
var field = command[key];
if (field is String) return field;
+ if (field == null && optional) return null;
throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
'"$key" must be a string. Got ${JSON.encode(field)}.');
}
+ /// Validates that [command] has a field named [key] whose value is a string
+ /// containing a relative path that doesn't reach out of the entrypoint
+ /// package's root directory.
+ ///
+ /// Returns the path if found, or throws a [_WebSocketException] if
+ /// validation failed.
+ String _validateRelativePath(Map command, String key) {
+ var pathString = _validateString(command, key);
+
+ if (!path.isRelative(pathString)) {
+ throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+ '"$key" must be a relative path. Got "$pathString".');
+ }
+
+ if (!path.isWithin(".", pathString)) {
+ throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+ '"$key" cannot reach out of its containing directory. '
+ 'Got "$pathString".');
+ }
+
+ return pathString;
+ }
+
/// Validates that if [command] has a field named [key], then its value is a
/// number.
///
@@ -306,7 +410,9 @@
}
/// Function for processing a single web socket command.
-typedef Map _CommandHandler(Map command);
+///
+/// It can return a [Map] or a [Future] that completes to one.
+typedef _CommandHandler(Map command);
/// Web socket API error codenames.
class _ErrorCode {
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index d57be72..d7a6e8e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -27,7 +27,7 @@
/// Handles the `build` pub command.
class BuildCommand extends PubCommand {
String get description => "Apply transformers to build a package.";
- String get usage => "pub build [options]";
+ String get usage => "pub build [options] [directories...]";
List<String> get aliases => const ["deploy", "settle-up"];
bool get takesArguments => true;
@@ -62,6 +62,7 @@
_parseBuildDirectories();
cleanDir(target);
+ var environment;
var errorsJson = [];
var logJson = [];
@@ -69,9 +70,17 @@
// user-facing, just use an IPv4 address to avoid a weird bug on the
// OS X buildbots.
return BuildEnvironment.create(entrypoint, "127.0.0.1", 0, mode,
- WatcherType.NONE, buildDirectories, useDart2JS: true)
- .then((environment) {
+ WatcherType.NONE, useDart2JS: true)
+ .then((env) {
+ environment = env;
+ // Register all of the build directories.
+ // TODO(rnystrom): We don't actually need to bind servers for these, we
+ // just need to add them to barback's sources. Add support to
+ // BuildEnvironment for going the latter without the former.
+ return Future.wait(buildDirectories.map(
+ (dir) => environment.serveDirectory(dir)));
+ }).then((_) {
// Show in-progress errors, but not results. Those get handled implicitly
// by getAllAssets().
environment.barback.errors.listen((error) {
@@ -285,7 +294,7 @@
var entrypointDirs = entrypoints
// Convert the asset path to a native-separated one and get the
// directory containing the entrypoint.
- .map((id) => path.dirname(path.joinAll(path.url.split(id.path))))
+ .map((id) => path.dirname(path.fromUri(id.path)))
// Don't copy files to the top levels of the build directories since
// the normal lib asset copying will take care of that.
.where((dir) => dir.contains(path.separator))
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 9bf6876..f43cc3a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -39,6 +39,10 @@
/// The build mode.
BarbackMode get mode => new BarbackMode(commandOptions['mode']);
+ /// This completer is used to keep pub running (by not completing) and to
+ /// pipe fatal errors to pub's top-level error-handling machinery.
+ final _completer = new Completer();
+
ServeCommand() {
commandParser.addOption('port', defaultsTo: '8080',
help: 'The base port to listen on.');
@@ -68,82 +72,98 @@
return flushThenExit(exit_codes.USAGE);
}
+ var directories = _parseDirectoriesToServe();
+
var watcherType = commandOptions['force-poll'] ?
WatcherType.POLLING : WatcherType.AUTO;
return BuildEnvironment.create(entrypoint, hostname, port, mode,
- watcherType, _directoriesToServe,
- useDart2JS: useDart2JS).then((environment) {
+ watcherType, useDart2JS: useDart2JS).then((environment) {
- // In release mode, strip out .dart files since all relevant ones have
- // been compiled to JavaScript already.
- if (mode == BarbackMode.RELEASE) {
- for (var server in environment.servers) {
- server.allowAsset = (url) => !url.path.endsWith(".dart");
- }
- }
-
- /// This completer is used to keep pub running (by not completing) and
- /// to pipe fatal errors to pub's top-level error-handling machinery.
- var completer = new Completer();
-
- environment.barback.errors.listen((error) {
- log.error(log.red("Build error:\n$error"));
- });
-
- environment.barback.results.listen((result) {
- if (result.succeeded) {
- // TODO(rnystrom): Report using growl/inotify-send where available.
- log.message("Build completed ${log.green('successfully')}");
- } else {
- log.message("Build completed with "
- "${log.red(result.errors.length)} errors.");
- }
- }, onError: (error, [stackTrace]) {
- if (!completer.isCompleted) completer.completeError(error, stackTrace);
- });
-
- var directoryLength = environment.servers
- .map((server) => server.rootDirectory.length)
+ var directoryLength = directories.map((dir) => dir.length)
.reduce(math.max);
- for (var server in environment.servers) {
- // Add two characters to account for "[" and "]".
- var directoryPrefix = log.gray(
- padRight("[${server.rootDirectory}]", directoryLength + 2));
- server.results.listen((result) {
- if (result.isSuccess) {
- log.message("$directoryPrefix ${log.green('GET')} "
- "${result.url.path} $_arrow ${result.id}");
- return;
- }
- var msg = "$directoryPrefix ${log.red('GET')} ${result.url.path} "
- "$_arrow";
- var error = result.error.toString();
- if (error.contains("\n")) {
- log.message("$msg\n${prefixLines(error)}");
- } else {
- log.message("$msg $error");
- }
- }, onError: (error, [stackTrace]) {
- if (completer.isCompleted) return;
- completer.completeError(error, stackTrace);
+ // Start up the servers. We pause updates while this is happening so that
+ // we don't log spurious build results in the middle of listing out the
+ // bound servers.
+ environment.pauseUpdates();
+ return Future.forEach(directories, (directory) {
+ return _startServer(environment, directory, directoryLength);
+ }).then((_) {
+ // Now that the servers are up and logged, send them to barback.
+ environment.barback.errors.listen((error) {
+ log.error(log.red("Build error:\n$error"));
});
- log.message("Serving ${entrypoint.root.name} "
- "${padRight(server.rootDirectory, directoryLength)} "
- "on ${log.bold('http://$hostname:${server.port}')}");
- }
+ environment.barback.results.listen((result) {
+ if (result.succeeded) {
+ // TODO(rnystrom): Report using growl/inotify-send where available.
+ log.message("Build completed ${log.green('successfully')}");
+ } else {
+ log.message("Build completed with "
+ "${log.red(result.errors.length)} errors.");
+ }
+ }, onError: (error, [stackTrace]) {
+ if (!_completer.isCompleted) {
+ _completer.completeError(error, stackTrace);
+ }
+ });
- return completer.future;
+ environment.resumeUpdates();
+ return _completer.future;
+ });
});
}
- /// Returns the set of directories that will be served from servers exposed to
- /// the user.
+ Future _startServer(BuildEnvironment environment, String rootDirectory,
+ int directoryLength) {
+ return environment.serveDirectory(rootDirectory).then((server) {
+ // In release mode, strip out .dart files since all relevant ones have
+ // been compiled to JavaScript already.
+ if (mode == BarbackMode.RELEASE) {
+ server.allowAsset = (url) => !url.path.endsWith(".dart");
+ }
+
+ // Add two characters to account for "[" and "]".
+ var prefix = log.gray(
+ padRight("[${server.rootDirectory}]", directoryLength + 2));
+
+ server.results.listen((result) {
+ var buffer = new StringBuffer();
+ buffer.write("$prefix ");
+
+ if (result.isSuccess) {
+ buffer.write(
+ "${log.green('GET')} ${result.url.path} $_arrow ${result.id}");
+ } else {
+ buffer.write("${log.red('GET')} ${result.url.path} $_arrow");
+
+ var error = result.error.toString();
+ if (error.contains("\n")) {
+ buffer.write("\n${prefixLines(error)}");
+ } else {
+ buffer.write(" $error");
+ }
+ }
+
+ log.message(buffer);
+
+ }, onError: (error, [stackTrace]) {
+ if (_completer.isCompleted) return;
+ _completer.completeError(error, stackTrace);
+ });
+
+ log.message("Serving ${entrypoint.root.name} "
+ "${padRight(server.rootDirectory, directoryLength)} "
+ "on ${log.bold('http://$hostname:${server.port}')}");
+ });
+ }
+
+ /// Returns the set of directories that will be served from servers exposed
+ /// to the user.
///
/// Throws a [UsageException] if the command-line arguments are invalid.
- List<String> get _directoriesToServe {
+ List<String> _parseDirectoriesToServe() {
if (commandOptions.rest.isEmpty) {
var directories = ['web', 'test'].where(dirExists).toList();
if (directories.isNotEmpty) return directories;
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 530c798..9e84360 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -16,6 +16,7 @@
import '../../../compiler/implementation/filenames.dart'
show appendSlash;
+import '../../asset/dart/serialize.dart';
import 'io.dart';
import 'sdk.dart' as sdk;
import 'utils.dart';
@@ -170,44 +171,3 @@
});
});
}
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
- /// The name of the type of exception thrown.
- ///
- /// This is the return value of [error.runtimeType.toString()]. Keep in mind
- /// that objects in different libraries may have the same type name.
- final String type;
-
- /// The exception's message, or its [toString] if it didn't expose a `message`
- /// property.
- final String message;
-
- /// The exception's stack chain, or `null` if no stack chain was available.
- final Chain stackTrace;
-
- /// Loads a [CrossIsolateException] from a serialized representation.
- ///
- /// [error] should be the result of [CrossIsolateException.serialize].
- CrossIsolateException.deserialize(Map error)
- : type = error['type'],
- message = error['message'],
- stackTrace = error['stack'] == null ? null :
- new Chain.parse(error['stack']);
-
- /// Serializes [error] to an object that can safely be passed across isolate
- /// boundaries.
- static Map serialize(error, [StackTrace stack]) {
- if (stack == null && error is Error) stack = error.stackTrace;
- return {
- 'type': error.runtimeType.toString(),
- 'message': getErrorMessage(error),
- 'stack': stack == null ? null : new Chain.forTrace(stack).toString()
- };
- }
-
- String toString() => "$message\n$stackTrace";
-}
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index e05713d..fd5af92 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -398,13 +398,13 @@
bool get runningFromSdk => Platform.script.path.endsWith('.snapshot');
/// Resolves [target] relative to the path to pub's `resource` directory.
-String resourcePath(String target) {
+String assetPath(String target) {
if (runningFromSdk) {
return path.join(
- sdk.rootDirectory, 'lib', '_internal', 'pub', 'resource', target);
+ sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target);
} else {
return path.join(
- path.dirname(libraryPath('pub.io')), '..', '..', 'resource', target);
+ path.dirname(libraryPath('pub.io')), '..', '..', 'asset', target);
}
}
@@ -722,7 +722,7 @@
}
String get pathTo7zip {
- if (runningFromSdk) return resourcePath(path.join('7zip', '7za.exe'));
+ if (runningFromSdk) return assetPath(path.join('7zip', '7za.exe'));
return path.join(repoRoot, 'third_party', '7zip', '7za.exe');
}
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 07a1195..0b93b3f 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -13,6 +13,7 @@
import 'package:stack_trace/stack_trace.dart';
import 'io.dart';
+import 'progress.dart';
import 'transcript.dart';
import 'utils.dart';
@@ -36,12 +37,8 @@
/// [recordTranscript()] is called.
Transcript<Entry> _transcript;
-/// The timer used to write "..." during a progress log.
-Timer _progressTimer;
-
-/// The progress message as it's being incrementally appended. When the
-/// progress is done, a single entry will be added to the log for it.
-String _progressMessage;
+/// The currently-running progress indicator or `null` if there is none.
+Progress _progress;
final _cyan = getSpecial('\u001b[36m');
final _green = getSpecial('\u001b[32m');
@@ -224,23 +221,30 @@
stderr.writeln('---- End log transcript ----');
}
-/// Prints [message] then slowly prints additional "..." after it until the
-/// future returned by [callback] completes. If anything else is logged during
-/// this, it cancels the progress.
+/// Prints [message] then displays an updated elapsed time until the future
+/// returned by [callback] completes. If anything else is logged during this
+/// (include another call to [progress]) that cancels the progress.
Future progress(String message, Future callback()) {
- if (json.enabled) return callback();
+ _stopProgress();
+ _progress = new Progress(message);
+ return callback().whenComplete(() {
+ var message = _stopProgress();
- if (_progressTimer != null) throw new StateError("Already in progress.");
-
- _progressMessage = '$message...';
- stdout.write(_progressMessage);
-
- _progressTimer = new Timer.periodic(new Duration(milliseconds: 500), (_) {
- stdout.write('.');
- _progressMessage += '.';
+ // Add the progress message to the transcript.
+ if (_transcript != null && message != null) {
+ _transcript.add(new Entry(Level.MESSAGE, [message]));
+ }
});
+}
- return callback().whenComplete(_stopProgress);
+/// Stops the running progress indicator, if currently running.
+///
+/// Returns the final progress message, if any, otherwise `null`.
+String _stopProgress() {
+ if (_progress == null) return null;
+ var message = _progress.stop();
+ _progress = null;
+ return message;
}
/// Wraps [text] in the ANSI escape codes to make it bold when on a platform
@@ -287,23 +291,6 @@
/// do not prevent the user's goal from being reached.
String yellow(text) => "$_yellow$text$_none";
-/// Stops the running progress indicator, if currently running.
-_stopProgress() {
- if (_progressTimer == null) return;
-
- // Stop the timer.
- _progressTimer.cancel();
- _progressTimer = null;
- stdout.writeln();
-
- // Add the progress message to the transcript.
- if (_transcript != null) {
- _transcript.add(new Entry(Level.MESSAGE, [_progressMessage]));
- }
-
- _progressMessage = null;
-}
-
/// Sets the verbosity to "normal", which shows errors, warnings, and messages.
void showNormal() {
_loggers[Level.ERROR] = _logToStderr;
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
new file mode 100644
index 0000000..059d480
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.progress;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'log.dart' as log;
+
+/// A live-updating progress indicator for long-running log entries.
+class Progress {
+ /// The timer used to write "..." during a progress log.
+ Timer _timer;
+
+ /// The [Stopwatch] used to track how long a progress log has been running.
+ final _stopwatch = new Stopwatch();
+
+ /// The progress message as it's being incrementally appended. When the
+ /// progress is done, a single entry will be added to the log for it.
+ final String _message;
+
+ Progress(this._message) {
+ _stopwatch.start();
+
+ if (log.json.enabled) return;
+
+ // Only animate if we're writing to a TTY in human format.
+ if (stdioType(stdout) == StdioType.TERMINAL) {
+ _update();
+ _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
+ _update();
+ });
+ } else {
+ stdout.write("$_message... ");
+ }
+ }
+
+ /// Stops the progress indicator.
+ ///
+ /// Returns the complete final progress message.
+ String stop() {
+ _stopwatch.stop();
+
+ // If we aren't animating, just log the final time.
+ if (log.json.enabled) {
+ // Do nothing.
+ } else if (_timer == null) {
+ stdout.writeln(_time);
+ } else {
+ _timer.cancel();
+
+ // Show one final update.
+ _update();
+ stdout.writeln();
+ }
+
+ return "$_message... ${_time}";
+ }
+
+ /// Gets the current progress time as a parenthesized, formatted string.
+ String get _time {
+ var elapsed = _stopwatch.elapsed;
+ var time = "(";
+
+ // TODO(rnystrom): Move this somewhere reusable.
+ if (elapsed.inMinutes > 0) {
+ time += "${elapsed.inMinutes}:";
+ }
+
+ var s = elapsed.inSeconds % 59;
+ var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
+ return time + "$s.${ms}s)";
+ }
+
+ /// Refreshes the progress line.
+ void _update() {
+ stdout.write("\r$_message... ");
+
+ // Show the time only once it gets noticeably long.
+ if (_stopwatch.elapsed.inSeconds > 0) {
+ stdout.write(log.gray(_time));
+ }
+ }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 2584bc4..afdf94f 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -18,7 +18,9 @@
import 'package:path/path.dart' as path;
import "package:stack_trace/stack_trace.dart";
-import 'dart.dart';
+import '../../asset/dart/serialize.dart';
+
+export '../../asset/dart/utils.dart';
/// A pair of values.
class Pair<E, F> {
@@ -78,53 +80,6 @@
Future<List> get future => _completer.future;
}
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes.
-///
-/// If [future] completes to an error, the return value will emit that error and
-/// then close.
-///
-/// If [broadcast] is true, a broadcast stream is returned. This assumes that
-/// the stream returned by [future] will be a broadcast stream as well.
-/// [broadcast] defaults to false.
-Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
- var subscription;
- var controller;
-
- future = future.catchError((e, stackTrace) {
- // Since [controller] is synchronous, it's likely that emitting an error
- // will cause it to be cancelled before we call close.
- if (controller != null) controller.addError(e, stackTrace);
- if (controller != null) controller.close();
- controller = null;
- });
-
- onListen() {
- future.then((stream) {
- if (controller == null) return;
- subscription = stream.listen(
- controller.add,
- onError: controller.addError,
- onDone: controller.close);
- });
- }
-
- onCancel() {
- if (subscription != null) subscription.cancel();
- subscription = null;
- controller = null;
- }
-
- if (broadcast) {
- controller = new StreamController.broadcast(
- sync: true, onListen: onListen, onCancel: onCancel);
- } else {
- controller = new StreamController(
- sync: true, onListen: onListen, onCancel: onCancel);
- }
- return controller.stream;
-}
-
/// Like [new Future], but avoids around issue 11911 by using [new Future.value]
/// under the covers.
Future newFuture(callback()) => new Future.value().then((_) => callback());
@@ -233,14 +188,14 @@
/// Creates a URL string for [address]:[port].
///
/// Handles properly formatting IPv6 addresses.
-String baseUrlForAddress(InternetAddress address, int port) {
+Uri baseUrlForAddress(InternetAddress address, int port) {
// IPv6 addresses in URLs need to be enclosed in square brackets to avoid
// URL ambiguity with the ":" in the address.
if (address.type == InternetAddressType.IP_V6) {
- return "http://[${address.address}]:$port";
+ return new Uri(scheme: "http", host: "[${address.address}]", port: port);
}
- return "http://${address.address}:$port";
+ return new Uri(scheme: "http", host: address.address, port: port);
}
/// Flattens nested lists inside an iterable into a single list containing only
@@ -523,25 +478,6 @@
return controller.stream;
}
-/// Returns a [Stream] that will emit the same values as the stream returned by
-/// [callback].
-///
-/// [callback] will only be called when the returned [Stream] gets a subscriber.
-Stream callbackStream(Stream callback()) {
- var subscription;
- var controller;
- controller = new StreamController(onListen: () {
- subscription = callback().listen(controller.add,
- onError: controller.addError,
- onDone: controller.close);
- },
- onCancel: () => subscription.cancel(),
- onPause: () => subscription.pause(),
- onResume: () => subscription.resume(),
- sync: true);
- return controller.stream;
-}
-
/// A regular expression matching a trailing CR character.
final _trailingCR = new RegExp(r"\r$");
@@ -828,17 +764,6 @@
return buffer.toString();
}
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
- error.toString().replaceFirst(_exceptionPrefix, '');
-
/// An exception class for exceptions that are intended to be seen by the user.
/// These exceptions won't have any debugging information printed when they're
/// thrown.
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 35bb8c3..084cf7e 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -4,8 +4,13 @@
test/hosted/version_negotiation_test: Pass, Timeout # Issue 14346
+
+[ $runtime == vm && $system == macos ]
+test/serve/web_socket/path_to_urls_test: Skip # Issue 17601
+
[ $runtime == vm && $system == windows ]
test/serve/warns_on_assets_paths_test: Pass, Fail # Issue 15741
+test/transformer/can_log_messages_test: Pass, Fail # Issue 17603
# Pub only runs on the VM, so just rule out all compilers.
[ $compiler == dart2js || $compiler == dart2dart ]
diff --git a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
index 3f3868c..37413b5 100644
--- a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
+++ b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
@@ -18,7 +18,7 @@
error: '''
Build directory names are not allowed if "--all" is passed.
- Usage: pub build [options]
+ Usage: pub build [options] [directories...]
-h, --help Print usage information for this command.
--format How output should be displayed.
[text (default), json]
diff --git a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
index bd0db68..e899b41 100644
--- a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
@@ -30,6 +30,7 @@
]).create();
var pub = startPub(args: ["build"]);
+ pub.stdout.expect(startsWith("Loading source assets..."));
pub.stdout.expect(startsWith("Building myapp..."));
var consumeFile = consumeThrough(inOrder([
diff --git a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
index 73b2b65..8ecc742 100644
--- a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
@@ -17,7 +17,7 @@
Unsupported build directories "bar" and "foo".
The allowed directories are "benchmark", "bin", "example", "test" and "web".
- Usage: pub build [options]
+ Usage: pub build [options] [directories...]
-h, --help Print usage information for this command.
--format How output should be displayed.
[text (default), json]
diff --git a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
index e549750..76d00e9 100644
--- a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
@@ -32,7 +32,7 @@
request.response.close();
});
- pub.stdout.expect(matches(r'Uploading\.\.\.+'));
+ pub.stdout.expect(startsWith('Uploading...'));
pub.stdout.expect('Package test_pkg 1.0.0 uploaded!');
pub.shouldExit(exit_codes.SUCCESS);
});
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index a96f273..e127999 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -5,6 +5,7 @@
import 'dart:convert';
import 'package:scheduled_test/scheduled_server.dart';
+import 'package:scheduled_test/scheduled_test.dart';
import '../descriptor.dart' as d;
import '../test_pub.dart';
@@ -32,7 +33,7 @@
});
pub.stderr.expect('OAuth2 authorization failed (your token sucks).');
- pub.stdout.expect('Uploading...');
+ pub.stdout.expect(startsWith('Uploading...'));
pub.kill();
});
}
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 9de35b3..a830da4 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -150,6 +150,9 @@
_pubServer.stdout.expect(consumeThrough("Got dependencies!"));
}
+ _pubServer.stdout.expect(startsWith("Loading source assets..."));
+ _pubServer.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+
// The server should emit one or more ports.
_pubServer.stdout.expect(
consumeWhile(predicate(_parsePort, 'emits server url')));
@@ -236,6 +239,17 @@
}, "request $urlPath");
}
+/// Schedules an HTTP request to the (theoretically) running pub server with
+/// [urlPath] and verifies that it cannot be connected to.
+///
+/// [root] indicates which server should be accessed, and defaults to "web".
+void requestShouldNotConnect(String urlPath, {String root}) {
+ schedule(() {
+ return expect(http.get(_getServerUrlSync(root, urlPath)),
+ throwsA(new isInstanceOf<SocketException>()));
+ }, "request $urlPath");
+}
+
/// Reads lines from pub serve's stdout until it prints the build success
/// message.
///
@@ -270,19 +284,21 @@
///
/// Only one of [replyEquals] or [replyMatches] may be provided.
///
-/// [request] and [replyMatches] may contain futures, in which case this will
-/// wait until they've completed before matching.
+/// [request], [replyEquals], and [replyMatches] may contain futures, in which
+/// case this will wait until they've completed before matching.
///
/// If [encodeRequest] is `false`, then [request] will be sent as-is over the
/// socket. It omitted, request is JSON encoded to a string first.
-void expectWebSocketCall(request, {Map replyEquals, replyMatches,
+///
+/// Returns a [Future] that completes to the call's response.
+Future<Map> expectWebSocketCall(request, {Map replyEquals, replyMatches,
bool encodeRequest: true}) {
assert((replyEquals == null) != (replyMatches == null));
- schedule(() => _ensureWebSocket().then((_) {
+ return schedule(() => _ensureWebSocket().then((_) {
var matcherFuture;
if (replyMatches != null) {
- matcherFuture = new Future.value(replyMatches);
+ matcherFuture = awaitObject(replyMatches);
} else {
matcherFuture = awaitObject(replyEquals).then((reply) => equals(reply));
}
@@ -293,7 +309,9 @@
_webSocket.add(completeRequest);
return _webSocketBroadcastStream.first.then((value) {
- expect(JSON.decode(value), matcher);
+ value = JSON.decode(value);
+ expect(value, matcher);
+ return value;
});
});
});
@@ -309,6 +327,14 @@
Future<String> getServerUrl([String root, String path]) =>
_portsCompleter.future.then((_) => _getServerUrlSync(root, path));
+/// Records that [root] has been bound to [port].
+///
+/// Used for testing the Web Socket API for binding new root directories to
+/// ports after pub serve has been started.
+registerServerPort(String root, int port) {
+ _ports[root] = port;
+}
+
/// Returns a URL string for the server serving [path] from [root].
///
/// If [root] is omitted, defaults to "web". If [path] is omitted, no path is
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
deleted file mode 100644
index f438c78..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
- // TODO(rnystrom): Split into independent tests.
- initConfig();
- integration("assetIdToUrls errors on bad inputs", () {
- d.dir(appPath, [
- d.appPubspec(),
- d.file("top-level.txt", "top-level"),
- d.dir("asset", [
- d.file("foo.txt", "foo"),
- ]),
- d.dir("bin", [
- d.file("foo.txt", "foo"),
- ]),
- d.dir("lib", [
- d.file("myapp.dart", "myapp"),
- ])
- ]).create();
-
- pubServe();
-
- // Bad arguments.
- expectWebSocketCall({
- "command": "assetIdToUrls"
- }, replyEquals: {
- "code": "BAD_ARGUMENT",
- "error": 'Missing "path" argument.'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": 123
- }, replyEquals: {
- "code": "BAD_ARGUMENT",
- "error": '"path" must be a string. Got 123.'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "/absolute.txt"
- }, replyEquals: {
- "code": "BAD_ARGUMENT",
- "error": '"path" must be a relative path. Got "/absolute.txt".'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "a/../../bad.txt"
- }, replyEquals: {
- "code": "BAD_ARGUMENT",
- "error":
- '"path" cannot reach out of its containing directory. '
- 'Got "a/../../bad.txt".'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "main.dart",
- "line": 12.34
- }, replyEquals: {
- "code": "BAD_ARGUMENT",
- "error": '"line" must be an integer. Got 12.34.'
- });
-
- // Unserved directories.
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "bin/foo.txt"
- }, replyEquals: {
- "code": "NOT_SERVED",
- "error": 'Asset path "bin/foo.txt" is not currently being served.'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "lib/myapp.dart"
- }, replyEquals: {
- "code": "NOT_SERVED",
- "error": 'Asset path "lib/myapp.dart" is not currently being served.'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "asset/myapp.dart"
- }, replyEquals: {
- "code": "NOT_SERVED",
- "error": 'Asset path "asset/myapp.dart" is not currently being served.'
- });
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "nope/foo.txt"
- }, replyEquals: {
- "code": "NOT_SERVED",
- "error": 'Asset path "nope/foo.txt" is not currently being served.'
- });
-
- endPubServe();
- });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
deleted file mode 100644
index 6b02fb0..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
- // TODO(rnystrom): Split into independent tests.
- initConfig();
- integration("assetIdToUrls converts asset ids to matching URL paths", () {
- d.dir(appPath, [
- d.appPubspec(),
- d.dir("test", [
- d.file("index.html", "<body>"),
- d.dir("sub", [
- d.file("bar.html", "bar"),
- ])
- ]),
- d.dir("web", [
- d.file("index.html", "<body>"),
- d.dir("sub", [
- d.file("bar.html", "bar"),
- ])
- ]),
- d.dir("randomdir", [
- d.file("index.html", "<body>")
- ])
- ]).create();
-
- pubServe(args: ["test", "web", "randomdir"]);
-
- schedule(() {
- // Paths in web/.
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/index.html"
- }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/sub/bar.html"
- }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
-
- // Paths in test/.
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "test/index.html"
- }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
-
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "test/sub/bar.html"
- }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
-
- // A non-default directory.
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "randomdir/index.html"
- }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
- });
-
- endPubServe();
- });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
index 12bc06f..4adbd23 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
@@ -11,26 +11,20 @@
main() {
initConfig();
- integration("assetIdToUrls provides output line if given source", () {
+ integration("an error includes id in response if given", () {
d.dir(appPath, [
d.appPubspec(),
d.dir("web", [
- d.file("main.dart", "main"),
+ d.file("index.html", "<body>")
])
]).create();
pubServe();
- schedule(() {
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/main.dart",
- "line": 12345
- }, replyEquals: {
- "urls": [getServerUrl("web", "main.dart")],
- "line": 12345
- });
- });
+ expectWebSocketCall({
+ "command": "bad command",
+ "id": "some id"
+ }, replyMatches: containsPair("id", "some id"));
endPubServe();
});
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
new file mode 100644
index 0000000..ac77a1c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ // TODO(rnystrom): Split into independent tests.
+ initConfig();
+ integration("pathToUrls errors on bad inputs", () {
+ d.dir("foo", [
+ d.libPubspec("foo", "1.0.0"),
+ d.dir("web", [
+ d.file("foo.txt", "foo")
+ ])
+ ]).create();
+
+ d.dir(appPath, [
+ d.appPubspec({"foo": {"path": "../foo"}}),
+ d.file("top-level.txt", "top-level"),
+ d.dir("asset", [
+ d.file("foo.txt", "foo"),
+ ]),
+ d.dir("bin", [
+ d.file("foo.txt", "foo"),
+ ]),
+ d.dir("lib", [
+ d.file("myapp.dart", "myapp"),
+ ])
+ ]).create();
+
+ pubServe(shouldGetFirst: true);
+
+ // Bad arguments.
+ expectWebSocketCall({
+ "command": "pathToUrls"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": 'Missing "path" argument.'
+ });
+
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": 123
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"path" must be a string. Got 123.'
+ });
+
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": "main.dart",
+ "line": 12.34
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"line" must be an integer. Got 12.34.'
+ });
+
+ // Unserved directories.
+ expectNotServed(p.join('bin', 'foo.txt'));
+ expectNotServed(p.join('nope', 'foo.txt'));
+ expectNotServed(p.join("..", "bar", "lib", "bar.txt"));
+ expectNotServed(p.join("..", "foo", "web", "foo.txt"));
+
+ endPubServe();
+ });
+}
+
+void expectNotServed(String path) {
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": path
+ }, replyEquals: {
+ "code": "NOT_SERVED",
+ "error": 'Asset path "$path" is not currently being served.'
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
index c5e35df..d31bf9d 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
@@ -14,7 +14,7 @@
main() {
// TODO(rnystrom): Split into independent tests.
initConfig();
- integration("assetIdToUrls returns multiple urls if servers overlap", () {
+ integration("pathToUrls returns multiple urls if servers overlap", () {
d.dir(appPath, [
d.appPubspec(),
d.dir("test", [
@@ -32,8 +32,8 @@
schedule(() {
expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/index.html"
+ "command": "pathToUrls",
+ "path": path.join("web", "index.html")
}, replyEquals: {
"urls": [
getServerUrl("web", "index.html")
@@ -41,8 +41,8 @@
});
expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/sub/bar.html"
+ "command": "pathToUrls",
+ "path": path.join("web", "sub", "bar.html")
}, replyEquals: {
"urls": [
getServerUrl("web", "sub/bar.html"),
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
index 12bc06f..f7db59e 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
@@ -4,33 +4,30 @@
library pub_tests;
+import 'package:path/path.dart' as p;
import 'package:scheduled_test/scheduled_test.dart';
+
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
import '../utils.dart';
main() {
initConfig();
- integration("assetIdToUrls provides output line if given source", () {
+ integration("pathToUrls includes id in response if given", () {
d.dir(appPath, [
d.appPubspec(),
d.dir("web", [
- d.file("main.dart", "main"),
+ d.file("index.html", "<body>")
])
]).create();
pubServe();
- schedule(() {
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/main.dart",
- "line": 12345
- }, replyEquals: {
- "urls": [getServerUrl("web", "main.dart")],
- "line": 12345
- });
- });
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "id": "some id",
+ "path": p.join("web", "index.html")
+ }, replyMatches: containsPair("id", "some id"));
endPubServe();
});
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
new file mode 100644
index 0000000..ce6b620
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ // TODO(rnystrom): Split into independent tests.
+ initConfig();
+ integration("pathToUrls converts asset ids to matching URL paths", () {
+ d.dir("foo", [
+ d.libPubspec("foo", "1.0.0"),
+ d.dir("lib", [
+ d.file("foo.dart", "foo() => null;")
+ ]),
+ d.dir("asset", [
+ d.file("foo.txt", "foo")
+ ]),
+ ]).create();
+
+ d.dir(appPath, [
+ d.appPubspec({"foo": {"path": "../foo"}}),
+ d.dir("test", [
+ d.file("index.html", "<body>"),
+ d.dir("sub", [
+ d.file("bar.html", "bar"),
+ ])
+ ]),
+ d.dir("lib", [
+ d.file("app.dart", "app() => null;")
+ ]),
+ d.dir("asset", [
+ d.file("app.txt", "app")
+ ]),
+ d.dir("web", [
+ d.file("index.html", "<body>"),
+ d.dir("sub", [
+ d.file("bar.html", "bar"),
+ ])
+ ]),
+ d.dir("randomdir", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ pubServe(args: ["test", "web", "randomdir"], shouldGetFirst: true);
+
+ // Paths in web/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("web", "index.html")
+ }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
+
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("web", "sub", "bar.html")
+ }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
+
+ // Paths in test/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("test", "index.html")
+ }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
+
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("test", "sub", "bar.html")
+ }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
+
+ // A non-default directory.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("randomdir", "index.html")
+ }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
+
+ // A path in lib/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("lib", "app.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "packages/myapp/app.dart"),
+ getServerUrl("web", "packages/myapp/app.dart"),
+ getServerUrl("randomdir", "packages/myapp/app.dart")
+ ]});
+
+ // A path in asset/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("asset", "app.txt")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "assets/myapp/app.txt"),
+ getServerUrl("web", "assets/myapp/app.txt"),
+ getServerUrl("randomdir", "assets/myapp/app.txt")
+ ]});
+
+ // A path to this package in packages/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("packages", "myapp", "app.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "packages/myapp/app.dart"),
+ getServerUrl("web", "packages/myapp/app.dart"),
+ getServerUrl("randomdir", "packages/myapp/app.dart")
+ ]});
+
+ // A path to another package in packages/.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("packages", "foo", "foo.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "packages/foo/foo.dart"),
+ getServerUrl("web", "packages/foo/foo.dart"),
+ getServerUrl("randomdir", "packages/foo/foo.dart")
+ ]});
+
+ // A relative path to another package's lib/ directory.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("..", "foo", "lib", "foo.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "packages/foo/foo.dart"),
+ getServerUrl("web", "packages/foo/foo.dart"),
+ getServerUrl("randomdir", "packages/foo/foo.dart")
+ ]});
+
+ // An absolute path to another package's lib/ directory.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join(sandboxDir, "foo", "lib", "foo.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "packages/foo/foo.dart"),
+ getServerUrl("web", "packages/foo/foo.dart"),
+ getServerUrl("randomdir", "packages/foo/foo.dart")
+ ]});
+
+ // A relative path to another package's asset/ directory.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join("..", "foo", "asset", "foo.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "assets/foo/foo.dart"),
+ getServerUrl("web", "assets/foo/foo.dart"),
+ getServerUrl("randomdir", "assets/foo/foo.dart")
+ ]});
+
+ // An absolute path to another package's asset/ directory.
+ expectWebSocketCall({
+ "command": "pathToUrls",
+ "path": p.join(sandboxDir, "foo", "asset", "foo.dart")
+ }, replyEquals: {"urls": [
+ getServerUrl("test", "assets/foo/foo.dart"),
+ getServerUrl("web", "assets/foo/foo.dart"),
+ getServerUrl("randomdir", "assets/foo/foo.dart")
+ ]});
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
similarity index 80%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
index 12bc06f..4bc8307 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
@@ -4,14 +4,16 @@
library pub_tests;
+import 'package:path/path.dart' as p;
import 'package:scheduled_test/scheduled_test.dart';
+
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
import '../utils.dart';
main() {
initConfig();
- integration("assetIdToUrls provides output line if given source", () {
+ integration("pathToUrls provides output line if given source", () {
d.dir(appPath, [
d.appPubspec(),
d.dir("web", [
@@ -23,8 +25,8 @@
schedule(() {
expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/main.dart",
+ "command": "pathToUrls",
+ "path": p.join("web", "main.dart"),
"line": 12345
}, replyEquals: {
"urls": [getServerUrl("web", "main.dart")],
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
deleted file mode 100644
index 2061748..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
- initConfig();
- integration("includes id in response if given with command", () {
- d.dir(appPath, [
- d.appPubspec(),
- d.dir("test", [
- d.file("index.html", "<body>"),
- d.dir("sub", [
- d.file("bar.html", "bar"),
- ])
- ]),
- d.dir("web", [
- d.file("index.html", "<body>"),
- d.dir("sub", [
- d.file("bar.html", "bar"),
- ])
- ]),
- d.dir("randomdir", [
- d.file("index.html", "<body>")
- ])
- ]).create();
-
- pubServe(args: ["test", "web", "randomdir"]);
-
- schedule(() {
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "id": "some id",
- "path": "web/index.html"
- }, replyMatches: containsPair("id", "some id"));
-
- expectWebSocketCall({
- "command": "urlToAssetId",
- "id": 12345,
- "url": getServerUrl("web", "index.html")
- }, replyMatches: containsPair("id", 12345));
- });
-
- endPubServe();
- });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
new file mode 100644
index 0000000..a3c8f0c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("returns the old URL if the directory is already served", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ pubServe();
+
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "path": "web"
+ }, replyMatches: {
+ "url": getServerUrl("web")
+ });
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..d0ffd78
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+
+ setUp(() {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+ });
+
+ integration("responds with an error if 'path' is missing", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "serveDirectory"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": 'Missing "path" argument.'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' is not a string", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "path": 123
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"path" must be a string. Got 123.'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' is absolute", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "path": "/absolute.txt"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"path" must be a relative path. Got "/absolute.txt".'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' reaches out", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "path": "a/../../bad.txt"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error":
+ '"path" cannot reach out of its containing directory. '
+ 'Got "a/../../bad.txt".'
+ });
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
index 12bc06f..e812e19 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
@@ -11,26 +11,24 @@
main() {
initConfig();
- integration("assetIdToUrls provides output line if given source", () {
+ integration("serveDirectory includes id in response if given", () {
d.dir(appPath, [
d.appPubspec(),
+ d.dir("example", [
+ d.file("index.html", "<body>")
+ ]),
d.dir("web", [
- d.file("main.dart", "main"),
+ d.file("index.html", "<body>")
])
]).create();
pubServe();
- schedule(() {
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/main.dart",
- "line": 12345
- }, replyEquals: {
- "urls": [getServerUrl("web", "main.dart")],
- "line": 12345
- });
- });
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "id": 12345,
+ "path": "example"
+ }, replyMatches: containsPair("id", 12345));
endPubServe();
});
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
new file mode 100644
index 0000000..876142f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("binds a directory to a new port", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("test", [
+ d.file("index.html", "<test body>")
+ ]),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ pubServe(args: ["web"]);
+
+ // Bind the new directory.
+ expectWebSocketCall({
+ "command": "serveDirectory",
+ "path": "test"
+ }, replyMatches: {"url": matches(r"http://127\.0\.0\.1:\d+")})
+ .then((response) {
+ var url = Uri.parse(response["url"]);
+ registerServerPort("test", url.port);
+ });
+
+ // It should be served now.
+ requestShouldSucceed("index.html", "<test body>", root: "test");
+
+ // And watched.
+ d.dir(appPath, [
+ d.dir("test", [
+ d.file("index.html", "after")
+ ])
+ ]).create();
+
+ waitForBuildSuccess();
+ requestShouldSucceed("index.html", "after", root: "test");
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..aaa3d9c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+
+ setUp(() {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+ });
+
+ integration("responds with an error if 'path' is missing", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "unserveDirectory"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": 'Missing "path" argument.'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' is not a string", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": 123
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"path" must be a string. Got 123.'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' is absolute", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": "/absolute.txt"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error": '"path" must be a relative path. Got "/absolute.txt".'
+ });
+ endPubServe();
+ });
+
+ integration("responds with an error if 'path' reaches out", () {
+ pubServe();
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": "a/../../bad.txt"
+ }, replyEquals: {
+ "code": "BAD_ARGUMENT",
+ "error":
+ '"path" cannot reach out of its containing directory. '
+ 'Got "a/../../bad.txt".'
+ });
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
new file mode 100644
index 0000000..7d80601
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("errors if the directory is not served", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ pubServe();
+
+ // Unbind the directory.
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": "test"
+ }, replyEquals: {
+ "code": "NOT_SERVED",
+ "error": 'Directory "test" is not bound to a server.'
+ });
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
new file mode 100644
index 0000000..20a4d2a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("unserveDirectory includes id in response if given", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("example", [
+ d.file("index.html", "<body>")
+ ]),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ // TODO(rnystrom): "example" is in here so that that's the port the web
+ // socket is bound to. That way, when we unserve "web", we don't close the
+ // web socket connection itself.
+ // Remove this when #16957 is fixed.
+ pubServe(args: ["example", "web"]);
+
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "id": 12345,
+ "path": "web"
+ }, replyMatches: containsPair("id", 12345));
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
new file mode 100644
index 0000000..c08ff4b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("when a subdirectory is unbound it is still watched because the "
+ "superdirectory is watching it", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("example", [
+ d.dir("one", [
+ d.file("foo.txt", "before")
+ ])
+ ])
+ ]).create();
+
+ var exampleOne = p.join("example", "one");
+ pubServe(args: ["example", exampleOne]);
+
+ requestShouldSucceed("one/foo.txt", "before", root: "example");
+ requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+ // Unbind the subdirectory.
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": exampleOne
+ }, replyEquals: {
+ "url": getServerUrl(exampleOne)
+ });
+
+ // "example/one" should not be served now.
+ requestShouldNotConnect("foo.txt", root: exampleOne);
+
+ // "example" is still fine.
+ requestShouldSucceed("one/foo.txt", "before", root: "example");
+
+ // And still being watched.
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("example", [
+ d.dir("one", [
+ d.file("foo.txt", "after")
+ ])
+ ])
+ ]).create();
+
+ waitForBuildSuccess();
+ requestShouldSucceed("one/foo.txt", "after", root: "example");
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
new file mode 100644
index 0000000..2cb5d2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("when a superdirectory is unbound it is still watched because "
+ "the subdirectory is watching it", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("example", [
+ d.dir("one", [
+ d.file("foo.txt", "before")
+ ])
+ ])
+ ]).create();
+
+ var exampleOne = p.join("example", "one");
+ pubServe(args: [exampleOne, "example"]);
+
+ requestShouldSucceed("one/foo.txt", "before", root: "example");
+ requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+ // Unbind the subdirectory.
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": "example"
+ }, replyEquals: {
+ "url": getServerUrl("example")
+ });
+
+ // "example" should not be served now.
+ requestShouldNotConnect("one/foo.txt", root: "example");
+
+ // "example/one" is still fine.
+ requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+ // And still being watched.
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("example", [
+ d.dir("one", [
+ d.file("foo.txt", "after")
+ ])
+ ])
+ ]).create();
+
+ waitForBuildSuccess();
+ requestShouldSucceed("foo.txt", "after", root: exampleOne);
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
new file mode 100644
index 0000000..361bb3f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+ initConfig();
+ integration("unbinds a directory from a port", () {
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir("test", [
+ d.file("index.html", "<test body>")
+ ]),
+ d.dir("web", [
+ d.file("index.html", "<body>")
+ ])
+ ]).create();
+
+ pubServe();
+
+ requestShouldSucceed("index.html", "<body>");
+ requestShouldSucceed("index.html", "<test body>", root: "test");
+
+ // Unbind the directory.
+ expectWebSocketCall({
+ "command": "unserveDirectory",
+ "path": "test"
+ }, replyEquals: {
+ "url": getServerUrl("test")
+ });
+
+ // "test" should not be served now.
+ requestShouldNotConnect("index.html", root: "test");
+
+ // "web" is still fine.
+ requestShouldSucceed("index.html", "<body>");
+
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
index 12bc06f..ce65421 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
@@ -11,26 +11,21 @@
main() {
initConfig();
- integration("assetIdToUrls provides output line if given source", () {
+ integration("urlToAssetId includes id in response if given", () {
d.dir(appPath, [
d.appPubspec(),
d.dir("web", [
- d.file("main.dart", "main"),
+ d.file("index.html", "<body>")
])
]).create();
pubServe();
- schedule(() {
- expectWebSocketCall({
- "command": "assetIdToUrls",
- "path": "web/main.dart",
- "line": 12345
- }, replyEquals: {
- "urls": [getServerUrl("web", "main.dart")],
- "line": 12345
- });
- });
+ expectWebSocketCall({
+ "command": "urlToAssetId",
+ "id": 12345,
+ "url": getServerUrl("web", "index.html")
+ }, replyMatches: containsPair("id", 12345));
endPubServe();
});
diff --git a/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
new file mode 100644
index 0000000..1d8954c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'dart:convert';
+
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+final transformer = """
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+
+class GetInputTransformer extends Transformer {
+ GetInputTransformer.asPlugin();
+
+ String get allowedExtensions => '.txt';
+
+ Future apply(Transform transform) {
+ return transform.readInputAsString(new AssetId('myapp', 'nonexistent'))
+ .catchError((error) {
+ if (error is! AssetNotFoundException) throw error;
+ transform.addOutput(new Asset.fromString(transform.primaryInput.id,
+ JSON.encode({
+ 'package': error.id.package,
+ 'path': error.id.path
+ })));
+ });
+ }
+}
+""";
+
+main() {
+ initConfig();
+ integration("AssetNotFoundExceptions are detectable", () {
+ d.dir(appPath, [
+ d.pubspec({
+ "name": "myapp",
+ "transformers": ["myapp/src/transformer"]
+ }),
+ d.dir("lib", [d.dir("src", [
+ d.file("transformer.dart", transformer)
+ ])]),
+ d.dir("web", [
+ d.file("foo.txt", "foo")
+ ])
+ ]).create();
+
+ createLockFile('myapp', pkg: ['barback']);
+
+ var server = pubServe();
+ requestShouldSucceed("foo.txt", JSON.encode({
+ "package": "myapp",
+ "path": "nonexistent"
+ }));
+ endPubServe();
+
+ // Since the AssetNotFoundException was caught and handled, the server
+ // shouldn't print any error information for it.
+ server.stderr.expect(isDone);
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
index c818a73..d80994b 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
@@ -4,6 +4,10 @@
library pub_tests;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
import '../descriptor.dart' as d;
import '../test_pub.dart';
@@ -52,19 +56,22 @@
createLockFile('myapp', pkg: ['barback']);
- schedulePub(args: ["build"],
- output: """
-Building myapp...
+ var pub = startPub(args: ["build"]);
+ pub.stdout.expect(startsWith("Loading source assets..."));
+ pub.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+ pub.stdout.expect(startsWith("Building myapp..."));
+
+ pub.stdout.expect(emitsLines("""
[Rewrite on myapp|web/foo.txt]:
-info!
-""",
- error: """
+info!"""));
+
+ pub.stderr.expect(emitsLines("""
[Rewrite on myapp|web/foo.txt with input myapp|web/foo.foo]:
Warning!
[Rewrite on myapp|web/foo.txt]:
http://fake.com/not_real.dart:2:1: ERROR!
-Build failed.
-""",
- exitCode: 65);
+Build failed."""));
+
+ pub.shouldExit(exit_codes.DATA);
});
}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
new file mode 100644
index 0000000..9b41b2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+ RewriteTransformer.asPlugin();
+
+ String get allowedExtensions => '.txt';
+
+ Future apply(Transform transform) {
+ transform.consumePrimary();
+ return transform.primaryInput.readAsString().then((contents) {
+ var id = transform.primaryInput.id.changeExtension(".out");
+ var asset = new Asset.fromString(id, "\$contents.out");
+ transform.addOutput(asset);
+ });
+ }
+}
+""";
+
+main() {
+ initConfig();
+ integration("a transform can use consumePrimary", () {
+ d.dir(appPath, [
+ d.pubspec({
+ "name": "myapp",
+ "transformers": ["myapp/src/transformer"]
+ }),
+ d.dir("lib", [d.dir("src", [
+ d.file("transformer.dart", TRANSFORMER)
+ ])]),
+ d.dir("web", [
+ d.file("foo.txt", "foo")
+ ])
+ ]).create();
+
+ createLockFile('myapp', pkg: ['barback']);
+
+ pubServe();
+ requestShouldSucceed("foo.out", "foo.out");
+ requestShould404("foo.txt");
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
new file mode 100644
index 0000000..543bf01
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+ RewriteTransformer.asPlugin();
+
+ String get allowedExtensions => '.txt';
+
+ Future apply(Transform transform) {
+ return Future.wait([
+ transform.hasInput(transform.primaryInput.id),
+ transform.hasInput(new AssetId('hooble', 'whatsit'))
+ ]).then((results) {
+ var id = transform.primaryInput.id.changeExtension(".out");
+ var asset = new Asset.fromString(id,
+ "primary: \${results[0]}, secondary: \${results[1]}");
+ transform.addOutput(asset);
+ });
+ }
+}
+""";
+
+main() {
+ initConfig();
+ integration("a transform can use hasInput", () {
+ d.dir(appPath, [
+ d.pubspec({
+ "name": "myapp",
+ "transformers": ["myapp/src/transformer"]
+ }),
+ d.dir("lib", [d.dir("src", [
+ d.file("transformer.dart", TRANSFORMER)
+ ])]),
+ d.dir("web", [
+ d.file("foo.txt", "foo")
+ ])
+ ]).create();
+
+ createLockFile('myapp', pkg: ['barback']);
+
+ pubServe();
+ requestShouldSucceed("foo.out", "primary: true, secondary: false");
+ endPubServe();
+ });
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
index 9bb02a5..cc84127 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
@@ -52,7 +52,7 @@
// Upgrade everything.
pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
. description_changed 1\.0\.0 from path \.\.[/\\]description_changed_2 \(was 1\.0\.0 from path \.\.[/\\]description_changed_1\)
. source_changed 2\.0\.0 from path \.\.[/\\]source_changed \(was 1\.0\.0\)
. unchanged 1\.0\.0
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index b442686..7925992 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -36,7 +36,7 @@
// Only upgrade "upgraded".
pubUpgrade(args: ["upgraded"], output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
not_upgraded 1\.0\.0
. upgraded 2\.0\.0 \(was 1\.0\.0\) \(1 newer unstable version available\)
""", multiLine: true));
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
index 6bbccc5..b91cd08 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
@@ -25,7 +25,7 @@
// Upgrade everything.
pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
! overridden 1\.0\.0 \(overridden\)
""", multiLine: true));
});
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
index 815f640..3d94d7a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
@@ -77,7 +77,7 @@
// Upgrade everything.
pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
\+ added .*
\* description_changed .*
< downgraded .*
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
index c887135..2de3d9a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -40,7 +40,7 @@
// Upgrade everything.
pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
. multiple_newer 1\.0\.0 \(1 newer version available\)
. multiple_newer_stable 1\.0\.0 \(2 newer versions available\)
. multiple_newer_unstable 1\.0\.0 \(2 newer unstable versions available\)
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index 7de40e6..adf54f1 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -43,8 +43,10 @@
* ## Stream
*
* A Stream provides an asynchronous sequence of data.
- * Examples of data sequences include user-generated events,
- * such as mouse clicks, and a stream of bytes read from a file.
+ * Examples of data sequences include individual events, like mouse clicks,
+ * or sequential chunks of larger data, like multiple byte lists with the
+ * contents of a file
+ * such as mouse clicks, and a stream of byte lists read from a file.
* The following example opens a file for reading.
* [Stream.listen] registers a callback function that runs
* each time more data is available.
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index fb5ac89..5bff429 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -6,10 +6,27 @@
/**
- * A linked list implementation, providing O(1) removal(unlink) of elements and
- * manual traversal through [next] and [previous].
+ * A specialized double-linked list of elements that extends [LinkedListEntry].
*
- * The list elements must extend [LinkedListEntry].
+ * This is not a generic data structure. It only accepts elements that extend
+ * the [LinkedListEntry] class. See the [Queue] implementations for
+ * generic collections that allow constant time adding and removing at the ends.
+ *
+ * This is not a [List] implementation. Despite its name, this class does not
+ * implement the [List] interface. It does not allow constant time lookup by
+ * index.
+ *
+ * Because the elements themselves contain the links of this linked list,
+ * each element can be in only one list at a time. To add an element to another
+ * list, it must first be removed from its current list (if any).
+ *
+ * In return, each element knows its own place in the linked list, as well as
+ * which list it is in. This allows constant time [LinkedListEntry.addAfter],
+ * [LinkedListEntry.addBefore] and [LinkedListEntry.unlink] operations
+ * when all you have is the element.
+ *
+ * A `LinkedList` also allows constant time adding and removing at either end,
+ * and a constant time length getter.
*/
class LinkedList<E extends LinkedListEntry<E>>
extends IterableBase<E>
@@ -28,30 +45,33 @@
}
/**
- * Add [entry] to the beginning of the list.
+ * Add [entry] to the beginning of the linked list.
*/
void addFirst(E entry) {
_insertAfter(this, entry);
}
/**
- * Add [entry] to the end of the list.
+ * Add [entry] to the end of the linked list.
*/
void add(E entry) {
_insertAfter(_previous, entry);
}
/**
- * Add [entries] to the end of the list.
+ * Add [entries] to the end of the linked list.
*/
void addAll(Iterable<E> entries) {
entries.forEach((entry) => _insertAfter(_previous, entry));
}
/**
- * Remove [entry] from the list. This is the same as calling `entry.unlink()`.
+ * Remove [entry] from the linked list.
*
- * If [entry] is not in the list, `false` is returned.
+ * Returns false and does nothing if [entry] is not in this linked list.
+ *
+ * This is equivalent to calling `entry.unlink()` if the entry is in this
+ * list.
*/
bool remove(E entry) {
if (entry._list != this) return false;
@@ -61,11 +81,11 @@
Iterator<E> get iterator => new _LinkedListIterator<E>(this);
- // TODO(zarah) Remove this, and let it be inherited by IterableMixin
- String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
-
int get length => _length;
+ /**
+ * Remove all elements from this linked list.
+ */
void clear() {
_modificationCount++;
_LinkedListLink next = _next;
@@ -103,9 +123,9 @@
}
/**
- * Call [action] with each entry in the list.
+ * Call [action] with each entry in this linked list.
*
- * It's an error if [action] modify the list.
+ * It's an error if [action] modify the linked list.
*/
void forEach(void action(E entry)) {
int modificationCount = _modificationCount;
@@ -183,7 +203,18 @@
/**
- * Entry element for a [LinkedList]. Any entry must extend this class.
+ * An object that can be an element in a [LinkedList].
+ *
+ * All elements of a `LinkedList` must extend this class.
+ * The class provides the internal links that link elements together
+ * in the `LinkedList`, and a reference to the linked list itself
+ * that an element is currently part of.
+ *
+ * An entry can be in at most one linked list at a time.
+ * While an entry is in a linked list, the [list] property points to that
+ * linked list, and otherwise the `list` property is `null`.
+ *
+ * When created, an entry is not in any linked list.
*/
abstract class LinkedListEntry<E extends LinkedListEntry<E>>
implements _LinkedListLink {
@@ -192,27 +223,38 @@
_LinkedListLink _previous;
/**
- * Get the list containing this element.
+ * Get the linked list containing this element.
+ *
+ * Returns `null` if this entry is not currently in any list.
*/
LinkedList<E> get list => _list;
/**
- * Unlink the element from the list.
+ * Unlink the element from its linked list.
+ *
+ * The entry must currently be in a linked list when this method is called.
*/
void unlink() {
_list._unlink(this);
}
/**
- * Return the succeeding element in the list.
+ * Return the succeessor of this element in its linked list.
+ *
+ * Returns `null` if there is no successor in the linked list, or if this
+ * entry is not currently in any list.
*/
E get next {
if (identical(_next, _list)) return null;
- return _next as E;
+ E result = _next;
+ return result;
}
/**
- * Return the preceeding element in the list.
+ * Return the predecessor of this element in its linked list.
+ *
+ * Returns `null` if there is no predecessor in the linked list, or if this
+ * entry is not currently in any list.
*/
E get previous {
if (identical(_previous, _list)) return null;
@@ -220,14 +262,20 @@
}
/**
- * insert an element after this.
+ * Insert an element after this element in this element's linked list.
+ *
+ * This entry must be in a linked list when this method is called.
+ * The [entry] must not be in a linked list.
*/
void insertAfter(E entry) {
_list._insertAfter(this, entry);
}
/**
- * Insert an element before this.
+ * Insert an element before this element in this element's linked list.
+ *
+ * This entry must be in a linked list when this method is called.
+ * The [entry] must not be in a linked list.
*/
void insertBefore(E entry) {
_list._insertAfter(_previous, entry);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 82454e3..78f2638 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2261,9 +2261,9 @@
@DomName('Console')
class Console {
- Console._safe() {}
+ const Console._safe();
- static Console _safeConsole = new Console._safe();
+ static const Console _safeConsole = const Console._safe();
bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
@@ -2289,7 +2289,7 @@
@DomName('Console.dir')
void dir(Object arg) => _isConsoleDefined ?
- JS('void', 'console.debug(#)', arg) : null;
+ JS('void', 'console.dir(#)', arg) : null;
@DomName('Console.dirxml')
void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index acc5db1..366fd8d 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -590,6 +590,34 @@
*/
abstract class ContentType implements HeaderValue {
/**
+ * Content type for plain text using UTF-8 encoding.
+ *
+ * text/plain; charset=utf-8
+ */
+ static final TEXT = new ContentType("text", "plain", charset: "utf-8");
+
+ /**
+ * Content type for HTML using UTF-8 encoding.
+ *
+ * text/html; charset=utf-8
+ */
+ static final HTML = new ContentType("text", "html", charset: "utf-8");
+
+ /**
+ * Content type for JSON using UTF-8 encoding.
+ *
+ * application/json; charset=utf-8
+ */
+ static final JSON = new ContentType("application", "json", charset: "utf-8");
+
+ /**
+ * Content type for binary data.
+ *
+ * application/octet-stream
+ */
+ static final BINARY = new ContentType("application", "octet-stream");
+
+ /**
* Creates a new content type object setting the primary type and
* sub type. The charset and additional parameters can also be set
* using [charset] and [parameters]. If charset is passed and
@@ -720,19 +748,19 @@
* package, which makes working with the low-level
* dart:io HTTP server subsystem easier.
*
- * HttpRequest objects are generated by an [HttpServer],
+ * `HttpRequest` objects are generated by an [HttpServer],
* which listens for HTTP requests on a specific host and port.
* For each request received, the HttpServer, which is a [Stream],
- * generates an HttpRequest object and adds it to the stream.
+ * generates an `HttpRequest` object and adds it to the stream.
*
- * An HttpRequest object delivers the body content of the request
- * as a stream of bytes.
+ * An `HttpRequest` object delivers the body content of the request
+ * as a stream of byte lists.
* The object also contains information about the request,
* such as the method, URI, and headers.
*
* In the following code, an HttpServer listens
* for HTTP requests and, within the callback function,
- * uses the HttpRequest object's `method` property to dispatch requests.
+ * uses the `HttpRequest` object's `method` property to dispatch requests.
*
* final HOST = InternetAddress.LOOPBACK_IP_V4;
* final PORT = 4040;
@@ -750,9 +778,9 @@
* onError: handleError); // listen() failed.
* }).catchError(handleError);
*
- * Listen to the HttpRequest stream to handle the
+ * Listen to the `HttpRequest` stream to handle the
* data and be notified once the entire body is received.
- * An HttpRequest object contains an [HttpResponse] object,
+ * An `HttpRequest` object contains an [HttpResponse] object,
* to which the server can write its response.
* For example, here's a skeletal callback function
* that responds to a request:
@@ -1347,6 +1375,7 @@
abstract class HttpClientRequest implements IOSink {
/**
* Gets and sets the requested persistent connection state.
+ *
* The default value is [:true:].
*/
bool persistentConnection;
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 85706d1..bd56939 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -495,7 +495,11 @@
}
skipWS();
String value = parseValue();
- cookies.add(new _Cookie(name, value));
+ try {
+ cookies.add(new _Cookie(name, value));
+ } catch (_) {
+ // Skip it, invalid cookie data.
+ }
skipWS();
if (done()) return;
if (!expect(";")) {
@@ -718,7 +722,9 @@
bool httpOnly = false;
bool secure = false;
- _Cookie([this.name, this.value]);
+ _Cookie([this.name, this.value]) {
+ _validate();
+ }
_Cookie.fromSetCookieValue(String value) {
// Parse the 'set-cookie' header value.
@@ -806,6 +812,7 @@
}
index++; // Skip the = character.
value = parseValue();
+ _validate();
if (done()) return;
index++; // Skip the ; character.
parseAttributes();
@@ -830,6 +837,32 @@
if (httpOnly) sb.write("; HttpOnly");
return sb.toString();
}
+
+ void _validate() {
+ const SEPERATORS = const [
+ "(", ")", "<", ">", "@", ",", ";", ":", "\\",
+ '"', "/", "[", "]", "?", "=", "{", "}"];
+ for (int i = 0; i < name.length; i++) {
+ int codeUnit = name.codeUnits[i];
+ if (codeUnit <= 32 ||
+ codeUnit >= 127 ||
+ SEPERATORS.indexOf(name[i]) >= 0) {
+ throw new FormatException(
+ "Invalid character in cookie name, code unit: '$codeUnit'");
+ }
+ }
+ for (int i = 0; i < value.length; i++) {
+ int codeUnit = value.codeUnits[i];
+ if (!(codeUnit == 0x21 ||
+ (codeUnit >= 0x23 && codeUnit <= 0x2B) ||
+ (codeUnit >= 0x2D && codeUnit <= 0x3A) ||
+ (codeUnit >= 0x3C && codeUnit <= 0x5B) ||
+ (codeUnit >= 0x5D && codeUnit <= 0x7E))) {
+ throw new FormatException(
+ "Invalid character in cookie value, code unit: '$codeUnit'");
+ }
+ }
+ }
}
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index a6d9f53..0c27522 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -8,7 +8,7 @@
* Helper class to wrap a [StreamConsumer<List<int>>] and provide
* utility functions for writing to the StreamConsumer directly. The
* [IOSink] buffers the input given by all [StringSink] methods and will delay
- * a [addStream] until the buffer is flushed.
+ * an [addStream] until the buffer is flushed.
*
* When the [IOSink] is bound to a stream (through [addStream]) any call
* to the [IOSink] will throw a [StateError]. When the [addStream] completes,
@@ -18,6 +18,7 @@
* ignored. Use the [done] future to be notified when the [IOSink] is closed.
*/
abstract class IOSink implements StreamSink<List<int>>, StringSink {
+ // TODO(ajohnsen): Make _encodingMutable an argument.
factory IOSink(StreamConsumer<List<int>> target,
{Encoding encoding: UTF8})
=> new _IOSinkImpl(target, encoding);
@@ -29,14 +30,68 @@
Encoding encoding;
/**
- * Writes the bytes uninterpreted to the consumer. While the call is
- * synchronous, the data may be buffered until the underlying resource is
- * ready. The data should not be modified after a call to [add].
+ * Adds [data] to the target consumer, ignoring [encoding].
+ *
+ * The [encoding] does not apply to this method, and the `data` list is passed
+ * directly to the target consumer as a stream event.
+ *
+ * This function must not be called when a stream is currently being added
+ * using [addStream].
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
+ *
+ * The data list should not be modified after it has been passed to `add`.
*/
void add(List<int> data);
/**
- * Writes an error to the consumer.
+ * Converts [obj] to a String by invoking [Object.toString] and
+ * [add]s the encoding of the result to the target consumer.
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
+ */
+ void write(Object obj);
+
+ /**
+ * Iterates over the given [objects] and [write]s them in sequence.
+ *
+ * If [separator] is provided, a `write` with the `separator` is performed
+ * between any two elements of `objects`.
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
+ */
+ void writeAll(Iterable objects, [String separator = ""]);
+
+ /**
+ * Converts [obj] to a String by invoking [Object.toString] and
+ * writes the result to `this`, followed by a newline.
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
+ */
+ void writeln([Object obj = ""]);
+
+ /**
+ * Writes the [charCode] to `this`.
+ *
+ * This method is equivalent to `write(new String.fromCharCode(charCode))`.
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
+ */
+ void writeCharCode(int charCode);
+
+ /**
+ * Passes the error to the target consumer as an error event.
+ *
+ * This function must not be called when a stream is currently being added
+ * using [addStream].
+ *
+ * This operation is non-blocking. See [flush] or [done] for how to get any
+ * errors generated by this call.
*/
void addError(error, [StackTrace stackTrace]);
@@ -57,13 +112,14 @@
Future flush();
/**
- * Close the target.
+ * Close the target consumer.
*/
Future close();
/**
- * Get a future that will complete when all synchronous have completed, or an
- * error happened. This future is identical to the future returned from close.
+ * Get a future that will complete when the consumer closes, or when an
+ * error occurs. This future is identical to the future returned by
+ * [close].
*/
Future get done;
}
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 828145e..db68773 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -9,6 +9,7 @@
class _ProcessUtils {
external static void _exit(int status);
external static void _setExitCode(int status);
+ external static int _getExitCode();
external static void _sleep(int millis);
external static int _pid(Process process);
external static Stream<ProcessSignal> _watchSignal(ProcessSignal signal);
@@ -49,7 +50,26 @@
}
/**
- * Global exit code for the Dart VM.
+ * Set the global exit code for the Dart VM.
+ *
+ * The exit code is global for the Dart VM and the last assignment to
+ * exitCode from any isolate determines the exit code of the Dart VM
+ * on normal termination.
+ *
+ * Default value is `0`.
+ *
+ * See [exit] for more information on how to chose a value for the
+ * exit code.
+ */
+void set exitCode(int code) {
+ if (code is !int) {
+ throw new ArgumentError("Integer value for exit code expected");
+ }
+ _ProcessUtils._setExitCode(code);
+}
+
+/*
+ * Get the global exit code for the Dart VM.
*
* The exit code is global for the Dart VM and the last assignment to
* exitCode from any isolate determines the exit code of the Dart VM
@@ -58,12 +78,7 @@
* See [exit] for more information on how to chose a value for the
* exit code.
*/
-set exitCode(int code) {
- if (code is !int) {
- throw new ArgumentError("Integer value for exit code expected");
- }
- _ProcessUtils._setExitCode(code);
-}
+int get exitCode => _ProcessUtils._getExitCode();
/**
* Sleep for the duration specified in [duration].
@@ -86,7 +101,7 @@
/**
* The means to execute a program.
- *
+ *
* Use the static [start] and [run] methods to start a new process.
* The run method executes the process non-interactively to completion.
* In contrast, the start method allows your code to interact with the
@@ -138,10 +153,10 @@
* }
*
* ## Standard I/O streams
- *
+ *
* As seen in the previous code sample, you can interact with the Process's
* standard output stream through the getter [stdout],
- * and you can interact with the Process's standard input stream through
+ * and you can interact with the Process's standard input stream through
* the getter [stdin].
* In addition, Process provides a getter [stderr] for using the Process's
* standard error stream.
@@ -174,7 +189,7 @@
* ## Other resources
*
* [Dart by Example](https://www.dartlang.org/dart-by-example/#dart-io-and-command-line-apps)
- * provides additional task-oriented code samples that show how to use
+ * provides additional task-oriented code samples that show how to use
* various API from the [dart:io] library.
*/
abstract class Process {
@@ -396,6 +411,10 @@
/**
* On Posix systems, [ProcessSignal] is used to send a specific signal
* to a child process, see [:Process.kill:].
+ *
+ * Some [ProcessSignal]s can also be watched, as a way to intercept the default
+ * signal handler and implement another. See [ProcessSignal.watch] for more
+ * information.
*/
class ProcessSignal {
static const ProcessSignal SIGHUP = const ProcessSignal._(1, "SIGHUP");
@@ -441,13 +460,16 @@
* The following [ProcessSignal]s can be listened to:
*
* * [ProcessSignal.SIGHUP].
- * * [ProcessSignal.SIGINT].
+ * * [ProcessSignal.SIGINT]. Signal sent by e.g. CTRL-C.
* * [ProcessSignal.SIGTERM]. Not available on Windows.
* * [ProcessSignal.SIGUSR1]. Not available on Windows.
* * [ProcessSignal.SIGUSR2]. Not available on Windows.
* * [ProcessSignal.SIGWINCH]. Not available on Windows.
*
* Other signals are disallowed, as they may be used by the VM.
+ *
+ * A signal can be watched multiple times, from multiple isolates, where all
+ * callbacks are invoked when signaled, in no specific order.
*/
Stream<ProcessSignal> watch() => _ProcessUtils._watchSignal(this);
}
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 7f928b1..4b64fe3 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -179,7 +179,7 @@
* was received, the result will be null.
*/
static Future<RawSecureServerSocket> bind(
- String address,
+ address,
int port,
String certificateName,
{int backlog: 0,
diff --git a/sdk/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
index 495c70e..51f0901 100644
--- a/sdk/lib/io/timer_impl.dart
+++ b/sdk/lib/io/timer_impl.dart
@@ -190,7 +190,7 @@
_clear();
if (!_isInHeap) return;
assert(_wakeupTime != 0);
- bool update = _firstZeroTimer == null && _heap.isFirst(this);
+ bool update = (_firstZeroTimer == null) && _heap.isFirst(this);
_heap.remove(this);
if (update) {
_notifyEventHandler();
@@ -207,10 +207,12 @@
bool _addTimerToHeap() {
if (_wakeupTime == 0) {
if (_firstZeroTimer == null) {
- _lastZeroTimer = _firstZeroTimer = this;
+ _lastZeroTimer = this;
+ _firstZeroTimer = this;
return true;
} else {
- _lastZeroTimer = _lastZeroTimer._indexOrNext = this;
+ _lastZeroTimer._indexOrNext = this;
+ _lastZeroTimer = this;
return false;
}
} else {
@@ -257,13 +259,16 @@
// Collect all pending timers.
var timer = _firstZeroTimer;
var nextTimer = _lastZeroTimer;
- _firstZeroTimer = _lastZeroTimer = null;
+ _firstZeroTimer = null;
+ _lastZeroTimer = null;
while (_heap.isNotEmpty && _heap.first._wakeupTime <= currentTime) {
var next = _heap.removeFirst();
if (timer == null) {
- nextTimer = timer = next;
+ nextTimer = next;
+ timer = next;
} else {
- nextTimer = nextTimer._indexOrNext = next;
+ nextTimer._indexOrNext = next;
+ nextTimer = next;
}
}
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index ee5f5bb..630eeac 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -13,7 +13,7 @@
LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
-[ $runtime == vm || $runtime == dartium || $compiler == dart2dart || $compiler == dart2js ]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer ]
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
@@ -31,7 +31,6 @@
LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError, OK # co19 issue 663
LibTest/core/Set/IterableBase_A01_t01: RuntimeError, OK # co19 issue 663
-[ $runtime == vm || $runtime == dartium || $compiler == dart2js ]
LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -49,11 +48,6 @@
LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493 (not fixed in r672)
LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495 (not fixed in r672)
-
-[ $runtime == dartium || $compiler == dart2js ]
-LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
-
-[ $runtime == vm || $compiler == none || $compiler == dart2js ]
LibTest/isolate/IsolateStream/any_A01_t01: Fail # Co19 issue 639 (Fixed in r674)
LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # Co19 issue 639
LibTest/isolate/IsolateStream/contains_A01_t01: Fail # Co19 issue 639
@@ -86,9 +80,11 @@
Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
+[ $runtime == dartium || $compiler == dart2js ]
+LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
### CHECKED MODE FAILURES ###
-[ ($runtime == vm || $runtime == dartium || $compiler == dart2js) && $checked]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index df91bfe..294a984 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -667,3 +667,6 @@
LibTest/async/Stream/listen_A05_t01: RuntimeError # co19-roll r641: Please triage this failure
LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+LibTest/async/DeferredLibrary/*: Skip # Issue 17458
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index b52328c..eefab31 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -5,7 +5,7 @@
[ $compiler == none && $runtime == drt ]
*: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
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/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
@@ -37,5 +37,5 @@
LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
-[ $compiler == none && $runtime == dartium && $checked ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index e98b79b..bb3ef50 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,7 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
-[ $compiler == none && ($runtime == vm || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
@@ -69,8 +69,8 @@
LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
[ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
-LibTest/isolate/Isolate/spawnUri_A01_t04: Crash # dartbug.com/17440
-LibTest/isolate/Isolate/spawn_A01_t04: Crash # dartbug.com/17440
+LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
+LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # dartbug.com/17440
[ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips) ]
LibTest/core/Uri/Uri_A06_t03: Skip # Timeouts, co19-roll r576: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 3c842af..75b884d 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -11,7 +11,10 @@
import 'analyze_helper.dart';
const Map<String, List<String>> WHITE_LIST = const {
- "ir_builder.dart": const ["The method 'getIr' is never called."],
+ "ir_builder.dart":
+ const ["The method 'getIr' is never called.",
+ "The method 'hasIr' is never called.",
+ ],
};
void main() {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index ac12f23..770e62f 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -22,6 +22,9 @@
mirrors/library_imports_prefixed_show_hide_test: Fail
mirrors/library_imports_shown_test: Fail
+[ $unchecked ]
+exit_code_test: Skip # This tests requires checked mode.
+
[ $mode == debug ]
mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
@@ -31,6 +34,8 @@
exit_code_test: Pass, Slow
deferred_load_graph_segmentation_test: Pass, Slow
check_members_test: Pass, Slow
+duplicate_library_test: Pass, Slow
+show_package_warnings_test: Pass, Slow
# Don't mark these tests as failing. Instead, fix the errors/warnings that they
# report or update the whitelist in the test-files to temporarily allow
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index fd5c38f..4db2ecd 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -218,6 +218,7 @@
}
void main() {
+ // TODO(johnniwinther): implement this test for unchecked mode.
bool isCheckedMode = false;
assert(isCheckedMode = true);
Expect.isTrue(isCheckedMode, 'This test must be run in checked mode.');
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index f31fe96..8d2763d 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -18,11 +18,8 @@
variable_type_test/03: Fail, OK
variable_type_test/01: Fail, OK
-[ $compiler == dart2js && $host_checked && $checked == false ]
-# Test that @IrRepresentation yields compile-time errors in host-checked mode.
-# The condition "$checked == false" is to be removed once we build IR in
-# target-checked mode.
-ir_representation_test: CompileTimeError, OK
+[ $compiler == dart2js && ($runtime == d8 || $runtime == chrome || $runtime == drt) ]
+bound_closure_interceptor_type_test: Fail, Pass # v8 issue 3084. https://code.google.com/p/v8/issues/detail?id=3084
[ $compiler == dart2js && $mode == debug ]
operator_test: Skip
@@ -59,3 +56,6 @@
deferred/deferred_constant3_test: Fail # http://dartbug.com/16898
deferred/deferred_constant4_test: Fail # http://dartbug.com/16898
deferred/deferred_constant5_test: Fail # http://dartbug.com/16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+deferred/*: Skip # Issue 17458
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
deleted file mode 100644
index e0d241c..0000000
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'dart:async';
-
-@lazy import 'deferred_class_library2.dart' as lib;
-
-const lazy = const DeferredLibrary('deferred_class_library2');
-
-main() {
- asyncStart();
- lazy.load().then((bool didLoad) {
- Expect.isTrue(didLoad);
- Expect.equals(321, const lib.Gee.n321().value);
- Expect.equals(246, const lib.Gee.n246().value);
- Expect.equals(888, const lib.Gee.n888().value);
- Expect.equals(321, const lib.Gee2.n321().value);
- Expect.equals(151, const lib.Gee2.n151().value);
- Expect.equals(888, const lib.Gee2.n888().value);
- asyncEnd();
- });
-}
diff --git a/tests/compiler/dart2js_extra/ir_representation_test.dart b/tests/compiler/dart2js_extra/ir_representation_test.dart
deleted file mode 100644
index 4b037c4..0000000
--- a/tests/compiler/dart2js_extra/ir_representation_test.dart
+++ /dev/null
@@ -1,62 +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.
-
-// The multitest framework does not support import paths that contain '..',
-// therefore it's not used in this file.
-import '../dart2js_native/compiler_test_internals.dart';
-
-/**
- * This test verifies that the @IrRepresentation annotation works as expected.
- * It might fail when extending the IR to express more of Dart.
- */
-
-// closure
-@IrRepresentation(true)
-test1() {
- var f = () => 42;
- return 1;
-}
-
-// parameter
-@IrRepresentation(true)
-test2(x) {
- return x;
-}
-
-// dynamic invocation, construction
-@IrRepresentation(true)
-test3() {
- new Object().hashCode;
-}
-
-// exceptions
-@IrRepresentation(true)
-test4() {
- try {
- throw "possum";
- } catch (e) {
- return e;
- }
-}
-
-// control flow, loops
-@IrRepresentation(true)
-test5(x) {
- while (x < 100) {
- x += x;
- }
- if (x % 2 == 0) {
- return 1;
- } else {
- return 2;
- }
-}
-
-main() {
- print(test1());
- print(test2(1));
- print(test3());
- print(test4());
- print(test5(2));
-}
diff --git a/tests/compiler/dart2js_extra/ssa_inlining_test.dart b/tests/compiler/dart2js_extra/ssa_inlining_test.dart
deleted file mode 100644
index b043c77..0000000
--- a/tests/compiler/dart2js_extra/ssa_inlining_test.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../dart2js_native/compiler_test_internals.dart';
-import 'package:expect/expect.dart';
-
-// The function ast01 is built by an SsaFromAstBuilder.
-// Ir functions are inlined by an SsaFromIrInliner.
-
-@NoInline()
-@IrRepresentation(false)
-ast01() {
- checkAst01(JS('', 'arguments.callee'));
- print(ir01());
- print(ir02());
- return ast02(11);
-}
-
-@IrRepresentation(true)
-ir01() => ir04();
-
-@IrRepresentation(true)
-ir02() => ast06(10, 20);
-
-@IrRepresentation(false)
-ast06(a,b) {
- JS('', 'String("in ast06")');
- return 3*a + b;
-}
-
-@IrRepresentation(true)
-ir04() => ir05();
-
-@IrRepresentation(true)
-ir05() => ast07(1, 22);
-
-@IrRepresentation(false)
-ast07(i, j) {
- var x = 0;
- return ast08(i,j) ? i : j;
-}
-
-@IrRepresentation(false)
-ast08(x,y) {
- JS('', 'String("in ast08")');
- return x - y < 0;
-}
-
-@IrRepresentation(false)
-ast02(x) {
- print(x);
- ir06();
- print(ir07());
-}
-
-@IrRepresentation(true)
-ir06() => ast04(1,2,3);
-
-@IrRepresentation(false)
-ast04(a, b, c) {
- print(a + b - c);
- JS('', 'String("in ast04")');
-}
-
-@IrRepresentation(true)
-ir07() => ir03();
-
-@IrRepresentation(true)
-ir03() => ast05(1,3);
-
-@IrRepresentation(false)
-ast05(a, b) {
- JS('', 'String("in ast05")');
- return (a+b)/2;
-}
-
-// The function ir08 is built by an SsaFromIrBuilder.
-// Ast functions are inlined by an SsaFromAstInliner.
-
-@NoInline()
-@IrRepresentation(true)
-ir08() => ir09();
-
-ir09() => ast09();
-
-ast09() {
- checkIr08(JS('', 'arguments.callee'));
- JS('', 'String("in ast09")');
- print(ir01());
- print(ir02());
- print(ast02(11));
-}
-
-main() {
- ast01();
- ir08();
-}
-
-@NoInline()
-check(func, names) {
- var source = JS('String', 'String(#)', func);
- print(source);
- for (var f in names) {
- Expect.isTrue(source.contains('"in $f"'), "should inline '$f'");
- }
-}
-
-@NoInline
-checkAst01(func) {
- var names = ["ast04", "ast05", "ast06", "ast08"];
- check(func, names);
-}
-
-checkIr08(func) {
- var names = ["ast09", "ast04", "ast05", "ast06", "ast08"];
- check(func, names);
-}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 022e0b2..a741052 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -22,3 +22,7 @@
[ $browser || $runtime == d8 ]
only_pass_on_jsshell_test: Fail, OK # This test should only pass on jsshell.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+only_pass_on_d8_test: Skip # Issue 17458
+compute_this_script_test: Skip # Issue 17458
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 3c56c5c..c2b831e 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -15,7 +15,7 @@
string_from_environment_default_value: Skip
string_from_environment_test: Skip
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
bool_from_environment2_test: Skip
bool_from_environment_default_value_test: Skip
bool_from_environment_test: Skip
@@ -52,7 +52,7 @@
symbol_test/01: Fail, Pass # bug 11669
-[ $compiler == none && $runtime != dartium && $runtime != drt ]
+[ $compiler == none && $runtime != dartium && $runtime != drt && $runtime != ContentShellOnAndroid ]
symbol_test/02: MissingCompileTimeError # bug 11669
symbol_test/03: MissingCompileTimeError # bug 11669
@@ -60,10 +60,7 @@
symbol_test/none: Fail # bug 11669
symbol_operator_test/03: Fail # bug 11669
-[ $compiler == none && $runtime == drt ]
-main_test: Fail # Dartium needs to check for both main() and main(args).
-
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
main_test: Fail # Dartium needs to check for both main() and main(args).
[ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
diff --git a/tests/html/html.status b/tests/html/html.status
index f9ce16e..36780af 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -25,7 +25,7 @@
[ $compiler == none && $runtime == dartium && $system == macos]
canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellInAndroid) ]
# postMessage in dartium always transfers the typed array buffer, never a view
postmessage_structured_test/typed_arrays: Fail
xhr_test: Pass, Fail # Issue 12648
@@ -34,6 +34,9 @@
keyboard_event_test: Fail # Issue 13902
isolates_test: Fail # Issue 13921
+[ $compiler == none && $runtime == ContentShellInAndroid ]
+element_offset_test/offset: Pass, Fail # Issue 13296
+
[ $compiler == none && $runtime == drt && $system == windows ]
worker_test/functional: Pass, Crash # Issue 9929.
touchevent_test/supported: Pass, Fail # Issue 17061
@@ -74,11 +77,10 @@
xhr_cross_origin_test: Pass, Fail # Issue 11884
xhr_test: Pass, Fail # Issue 11884
-[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid]
+[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == ContentShellOnAndroid ]
webgl_1_test: Pass, Fail # Issue 8219
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
-request_animation_frame_test: Skip # drt hangs; requestAnimationFrame not implemented
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
worker_api_test: Fail # http://dartbug.com/10223
[ $compiler == none && ($runtime == drt || $runtime == dartium) && $system == windows]
@@ -380,6 +382,10 @@
[ $compiler == dart2js && ($runtime == drt || $runtime ==chrome) ]
wheelevent_test: Fail # http://dartbug.com/12958
+[ $runtime == dartium && ($system == macos || $system == windows || $system == linux)]
+# Desktop operation systems do not support touch events on chrome 34 dartium.
+touchevent_test/supported: Fail
+
[ $compiler == none && $runtime == dartium ]
async_test: Timeout # Issue 13719: Please triage this failure.
element_offset_test/offset: Pass, Fail # Issue 13719, 13296
diff --git a/tests/language/deferred_constraints_constants_lib.dart b/tests/language/deferred_constraints_constants_lib.dart
new file mode 100644
index 0000000..50b6ed5
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_lib.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+ static int staticMethod() => 42;
+}
+
+class G<T> {}
+
+class Const {
+ const Const();
+ const Const.namedConstructor();
+ static const instance = const Const();
+}
+
+const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_constants_test.dart b/tests/language/deferred_constraints_constants_test.dart
new file mode 100644
index 0000000..be44642
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+@lazy import "deferred_constraints_constants_lib.dart" as lib;
+
+const lazy = const DeferredLibrary('lib');
+
+const myConst1 =
+ lib.constantInstance; /// reference1: compile-time error
+ /* /// reference1: continued
+ 499;
+ */ /// reference1: continued
+const myConst2 =
+ lib.Const.instance; /// reference2: compile-time error
+ /* /// reference2: continued
+ 499;
+ */ /// reference2: continued
+
+void f1({a:
+ const lib.Const() /// default_argument1: compile-time error
+ /* /// default_argument1: continued
+ 499
+ */ /// default_argument1: continued
+}) {}
+
+void f2({a:
+ lib.constantInstance /// default_argument2: compile-time error
+ /* /// default_argument2: continued
+ 499
+ */ /// default_argument2: continued
+}) {}
+
+@lib.Const() /// metadata1: compile-time error
+class H1 {}
+@lib.Const.instance /// metadata2: compile-time error
+class H2 {}
+@lib.Const.namedConstructor() /// metadata3: compile-time error
+class H3 {}
+
+void main() {
+ var a1 = myConst1;
+ var a2 = myConst2;
+
+ asyncStart();
+ lazy.load().then((_) {
+ var instance = lib.constantInstance;
+ var c1 = const lib.Const(); /// constructor1: compile-time error
+ var c2 = const lib.Const.namedConstructor(); /// constructor2: compile-time error
+ f1();
+ f2();
+ var constInstance = lib.constantInstance; /// reference_after_load: ok
+ var h1 = new H1();
+ var h2 = new H2();
+ var h3 = new H3();
+ asyncEnd();
+ });
+}
+
diff --git a/tests/language/deferred_constraints_lib.dart b/tests/language/deferred_constraints_lib.dart
index 9f4d207..1aac90a 100644
--- a/tests/language/deferred_constraints_lib.dart
+++ b/tests/language/deferred_constraints_lib.dart
@@ -10,6 +10,8 @@
class Const {
const Const();
+ const Const.otherConstructor();
+ static const instance = const Const();
}
const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_test.dart b/tests/language/deferred_constraints_type_annotation_test.dart
similarity index 77%
rename from tests/language/deferred_constraints_test.dart
rename to tests/language/deferred_constraints_type_annotation_test.dart
index 6992b78..cd4cdf5 100644
--- a/tests/language/deferred_constraints_test.dart
+++ b/tests/language/deferred_constraints_type_annotation_test.dart
@@ -14,21 +14,17 @@
class F {}
class G2<T> {}
-void f({a: const lib.Const()}) {} /// const_default_argument: compile-time error
-
-@lib.Const() class H {} /// const_annotation: compile-time error
-
-void main() {
- Expect.throws(() { /// type_annotation1: static type warning
- lib.C a = new lib.C(); /// type_annotation1: continued
- }, (e) => e is NoSuchMethodError); /// type_annotation1: continued
+main() {
lib.C a = null; /// type_annotation_null: static type warning
+ Expect.throws(() { /// new_before_load: static type warning
+ lib.C a = new lib.C(); /// new_before_load: continued
+ }, (e) => e is NoSuchMethodError); /// new_before_load: continued
// In this case we do not defer C.
lib2.C a1 = new lib2.C(); /// type_annotation_non_deferred: continued
asyncStart();
lazy.load().then((_) {
- lib.C a2 = new lib.C(); /// type_annotation2: dynamic type error, static type warning
+ lib.C a2 = new lib.C(); /// type_annotation1: dynamic type error, static type warning
lib.G<F> a3 = new lib.G<F>(); /// type_annotation_generic1: dynamic type error, static type warning
G2<lib.C> a4 = new G2(); /// type_annotation_generic2: static type warning
G2<lib.C> a5 = new G2<lib.C>(); /// type_annotation_generic3: static type warning
@@ -50,10 +46,6 @@
try { throw instance; } on lib.Const {} /// catch_check: continued
}, (e) => e is TypeError); /// catch_check: continued
int i = lib.C.staticMethod(); /// static_method: ok
- var c1 = const lib.Const(); /// const: compile-time error
- f(); /// const_default_argument: continued
- var constInstance = lib.constantInstance; /// const_instance: ok
- var h = new H(); /// const_annotation: continued
asyncEnd();
});
}
diff --git a/tests/language/language.status b/tests/language/language.status
index 7dc0382..1e36a24 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -20,28 +20,28 @@
duplicate_export_negative_test: Fail # Issue 6134
mixin_forwarding_constructor2_test: Fail # Issue 13641
+deferred_constraints_constants_test/reference1: Fail
+deferred_constraints_constants_test/reference2: Fail
+deferred_constraints_constants_test/metadata1: Fail
+deferred_constraints_constants_test/metadata2: Fail
+deferred_constraints_constants_test/metadata3: Fail
+deferred_constraints_constants_test/default_argument1: Fail
+deferred_constraints_constants_test/default_argument2: Fail
+deferred_constraints_constants_test/constructor1: Fail
+deferred_constraints_constants_test/constructor2: Fail
+
+[ ($compiler == none || $compiler == dart2dart)]
# The vm does not support deferred loading.
-deferred_constraints_test/const: Fail
-deferred_constraints_test/const_annotation: Fail
-deferred_constraints_test/const_default_argument: Fail
+deferred_constraints_type_annotation_test/as_operation: Fail
+deferred_constraints_type_annotation_test/is_check: Fail
+deferred_constraints_type_annotation_test/catch_check: Fail
+deferred_constraints_type_annotation_test/new_before_load: Fail
-[ ($compiler == none || $compiler == dart2dart) && $unchecked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-
-[ ($compiler == none || $compiler == dart2dart) && $checked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-deferred_constraints_test/type_annotation2: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/type_annotation_generic1: Fail
-deferred_constraints_test/type_annotation_generic4: Fail
+[ ($compiler == none || $compiler == dart2dart) && $checked ]
+# The vm and dart2dart do not support deferred loading.
+deferred_constraints_type_annotation_test/type_annotation1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic4: Fail
[ $compiler == none || $compiler == dartanalyzer || $compiler == dart2analyzer ]
# The vm and analyzer do not support deferred loading.
@@ -79,29 +79,24 @@
type_check_const_function_typedef2_test/00: Fail, OK
malformed2_test/01: Fail, OK
-[ $runtime == vm || (($runtime == drt || $runtime == dartium) && $compiler == none) ]
+[ ($compiler == none || $compiler == dart2dart) && $runtime != none ]
dynamic_prefix_core_test/01: Fail # Issue 12478
-call_closurization_test: Fail # Issue 17473
-[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium|| $runtime == ContentShellOnAndroid) ]
dynamic_prefix_core_test/none: Fail # Issue 12478
export_ambiguous_main_negative_test: Fail # Issue 14763
-[ $compiler == none && $runtime == drt ]
-mixin_illegal_object_test/01: pass # Issue 10952.
-mixin_illegal_object_test/02: pass # Issue 10952.
-
[ $compiler == dart2js && $runtime == ie9 ]
lazy_static3_test: Fail # Issue 13469
[ $compiler == none && $runtime == dartium && $unchecked ]
-named_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/03: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-assertion_test: Fail # Issue 13719: Please triage this failure.
-generic_test: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/01: Fail # Issue 17561.
+named_parameters_type_test/02: Fail # Issue 17561.
+named_parameters_type_test/03: Fail # Issue 17561.
+positional_parameters_type_test/01: Fail # Issue 17561.
+positional_parameters_type_test/02: Fail # Issue 17561.
+assertion_test: Fail # Issue 17561.
+generic_test: Fail # Issue 17561.
list_literal1_test/01: Fail # Issue 13719: Please triage this failure.
list_literal4_test: Fail # Issue 13719: Please triage this failure.
map_literal1_test/01: Fail # Issue 13719: Please triage this failure.
@@ -120,4 +115,8 @@
override_inheritance_mixed_test/09: Fail # Issue 16137
[ $compiler == none && $runtime == vm && $arch == mips && $checked ]
-generic_instanceof3_test: Pass, Crash # dartbug.com/17440
+generic_instanceof3_test: Pass, Crash # Issue 17440.
+
+[ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
+stack_overflow_test: Skip # Crashes. Issue 17440.
+stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index f4c89cf..720486c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -475,19 +475,25 @@
vm/type_cast_vm_test: StaticWarning
vm/type_vm_test: StaticWarning
void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 86e489a..6c689a1 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -475,19 +475,25 @@
vm/type_cast_vm_test: StaticWarning
vm/type_vm_test: StaticWarning
void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 3f55762..a014535 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -52,7 +52,6 @@
default_factory2_test/01: Fail # Issue 14121
typevariable_substitution2_test/01: CompileTimeError # Issue 15875
typevariable_substitution2_test/02: CompileTimeError # Issue 15875
-mixin_bound_test: CompileTimeError # Issue 15875
[ $compiler == dart2js && $unchecked ]
type_checks_in_factory_method_test: RuntimeError # Issue 12746
@@ -148,9 +147,6 @@
bit_operations_test: RuntimeError, OK # Issue 1533
expect_test: RuntimeError, OK # Issue 13080
-[ ($compiler == dart2js || $compiler == dart2dart) && $checked ]
-cyclic_typedef_test/07: Crash # Issue 15237
-
[ ($compiler == dart2js || $compiler == dart2dart) && $unchecked ]
type_check_const_function_typedef2_test/00: MissingCompileTimeError, OK
@@ -293,10 +289,12 @@
[ $runtime == ie9 ]
stack_trace_test: Fail, OK # Stack traces not available in IE9.
-deferred_constraints_test/*: Fail, Pass # http://dartbug.com/12635
-
-[ $compiler == dart2js && $host_checked ]
-const_factory_with_body_test/01: Crash
+deferred_constraints_type_annotation_test/*: Fail, Pass # http://dartbug.com/12635
+deferred_constraints_constants_test/*: Fail, Pass # http://dartbug.com/12635
[ ($compiler == dart2js && $csp)]
-deferred_constraints_test/*: Skip # Issue 16898
+deferred_constraints_type_annotation_test/*: Skip # Issue 16898
+deferred_constraints_constants_test/*: Skip # Issue 16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+*deferred*: Skip # Issue 17458
diff --git a/tests/language/mixin_type_variable_test.dart b/tests/language/mixin_type_variable_test.dart
new file mode 100644
index 0000000..4d5c6c4
--- /dev/null
+++ b/tests/language/mixin_type_variable_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.
+
+// Regression test for generic mixin fields in checked mode.
+
+class A<T> {
+ T field;
+}
+
+class B<T> = Object with A<T>;
+
+class C<T> extends B<T> {} /// 03: ok
+class D extends B<int> {} /// 04: ok
+
+class E = Object with A<int>;
+
+class F extends E {} /// 06: ok
+
+class G<T> extends Object with A<T> {} /// 07: ok
+class H extends Object with A<int> {} /// 08: ok
+
+void main() {
+ new A<num>(); /// 01: ok
+ new B<num>(); /// 02: ok
+ new C<num>(); /// 03: continued
+ new D(); /// 04: continued
+ new E(); /// 05: ok
+ new F(); /// 06: continued
+ new G<num>(); /// 07: continued
+ new H(); /// 08: continued
+}
\ No newline at end of file
diff --git a/tests/language/pure_function2_test.dart b/tests/language/pure_function2_test.dart
new file mode 100644
index 0000000..1fdf5f0
--- /dev/null
+++ b/tests/language/pure_function2_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Regression test for issue 17483.
+
+confuse(x) {
+ if (new DateTime.now().millisecondsSinceEpoch == 42) return confuse(x);
+ return x;
+}
+
+foo(trace) {
+ trace.add("foo");
+ return "foo";
+}
+bar(trace) {
+ trace.add("bar");
+ return "bar";
+}
+
+main() {
+ var f = confuse(foo);
+ var b = confuse(bar);
+
+ var trace = [];
+ // Dart2js must keep the order of t1 and t2.
+ var t1 = f(trace);
+ var t2 = b(trace);
+ var t3 = identical(t2, "foo");
+ var t4 = trace.add(t1);
+ trace.add(t3);
+ trace.add(t3);
+ Expect.listEquals(["foo", "bar", "foo", false, false], trace);
+}
diff --git a/tests/language/pure_function_test.dart b/tests/language/pure_function_test.dart
new file mode 100644
index 0000000..4bd36be
--- /dev/null
+++ b/tests/language/pure_function_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Regression test for issue 17483.
+
+class A {
+ var x, y;
+ A(x, this.y) {
+ this.x = x;
+ }
+ toString() => "a";
+}
+
+foo(trace) => trace.add("foo");
+bar(trace) => trace.add("bar");
+
+main() {
+ var trace = [];
+ // Dart2js must keep the order of t1 and t2.
+ var t1 = foo(trace);
+ var t2 = bar(trace);
+ // Dart2js inlines the constructor, yielding something like:
+ // t3 = jsNew A(null, t2); // Note that jsNew is pure.
+ // t3.x = t1;
+ // t3 is used twice and cannot be generated at use site.
+ // Dart2js must not allow t1 to cross the t3-line.
+ var a = new A(t1, t2);
+ // Use a. It is already implicitly used by the this.x = x line in its
+ // constructor. With the following use we use it twice and make sure that
+ // the allocation can not be generated at use-site.
+ trace.add(a.toString());
+ Expect.listEquals(["foo", "bar", "a"], trace);
+}
diff --git a/tests/language/super_bound_closure_test.dart b/tests/language/super_bound_closure_test.dart
index a85f30f..eb91f5f 100644
--- a/tests/language/super_bound_closure_test.dart
+++ b/tests/language/super_bound_closure_test.dart
@@ -6,7 +6,29 @@
class A {
bar([var optional = 1]) => 498 + optional;
- bar2(x, { namedOptional: 2 }) => 40 + x + namedOptional;
+ bar2({ namedOptional: 2 }) => 40 + namedOptional;
+ bar3(x, [var optional = 3]) => x + 498 + optional;
+ bar4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+ // Gee is the same as bar, but we make sure that gee is used. Potentially
+ // this yields different code if the redirecting stub exists.
+ gee([var optional = 1]) => 498 + optional;
+ gee2({ namedOptional: 2 }) => 40 + namedOptional;
+ gee3(x, [var optional = 3]) => x + 498 + optional;
+ gee4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+ // Use identifiers that could be intercepted.
+ add([var optional = 33]) => 1234 + optional;
+ trim({ namedOptional: 22 }) => 1313 + namedOptional;
+ sublist(x, [optional = 44]) => 4321 + optional + x;
+ splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) =>
+ 111 + x + onMatch + onNonMatch;
+
+ // Other interceptable identifiers, but all of them are used.
+ shuffle([var optional = 121]) => 12342 + optional;
+ toList({ growable: 2233 }) => 13131 + growable;
+ lastIndexOf(x, [optional = 424]) => 14321 + optional + x;
+ lastWhere(x, { orElse: 555 }) => x + 1213 + 555;
}
class B extends A {
@@ -16,11 +38,59 @@
// `A` redirects to A's bar$1.
foo() => confuse(super.bar)();
foo2() => confuse(super.bar)(2);
- foo3() => confuse(super.bar2)(0);
- foo4() => confuse(super.bar2)(3, namedOptional: 77);
+ foo3() => confuse(super.bar2)();
+ foo4() => confuse(super.bar2)(namedOptional: 77);
+ foo5() => confuse(super.bar3)(-3);
+ foo6() => confuse(super.bar3)(-11, -19);
+ foo7() => confuse(super.bar4)(0);
+ foo8() => confuse(super.bar4)(3, namedOptional: 77);
+
+ fooGee() => confuse(super.gee)();
+ fooGee2() => confuse(super.gee)(2);
+ fooGee3() => confuse(super.gee2)();
+ fooGee4() => confuse(super.gee2)(namedOptional: 77);
+ fooGee5() => confuse(super.gee3)(-3);
+ fooGee6() => confuse(super.gee3)(-11, -19);
+ fooGee7() => confuse(super.gee4)(0);
+ fooGee8() => confuse(super.gee4)(3, namedOptional: 77);
+
+ fooIntercept() => confuse(super.add)();
+ fooIntercept2() => confuse(super.add)(2);
+ fooIntercept3() => confuse(super.trim)();
+ fooIntercept4() => confuse(super.trim)(namedOptional: 77);
+ fooIntercept5() => confuse(super.sublist)(-3);
+ fooIntercept6() => confuse(super.sublist)(-11, -19);
+ fooIntercept7() => confuse(super.splitMapJoin)(0);
+ fooIntercept8() => confuse(super.splitMapJoin)(3, onMatch: 77, onNonMatch: 8);
+
+ fooIntercept21() => confuse(super.shuffle)();
+ fooIntercept22() => confuse(super.shuffle)(2);
+ fooIntercept23() => confuse(super.toList)();
+ fooIntercept24() => confuse(super.toList)(growable: 77);
+ fooIntercept25() => confuse(super.lastIndexOf)(-3);
+ fooIntercept26() => confuse(super.lastIndexOf)(-11, -19);
+ fooIntercept27() => confuse(super.lastWhere)(0);
+ fooIntercept28() => confuse(super.lastWhere)(3, orElse: 77);
bar([var optional]) => -1;
- bar2(x, { namedOptional }) => -1;
+ bar2({ namedOptional }) => -1;
+ bar3(x, [var optional]) => -1;
+ bar4(x, { namedOptional }) => -1;
+
+ gee([var optional]) => -1;
+ gee2({ namedOptional }) => -1;
+ gee3(x, [var optional]) => -1;
+ gee4(x, { namedOptional }) => -1;
+
+ add([var optional = 33]) => -1;
+ trim({ namedOptional: 22 }) => -1;
+ sublist(x, [optional = 44]) => -1;
+ splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) => -1;
+
+ shuffle([var optional = 121]) => -1;
+ toList({ growable: 2233 }) => -1;
+ lastIndexOf(x, [optional = 424]) => -1;
+ lastWhere(x, { orElse: 555 }) => -1;
}
confuse(x) {
@@ -29,11 +99,50 @@
}
main() {
- var list = [new A(), new B() ];
+ var list = [new A(), new B(), [], "foo" ];
var a = list[confuse(0)];
var b = list[confuse(1)];
+ var ignored = list[confuse(2)];
+ var ignored2 = list[confuse(3)];
+
+ var t = b.gee() + b.gee2() + b.gee3(9) + b.gee4(19);
+ Expect.equals(-4, t);
+ t = b.shuffle() + b.toList() + b.lastIndexOf(1) + b.lastWhere(2);
+ Expect.equals(-4, t);
+
Expect.equals(499, b.foo());
Expect.equals(500, b.foo2());
Expect.equals(42, b.foo3());
- Expect.equals(120, b.foo4());
+ Expect.equals(117, b.foo4());
+ Expect.equals(498, b.foo5());
+ Expect.equals(468, b.foo6());
+ Expect.equals(426, b.foo7());
+ Expect.equals(502, b.foo8());
+
+ Expect.equals(499, b.fooGee());
+ Expect.equals(500, b.fooGee2());
+ Expect.equals(42, b.fooGee3());
+ Expect.equals(117, b.fooGee4());
+ Expect.equals(498, b.fooGee5());
+ Expect.equals(468, b.fooGee6());
+ Expect.equals(426, b.fooGee7());
+ Expect.equals(502, b.fooGee8());
+
+ Expect.equals(1267, b.fooIntercept());
+ Expect.equals(1236, b.fooIntercept2());
+ Expect.equals(1335, b.fooIntercept3());
+ Expect.equals(1390, b.fooIntercept4());
+ Expect.equals(4362, b.fooIntercept5());
+ Expect.equals(4291, b.fooIntercept6());
+ Expect.equals(232, b.fooIntercept7());
+ Expect.equals(199, b.fooIntercept8());
+
+ Expect.equals(12463, b.fooIntercept21());
+ Expect.equals(12344, b.fooIntercept22());
+ Expect.equals(15364, b.fooIntercept23());
+ Expect.equals(13208, b.fooIntercept24());
+ Expect.equals(14742, b.fooIntercept25());
+ Expect.equals(14291, b.fooIntercept26());
+ Expect.equals(1768, b.fooIntercept27());
+ Expect.equals(1771, b.fooIntercept28());
}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 19f070b..5e5d7de 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -27,6 +27,3 @@
lib/web_gl/dartium/web_gl_dartium: CompileTimeError # Issue 16524
lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16524
lib/web_sql/dartium/web_sql_dartium: CompileTimeError # Issue 16524
-lib/_internal/compiler/samples/jsonify/jsonify: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/dart2js_mirrors: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/analyze: CompileTimeError # Issue 17264
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index e8fd11f..0fe2a10 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -59,6 +59,7 @@
mirrors/instance_members_test: RuntimeError # Issue 14633
mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
mirrors/invoke_test: RuntimeError # Issue 11954
+mirrors/invoke_call_on_closure_test: RuntimeError # 6490
mirrors/invoke_call_through_getter_previously_accessed_test: RuntimeError # Issue 15138
mirrors/invoke_call_through_getter_test: RuntimeError # Issue 15138
mirrors/invoke_call_through_implicit_getter_previously_accessed_test: RuntimeError # Issue 15138
@@ -254,14 +255,14 @@
async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
async/schedule_microtask6_test: Fail # Issue 10910
mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
mirrors/mirrors_reader_test: Pass, Slow # Dartium debug uses -O0
mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
mirrors/local_isolate_test: Skip # http://dartbug.com/12188
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
async/timer_test: Fail, Pass # Issue 15487
async/multiple_timer_test: Fail, Pass # Issue 15487
async/stream_periodic3_test: Fail, Pass # Issue 15487
@@ -282,6 +283,8 @@
[ $compiler == none && $runtime == dartium ]
async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
mirrors/find_in_context_test: Fail # Issue 13719: Needs VM flag
mirrors/find_in_context_private_test: Fail # Issue 13719: Needs VM flag
mirrors/find_in_context_fake_function_test: Fail # Issue 13719: Needs VM flag
@@ -290,7 +293,7 @@
# Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
async/timer_isolate_test: Fail
-[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm)) ]
+[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm || $runtime == ContentShellOnAndroid)) ]
# Deferred loading is not implemented in the VM so the error-handling will never be triggered.
async/deferred/deferred_fail_to_load_test: Fail
# Deferred loading is not implemented in the VM so the error-handling will never be triggered.
@@ -312,3 +315,9 @@
mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+mirrors/*deferred*: Skip # Issue 17458
+
+[ $compiler == dart2js && $mode == debug ]
+mirrors/native_class_test: Pass, Slow
diff --git a/tests/lib/mirrors/invoke_call_on_closure_test.dart b/tests/lib/mirrors/invoke_call_on_closure_test.dart
new file mode 100644
index 0000000..e023ff0
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_on_closure_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.invoke_call_on_closure;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+ call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+ noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+ get fakeFunctionCall => new FakeFunctionCall();
+ get fakeFunctionNSM => new FakeFunctionNSM();
+ get closure => (x, y) => '2 $this $x $y';
+ get closureOpt => (x, y, [z, w]) => '3 $this $x $y $z $w';
+ get closureNamed => (x, y, {z, w}) => '4 $this $x $y $z $w';
+ tearOff(x, y) => '22 $this $x $y';
+ tearOffOpt(x, y, [z, w]) => '33 $this $x $y $z $w';
+ tearOffNamed(x, y, {z, w}) => '44 $this $x $y $z $w';
+
+ noSuchMethod(msg) => 'DNU';
+
+ toString() => 'C';
+}
+
+main() {
+ var c = new C();
+ InstanceMirror im;
+
+ im = reflect(c.fakeFunctionCall);
+ Expect.equals('1 5 6',
+ im.invoke(#call, [5, 6]).reflectee);
+
+ im = reflect(c.fakeFunctionNSM);
+ Expect.equals('7, 8',
+ im.invoke(#call, [7, 8]).reflectee);
+
+ im = reflect(c.closure);
+ Expect.equals('2 C 9 10',
+ im.invoke(#call, [9, 10]).reflectee);
+
+ im = reflect(c.closureOpt);
+ Expect.equals('3 C 11 12 13 null',
+ im.invoke(#call, [11, 12, 13]).reflectee);
+
+ im = reflect(c.closureNamed);
+ Expect.equals('4 C 14 15 null 16',
+ im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+
+ im = reflect(c.tearOff);
+ Expect.equals('22 C 9 10',
+ im.invoke(#call, [9, 10]).reflectee);
+
+ im = reflect(c.tearOffOpt);
+ Expect.equals('33 C 11 12 13 null',
+ im.invoke(#call, [11, 12, 13]).reflectee);
+
+ im = reflect(c.tearOffNamed);
+ Expect.equals('44 C 14 15 null 16',
+ im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+}
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 7417d56..edaa64a 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -325,6 +325,12 @@
contentType = ContentType.parse(
" text/html ; charset = utf-8 ; xxx=yyy ");
check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
+
+ // Test builtin content types.
+ check(ContentType.TEXT, "text", "plain", {"charset": "utf-8"});
+ check(ContentType.HTML, "text", "html", {"charset": "utf-8"});
+ check(ContentType.JSON, "application", "json", {"charset": "utf-8"});
+ check(ContentType.BINARY, "application", "octet-stream");
}
void testContentTypeCache() {
@@ -436,6 +442,9 @@
Expect.throws(() => new _Cookie.fromSetCookieValue("xxx"));
Expect.throws(() => new _Cookie.fromSetCookieValue(
"xxx=yyy; expires=12 jan 2013"));
+ Expect.throws(() => new _Cookie.fromSetCookieValue("x x = y y"));
+ Expect.throws(() => new _Cookie("[4", "y"));
+ Expect.throws(() => new _Cookie("4", "y\""));
_HttpHeaders headers = new _HttpHeaders("1.1");
headers.set('Cookie',
diff --git a/tests/standalone/io/https_server_test.dart b/tests/standalone/io/https_server_test.dart
index 559a4d1..cdba064 100644
--- a/tests/standalone/io/https_server_test.dart
+++ b/tests/standalone/io/https_server_test.dart
@@ -2,20 +2,21 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import "package:expect/expect.dart";
-import "package:path/path.dart";
import "dart:async";
import "dart:io";
import "dart:isolate";
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+const CERTIFICATE = "localhost_cert";
void testListenOn() {
void test(void onDone()) {
- HttpServer.bindSecure(HOST_NAME,
+ HttpServer.bindSecure(HOST,
0,
backlog: 5,
- certificateName: 'localhost_cert').then((server) {
+ certificateName: CERTIFICATE).then((server) {
ReceivePort serverPort = new ReceivePort();
server.listen((HttpRequest request) {
request.listen(
@@ -28,7 +29,7 @@
HttpClient client = new HttpClient();
ReceivePort clientPort = new ReceivePort();
- client.getUrl(Uri.parse("https://$HOST_NAME:${server.port}/"))
+ client.getUrl(Uri.parse("https://${HOST.host}:${server.port}/"))
.then((HttpClientRequest request) {
return request.close();
})
@@ -64,7 +65,7 @@
}
void testEarlyClientClose() {
- HttpServer.bindSecure(HOST_NAME,
+ HttpServer.bindSecure(HOST,
0,
certificateName: 'localhost_cert').then((server) {
server.listen(
@@ -76,7 +77,7 @@
var count = 0;
makeRequest() {
- Socket.connect(HOST_NAME, server.port).then((socket) {
+ Socket.connect(HOST, server.port).then((socket) {
var data = "Invalid TLS handshake";
socket.write(data);
socket.close();
@@ -96,6 +97,9 @@
void main() {
InitializeSSL();
- testListenOn();
- testEarlyClientClose();
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ testListenOn();
+ testEarlyClientClose();
+ });
}
diff --git a/tests/standalone/io/process_set_exit_code_script.dart b/tests/standalone/io/process_set_exit_code_script.dart
index 9a34f05..38a8075 100644
--- a/tests/standalone/io/process_set_exit_code_script.dart
+++ b/tests/standalone/io/process_set_exit_code_script.dart
@@ -5,7 +5,13 @@
import "dart:io";
main() {
+ if (exitCode != 0) {
+ throw "Bad initial exit-code";
+ }
stdout.write("standard out");
stderr.write("standard error");
exitCode = 25;
+ if (exitCode != 25) {
+ throw "Exit-code not set correctly";
+ }
}
diff --git a/tests/standalone/io/raw_secure_server_closing_test.dart b/tests/standalone/io/raw_secure_server_closing_test.dart
index c38ab58..16fffe3 100644
--- a/tests/standalone/io/raw_secure_server_closing_test.dart
+++ b/tests/standalone/io/raw_secure_server_closing_test.dart
@@ -12,9 +12,8 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
.then((_) {
asyncEnd();
});
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
server.listen((serverConnection) {
serverConnection.listen((event) {
if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
@@ -40,7 +39,7 @@
onDone: () {
serverDone.complete(null);
});
- RawSecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+ RawSecureSocket.connect(HOST, server.port).then((clientConnection) {
clientConnection.listen((event){
if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
clientConnection.shutdown(SocketDirection.SEND);
@@ -56,8 +55,8 @@
void testCloseBothEnds() {
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
- var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+ var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
clientEnd.close();
@@ -76,7 +75,7 @@
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME,
+ RawSecureServerSocket.bind(HOST,
0,
CERTIFICATE,
backlog: 2 * socketCount).then((server) {
@@ -97,7 +96,7 @@
subscription.pause();
var connectCount = 0;
for (int i = 0; i < socketCount; i++) {
- RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ RawSecureSocket.connect(HOST, server.port).then((connection) {
connection.shutdown(SocketDirection.SEND);
});
}
@@ -105,7 +104,7 @@
subscription.resume();
resumed = true;
for (int i = 0; i < socketCount; i++) {
- RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ RawSecureSocket.connect(HOST, server.port).then((connection) {
connection.shutdown(SocketDirection.SEND);
});
}
@@ -118,7 +117,7 @@
asyncStart();
List ends = [];
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
Expect.isTrue(server.port > 0);
void checkDone() {
if (ends.length < 2 * socketCount) return;
@@ -135,7 +134,7 @@
});
for (int i = 0; i < socketCount; i++) {
- RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ RawSecureSocket.connect(HOST, server.port).then((connection) {
ends.add(connection);
checkDone();
});
@@ -145,11 +144,19 @@
main() {
+ asyncStart();
var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart',
useBuiltinRoots: false);
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ runTests();
+ asyncEnd();
+ });
+}
+runTests() {
testCloseOneEnd("client");
testCloseOneEnd("server");
testCloseBothEnds();
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index 49c04fb..6c90ed9 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -12,14 +12,13 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
void testSimpleBind() {
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
Expect.isTrue(s.port > 0);
s.close();
asyncEnd();
@@ -49,8 +48,8 @@
// Bind to a port already in use.
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
- RawSecureServerSocket.bind(HOST_NAME,
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+ RawSecureServerSocket.bind(HOST,
s.port,
CERTIFICATE).then((t) {
s.close();
@@ -67,8 +66,8 @@
void testSimpleConnect(String certificate) {
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
- var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+ RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+ var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
clientEnd.shutdown(SocketDirection.SEND);
@@ -82,8 +81,8 @@
void testSimpleConnectFail(String certificate, bool cancelOnError) {
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
- var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port)
+ RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+ var clientEndFuture = RawSecureSocket.connect(HOST, server.port)
.then((clientEnd) {
Expect.fail("No client connection expected.");
})
@@ -107,9 +106,9 @@
void testServerListenAfterConnect() {
asyncStart();
- RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
Expect.isTrue(server.port > 0);
- var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+ var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
new Timer(const Duration(milliseconds: 500), () {
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
@@ -423,13 +422,13 @@
Future<RawSecureSocket> connectClient(int port) {
if (connectSecure) {
- return RawSecureSocket.connect(HOST_NAME, port);
+ return RawSecureSocket.connect(HOST, port);
} else if (!handshakeBeforeSecure) {
- return RawSocket.connect(HOST_NAME, port).then((socket) {
+ return RawSocket.connect(HOST, port).then((socket) {
return RawSecureSocket.secure(socket);
});
} else {
- return RawSocket.connect(HOST_NAME, port).then((socket) {
+ return RawSocket.connect(HOST, port).then((socket) {
return runClientHandshake(socket).then((subscription) {
return RawSecureSocket.secure(socket, subscription: subscription);
});
@@ -466,9 +465,9 @@
if (listenSecure) {
RawSecureServerSocket.bind(
- HOST_NAME, 0, CERTIFICATE).then(serverReady);
+ HOST, 0, CERTIFICATE).then(serverReady);
} else {
- RawServerSocket.bind(HOST_NAME, 0).then(serverReady);
+ RawServerSocket.bind(HOST, 0).then(serverReady);
}
}
@@ -477,7 +476,7 @@
asyncStart();
var clientComplete = new Completer();
- RawServerSocket.bind(HOST_NAME, 0).then((server) {
+ RawServerSocket.bind(HOST, 0).then((server) {
server.listen((client) {
var subscription;
subscription = client.listen((_) {
@@ -506,7 +505,7 @@
});
});
- RawSocket.connect(HOST_NAME, server.port).then((socket) {
+ RawSocket.connect(HOST, server.port).then((socket) {
var subscription;
subscription = socket.listen((_) {
if (pausedClient) {
@@ -534,10 +533,19 @@
}
main() {
+ asyncStart();
var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart',
useBuiltinRoots: false);
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ runTests();
+ asyncEnd();
+ });
+}
+
+runTests() {
testSimpleBind();
testInvalidBind();
testSimpleConnect(CERTIFICATE);
diff --git a/tests/standalone/io/secure_client_raw_server_test.dart b/tests/standalone/io/secure_client_raw_server_test.dart
index 9d40baf..e380f75 100644
--- a/tests/standalone/io/secure_client_raw_server_test.dart
+++ b/tests/standalone/io/secure_client_raw_server_test.dart
@@ -7,16 +7,16 @@
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
-import "package:expect/expect.dart";
-import "package:path/path.dart";
import "dart:async";
import "dart:io";
-import "dart:isolate";
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
Future<RawSecureServerSocket> startEchoServer() {
- return RawSecureServerSocket.bind(HOST_NAME,
+ return RawSecureServerSocket.bind(HOST,
0,
CERTIFICATE).then((server) {
server.listen((RawSecureSocket client) {
@@ -60,7 +60,7 @@
Future testClient(server) {
Completer success = new Completer();
List<String> chunks = <String>[];
- SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+ SecureSocket.connect(HOST, server.port).then((socket) {
socket.write("Hello server.");
socket.close();
socket.listen(
@@ -78,13 +78,13 @@
}
void main() {
+ asyncStart();
String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart');
-
- startEchoServer()
+ InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+ .then((_) => startEchoServer())
.then(testClient)
- .then((server) {
- server.close();
- });
+ .then((server) => server.close())
+ .then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/secure_client_server_test.dart b/tests/standalone/io/secure_client_server_test.dart
index cc41db9..3c41266 100644
--- a/tests/standalone/io/secure_client_server_test.dart
+++ b/tests/standalone/io/secure_client_server_test.dart
@@ -7,16 +7,16 @@
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
-import "package:expect/expect.dart";
-import "package:path/path.dart";
import "dart:async";
import "dart:io";
-import "dart:isolate";
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
Future<SecureServerSocket> startEchoServer() {
- return SecureServerSocket.bind(HOST_NAME,
+ return SecureServerSocket.bind(HOST,
0,
CERTIFICATE).then((server) {
server.listen((SecureSocket client) {
@@ -31,7 +31,7 @@
}
Future testClient(server) {
- return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+ return SecureSocket.connect(HOST, server.port).then((socket) {
socket.write("Hello server.");
socket.close();
return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -43,13 +43,13 @@
}
void main() {
+ asyncStart();
String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart');
-
- startEchoServer()
+ InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first )
+ .then((_) => startEchoServer())
.then(testClient)
- .then((server) {
- server.close();
- });
+ .then((server) => server.close())
+ .then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/secure_multiple_client_server_test.dart b/tests/standalone/io/secure_multiple_client_server_test.dart
index c6cfcf3..2eeeed2 100644
--- a/tests/standalone/io/secure_multiple_client_server_test.dart
+++ b/tests/standalone/io/secure_multiple_client_server_test.dart
@@ -7,19 +7,20 @@
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
-import "package:expect/expect.dart";
-import "package:path/path.dart";
import "dart:async";
import "dart:io";
-import "dart:isolate";
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+SecureServerSocket SERVER;
const CERTIFICATE = "localhost_cert";
-Future<SecureServerSocket> startServer() {
- return SecureServerSocket.bind(HOST_NAME,
- 0,
- CERTIFICATE).then((server) {
- server.listen((SecureSocket client) {
+
+Future startServer() {
+ return SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+ SERVER = server;
+ SERVER.listen((SecureSocket client) {
client.fold(<int>[], (message, data) => message..addAll(data))
.then((message) {
String received = new String.fromCharCodes(message);
@@ -29,30 +30,29 @@
client.close();
});
});
- return server;
});
}
-Future testClient(server, name) {
- return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+Future testClient(name) {
+ return SecureSocket.connect(HOST, SERVER.port).then((socket) {
socket.add("Hello from client $name".codeUnits);
socket.close();
return socket.fold(<int>[], (message, data) => message..addAll(data))
.then((message) {
Expect.listEquals("Welcome, client $name".codeUnits, message);
- return server;
});
});
}
void main() {
+ asyncStart();
var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart');
-
- startServer()
- .then((server) => Future.wait(
- ['able', 'baker', 'charlie', 'dozen', 'elapse']
- .map((name) => testClient(server, name))))
- .then((servers) => servers.first.close());
+ InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+ .then((_) => startServer())
+ .then((_) => ['ale', 'bar', 'che', 'den', 'els'].map(testClient))
+ .then((futures) => Future.wait(futures))
+ .then((_) => SERVER.close())
+ .then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index a0bcb41..34de17d 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_test.dart
@@ -7,18 +7,17 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
Future testClientCertificate() {
var completer = new Completer();
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST,
0,
CERTIFICATE,
requestClientCertificate: true).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME,
+ var clientEndFuture = SecureSocket.connect(HOST,
server.port,
sendClientCertificate: true);
server.listen((serverEnd) {
@@ -43,11 +42,11 @@
Future testRequiredClientCertificate() {
var completer = new Completer();
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST,
0,
CERTIFICATE,
requireClientCertificate: true).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME,
+ var clientEndFuture = SecureSocket.connect(HOST,
server.port,
sendClientCertificate: true);
server.listen((serverEnd) {
@@ -77,7 +76,8 @@
useBuiltinRoots: false);
asyncStart();
- testClientCertificate()
+ InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+ .then((_) => testClientCertificate())
.then((_) => testRequiredClientCertificate())
.then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/secure_server_client_no_certificate_test.dart b/tests/standalone/io/secure_server_client_no_certificate_test.dart
index 3ffeb22..888f988 100644
--- a/tests/standalone/io/secure_server_client_no_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_no_certificate_test.dart
@@ -7,18 +7,17 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
Future testNoClientCertificate() {
var completer = new Completer();
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST,
0,
CERTIFICATE,
requestClientCertificate: true).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME,
+ var clientEndFuture = SecureSocket.connect(HOST,
server.port);
server.listen((serverEnd) {
X509Certificate certificate = serverEnd.peerCertificate;
@@ -37,11 +36,11 @@
Future testNoRequiredClientCertificate() {
var completer = new Completer();
bool clientError = false;
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST,
0,
CERTIFICATE,
requireClientCertificate: true).then((server) {
- Future clientDone = SecureSocket.connect(HOST_NAME, server.port)
+ Future clientDone = SecureSocket.connect(HOST, server.port)
.catchError((e) { clientError = true; });
server.listen((serverEnd) {
Expect.fail("Got a unverifiable connection");
@@ -64,7 +63,8 @@
useBuiltinRoots: false);
asyncStart();
- testNoRequiredClientCertificate()
+ InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+ .then((_) => testNoRequiredClientCertificate())
.then((_) => testNoClientCertificate())
.then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/secure_server_closing_test.dart b/tests/standalone/io/secure_server_closing_test.dart
index ffe2ea7..a45877b 100644
--- a/tests/standalone/io/secure_server_closing_test.dart
+++ b/tests/standalone/io/secure_server_closing_test.dart
@@ -12,9 +12,8 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
.then((_) {
asyncEnd();
});
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
server.listen((serverConnection) {
serverConnection.listen(
(data) {
@@ -44,7 +43,7 @@
onDone: () {
serverDone.complete(null);
});
- SecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+ SecureSocket.connect(HOST, server.port).then((clientConnection) {
clientConnection.listen(
(data) {
Expect.fail("No data should be received by client");
@@ -62,8 +61,8 @@
void testCloseBothEnds() {
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+ var clientEndFuture = SecureSocket.connect(HOST, server.port);
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
clientEnd.destroy();
@@ -82,7 +81,7 @@
asyncStart();
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST,
0,
CERTIFICATE,
backlog: 2 * socketCount).then((server) {
@@ -103,7 +102,7 @@
subscription.pause();
var connectCount = 0;
for (int i = 0; i < socketCount; i++) {
- SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ SecureSocket.connect(HOST, server.port).then((connection) {
connection.close();
});
}
@@ -111,7 +110,7 @@
subscription.resume();
resumed = true;
for (int i = 0; i < socketCount; i++) {
- SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ SecureSocket.connect(HOST, server.port).then((connection) {
connection.close();
});
}
@@ -126,7 +125,7 @@
asyncStart();
List ends = [];
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
Expect.isTrue(server.port > 0);
void checkDone() {
if (ends.length < 2 * socketCount) return;
@@ -143,7 +142,7 @@
});
for (int i = 0; i < socketCount; i++) {
- SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+ SecureSocket.connect(HOST, server.port).then((connection) {
ends.add(connection);
checkDone();
});
@@ -153,11 +152,19 @@
main() {
+ asyncStart();
String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart',
useBuiltinRoots: false);
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ runTests();
+ asyncEnd();
+ });
+}
+runTests() {
testCloseOneEnd("client");
testCloseOneEnd("server");
testCloseBothEnds();
diff --git a/tests/standalone/io/secure_server_socket_test.dart b/tests/standalone/io/secure_server_socket_test.dart
index f8a4559..a6a1087 100644
--- a/tests/standalone/io/secure_server_socket_test.dart
+++ b/tests/standalone/io/secure_server_socket_test.dart
@@ -12,14 +12,13 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
void testSimpleBind() {
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
Expect.isTrue(s.port > 0);
s.close();
asyncEnd();
@@ -49,8 +48,8 @@
// Bind to a port already in use.
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
- SecureServerSocket.bind(HOST_NAME,
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+ SecureServerSocket.bind(HOST,
s.port,
CERTIFICATE).then((t) {
Expect.fail("Multiple listens on same port");
@@ -64,8 +63,8 @@
void testSimpleConnect(String certificate) {
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+ SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+ var clientEndFuture = SecureSocket.connect(HOST, server.port);
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
clientEnd.close();
@@ -79,8 +78,8 @@
void testSimpleConnectFail(String certificate, bool cancelOnError) {
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
- var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port)
+ SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+ var clientEndFuture = SecureSocket.connect(HOST, server.port)
.then((clientEnd) {
Expect.fail("No client connection expected.");
})
@@ -104,9 +103,9 @@
void testServerListenAfterConnect() {
asyncStart();
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
Expect.isTrue(server.port > 0);
- var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+ var clientEndFuture = SecureSocket.connect(HOST, server.port);
new Timer(const Duration(milliseconds: 500), () {
server.listen((serverEnd) {
clientEndFuture.then((clientEnd) {
@@ -145,7 +144,7 @@
}
}
- SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+ SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
server.listen((client) {
int bytesRead = 0;
int bytesWritten = 0;
@@ -167,7 +166,7 @@
});
});
- SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+ SecureSocket.connect(HOST, server.port).then((socket) {
int bytesRead = 0;
int bytesWritten = 0;
List<int> dataSent = createTestData();
@@ -194,6 +193,14 @@
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart',
useBuiltinRoots: false);
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ runTests();
+ asyncEnd();
+ });
+}
+
+runTests() {
testSimpleBind();
testInvalidBind();
testSimpleConnect(CERTIFICATE);
@@ -204,5 +211,4 @@
testSimpleConnectFail("CN=notARealDistinguishedName", true);
testServerListenAfterConnect();
testSimpleReadWrite();
- asyncEnd();
}
diff --git a/tests/standalone/io/secure_session_resume_test.dart b/tests/standalone/io/secure_session_resume_test.dart
index 83acd3e..5b8a3a3 100644
--- a/tests/standalone/io/secure_session_resume_test.dart
+++ b/tests/standalone/io/secure_session_resume_test.dart
@@ -16,16 +16,17 @@
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
-import "package:expect/expect.dart";
-import "package:path/path.dart";
import "dart:async";
import "dart:io";
import "dart:isolate";
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
Future<SecureServerSocket> startServer() {
- return SecureServerSocket.bind(HOST_NAME,
+ return SecureServerSocket.bind(HOST,
0,
CERTIFICATE).then((server) {
server.listen((SecureSocket client) {
@@ -43,7 +44,7 @@
}
Future testClient(server, name) {
- return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+ return SecureSocket.connect(HOST, server.port).then((socket) {
socket.write("Hello from client $name");
socket.close();
return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -55,14 +56,20 @@
}
void main() {
+ asyncStart();
String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart');
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ runTests().then((_) => asyncEnd());
+ });
+}
+Future runTests() {
Duration delay = const Duration(milliseconds: 0);
Duration delay_between_connections = const Duration(milliseconds: 300);
-
- startServer()
+ return startServer()
.then((server) => Future.wait(
['able', 'baker', 'charlie', 'dozen', 'elapse']
.map((name) {
diff --git a/tests/standalone/io/secure_socket_bad_data_test.dart b/tests/standalone/io/secure_socket_bad_data_test.dart
index bff3f46..f0c3fa5 100644
--- a/tests/standalone/io/secure_socket_bad_data_test.dart
+++ b/tests/standalone/io/secure_socket_bad_data_test.dart
@@ -12,9 +12,8 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
// This test sends corrupt data in the middle of a secure network connection.
@@ -133,15 +132,15 @@
Future<List> connectClient(int port, bool hostnameInConnect) =>
- RawSocket.connect(HOST_NAME, port)
+ RawSocket.connect(HOST, port)
.then((socket) =>
(hostnameInConnect ? RawSecureSocket.secure(socket)
- : RawSecureSocket.secure(socket, host: HOST_NAME))
+ : RawSecureSocket.secure(socket, host: HOST))
.then((secureSocket) => [socket, secureSocket]));
Future test(bool hostnameInConnect) {
- return RawServerSocket.bind(HOST_NAME, 0).then((server) {
+ return RawServerSocket.bind(HOST, 0).then((server) {
server.listen((client) {
RawSecureSocket.secureServer(client, CERTIFICATE)
.then((secureClient) {
@@ -164,6 +163,8 @@
password: 'dartdart',
useBuiltinRoots: false);
asyncStart();
- Future.wait([test(false), test(true)])
- .then((_) => asyncEnd());
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ return Future.wait([test(false), test(true)]);
+ }).then((_) => asyncEnd());
}
diff --git a/tests/standalone/io/socket_upgrade_to_secure_test.dart b/tests/standalone/io/socket_upgrade_to_secure_test.dart
index ff0f727..d973a78 100644
--- a/tests/standalone/io/socket_upgrade_to_secure_test.dart
+++ b/tests/standalone/io/socket_upgrade_to_secure_test.dart
@@ -12,9 +12,8 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
-import "package:path/path.dart";
-const HOST_NAME = "localhost";
+InternetAddress HOST;
const CERTIFICATE = "localhost_cert";
// This test creates a server and a client connects. After connecting
@@ -154,12 +153,12 @@
Future<SecureSocket> connectClient(int port) {
if (!handshakeBeforeSecure) {
- return Socket.connect(HOST_NAME, port).then((socket) {
+ return Socket.connect(HOST, port).then((socket) {
var future;
if (hostnameInConnect) {
future = SecureSocket.secure(socket);
} else {
- future = SecureSocket.secure(socket, host: HOST_NAME);
+ future = SecureSocket.secure(socket, host: HOST);
}
return future.then((secureSocket) {
socket.add([0]);
@@ -167,13 +166,13 @@
});
});
} else {
- return Socket.connect(HOST_NAME, port).then((socket) {
+ return Socket.connect(HOST, port).then((socket) {
return runClientHandshake(socket).then((_) {
var future;
if (hostnameInConnect) {
future = SecureSocket.secure(socket);
} else {
- future = SecureSocket.secure(socket, host: HOST_NAME);
+ future = SecureSocket.secure(socket, host: HOST.host);
}
return future.then((secureSocket) {
socket.add([0]);
@@ -209,18 +208,23 @@
});
}
- ServerSocket.bind(HOST_NAME, 0).then(serverReady);
+ ServerSocket.bind(HOST, 0).then(serverReady);
}
main() {
+ asyncStart();
var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
SecureSocket.initialize(database: certificateDatabase,
password: 'dartdart',
useBuiltinRoots: false);
- test(false, false);
- test(true, false);
- test(false, true);
- test(true, true);
- test(false, true, true);
- test(true, true, true);
+ InternetAddress.lookup("localhost").then((hosts) {
+ HOST = hosts.first;
+ test(false, false);
+ test(true, false);
+ test(false, true);
+ test(true, true);
+ test(false, true, true);
+ test(true, true, true);
+ asyncEnd();
+ });
}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index f5d3421..488828d 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -33,7 +33,7 @@
# of allowed open files ('ulimit -n' says something like 256).
io/socket_many_connections_test: Skip
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
typed_array_test: Fail # Issue 13921
typed_array_int64_uint64_test: Fail # Issue 13921
typed_data_isolate_test: Skip # This test uses dart:io
@@ -47,7 +47,7 @@
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-javascript_int_overflow_literal_test/01: fail, ok
+javascript_int_overflow_literal_test/01: Fail, OK
issue14236_test: Skip # Analyzer can't handle Script snapshots.
# test issue https://code.google.com/p/dart/issues/detail?id=11518
@@ -104,9 +104,6 @@
out_of_memory_test: Skip # passes on Mac, crashes on Linux
oom_error_stacktrace_test: Skip # Fails on Linux
-[ $arch == arm ]
-vmservice/isolate_echo_test: Fail # Issue 17431
-
[ $arch == simmips || $arch == mips ]
io/web_socket_test: Pass, Slow
io/http_server_response_test: Pass, Slow
@@ -116,11 +113,16 @@
[ $arch == mips ]
io/signals_test: Fail # dartbug.com/17440
io/file_stat_test: Fail # dartbug.com/17440
+io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
+io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
-[ $compiler == none && $runtime == dartium && $unchecked ]
+[ $arch == mips && $mode == debug ]
+io/file_read_special_device_test: Fail # dartbug.com/17440
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
assert_test: Fail # Issue 13719: Please triage this failure.
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
javascript_int_overflow_literal_test/01: Fail # Issue 13719: Please triage this failure.
javascript_int_overflow_test: Fail # Issue 13719: Please triage this failure.
diff --git a/tests/standalone/vmservice/isolate_code_test.dart b/tests/standalone/vmservice/isolate_code_test.dart
index ec8da52..34d07ae 100644
--- a/tests/standalone/vmservice/isolate_code_test.dart
+++ b/tests/standalone/vmservice/isolate_code_test.dart
@@ -25,7 +25,7 @@
onRequestCompleted(Map reply) {
Expect.equals('Code', reply['type']);
- Expect.equals('C.c', reply['function']['user_name']);
+ Expect.equals('c', reply['function']['user_name']);
Expect.isTrue(reply['disassembly'].length > 0);
}
}
diff --git a/tests/standalone/vmservice/isolate_function_test.dart b/tests/standalone/vmservice/isolate_function_test.dart
index 3e6d045..c0493eb 100644
--- a/tests/standalone/vmservice/isolate_function_test.dart
+++ b/tests/standalone/vmservice/isolate_function_test.dart
@@ -13,7 +13,7 @@
super('http://127.0.0.1:$port/$id/$functionId');
onRequestCompleted(Map reply) {
Expect.equals('Function', reply['type']);
- Expect.equals('C.c', reply['user_name']);
+ Expect.equals('c', reply['user_name']);
Expect.equals(false, reply['is_static']);
}
}
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 23e361b..5630a6f 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -8,13 +8,13 @@
[ $compiler == none && $runtime == drt ]
dummy_compiler_test: Skip # http://dartbug.com/7233
-dart2js_test: Skip # Uses dart:io.
[ $compiler == dart2js && $browser ]
*: Skip
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && $runtime != vm ]
dart2js_test: Skip # Uses dart:io.
-[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-source_mirrors_test: StaticWarning # Issue 17264
\ No newline at end of file
+
+[ $compiler == dart2js && $mode == debug ]
+source_mirrors_test: Slow, Pass
diff --git a/tools/VERSION b/tools/VERSION
index 9491f2d..9a5c8e94 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 1
MINOR 3
PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 1
+PRERELEASE 5
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index bf99227..1959043 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -185,16 +185,19 @@
return name, True
-def Clobber():
+def Clobber(force=None):
"""
Clobbers the builder before we do the build, if appropriate.
- mode: either 'debug' or 'release'
"""
- if os.environ.get(BUILDER_CLOBBER) != "1":
+ if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
return
+ clobber_string = 'Clobber'
+ if force:
+ clobber_string = 'Clobber(always)'
- with BuildStep('Clobber'):
+ with BuildStep(clobber_string):
cmd = [sys.executable,
'./tools/clean_output_directory.py']
print 'Clobbering %s' % (' '.join(cmd))
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index ab49a1c..cf51d1a 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -7,6 +7,7 @@
import hashlib
import imp
import os
+import string
import subprocess
import sys
@@ -312,3 +313,11 @@
f.write('%s *%s' % (checksum, mangled_filename))
return checksum_filename
+
+def GetChannelFromName(name):
+ """Get the channel from the name. Bleeding edge builders don't
+ have a suffix."""
+ channel_name = string.split(name, '-').pop()
+ if channel_name in Channel.ALL_CHANNELS:
+ return channel_name
+ return Channel.BLEEDING_EDGE
diff --git a/tools/bots/src-tarball.py b/tools/bots/src-tarball.py
index 1c32034..24e86f0 100644
--- a/tools/bots/src-tarball.py
+++ b/tools/bots/src-tarball.py
@@ -11,11 +11,16 @@
Archive tarball and debian package to google cloud storage.
"""
+import os
import re
import sys
import bot
+import bot_utils
+utils = bot_utils.GetUtils()
+
+HOST_OS = utils.GuessOS()
SRC_BUILDER = r'src-tarball-linux'
def SrcConfig(name, is_buildbot):
@@ -32,12 +37,26 @@
return bot.BuildInfo('none', 'none', 'release', 'linux')
def SrcSteps(build_info):
+ # We always clobber the bot, to not leave old tarballs and packages
+ # floating around the out dir.
+ bot.Clobber(force=True)
with bot.BuildStep('Create src tarball'):
- args = [sys.executable, './tools/create_tarball.py']
+ version = utils.GetVersion()
+ builddir = os.path.join(bot_utils.DART_DIR,
+ utils.GetBuildDir(HOST_OS, HOST_OS),
+ 'src_and_installation')
+ if not os.path.exists(builddir):
+ os.makedirs(builddir)
+ tarfilename = 'dart-%s.tar.gz' % version
+ tarfile = os.path.join(builddir, tarfilename)
+ args = [sys.executable, './tools/create_tarball.py', '--tar_filename',
+ tarfile]
print 'Building src tarball'
bot.RunProcess(args)
print 'Building Debian packages'
- args = [sys.executable, './tools/create_debian_packages.py']
+ args = [sys.executable, './tools/create_debian_packages.py',
+ '--tar_filename', tarfile,
+ '--out_dir', builddir]
bot.RunProcess(args)
if __name__ == '__main__':
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index b76c2e3..4f31dfb 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -9,6 +9,7 @@
# will build a source package and a 32-bit (i386) and 64-bit (amd64)
# binary packages.
+import optparse
import sys
import tarfile
import subprocess
@@ -21,6 +22,17 @@
HOST_CPUS = utils.GuessCpus()
DART_DIR = abspath(join(__file__, '..', '..'))
+def BuildOptions():
+ result = optparse.OptionParser()
+ result.add_option("--tar_filename",
+ default=None,
+ help="The tar file to build from.")
+ result.add_option("--out_dir",
+ default=None,
+ help="Where to put the packages.")
+
+ return result
+
def RunBuildPackage(opt, cwd):
cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
cmd.extend(opt)
@@ -32,14 +44,12 @@
raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
(' '.join(cmd), stderr, stdout))
-def BuildDebianPackage():
+def BuildDebianPackage(tarball, out_dir):
version = utils.GetVersion()
- builddir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
tarroot = 'dart-%s' % version
- tarname = 'dart-%s.tar.gz' % version
origtarname = 'dart_%s.orig.tar.gz' % version
- tarball = join(builddir, tarname)
- if not exists(join(builddir, tarball)):
+
+ if not exists(join(out_dir, tarball)):
print 'Source tarball not found'
return -1
@@ -76,18 +86,25 @@
'%s-1_amd64.deb' % debbase
]
for name in source_package:
- copyfile(join(temp_dir, name), join(builddir, name))
+ copyfile(join(temp_dir, name), join(out_dir, name))
for name in i386_package:
- copyfile(join(temp_dir, name), join(builddir, name))
+ copyfile(join(temp_dir, name), join(out_dir, name))
for name in amd64_package:
- copyfile(join(temp_dir, name), join(builddir, name))
+ copyfile(join(temp_dir, name), join(out_dir, name))
def Main():
if HOST_OS != 'linux':
print 'Debian build only supported on linux'
return -1
- BuildDebianPackage()
+ options, args = BuildOptions().parse_args()
+ out_dir = options.out_dir
+ tar_filename = options.tar_filename
+ if not options.out_dir:
+ out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
+ if not options.tar_filename:
+ raise Exception('Please specify the input filename.')
+ BuildDebianPackage(options.tar_filename, options.out_dir)
if __name__ == '__main__':
sys.exit(Main())
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 015d0dd..62b9194 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -230,10 +230,14 @@
for jarFile in jarFiles:
copyfile(jarFile, join(DARTANALYZER_DEST, os.path.basename(jarFile)))
+ RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'asset')
+ os.makedirs(os.path.dirname(RESOURCE))
+ copytree(join(HOME, 'sdk', 'lib', '_internal', 'pub', 'asset'),
+ join(RESOURCE),
+ ignore=ignore_patterns('.svn'))
+
# Copy in 7zip for Windows.
if HOST_OS == 'win32':
- RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'resource')
- os.makedirs(RESOURCE)
copytree(join(HOME, 'third_party', '7zip'),
join(RESOURCE, '7zip'),
ignore=ignore_patterns('.svn'))
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index e71ebf1..58679e0 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -32,7 +32,6 @@
HOST_OS = utils.GuessOS()
DART_DIR = abspath(join(__file__, '..', '..'))
-
# Flags.
verbose = False
@@ -52,6 +51,10 @@
result.add_option("-v", "--verbose",
help='Verbose output.',
default=False, action="store_true")
+ result.add_option("--tar_filename",
+ default=None,
+ help="The output file.")
+
return result
def Filter(tar_info):
@@ -103,23 +106,18 @@
f.write(svn_revision)
-def CreateTarball():
+def CreateTarball(tarfilename):
global ignoredPaths # Used for adding the output directory.
# Generate the name of the tarfile
version = utils.GetVersion()
global versiondir
versiondir = 'dart-%s' % version
- tarname = '%s.tar.gz' % versiondir
debian_dir = 'tools/linux_dist_support/debian'
- # Create the tar file in the build directory.
- builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
- tardir = join(DART_DIR, builddir)
# Don't include the build directory in the tarball (ignored paths
# are relative to DART_DIR).
+ builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
ignoredPaths.append(builddir)
- if not exists(tardir):
- makedirs(tardir)
- tarfilename = join(tardir, tarname)
+
print 'Creating tarball: %s' % tarfilename
with tarfile.open(tarfilename, mode='w:gz') as tar:
for f in listdir(DART_DIR):
@@ -157,7 +155,10 @@
global verbose
verbose = True
- CreateTarball()
+ if not options.tar_filename:
+ raise Exception('Please specify an output filename')
+
+ CreateTarball(options.tar_filename)
if __name__ == '__main__':
sys.exit(Main())
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 69e9804..c3e351b 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -75,6 +75,12 @@
},
"support_level": "experimental"
},
+ "Animation": {
+ "members": {
+ "Animation": {}
+ },
+ "support_level": "untriaged"
+ },
"ApplicationCache": {
"comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
"dart_action": "unstable",
@@ -1009,6 +1015,12 @@
"CompositionEvent": {
"comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-CompositionEvent",
"members": {
+ "activeSegmentEnd": {
+ "support_level": "untriaged"
+ },
+ "activeSegmentStart": {
+ "support_level": "untriaged"
+ },
"data": {},
"initCompositionEvent": {}
},
@@ -1072,6 +1084,9 @@
},
"ConsoleBase": {
"members": {
+ "assert": {
+ "support_level": "untriaged"
+ },
"assertCondition": {
"support_level": "untriaged"
},
@@ -1580,6 +1595,14 @@
},
"support_level": "experimental"
},
+ "DeprecatedStorageInfo": {
+ "members": {},
+ "support_level": "untriaged"
+ },
+ "DeprecatedStorageQuota": {
+ "members": {},
+ "support_level": "untriaged"
+ },
"DeviceAcceleration": {
"comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
"members": {
@@ -1594,6 +1617,9 @@
"members": {
"acceleration": {},
"accelerationIncludingGravity": {},
+ "initDeviceMotionEvent": {
+ "support_level": "untriaged"
+ },
"interval": {},
"rotationRate": {}
},
@@ -1657,6 +1683,9 @@
"comment": "http://dom.spec.whatwg.org/#interface-document",
"members": {
"URL": {},
+ "activeElement": {
+ "support_level": "untriaged"
+ },
"adoptNode": {},
"anchors": {
"dart_action": "suppress"
@@ -1896,6 +1925,9 @@
},
"onreadystatechange": {},
"onreset": {},
+ "onresize": {
+ "support_level": "untriaged"
+ },
"onscroll": {},
"onsearch": {
"comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -1977,6 +2009,9 @@
"querySelectorAll": {},
"readyState": {},
"referrer": {},
+ "rootElement": {
+ "support_level": "untriaged"
+ },
"securityPolicy": {
"comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy",
"support_level": "experimental"
@@ -1985,6 +2020,9 @@
"comment": "http://dev.w3.org/csswg/cssom/#widl-Document-selectedStyleSheetSet"
},
"styleSheets": {},
+ "timeline": {
+ "support_level": "untriaged"
+ },
"title": {},
"visibilityState": {
"support_level": "untriaged"
@@ -2274,6 +2312,9 @@
"localName": {
"support_level": "untriaged"
},
+ "matches": {
+ "support_level": "untriaged"
+ },
"namespaceURI": {
"support_level": "untriaged"
},
@@ -2370,6 +2411,9 @@
"support_level": "untriaged"
},
"onreset": {},
+ "onresize": {
+ "support_level": "untriaged"
+ },
"onscroll": {},
"onsearch": {
"comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -3092,27 +3136,49 @@
},
"FontFaceSet": {
"members": {
+ "add": {
+ "support_level": "untriaged"
+ },
"addEventListener": {
"support_level": "untriaged"
},
"check": {
"support_level": "untriaged"
},
+ "clear": {
+ "support_level": "untriaged"
+ },
+ "delete": {
+ "support_level": "untriaged"
+ },
"dispatchEvent": {
"support_level": "untriaged"
},
+ "forEach": {
+ "support_level": "untriaged"
+ },
+ "has": {
+ "support_level": "untriaged"
+ },
"match": {
"support_level": "untriaged"
},
"removeEventListener": {
"support_level": "untriaged"
},
+ "size": {
+ "support_level": "untriaged"
+ },
"status": {
"support_level": "untriaged"
}
},
"support_level": "untriaged"
},
+ "FontFaceSetForEachCallback": {
+ "members": {},
+ "support_level": "untriaged"
+ },
"FontLoader": {
"comment": "http://www.w3.org/TR/css3-fonts/#document-fontloader",
"members": {
@@ -3314,6 +3380,9 @@
"onreset": {
"support_level": "untriaged"
},
+ "onresize": {
+ "support_level": "untriaged"
+ },
"onscroll": {
"support_level": "untriaged"
},
@@ -3936,6 +4005,9 @@
"onreset": {
"support_level": "untriaged"
},
+ "onresize": {
+ "support_level": "untriaged"
+ },
"onscroll": {
"support_level": "untriaged"
},
@@ -4479,6 +4551,9 @@
"dart_action": "suppress",
"support_level": "deprecated"
},
+ "crossOrigin": {
+ "support_level": "untriaged"
+ },
"disabled": {},
"href": {},
"hreflang": {},
@@ -4668,6 +4743,9 @@
"readyState": {},
"seekable": {},
"seeking": {},
+ "setMediaKeys": {
+ "support_level": "untriaged"
+ },
"src": {},
"startTime": {
"support_level": "nonstandard"
@@ -5022,6 +5100,9 @@
"members": {
"HTMLSelectElement": {},
"__setter__": {},
+ "add": {
+ "support_level": "untriaged"
+ },
"autofocus": {},
"checkValidity": {},
"disabled": {},
@@ -5036,6 +5117,9 @@
"name": {},
"namedItem": {},
"options": {},
+ "remove": {
+ "support_level": "untriaged"
+ },
"required": {},
"selectedIndex": {},
"selectedOptions": {},
@@ -5752,6 +5836,14 @@
"members": {},
"support_level": "untriaged"
},
+ "ImageBitmapFactories": {
+ "members": {
+ "createImageBitmap": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"ImageData": {
"comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
"members": {
@@ -5792,6 +5884,25 @@
},
"support_level": "experimental"
},
+ "InstallEvent": {
+ "members": {
+ "reloadAll": {
+ "support_level": "untriaged"
+ },
+ "replace": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
+ "InstallPhaseEvent": {
+ "members": {
+ "waitUntil": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"Int16Array": {
"comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
"members": {
@@ -6111,6 +6222,9 @@
"MediaKeyNeededEvent": {
"comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent",
"members": {
+ "contentType": {
+ "support_level": "untriaged"
+ },
"initData": {}
},
"support_level": "experimental"
@@ -6135,6 +6249,9 @@
"onwebkitkeyadded": {},
"onwebkitkeyerror": {},
"onwebkitkeymessage": {},
+ "release": {
+ "support_level": "untriaged"
+ },
"removeEventListener": {},
"sessionId": {},
"update": {}
@@ -6510,6 +6627,9 @@
"comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
"support_level": "experimental"
},
+ "isProtocolHandlerRegistered": {
+ "support_level": "untriaged"
+ },
"javaEnabled": {
"dart_action": "suppress",
"support_level": "nonstandard"
@@ -6551,6 +6671,15 @@
"requestMIDIAccess": {
"support_level": "untriaged"
},
+ "serviceWorker": {
+ "support_level": "untriaged"
+ },
+ "storageQuota": {
+ "support_level": "untriaged"
+ },
+ "unregisterProtocolHandler": {
+ "support_level": "untriaged"
+ },
"userAgent": {
"comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
},
@@ -7264,6 +7393,47 @@
"members": {},
"support_level": "untriaged"
},
+ "Player": {
+ "members": {
+ "cancel": {
+ "support_level": "untriaged"
+ },
+ "currentTime": {
+ "support_level": "untriaged"
+ },
+ "finish": {
+ "support_level": "untriaged"
+ },
+ "finished": {
+ "support_level": "untriaged"
+ },
+ "pause": {
+ "support_level": "untriaged"
+ },
+ "paused": {
+ "support_level": "untriaged"
+ },
+ "play": {
+ "support_level": "untriaged"
+ },
+ "playbackRate": {
+ "support_level": "untriaged"
+ },
+ "reverse": {
+ "support_level": "untriaged"
+ },
+ "source": {
+ "support_level": "untriaged"
+ },
+ "startTime": {
+ "support_level": "untriaged"
+ },
+ "timeLag": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"Plugin": {
"members": {
"__getter__": {},
@@ -8313,6 +8483,10 @@
},
"support_level": "stable"
},
+ "SVGDiscardElement": {
+ "members": {},
+ "support_level": "untriaged"
+ },
"SVGDocument": {
"comment": "http://www.w3.org/TR/SVG/struct.html#InterfaceSVGDocument",
"dart_action": "unstable",
@@ -8459,6 +8633,9 @@
"onreset": {
"support_level": "untriaged"
},
+ "onresize": {
+ "support_level": "untriaged"
+ },
"onscroll": {
"support_level": "untriaged"
},
@@ -11086,6 +11263,9 @@
"Screen": {
"comment": "http://dev.w3.org/csswg/cssom-view/#the-screen-interface",
"members": {
+ "addEventListener": {
+ "support_level": "untriaged"
+ },
"availHeight": {},
"availLeft": {
"dart_action": "experimental",
@@ -11097,8 +11277,23 @@
},
"availWidth": {},
"colorDepth": {},
+ "dispatchEvent": {
+ "support_level": "untriaged"
+ },
"height": {},
+ "lockOrientation": {
+ "support_level": "untriaged"
+ },
+ "orientation": {
+ "support_level": "untriaged"
+ },
"pixelDepth": {},
+ "removeEventListener": {
+ "support_level": "untriaged"
+ },
+ "unlockOrientation": {
+ "support_level": "untriaged"
+ },
"width": {}
},
"support_level": "stable"
@@ -11211,6 +11406,17 @@
"members": {},
"support_level": "untriaged"
},
+ "ServiceWorkerContainer": {
+ "members": {
+ "register": {
+ "support_level": "untriaged"
+ },
+ "unregister": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"ServiceWorkerGlobalScope": {
"members": {},
"support_level": "untriaged"
@@ -11245,7 +11451,22 @@
"comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface",
"members": {
"SharedWorker": {},
- "port": {}
+ "addEventListener": {
+ "support_level": "untriaged"
+ },
+ "dispatchEvent": {
+ "support_level": "untriaged"
+ },
+ "onerror": {
+ "support_level": "untriaged"
+ },
+ "port": {},
+ "removeEventListener": {
+ "support_level": "untriaged"
+ },
+ "workerStart": {
+ "support_level": "untriaged"
+ }
},
"support_level": "experimental"
},
@@ -11304,6 +11525,9 @@
"dispatchEvent": {
"support_level": "untriaged"
},
+ "mode": {
+ "support_level": "untriaged"
+ },
"remove": {
"support_level": "untriaged"
},
@@ -11577,15 +11801,30 @@
"PERSISTENT": {},
"TEMPORARY": {},
"queryUsageAndQuota": {},
- "requestQuota": {}
+ "quota": {
+ "support_level": "untriaged"
+ },
+ "requestQuota": {},
+ "usage": {
+ "support_level": "untriaged"
+ }
},
"support_level": "experimental"
},
"StorageQuota": {
"comment": "http://www.w3.org/TR/quota-api/#idl-def-StorageQuota",
"members": {
+ "queryInfo": {
+ "support_level": "untriaged"
+ },
"queryUsageAndQuota": {},
- "requestQuota": {}
+ "requestPersistentQuota": {
+ "support_level": "untriaged"
+ },
+ "requestQuota": {},
+ "supportedTypes": {
+ "support_level": "untriaged"
+ }
},
"support_level": "experimental"
},
@@ -11696,6 +11935,30 @@
},
"support_level": "stable"
},
+ "TextDecoder": {
+ "members": {
+ "TextDecoder": {},
+ "decode": {
+ "support_level": "untriaged"
+ },
+ "encoding": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
+ "TextEncoder": {
+ "members": {
+ "TextEncoder": {},
+ "encode": {
+ "support_level": "untriaged"
+ },
+ "encoding": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"TextEvent": {
"comment": "http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413/events.html#Events-TextEvent",
"dart_action": "unstable",
@@ -11831,6 +12094,43 @@
},
"support_level": "stable"
},
+ "TimedItem": {
+ "members": {
+ "activeDuration": {
+ "support_level": "untriaged"
+ },
+ "currentIteration": {
+ "support_level": "untriaged"
+ },
+ "duration": {
+ "support_level": "untriaged"
+ },
+ "endTime": {
+ "support_level": "untriaged"
+ },
+ "localTime": {
+ "support_level": "untriaged"
+ },
+ "player": {
+ "support_level": "untriaged"
+ },
+ "specified": {
+ "support_level": "untriaged"
+ },
+ "startTime": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
+ "Timeline": {
+ "members": {
+ "play": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"TimeoutHandler": {
"comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-timers.html#timeouthandler",
"members": {
@@ -11838,6 +12138,38 @@
},
"support_level": "stable"
},
+ "Timing": {
+ "members": {
+ "__setter__": {
+ "support_level": "untriaged"
+ },
+ "delay": {
+ "support_level": "untriaged"
+ },
+ "direction": {
+ "support_level": "untriaged"
+ },
+ "easing": {
+ "support_level": "untriaged"
+ },
+ "endDelay": {
+ "support_level": "untriaged"
+ },
+ "fill": {
+ "support_level": "untriaged"
+ },
+ "iterationStart": {
+ "support_level": "untriaged"
+ },
+ "iterations": {
+ "support_level": "untriaged"
+ },
+ "playbackRate": {
+ "support_level": "untriaged"
+ }
+ },
+ "support_level": "untriaged"
+ },
"Touch": {
"comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
"members": {
@@ -13436,6 +13768,9 @@
"support_level": "deprecated"
},
"opener": {},
+ "orientation": {
+ "support_level": "untriaged"
+ },
"outerHeight": {},
"outerWidth": {},
"pagePopupController": {
@@ -13743,6 +14078,9 @@
"console": {
"support_level": "untriaged"
},
+ "createImageBitmap": {
+ "support_level": "untriaged"
+ },
"crypto": {
"support_level": "untriaged"
},
@@ -13875,6 +14213,10 @@
},
"support_level": "untriaged"
},
+ "XMLDocument": {
+ "members": {},
+ "support_level": "untriaged"
+ },
"XMLHttpRequest": {
"comment": "http://xhr.spec.whatwg.org/#interface-xmlhttprequest",
"members": {
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index da571a3..eee4c0c 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -280,7 +280,7 @@
interface SQLResultSetRowList {
// Change the return type to Dictionary so that rows are exposed in the Dart
// API as a Maps, with the appropriate conversion in JavaScript.
- [Suppressed] any item(unsigned long index);
+ [Suppressed] object item(unsigned long index);
[Custom] Dictionary item(unsigned long index);
};
@@ -359,4 +359,13 @@
[Supplemental]
interface Window : EventTarget {};
+[Suppressed]
+interface Promise {};
+
+[Suppressed]
+interface InstallEvent {};
+
+[Suppressed]
+interface InstallPhaseEvent {};
+
Element implements GlobalEventHandlers;
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 58d77b4..f8f98fa 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -70,6 +70,17 @@
'XMLHttpRequest.open',
])
+def ReturnValueConversionHack(idl_type, value, interface_name):
+ if idl_type == 'SVGMatrix':
+ return '%sTearOff::create(%s)' % (idl_type, value)
+ elif ((idl_type == 'SVGAngle' and interface_name != 'SVGAnimatedAngle')
+ or (idl_type == 'SVGTransform' and interface_name == 'SVGSVGElement')):
+ # Somewhere in the IDL it probably specifies whether we need to call
+ # create or not.
+ return 'SVGPropertyTearOff<%s>::create(%s)' % (idl_type, value)
+
+ return value
+
#
# Renames for attributes that have names that are not legal Dart names.
#
@@ -662,21 +673,25 @@
def vector_to_dart_template_parameter(self):
return self.native_type()
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
cls = self.bindings_class()
if 'Callback' in idl_node.ext_attrs:
return '%s.release()', 'OwnPtr<%s>' % self.native_type(), cls, 'create'
- if self.custom_to_native():
+ # This is a hack to handle property references correctly.
+ if (self.native_type() in ['SVGPropertyTearOff<SVGAngle>',
+ 'SVGPropertyTearOff<SVGAngle>*', 'SVGMatrixTearOff']
+ and (callback_name != 'createSVGTransformFromMatrixCallback'
+ or interface_name != 'SVGTransformList')):
+ argument_expression_template = '%s->propertyReference()'
+ type = '%s*' % self.native_type()
+ elif self.custom_to_native():
type = 'RefPtr<%s>' % self.native_type()
argument_expression_template = '%s.get()'
else:
type = '%s*' % self.native_type()
- if isinstance(self, SVGTearOffIDLTypeInfo) and not interface_name.endswith('List'):
- argument_expression_template = '%s->propertyReference()'
- else:
- argument_expression_template = '%s'
+ argument_expression_template = '%s'
return argument_expression_template, type, cls, 'toNative'
def pass_native_by_ref(self): return False
@@ -729,7 +744,7 @@
interface_name=None, attributes=None):
auto_dart_scope='true' if auto_dart_scope_setup else 'false'
return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
- value,
+ ReturnValueConversionHack(self._idl_type, value, interface_name),
auto_dart_scope)
def custom_to_dart(self):
@@ -838,7 +853,7 @@
def vector_to_dart_template_parameter(self):
raise Exception('sequences of sequences are not supported yet')
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
item_native_type = self._item_info.vector_to_dart_template_parameter()
if isinstance(self._item_info, PrimitiveIDLTypeInfo):
return '%s', 'Vector<%s>' % item_native_type, 'DartUtilities', 'toNativeVector<%s>' % item_native_type
@@ -873,7 +888,7 @@
def __init__(self, data, item_info):
super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', data, item_info)
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
return '%s', 'RefPtr<DOMStringList>', 'DartDOMStringList', 'toNative'
def pass_native_by_ref(self): return False
@@ -892,7 +907,7 @@
if self.idl_type() == 'float': return 'float'
return self.native_type()
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
type = self.native_type()
if type == 'SerializedScriptValue':
type = 'RefPtr<%s>' % type
@@ -956,24 +971,18 @@
return '%s<%s>' % (tear_off_type, self._idl_type)
def receiver(self):
- if self._idl_type.endswith('List'):
- return 'receiver->'
- return 'receiver->propertyReference().'
+ return 'receiver->'
def to_conversion_cast(self, value, interface_name, attributes):
- svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix',
+ svg_primitive_types = ['SVGLength', 'SVGMatrix',
'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
- conversion_cast = '%s::create(%s)'
- if interface_name.startswith('SVGAnimated'):
- conversion_cast = 'static_cast<%s*>(%s)'
- elif self.idl_type() == 'SVGStringList':
- conversion_cast = '%s::create(receiver, %s)'
- elif interface_name.endswith('List'):
- conversion_cast = 'static_cast<%s*>(%s.get())'
- elif self.idl_type() in svg_primitive_types:
- conversion_cast = '%s::create(%s)'
- else:
- conversion_cast = 'static_cast<%s*>(%s)'
+
+ # This is a hack. We either need to figure out the right way to derive this
+ # information from the IDL or remove this generator.
+ if self.idl_type() != 'SVGTransformList':
+ return value
+
+ conversion_cast = 'static_cast<%s*>(%s)'
conversion_cast = conversion_cast % (self.native_type(), value)
return '%s' % (conversion_cast)
@@ -985,14 +994,13 @@
auto_dart_scope='true' if auto_dart_scope_setup else 'false'
return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
self.to_conversion_cast(
- value,
+ ReturnValueConversionHack(self._idl_type, value, interface_name),
interface_name,
attr),
auto_dart_scope)
def argument_expression(self, name, interface_name):
- return name if interface_name.endswith('List') else '%s->propertyReference()' % name
-
+ return name
class TypedListIDLTypeInfo(InterfaceIDLTypeInfo):
def __init__(self, idl_type, data, interface_name, type_registry):
@@ -1012,7 +1020,7 @@
interface_name,
attributes)
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
@@ -1036,7 +1044,7 @@
interface_name,
attributes)
- def to_native_info(self, idl_node, interface_name):
+ def to_native_info(self, idl_node, interface_name, callback_name):
return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
@@ -1176,32 +1184,27 @@
'ArrayBufferView': TypeData(clazz='BasicTypedList'),
'ArrayBuffer': TypeData(clazz='BasicTypedList'),
- 'SVGAngle': TypeData(clazz='SVGTearOff'),
- 'SVGLength': TypeData(clazz='SVGTearOff'),
- 'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'),
- 'SVGMatrix': TypeData(clazz='SVGTearOff'),
- 'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGNumber>'),
- 'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'),
+ 'SVGAngle': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGAngle>'),
+ 'SVGLength': TypeData(clazz='SVGTearOff', native_type='SVGLengthTearOff'),
+ 'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength', native_type='SVGLengthListTearOff'),
+ 'SVGMatrix': TypeData(clazz='SVGTearOff', native_type='SVGMatrixTearOff'),
+ 'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGNumberTearOff'),
+ 'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber', native_type='SVGNumberListTearOff'),
'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg',
native_type='SVGPathSegListPropertyTearOff'),
- 'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<FloatPoint>'),
- 'SVGPointList': TypeData(clazz='SVGTearOff'),
- 'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff'),
- 'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGRect>'),
+ 'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPointTearOff'),
+ 'SVGPointList': TypeData(clazz='SVGTearOff', native_type='SVGPointListTearOff'),
+ 'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff', native_type='SVGPreserveAspectRatioTearOff'),
+ 'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGRectTearOff'),
'SVGStringList': TypeData(clazz='SVGTearOff', item_type='DOMString',
- native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
- 'SVGTransform': TypeData(clazz='SVGTearOff'),
+ native_type='SVGStringListTearOff'),
+ 'SVGTransform': TypeData(clazz='SVGTearOff', native_type="SVGPropertyTearOff<SVGTransform>"),
'SVGTransformList': TypeData(clazz='SVGTearOff', item_type='SVGTransform',
native_type='SVGTransformListPropertyTearOff'),
})
_svg_supplemental_includes = [
- '"SVGAnimatedPropertyTearOff.h"',
- '"SVGAnimatedListPropertyTearOff.h"',
- '"SVGStaticListPropertyTearOff.h"',
- '"SVGAnimatedListPropertyTearOff.h"',
- '"SVGTransformListPropertyTearOff.h"',
- '"SVGPathSegListPropertyTearOff.h"',
+ '"core/svg/properties/SVGPropertyTraits.h"',
]
class TypeRegistry(object):
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index b450d61..64876ce 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -76,6 +76,8 @@
'DOMFileSystemSync', # Workers
'DatabaseSync', # Workers
'DataView', # Typed arrays
+ 'DeprecatedStorageQuota',
+ 'DeprecatedStorageInfo',
'DirectoryEntrySync', # Workers
'DirectoryReaderSync', # Workers
'DocumentType',
@@ -99,6 +101,7 @@
'RGBColor',
'RadioNodeList', # Folded onto NodeList in dart2js.
'Rect',
+ 'ServiceWorker',
'SQLTransactionSync', # Workers
'SQLTransactionSyncCallback', # Workers
'SVGAltGlyphDefElement', # Webkit only.
@@ -122,7 +125,6 @@
'SVGMissingGlyphElement',
'SVGTRefElement',
'SVGVKernElement',
- 'SharedWorker', # Workers
'SubtleCrypto',
'WebKitCSSFilterValue',
'WebKitCSSMatrix',
@@ -358,7 +360,6 @@
'Window.webkitNotifications': 'notifications',
'Window.webkitRequestFileSystem': '_requestFileSystem',
'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
- 'Element.webkitMatchesSelector' : 'matches',
'Navigator.webkitGetUserMedia': '_getUserMedia',
'Node.appendChild': 'append',
'Node.cloneNode': 'clone',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 9957b35..8684071 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -7,6 +7,12 @@
import sys
+_operation_suffix_map = {
+ '__getter__': "Getter",
+ '__setter__': "Setter",
+ '__delete__': "Deleter",
+}
+
class IDLNode(object):
"""Base class for all IDL elements.
IDLNode may contain various child nodes, and have properties. Examples
@@ -493,6 +499,11 @@
else:
raise Exception('Cannot handle %s: operation has no id' % ast)
+ if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'):
+ arg = self.arguments[0]
+ operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed'
+ self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_category, _operation_suffix_map[self.id]))
+
def _extra_repr(self):
return [self.arguments]
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index d0fa567..852d8db 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -350,7 +350,7 @@
return [Id, MAYBE(OR(['=', ExtAttrValue], ExtAttrArgList))]
def ExtAttrValue():
- return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'))
+ return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'), re.compile(r'"[^"]+"\|"[^"]+"'), re.compile(r'"[^"]+"'))
def ExtAttrFunctionValue():
return [Id, ExtAttrArgList]
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 84d22fe..7521169 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -61,7 +61,7 @@
'Element.insertAdjacentText',
'Element.remove',
'Element.shadowRoot',
- 'Element.webkitMatchesSelector',
+ 'Element.matches',
'ElementEvents.mouseWheel',
'ElementEvents.transitionEnd',
'FileReader.result',
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 3ddefdb..128882e 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -76,10 +76,56 @@
('WorkerGlobalScope', 'btoa'): 'DOMWindowBase64',
('WorkerGlobalScope', 'clearTimeout'): 'DOMWindowTimers',
('WorkerGlobalScope', 'clearInterval'): 'DOMWindowTimers',
- }
+ ('Document', 'rootElement'): 'SVGDocument',
+ ('Document', 'childElementCount'): 'ParentNode',
+ ('Document', 'firstElementChild'): 'ParentNode',
+ ('Document', 'lastElementChild'): 'ParentNode',
+ ('DocumentFragment', 'childElementCount'): 'ParentNode',
+ ('DocumentFragment', 'firstElementChild'): 'ParentNode',
+ ('DocumentFragment', 'lastElementChild'): 'ParentNode',
+ ('CharacterData', 'nextElementSibling'): 'ChildNode',
+ ('CharacterData', 'previousElementSibling'): 'ChildNode',
+ ('Element', 'childElementCount'): 'ParentNode',
+ ('Element', 'firstElementChild'): 'ParentNode',
+ ('Element', 'lastElementChild'): 'ParentNode',
+ ('Element', 'nextElementSibling'): 'ChildNode',
+ ('Element', 'previousElementSibling'): 'ChildNode',
+ ('SVGAnimationElement', 'requiredExtensions'): 'SVGTests',
+ ('SVGAnimationElement', 'requiredFeatures'): 'SVGTests',
+ ('SVGAnimationElement', 'systemLanguage'): 'SVGTests',
+ ('SVGAnimationElement', 'hasExtension'): 'SVGTests',
+ ('SVGGraphicsElement', 'requiredExtensions'): 'SVGTests',
+ ('SVGGraphicsElement', 'requiredFeatures'): 'SVGTests',
+ ('SVGGraphicsElement', 'systemLanguage'): 'SVGTests',
+ ('SVGGraphicsElement', 'hasExtension'): 'SVGTests',
+ ('SVGPatternElement', 'requiredExtensions'): 'SVGTests',
+ ('SVGPatternElement', 'requiredFeatures'): 'SVGTests',
+ ('SVGPatternElement', 'systemLanguage'): 'SVGTests',
+ ('SVGPatternElement', 'hasExtension'): 'SVGTests',
+ ('SVGUseElement', 'requiredExtensions'): 'SVGTests',
+ ('SVGUseElement', 'requiredFeatures'): 'SVGTests',
+ ('SVGUseElement', 'systemLanguage'): 'SVGTests',
+ ('SVGUseElement', 'hasExtension'): 'SVGTests',
+ ('SVGMaskElement', 'requiredExtensions'): 'SVGTests',
+ ('SVGMaskElement', 'requiredFeatures'): 'SVGTests',
+ ('SVGMaskElement', 'systemLanguage'): 'SVGTests',
+ ('SVGMaskElement', 'hasExtension'): 'SVGTests',
+ ('SVGViewSpec', 'zoomAndPan'): 'SVGZoomAndPan',
+ ('SVGViewSpec', 'setZoomAndPan'): 'SVGZoomAndPan',
+ ('SVGViewElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+ ('SVGSVGElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+ ('Screen', 'orientation'): 'ScreenOrientation',
+ ('Screen', 'lockOrientation'): 'ScreenOrientation',
+ ('Screen', 'unlockOrientation'): 'ScreenOrientation',
+ ('Navigator', 'serviceWorker'): 'NavigatorServiceWorker',
+ ('Navigator', 'storageQuota'): 'NavigatorStorageQuota',
+ ('Navigator', 'isProtocolHandlerRegistered'): 'NavigatorContentUtils',
+ ('SharedWorker', 'workerStart'): 'SharedWorkerPerformance',
+}
_cpp_import_map = {
- 'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories'
+ 'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories',
+ 'ScreenOrientation' : 'modules/screen_orientation/ScreenOrientation'
}
_cpp_overloaded_callback_map = {
@@ -318,8 +364,15 @@
self._interface_type_info = self._TypeInfo(self._interface.id)
self._members_emitter = members_emitter
self._cpp_declarations_emitter = emitter.Emitter()
+
self._cpp_impl_includes = set(['"' + partial + '.h"'
for partial in _GetCPPPartialNames(self._interface)])
+
+ # This is a hack to work around a strange C++ compile error that we weren't
+ # able to track down the true cause of.
+ if self._interface.id == 'Timing':
+ self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
+
self._cpp_definitions_emitter = emitter.Emitter()
self._cpp_resolver_emitter = emitter.Emitter()
@@ -549,10 +602,17 @@
def TypeCheckHelper(test):
return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false'
+ v8_interface_include = ''
+ # V8AbstractWorker.h does not exist so we have to hard code this case.
+ if self._interface.id != 'AbstractWorker':
+ # FIXME: We need this to access the WrapperTypeInfo.
+ v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
+
self._cpp_header_emitter.Emit(
self._template_loader.Load('cpp_header.template'),
INTERFACE=self._interface.id,
WEBCORE_INCLUDES=webcore_includes,
+ V8_INTERFACE_INCLUDE=v8_interface_include,
WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
WEBCORE_CLASS_NAME_ESCAPED=
self._interface_type_info.native_type().replace('<', '_').replace('>', '_'),
@@ -833,6 +893,7 @@
def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name, auto_scope_setup=True):
webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.id)
+
function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation, cpp_callback_name)
self._GenerateNativeCallback(
cpp_callback_name,
@@ -859,6 +920,7 @@
generate_custom_element_scope_if_needed=False):
ext_attrs = node.ext_attrs
+
if self._IsStatic(node.id):
needs_receiver = True
@@ -892,6 +954,14 @@
requires_script_execution_context = (ext_attrs.get('CallWith') == 'ExecutionContext' or
ext_attrs.get('ConstructorCallWith') == 'ExecutionContext')
+ # Hack because our parser misses that these IDL members require an execution
+ # context.
+
+ if (self._interface.id == 'FontFace'
+ and callback_name in ['familySetter', 'featureSettingsSetter', 'stretchSetter',
+ 'styleSetter', 'unicodeRangeSetter', 'variantSetter', 'weightSetter']):
+ requires_script_execution_context = True
+
requires_document = ext_attrs.get('ConstructorCallWith') == 'Document'
if requires_script_execution_context:
@@ -996,6 +1066,7 @@
if requires_dom_window or requires_document:
self._cpp_impl_includes.add('"DOMWindow.h"')
+
body_emitter.Emit(
' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsolate();\n'
' if (!domWindow) {\n'
@@ -1045,7 +1116,7 @@
type_info = self._TypeInfo(argument.type.id)
self._cpp_impl_includes |= set(type_info.conversion_includes())
argument_expression_template, type, cls, function = \
- type_info.to_native_info(argument, self._interface.id)
+ type_info.to_native_info(argument, self._interface.id, callback_name)
def AllowsNull():
# TODO(vsm): HTMLSelectElement's indexed setter treats a null as a remove.
@@ -1116,19 +1187,32 @@
' }\n')
+ interface_name = self._interface_type_info.native_type()
+
if needs_receiver:
- interface_name = self._interface_type_info.native_type()
# Hack to determine if this came from the _cpp_callback_map.
# In this case, the getter is mapped to a static method.
- if (not function_expression.startswith('receiver->') and
+ if function_expression.startswith('SVGTests::'):
+ cpp_arguments.insert(0, 'receiver')
+ elif (not function_expression.startswith('receiver->') and
not function_expression.startswith(interface_name + '::')):
- if interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']:
+ if (interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']
+ or (interface_name in ['SVGViewSpec', 'SVGViewElement', 'SVGSVGElement']
+ and callback_name in ['setZoomAndPan', 'zoomAndPanSetter', 'zoomAndPan'])
+ or (interface_name == 'Screen'
+ and callback_name in ['_lockOrientation_1Callback', '_lockOrientation_2Callback', 'unlockOrientation', 'orientation'])):
cpp_arguments.insert(0, 'receiver')
else:
cpp_arguments.append('receiver')
elif self._IsStatic(node.id):
cpp_arguments.insert(0, 'receiver')
+ if interface_name in ['SVGPropertyTearOff<SVGTransform>', 'SVGPropertyTearOff<SVGAngle>', 'SVGMatrixTearOff'] and function_expression.startswith('receiver->'):
+ # This is a horrible hack. I don't know why this one case has to be
+ # special cased.
+ if not (self._interface.id == 'SVGTransformList' and callback_name == 'createSVGTransformFromMatrixCallback'):
+ function_expression = 'receiver->propertyReference().%s' % (function_expression[len('receiver->'):])
+
function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments))
if return_type == 'void':
invocation_emitter.Emit(
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index af81731..f71ebae 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -146,8 +146,7 @@
* that does not expect REPL support.
*/
static const _CONSOLE_API_SUPPORT_HEADER =
- 'with ((console && console._commandLineAPI) || {}) {\n';
-
+ 'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
static bool expectsConsoleApi(String expression) {
return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
}
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index 3f6c4cd..4372f85 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -6,9 +6,9 @@
$(ANNOTATIONS)$(CLASS_MODIFIERS)class Console {
- Console._safe() {}
+ const Console._safe();
- static Console _safeConsole = new Console._safe();
+ static const Console _safeConsole = const Console._safe();
bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
@@ -34,7 +34,7 @@
@DomName('Console.dir')
void dir(Object arg) => _isConsoleDefined ?
- JS('void', 'console.debug(#)', arg) : null;
+ JS('void', 'console.dir(#)', arg) : null;
@DomName('Console.dirxml')
void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/tools/dom/templates/html/dartium/cpp_header.template b/tools/dom/templates/html/dartium/cpp_header.template
index 1f8ae1b..e957de6 100644
--- a/tools/dom/templates/html/dartium/cpp_header.template
+++ b/tools/dom/templates/html/dartium/cpp_header.template
@@ -9,8 +9,10 @@
#include "bindings/dart/DartDOMWrapper.h"
$WEBCORE_INCLUDES
+
// FIXME: We need this to access the WrapperTypeInfo.
-#include "V8$(INTERFACE).h"
+$V8_INTERFACE_INCLUDE
+
#include <dart_api.h>
namespace WebCore {
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 4d676c0..a1e6c4d 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -387,7 +387,7 @@
}
// Helper class for displaying directory listings.
-class _Entry {
+class _Entry implements Comparable {
final String name;
final String displayName;
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index 59aa15f..49af512 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -85,10 +85,6 @@
'--exclude-lib=async_helper',
'--exclude-lib=expect',
'--exclude-lib=docgen',
- '--exclude-lib=canonicalization.a',
- '--exclude-lib=canonicalization.b',
- '--exclude-lib=canonicalization.c',
- '--exclude-lib=canonicalization.d',
'../../pkg',
],
'message': 'Running docgen: <(_action)',