Version 1.4.0-dev.6.0
svn merge -r 35615:35841 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
git-svn-id: http://dart.googlecode.com/svn/trunk@35843 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/client/tools/buildbot_annotated_steps.py b/client/tools/buildbot_annotated_steps.py
index a2b306f..9dacc5a 100755
--- a/client/tools/buildbot_annotated_steps.py
+++ b/client/tools/buildbot_annotated_steps.py
@@ -208,6 +208,8 @@
status = ProcessBot(name, 'linux_distribution_support')
elif name.startswith('ft'):
status = ProcessBot(name, 'functional_testing')
+ elif name.startswith('version-checker'):
+ status = ProcessBot(name, 'version_checker')
else:
status = ProcessBot(name, 'compiler')
diff --git a/dart.gyp b/dart.gyp
index b7ae219..0dbe443 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -8,9 +8,10 @@
'target_name': 'most',
'type': 'none',
'dependencies': [
- 'dartanalyzer',
+ 'analyzer_java',
'create_sdk',
'dart2js',
+ 'dartanalyzer',
'editor',
'packages',
'runtime',
@@ -55,6 +56,13 @@
],
},
{
+ 'target_name': 'analyzer_java',
+ 'type': 'none',
+ 'dependencies': [
+ 'editor/analyzer_java.gyp:analyzer',
+ ],
+ },
+ {
'target_name': 'dartfmt',
'type': 'none',
'dependencies': [
diff --git a/pkg/analysis_server/lib/src/generated/service_computers.dart b/pkg/analysis_server/lib/src/generated/service_computers.dart
index 3a83340..8f8d10f 100644
--- a/pkg/analysis_server/lib/src/generated/service_computers.dart
+++ b/pkg/analysis_server/lib/src/generated/service_computers.dart
@@ -12,8 +12,10 @@
import 'package:analyzer/src/generated/source.dart' show Source;
import 'package:analyzer/src/generated/scanner.dart' show Token;
import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'service_interfaces.dart';
+import 'package:analyzer/src/generated/element.dart' as pae;
+import 'package:analyzer/src/generated/element.dart' show DartType;
+import 'package:analyzer/src/generated/source.dart';
+import 'service_interfaces.dart' as psi;
/**
* A computer for [HighlightRegion]s in a Dart [CompilationUnit].
@@ -21,14 +23,14 @@
class DartUnitHighlightsComputer {
final CompilationUnit _unit;
- List<HighlightRegion> _regions = [];
+ List<psi.HighlightRegion> _regions = [];
DartUnitHighlightsComputer(this._unit);
/**
* Returns the computed [HighlightRegion]s, not `null`.
*/
- List<HighlightRegion> compute() {
+ List<psi.HighlightRegion> compute() {
_unit.accept(new RecursiveAstVisitor_DartUnitHighlightsComputer_compute(this));
return new List.from(_regions);
}
@@ -76,39 +78,39 @@
if (_addIdentifierRegion_typeParameter(node)) {
return;
}
- _addRegion_node(node, HighlightType.IDENTIFIER_DEFAULT);
+ _addRegion_node(node, psi.HighlightType.IDENTIFIER_DEFAULT);
}
void _addIdentifierRegion_annotation(Annotation node) {
ArgumentList arguments = node.arguments;
if (arguments == null) {
- _addRegion_node(node, HighlightType.ANNOTATION);
+ _addRegion_node(node, psi.HighlightType.ANNOTATION);
} else {
- _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.ANNOTATION);
- _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
+ _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, psi.HighlightType.ANNOTATION);
+ _addRegion_token(arguments.endToken, psi.HighlightType.ANNOTATION);
}
}
bool _addIdentifierRegion_class(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! ClassElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.ClassElement) {
return false;
}
- return _addRegion_node(node, HighlightType.CLASS);
+ return _addRegion_node(node, psi.HighlightType.CLASS);
}
bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! ConstructorElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.ConstructorElement) {
return false;
}
- return _addRegion_node(node, HighlightType.CONSTRUCTOR);
+ return _addRegion_node(node, psi.HighlightType.CONSTRUCTOR);
}
bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
// should be variable
- Element element = node.staticElement;
- if (element is! VariableElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.VariableElement) {
return false;
}
// has propagated type
@@ -121,51 +123,51 @@
return false;
}
// OK
- return _addRegion_node(node, HighlightType.DYNAMIC_TYPE);
+ return _addRegion_node(node, psi.HighlightType.DYNAMIC_TYPE);
}
bool _addIdentifierRegion_field(SimpleIdentifier node) {
- Element element = node.bestElement;
- if (element is FieldFormalParameterElement) {
- element = (element as FieldFormalParameterElement).field;
+ pae.Element element = node.bestElement;
+ if (element is pae.FieldFormalParameterElement) {
+ element = (element as pae.FieldFormalParameterElement).field;
}
- if (element is FieldElement) {
- if ((element as FieldElement).isStatic) {
- return _addRegion_node(node, HighlightType.FIELD_STATIC);
+ if (element is pae.FieldElement) {
+ if ((element as pae.FieldElement).isStatic) {
+ return _addRegion_node(node, psi.HighlightType.FIELD_STATIC);
} else {
- return _addRegion_node(node, HighlightType.FIELD);
+ return _addRegion_node(node, psi.HighlightType.FIELD);
}
}
- if (element is PropertyAccessorElement) {
- if ((element as PropertyAccessorElement).isStatic) {
- return _addRegion_node(node, HighlightType.FIELD_STATIC);
+ if (element is pae.PropertyAccessorElement) {
+ if ((element as pae.PropertyAccessorElement).isStatic) {
+ return _addRegion_node(node, psi.HighlightType.FIELD_STATIC);
} else {
- return _addRegion_node(node, HighlightType.FIELD);
+ return _addRegion_node(node, psi.HighlightType.FIELD);
}
}
return false;
}
bool _addIdentifierRegion_function(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! FunctionElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.FunctionElement) {
return false;
}
- HighlightType type;
+ psi.HighlightType type;
if (node.inDeclarationContext()) {
- type = HighlightType.FUNCTION_DECLARATION;
+ type = psi.HighlightType.FUNCTION_DECLARATION;
} else {
- type = HighlightType.FUNCTION;
+ type = psi.HighlightType.FUNCTION;
}
return _addRegion_node(node, type);
}
bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! FunctionTypeAliasElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.FunctionTypeAliasElement) {
return false;
}
- return _addRegion_node(node, HighlightType.FUNCTION_TYPE_ALIAS);
+ return _addRegion_node(node, psi.HighlightType.FUNCTION_TYPE_ALIAS);
}
bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
@@ -175,117 +177,117 @@
return false;
}
// should be property accessor
- Element element = node.staticElement;
- if (element is! PropertyAccessorElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.PropertyAccessorElement) {
return false;
}
// getter or setter
- PropertyAccessorElement propertyAccessorElement = element as PropertyAccessorElement;
+ pae.PropertyAccessorElement propertyAccessorElement = element as pae.PropertyAccessorElement;
if (propertyAccessorElement.isGetter) {
- return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
+ return _addRegion_node(node, psi.HighlightType.GETTER_DECLARATION);
} else {
- return _addRegion_node(node, HighlightType.SETTER_DECLARATION);
+ return _addRegion_node(node, psi.HighlightType.SETTER_DECLARATION);
}
}
bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! PrefixElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.PrefixElement) {
return false;
}
- return _addRegion_node(node, HighlightType.IMPORT_PREFIX);
+ return _addRegion_node(node, psi.HighlightType.IMPORT_PREFIX);
}
bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
String name = node.name;
if (name == "void") {
- return _addRegion_node(node, HighlightType.KEYWORD);
+ return _addRegion_node(node, psi.HighlightType.KEYWORD);
}
return false;
}
bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! LocalVariableElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.LocalVariableElement) {
return false;
}
// OK
- HighlightType type;
+ psi.HighlightType type;
if (node.inDeclarationContext()) {
- type = HighlightType.LOCAL_VARIABLE_DECLARATION;
+ type = psi.HighlightType.LOCAL_VARIABLE_DECLARATION;
} else {
- type = HighlightType.LOCAL_VARIABLE;
+ type = psi.HighlightType.LOCAL_VARIABLE;
}
return _addRegion_node(node, type);
}
bool _addIdentifierRegion_method(SimpleIdentifier node) {
- Element element = node.bestElement;
- if (element is! MethodElement) {
+ pae.Element element = node.bestElement;
+ if (element is! pae.MethodElement) {
return false;
}
- MethodElement methodElement = element as MethodElement;
+ pae.MethodElement methodElement = element as pae.MethodElement;
bool isStatic = methodElement.isStatic;
// OK
- HighlightType type;
+ psi.HighlightType type;
if (node.inDeclarationContext()) {
if (isStatic) {
- type = HighlightType.METHOD_DECLARATION_STATIC;
+ type = psi.HighlightType.METHOD_DECLARATION_STATIC;
} else {
- type = HighlightType.METHOD_DECLARATION;
+ type = psi.HighlightType.METHOD_DECLARATION;
}
} else {
if (isStatic) {
- type = HighlightType.METHOD_STATIC;
+ type = psi.HighlightType.METHOD_STATIC;
} else {
- type = HighlightType.METHOD;
+ type = psi.HighlightType.METHOD;
}
}
return _addRegion_node(node, type);
}
bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! ParameterElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.ParameterElement) {
return false;
}
- return _addRegion_node(node, HighlightType.PARAMETER);
+ return _addRegion_node(node, psi.HighlightType.PARAMETER);
}
bool _addIdentifierRegion_topLevelVariable(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! TopLevelVariableElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.TopLevelVariableElement) {
return false;
}
- return _addRegion_node(node, HighlightType.TOP_LEVEL_VARIABLE);
+ return _addRegion_node(node, psi.HighlightType.TOP_LEVEL_VARIABLE);
}
bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
- Element element = node.staticElement;
- if (element is! TypeParameterElement) {
+ pae.Element element = node.staticElement;
+ if (element is! pae.TypeParameterElement) {
return false;
}
- return _addRegion_node(node, HighlightType.TYPE_PARAMETER);
+ return _addRegion_node(node, psi.HighlightType.TYPE_PARAMETER);
}
- void _addRegion(int offset, int length, HighlightType type) {
+ void _addRegion(int offset, int length, psi.HighlightType type) {
_regions.add(new HighlightRegionImpl(offset, length, type));
}
- bool _addRegion_node(AstNode node, HighlightType type) {
+ bool _addRegion_node(AstNode node, psi.HighlightType type) {
int offset = node.offset;
int length = node.length;
_addRegion(offset, length, type);
return true;
}
- void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightType type) {
+ void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, psi.HighlightType type) {
int offset = a.offset;
int end = b.end;
_addRegion(offset, end - offset, type);
}
- void _addRegion_token(Token token, HighlightType type) {
+ void _addRegion_token(Token token, psi.HighlightType type) {
if (token != null) {
int offset = token.offset;
int length = token.length;
@@ -293,7 +295,7 @@
}
}
- void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightType type) {
+ void _addRegion_tokenStart_tokenEnd(Token a, Token b, psi.HighlightType type) {
int offset = a.offset;
int end = b.end;
_addRegion(offset, end - offset, type);
@@ -306,14 +308,14 @@
class DartUnitNavigationComputer {
final CompilationUnit _unit;
- List<NavigationRegion> _regions = [];
+ List<psi.NavigationRegion> _regions = [];
DartUnitNavigationComputer(this._unit);
/**
* Returns the computed [NavigationRegion]s, not `null`.
*/
- List<NavigationRegion> compute() {
+ List<psi.NavigationRegion> compute() {
_unit.accept(new RecursiveAstVisitor_DartUnitNavigationComputer_compute(this));
return new List.from(_regions);
}
@@ -322,15 +324,15 @@
* If the given [Element] is not `null`, then creates a corresponding
* [NavigationRegion].
*/
- void _addRegion(int offset, int length, Element element) {
- NavigationTarget target = _createTarget(element);
+ void _addRegion(int offset, int length, pae.Element element) {
+ psi.Element target = _createTarget(element);
if (target == null) {
return;
}
- _regions.add(new NavigationRegionImpl(offset, length, <NavigationTarget> [target]));
+ _regions.add(new NavigationRegionImpl(offset, length, <psi.Element> [target]));
}
- void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
+ void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, pae.Element element) {
int offset = a.offset;
int length = b.end - offset;
_addRegion(offset, length, element);
@@ -340,7 +342,7 @@
* If the given [Element] is not `null`, then creates a corresponding
* [NavigationRegion].
*/
- void _addRegionForNode(AstNode node, Element element) {
+ void _addRegionForNode(AstNode node, pae.Element element) {
int offset = node.offset;
int length = node.length;
_addRegion(offset, length, element);
@@ -350,53 +352,50 @@
* If the given [Element] is not `null`, then creates a corresponding
* [NavigationRegion].
*/
- void _addRegionForToken(Token token, Element element) {
+ void _addRegionForToken(Token token, pae.Element element) {
int offset = token.offset;
int length = token.length;
_addRegion(offset, length, element);
}
/**
- * Returns the [NavigationTarget] for the given [Element], maybe `null` if
- * `null` was given.
+ * Returns the [com.google.dart.server.Element] for the given [Element], maybe
+ * `null` if `null` was given.
*/
- NavigationTarget _createTarget(Element element) {
+ psi.Element _createTarget(pae.Element element) {
if (element == null) {
return null;
}
- if (element is FieldFormalParameterElement) {
- element = (element as FieldFormalParameterElement).field;
+ if (element is pae.FieldFormalParameterElement) {
+ element = (element as pae.FieldFormalParameterElement).field;
}
- int nameOffset = element.nameOffset;
- int nameLength = element.displayName.length;
- if (nameOffset == -1) {
- nameLength = 0;
- }
- return new NavigationTargetImpl(element.source, _getElementId(element), nameOffset, nameLength);
+ return ElementImpl.create(element);
}
-
- String _getElementId(Element element) => element.location.encoding;
}
/**
* A computer for [Outline]s in a Dart [CompilationUnit].
*/
class DartUnitOutlineComputer {
+ static String _UNITTEST_LIBRARY = "unittest";
+
+ final Source _source;
+
final CompilationUnit _unit;
- DartUnitOutlineComputer(this._unit);
+ DartUnitOutlineComputer(this._source, this._unit);
/**
* Returns the computed [Outline]s, not `null`.
*/
- Outline compute() {
+ psi.Outline compute() {
OutlineImpl unitOutline = _newUnitOutline();
- List<Outline> unitChildren = [];
+ List<psi.Outline> unitChildren = [];
for (CompilationUnitMember unitMember in _unit.declarations) {
if (unitMember is ClassDeclaration) {
ClassDeclaration classDeclartion = unitMember;
OutlineImpl classOutline = _newClassOutline(unitOutline, unitChildren, classDeclartion);
- List<Outline> classChildren = [];
+ List<psi.Outline> classChildren = [];
for (ClassMember classMember in classDeclartion.members) {
if (classMember is ConstructorDeclaration) {
ConstructorDeclaration constructorDeclaration = classMember;
@@ -437,16 +436,59 @@
return unitOutline;
}
- void _addLocalFunctionOutlines(OutlineImpl parenet, FunctionBody body) {
- List<Outline> localOutlines = [];
- body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parenet, localOutlines));
- parenet.children = new List.from(localOutlines);
+ void _addLocalFunctionOutlines(OutlineImpl parent, FunctionBody body) {
+ List<psi.Outline> localOutlines = [];
+ body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parent, localOutlines));
+ parent.children = new List.from(localOutlines);
+ }
+
+ bool _addUnitTestOutlines(OutlineImpl parent, List<psi.Outline> children, MethodInvocation node) {
+ psi.ElementKind unitTestKind = null;
+ if (_isUnitTestFunctionInvocation(node, "group")) {
+ unitTestKind = psi.ElementKind.UNIT_TEST_GROUP;
+ } else if (_isUnitTestFunctionInvocation(node, "test")) {
+ unitTestKind = psi.ElementKind.UNIT_TEST_CASE;
+ } else {
+ return false;
+ }
+ ArgumentList argumentList = node.argumentList;
+ if (argumentList != null) {
+ List<Expression> arguments = argumentList.arguments;
+ if (arguments.length == 2 && arguments[1] is FunctionExpression) {
+ // prepare name
+ String name;
+ int nameOffset;
+ int nameLength;
+ {
+ Expression nameNode = arguments[0];
+ if (nameNode is SimpleStringLiteral) {
+ SimpleStringLiteral nameLiteral = arguments[0] as SimpleStringLiteral;
+ name = nameLiteral.value;
+ nameOffset = nameLiteral.valueOffset;
+ nameLength = name.length;
+ } else {
+ name = "??????????";
+ nameOffset = nameNode.offset;
+ nameLength = nameNode.length;
+ }
+ }
+ // add a new outline
+ FunctionExpression functionExpression = arguments[1] as FunctionExpression;
+ SourceRegionImpl sourceRegion = new SourceRegionImpl(node.offset, node.length);
+ ElementImpl element = new ElementImpl(null, _source, unitTestKind, name, nameOffset, nameLength, null, null, false, false, false);
+ OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
+ children.add(outline);
+ _addLocalFunctionOutlines(outline, functionExpression.body);
+ return true;
+ }
+ }
+ return false;
}
/**
* Returns the [AstNode]'s source region.
*/
- SourceRegion _getSourceRegion(AstNode node) {
+ psi.SourceRegion _getSourceRegion(AstNode node) {
int endOffset = node.end;
// prepare position of the node among its siblings
int firstOffset;
@@ -490,21 +532,45 @@
return new SourceRegionImpl(prevSiblingEnd, endOffset - prevSiblingEnd);
}
- OutlineImpl _newClassOutline(Outline unitOutline, List<Outline> unitChildren, ClassDeclaration classDeclaration) {
+ /**
+ * Returns `true` if the given [MethodInvocation] is invocation of the function with
+ * the given name from the "unittest" library.
+ */
+ bool _isUnitTestFunctionInvocation(MethodInvocation node, String name) {
+ SimpleIdentifier methodName = node.methodName;
+ if (methodName != null) {
+ pae.Element element = methodName.staticElement;
+ if (element is pae.FunctionElement) {
+ pae.FunctionElement functionElement = element;
+ if (name == functionElement.name) {
+ pae.LibraryElement libraryElement = functionElement.library;
+ return libraryElement != null && _UNITTEST_LIBRARY == libraryElement.name;
+ }
+ }
+ }
+ return false;
+ }
+
+ OutlineImpl _newClassOutline(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassDeclaration classDeclaration) {
SimpleIdentifier nameNode = classDeclaration.name;
String name = nameNode.name;
- OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(classDeclaration), OutlineKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false);
+ ElementImpl element = new ElementImpl(ElementImpl.createId(classDeclaration.element), _source, psi.ElementKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
+ OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
unitChildren.add(outline);
return outline;
}
- void _newClassTypeAlias(Outline unitOutline, List<Outline> unitChildren, ClassTypeAlias alias) {
+ void _newClassTypeAlias(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassTypeAlias alias) {
SimpleIdentifier nameNode = alias.name;
String name = nameNode.name;
- unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false));
+ ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(alias);
+ OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
+ unitChildren.add(outline);
}
- void _newConstructorOutline(OutlineImpl classOutline, List<Outline> children, ConstructorDeclaration constructorDeclaration) {
+ void _newConstructorOutline(OutlineImpl classOutline, List<psi.Outline> children, ConstructorDeclaration constructorDeclaration) {
Identifier returnType = constructorDeclaration.returnType;
String name = returnType.name;
int offset = returnType.offset;
@@ -519,70 +585,234 @@
length = constructorNameNode.length;
}
FormalParameterList parameters = constructorDeclaration.parameters;
- OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(constructorDeclaration), OutlineKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, isPrivate, false);
+ ElementImpl element = new ElementImpl(ElementImpl.createId(constructorDeclaration.element), _source, psi.ElementKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, false, isPrivate);
+ psi.SourceRegion sourceRegion = _getSourceRegion(constructorDeclaration);
+ OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
children.add(outline);
_addLocalFunctionOutlines(outline, constructorDeclaration.body);
}
- void _newField(OutlineImpl classOutline, List<Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
+ void _newField(OutlineImpl classOutline, List<psi.Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
SimpleIdentifier nameNode = field.name;
String name = nameNode.name;
- children.add(new OutlineImpl(classOutline, _getSourceRegion(field), OutlineKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, StringUtilities.startsWithChar(name, 0x5F), isStatic));
+ ElementImpl element = new ElementImpl(ElementImpl.createId(field.element), _source, psi.ElementKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, isStatic, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(field);
+ OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
+ children.add(outline);
}
- void _newFunctionOutline(Outline unitOutline, List<Outline> unitChildren, FunctionDeclaration functionDeclaration) {
+ void _newFunctionOutline(psi.Outline parent, List<psi.Outline> children, FunctionDeclaration functionDeclaration) {
TypeName returnType = functionDeclaration.returnType;
SimpleIdentifier nameNode = functionDeclaration.name;
String name = nameNode.name;
FunctionExpression functionExpression = functionDeclaration.functionExpression;
FormalParameterList parameters = functionExpression.parameters;
- OutlineKind kind;
+ psi.ElementKind kind;
if (functionDeclaration.isGetter) {
- kind = OutlineKind.GETTER;
+ kind = psi.ElementKind.GETTER;
} else if (functionDeclaration.isSetter) {
- kind = OutlineKind.SETTER;
+ kind = psi.ElementKind.SETTER;
} else {
- kind = OutlineKind.FUNCTION;
+ kind = psi.ElementKind.FUNCTION;
}
- OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(functionDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false);
- unitChildren.add(outline);
+ ElementImpl element = new ElementImpl(ElementImpl.createId(functionDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(functionDeclaration);
+ OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
+ children.add(outline);
_addLocalFunctionOutlines(outline, functionExpression.body);
}
- void _newFunctionTypeAliasOutline(Outline unitOutline, List<Outline> unitChildren, FunctionTypeAlias alias) {
+ void _newFunctionTypeAliasOutline(psi.Outline unitOutline, List<psi.Outline> unitChildren, FunctionTypeAlias alias) {
TypeName returnType = alias.returnType;
SimpleIdentifier nameNode = alias.name;
String name = nameNode.name;
FormalParameterList parameters = alias.parameters;
- unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false));
+ ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(alias);
+ OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
+ unitChildren.add(outline);
}
- void _newMethodOutline(OutlineImpl classOutline, List<Outline> children, MethodDeclaration methodDeclaration) {
+ void _newMethodOutline(OutlineImpl classOutline, List<psi.Outline> children, MethodDeclaration methodDeclaration) {
TypeName returnType = methodDeclaration.returnType;
SimpleIdentifier nameNode = methodDeclaration.name;
String name = nameNode.name;
FormalParameterList parameters = methodDeclaration.parameters;
- OutlineKind kind;
+ psi.ElementKind kind;
if (methodDeclaration.isGetter) {
- kind = OutlineKind.GETTER;
+ kind = psi.ElementKind.GETTER;
} else if (methodDeclaration.isSetter) {
- kind = OutlineKind.SETTER;
+ kind = psi.ElementKind.SETTER;
} else {
- kind = OutlineKind.METHOD;
+ kind = psi.ElementKind.METHOD;
}
- OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(methodDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), methodDeclaration.isStatic);
+ ElementImpl element = new ElementImpl(ElementImpl.createId(methodDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, methodDeclaration.isStatic, StringUtilities.startsWithChar(name, 0x5F));
+ psi.SourceRegion sourceRegion = _getSourceRegion(methodDeclaration);
+ OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
children.add(outline);
_addLocalFunctionOutlines(outline, methodDeclaration.body);
}
- OutlineImpl _newUnitOutline() => new OutlineImpl(null, new SourceRegionImpl(_unit.offset, _unit.length), OutlineKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+ OutlineImpl _newUnitOutline() {
+ ElementImpl element = new ElementImpl(ElementImpl.createId(_unit.element), _source, psi.ElementKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+ return new OutlineImpl(null, element, new SourceRegionImpl(_unit.offset, _unit.length));
+ }
+}
+
+/**
+ * A concrete implementation of [Element].
+ */
+class ElementImpl implements psi.Element {
+ /**
+ * Creates an [ElementImpl] instance for the given
+ * [com.google.dart.engine.element.Element].
+ */
+ static ElementImpl create(pae.Element element) {
+ // prepare name
+ String name = element.displayName;
+ int nameOffset = element.nameOffset;
+ int nameLength = name != null ? name.length : 0;
+ // prepare element kind specific information
+ psi.ElementKind outlineKind;
+ bool isAbstract = false;
+ bool isStatic = false;
+ bool isPrivate = element.isPrivate;
+ while (true) {
+ if (element.kind == pae.ElementKind.CLASS) {
+ outlineKind = psi.ElementKind.CLASS;
+ isAbstract = (element as pae.ClassElement).isAbstract;
+ } else if (element.kind == pae.ElementKind.COMPILATION_UNIT) {
+ outlineKind = psi.ElementKind.COMPILATION_UNIT;
+ nameOffset = -1;
+ nameLength = 0;
+ } else if (element.kind == pae.ElementKind.CONSTRUCTOR) {
+ outlineKind = psi.ElementKind.CONSTRUCTOR;
+ String className = element.enclosingElement.name;
+ if (name.length != 0) {
+ name = "${className}.${name}";
+ } else {
+ name = className;
+ }
+ } else if (element.kind == pae.ElementKind.FUNCTION) {
+ outlineKind = psi.ElementKind.FUNCTION;
+ } else if (element.kind == pae.ElementKind.FUNCTION_TYPE_ALIAS) {
+ outlineKind = psi.ElementKind.FUNCTION_TYPE_ALIAS;
+ } else if (element.kind == pae.ElementKind.LIBRARY) {
+ outlineKind = psi.ElementKind.LIBRARY;
+ } else if (element.kind == pae.ElementKind.METHOD) {
+ outlineKind = psi.ElementKind.METHOD;
+ isAbstract = (element as pae.MethodElement).isAbstract;
+ } else {
+ outlineKind = psi.ElementKind.UNKNOWN;
+ }
+ break;
+ }
+ // extract return type and parameters from toString()
+ // TODO(scheglov) we need a way to get this information directly from an Element
+ String parameters;
+ String returnType;
+ {
+ String str = element.toString();
+ // return type
+ String rightArrow = pae.Element.RIGHT_ARROW;
+ int returnIndex = str.lastIndexOf(rightArrow);
+ if (returnIndex != -1) {
+ returnType = str.substring(returnIndex + rightArrow.length);
+ str = str.substring(0, returnIndex);
+ } else {
+ returnType = null;
+ }
+ // parameters
+ int parametersIndex = str.indexOf("(");
+ if (parametersIndex != -1) {
+ parameters = str.substring(parametersIndex);
+ } else {
+ parameters = null;
+ }
+ }
+ // new element
+ return new ElementImpl(createId(element), element.source, outlineKind, name, nameOffset, nameLength, parameters, returnType, isAbstract, isStatic, isPrivate);
+ }
+
+ /**
+ * Returns an identifier of the given [Element], maybe `null` if `null` given.
+ */
+ static String createId(pae.Element element) {
+ if (element == null) {
+ return null;
+ }
+ return element.location.encoding;
+ }
+
+ final String id;
+
+ final Source source;
+
+ final psi.ElementKind kind;
+
+ final String name;
+
+ final int offset;
+
+ final int length;
+
+ final String parameters;
+
+ final String returnType;
+
+ final bool isAbstract;
+
+ final bool isPrivate;
+
+ final bool isStatic;
+
+ ElementImpl(this.id, this.source, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isStatic, this.isPrivate);
+
+ @override
+ bool operator ==(Object obj) {
+ if (identical(obj, this)) {
+ return true;
+ }
+ if (obj is! ElementImpl) {
+ return false;
+ }
+ ElementImpl other = obj as ElementImpl;
+ return other.kind == kind && (other.source == source) && (name == other.name);
+ }
+
+ @override
+ int get hashCode {
+ if (name == null) {
+ return source.hashCode;
+ }
+ return ObjectUtilities.combineHashCodes(source.hashCode, name.hashCode);
+ }
+
+ @override
+ String toString() {
+ JavaStringBuilder builder = new JavaStringBuilder();
+ builder.append("[name=");
+ builder.append(name);
+ builder.append(", kind=");
+ builder.append(kind);
+ builder.append(", offset=");
+ builder.append(offset);
+ builder.append(", length=");
+ builder.append(length);
+ builder.append(", parameters=");
+ builder.append(parameters);
+ builder.append(", return=");
+ builder.append(returnType);
+ builder.append("]");
+ return builder.toString();
+ }
}
/**
* A concrete implementation of [HighlightRegion].
*/
-class HighlightRegionImpl extends SourceRegionImpl implements HighlightRegion {
- final HighlightType type;
+class HighlightRegionImpl extends SourceRegionImpl implements psi.HighlightRegion {
+ final psi.HighlightType type;
HighlightRegionImpl(int offset, int length, this.type) : super(offset, length);
@@ -603,8 +833,8 @@
/**
* A concrete implementation of [NavigationRegion].
*/
-class NavigationRegionImpl extends SourceRegionImpl implements NavigationRegion {
- final List<NavigationTarget> targets;
+class NavigationRegionImpl extends SourceRegionImpl implements psi.NavigationRegion {
+ final List<psi.Element> targets;
NavigationRegionImpl(int offset, int length, this.targets) : super(offset, length);
@@ -620,64 +850,18 @@
}
/**
- * A concrete implementation of [NavigationTarget].
- */
-class NavigationTargetImpl implements NavigationTarget {
- final Source source;
-
- final String elementId;
-
- final int offset;
-
- final int length;
-
- NavigationTargetImpl(this.source, this.elementId, this.offset, this.length);
-
- @override
- String toString() {
- JavaStringBuilder builder = new JavaStringBuilder();
- builder.append("[offset=");
- builder.append(offset);
- builder.append(", length=");
- builder.append(length);
- builder.append(", source=");
- builder.append(source);
- builder.append(", element=");
- builder.append(elementId);
- builder.append("]");
- return builder.toString();
- }
-}
-
-/**
* A concrete implementation of [Outline].
*/
-class OutlineImpl implements Outline {
- final Outline parent;
+class OutlineImpl implements psi.Outline {
+ final psi.Outline parent;
- final SourceRegion sourceRegion;
+ final psi.Element element;
- final OutlineKind kind;
+ final psi.SourceRegion sourceRegion;
- final String name;
+ List<psi.Outline> children = psi.Outline.EMPTY_ARRAY;
- final int offset;
-
- final int length;
-
- final String parameters;
-
- final String returnType;
-
- final bool isAbstract;
-
- final bool isPrivate;
-
- final bool isStatic;
-
- List<Outline> children = Outline.EMPTY_ARRAY;
-
- OutlineImpl(this.parent, this.sourceRegion, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isPrivate, this.isStatic);
+ OutlineImpl(this.parent, this.element, this.sourceRegion);
@override
bool operator ==(Object obj) {
@@ -688,27 +872,22 @@
return false;
}
OutlineImpl other = obj as OutlineImpl;
- return (other.parent == parent) && other.offset == offset;
+ return (other.element == element) && (other.parent == parent);
}
@override
- int get hashCode => offset;
+ int get hashCode {
+ if (parent == null) {
+ return element.hashCode;
+ }
+ return ObjectUtilities.combineHashCodes(parent.hashCode, element.hashCode);
+ }
@override
String toString() {
JavaStringBuilder builder = new JavaStringBuilder();
- builder.append("[name=");
- builder.append(name);
- builder.append(", kind=");
- builder.append(kind);
- builder.append(", offset=");
- builder.append(offset);
- builder.append(", length=");
- builder.append(length);
- builder.append(", parameters=");
- builder.append(parameters);
- builder.append(", return=");
- builder.append(returnType);
+ builder.append("[element=");
+ builder.append(element);
builder.append(", children=[");
builder.append(StringUtils.join(children, ", "));
builder.append("]]");
@@ -729,134 +908,134 @@
@override
Object visitAsExpression(AsExpression node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.asOperator, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.asOperator, psi.HighlightType.BUILT_IN);
return super.visitAsExpression(node);
}
@override
Object visitBooleanLiteral(BooleanLiteral node) {
- DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_BOOLEAN);
+ DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_BOOLEAN);
return super.visitBooleanLiteral(node);
}
@override
Object visitCatchClause(CatchClause node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.onKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.onKeyword, psi.HighlightType.BUILT_IN);
return super.visitCatchClause(node);
}
@override
Object visitClassDeclaration(ClassDeclaration node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.abstractKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.abstractKeyword, psi.HighlightType.BUILT_IN);
return super.visitClassDeclaration(node);
}
@override
Object visitConstructorDeclaration(ConstructorDeclaration node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.factoryKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.factoryKeyword, psi.HighlightType.BUILT_IN);
return super.visitConstructorDeclaration(node);
}
@override
Object visitDoubleLiteral(DoubleLiteral node) {
- DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_DOUBLE);
+ DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_DOUBLE);
return super.visitDoubleLiteral(node);
}
@override
Object visitExportDirective(ExportDirective node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitExportDirective(node);
}
@override
Object visitFieldDeclaration(FieldDeclaration node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.staticKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.staticKeyword, psi.HighlightType.BUILT_IN);
return super.visitFieldDeclaration(node);
}
@override
Object visitFunctionDeclaration(FunctionDeclaration node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, psi.HighlightType.BUILT_IN);
return super.visitFunctionDeclaration(node);
}
@override
Object visitFunctionTypeAlias(FunctionTypeAlias node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitFunctionTypeAlias(node);
}
@override
Object visitHideCombinator(HideCombinator node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitHideCombinator(node);
}
@override
Object visitImplementsClause(ImplementsClause node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitImplementsClause(node);
}
@override
Object visitImportDirective(ImportDirective node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.deferredToken, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.asToken, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.deferredToken, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.asToken, psi.HighlightType.BUILT_IN);
return super.visitImportDirective(node);
}
@override
Object visitIntegerLiteral(IntegerLiteral node) {
- DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_INTEGER);
+ DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_INTEGER);
return super.visitIntegerLiteral(node);
}
@override
Object visitLibraryDirective(LibraryDirective node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitLibraryDirective(node);
}
@override
Object visitMethodDeclaration(MethodDeclaration node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.modifierKeyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.operatorKeyword, HighlightType.BUILT_IN);
- DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.externalKeyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.modifierKeyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.operatorKeyword, psi.HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.propertyKeyword, psi.HighlightType.BUILT_IN);
return super.visitMethodDeclaration(node);
}
@override
Object visitNativeClause(NativeClause node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitNativeClause(node);
}
@override
Object visitNativeFunctionBody(NativeFunctionBody node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.nativeToken, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.nativeToken, psi.HighlightType.BUILT_IN);
return super.visitNativeFunctionBody(node);
}
@override
Object visitPartDirective(PartDirective node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitPartDirective(node);
}
@override
Object visitPartOfDirective(PartOfDirective node) {
- DartUnitHighlightsComputer_this._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, psi.HighlightType.BUILT_IN);
return super.visitPartOfDirective(node);
}
@override
Object visitShowCombinator(ShowCombinator node) {
- DartUnitHighlightsComputer_this._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+ DartUnitHighlightsComputer_this._addRegion_token(node.keyword, psi.HighlightType.BUILT_IN);
return super.visitShowCombinator(node);
}
@@ -868,7 +1047,7 @@
@override
Object visitSimpleStringLiteral(SimpleStringLiteral node) {
- DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.LITERAL_STRING);
+ DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.LITERAL_STRING);
return super.visitSimpleStringLiteral(node);
}
@@ -877,7 +1056,7 @@
DartType type = node.type;
if (type != null) {
if (type.isDynamic && node.name.name == "dynamic") {
- DartUnitHighlightsComputer_this._addRegion_node(node, HighlightType.TYPE_NAME_DYNAMIC);
+ DartUnitHighlightsComputer_this._addRegion_node(node, psi.HighlightType.TYPE_NAME_DYNAMIC);
return null;
}
}
@@ -904,9 +1083,9 @@
@override
Object visitExportDirective(ExportDirective node) {
- ExportElement exportElement = node.element;
+ pae.ExportElement exportElement = node.element;
if (exportElement != null) {
- Element element = exportElement.exportedLibrary;
+ pae.Element element = exportElement.exportedLibrary;
DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
}
return super.visitExportDirective(node);
@@ -914,9 +1093,9 @@
@override
Object visitImportDirective(ImportDirective node) {
- ImportElement importElement = node.element;
+ pae.ImportElement importElement = node.element;
if (importElement != null) {
- Element element = importElement.importedLibrary;
+ pae.Element element = importElement.importedLibrary;
DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
}
return super.visitImportDirective(node);
@@ -962,23 +1141,66 @@
class RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines extends RecursiveAstVisitor<Object> {
final DartUnitOutlineComputer DartUnitOutlineComputer_this;
- OutlineImpl parenet;
+ OutlineImpl parent;
- List<Outline> localOutlines;
+ List<psi.Outline> localOutlines;
- RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this.DartUnitOutlineComputer_this, this.parenet, this.localOutlines) : super();
+ RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this.DartUnitOutlineComputer_this, this.parent, this.localOutlines) : super();
@override
Object visitFunctionDeclaration(FunctionDeclaration node) {
- DartUnitOutlineComputer_this._newFunctionOutline(parenet, localOutlines, node);
+ DartUnitOutlineComputer_this._newFunctionOutline(parent, localOutlines, node);
return null;
}
+
+ @override
+ Object visitMethodInvocation(MethodInvocation node) {
+ bool handled = DartUnitOutlineComputer_this._addUnitTestOutlines(parent, localOutlines, node);
+ if (handled) {
+ return null;
+ }
+ return super.visitMethodInvocation(node);
+ }
+}
+
+/**
+ * A concrete implementation of [SearchResult].
+ */
+class SearchResultImpl implements psi.SearchResult {
+ final List<psi.Element> path;
+
+ final Source source;
+
+ final psi.SearchResultKind kind;
+
+ final int offset;
+
+ final int length;
+
+ SearchResultImpl(this.path, this.source, this.kind, this.offset, this.length);
+
+ @override
+ String toString() {
+ JavaStringBuilder builder = new JavaStringBuilder();
+ builder.append("[source=");
+ builder.append(source);
+ builder.append(", kind=");
+ builder.append(kind);
+ builder.append(", offset=");
+ builder.append(offset);
+ builder.append(", length=");
+ builder.append(length);
+ builder.append(", path=");
+ builder.append(path);
+ builder.append("]");
+ return builder.toString();
+ }
}
/**
* A concrete implementation of [SourceRegion].
*/
-class SourceRegionImpl implements SourceRegion {
+class SourceRegionImpl implements psi.SourceRegion {
final int offset;
final int length;
@@ -993,10 +1215,10 @@
if (identical(obj, this)) {
return true;
}
- if (obj is! SourceRegion) {
+ if (obj is! psi.SourceRegion) {
return false;
}
- SourceRegion other = obj as SourceRegion;
+ psi.SourceRegion other = obj as psi.SourceRegion;
return other.offset == offset && other.length == length;
}
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index e2666e1..dae1c78 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -9,6 +9,154 @@
import 'package:analyzer/src/generated/java_core.dart' show Enum, StringUtils;
import 'package:analyzer/src/generated/source.dart' show Source;
+import 'package:analysis_services/src/generated/proposal.dart';
+
+/**
+ * The interface `Element` defines the behavior of objects that represent an information for
+ * an element.
+ */
+abstract class Element {
+ /**
+ * An empty array of elements.
+ */
+ static final List<Element> EMPTY_ARRAY = new List<Element>(0);
+
+ /**
+ * Return the id of the element, may be `null` if there is no resolution information
+ * associated with this element.
+ *
+ * @return the id of the element
+ */
+ String get id;
+
+ /**
+ * Return the kind of the element.
+ *
+ * @return the kind of the element
+ */
+ ElementKind get kind;
+
+ /**
+ * Return the length of the element's name.
+ *
+ * @return the length of the element's name
+ */
+ int get length;
+
+ /**
+ * Return the name of the element.
+ *
+ * @return the name of the element
+ */
+ String get name;
+
+ /**
+ * Return the offset to the beginning of the element's name.
+ *
+ * @return the offset to the beginning of the element's name
+ */
+ int get offset;
+
+ /**
+ * Return the parameter list for the element, or `null` if the element is not a constructor,
+ * method or function. If the element has zero arguments, the string `"()"` will be
+ * returned.
+ *
+ * @return the parameter list for the element
+ */
+ String get parameters;
+
+ /**
+ * Return the return type of the element, or `null` if the element is not a method or
+ * function. If the element does not have a declared return type then an empty string will be
+ * returned.
+ *
+ * @return the return type of the element
+ */
+ String get returnType;
+
+ /**
+ * Return the source containing the element, not `null`.
+ *
+ * @return the source containing the element
+ */
+ Source get source;
+
+ /**
+ * Return `true` if the element is abstract.
+ *
+ * @return `true` if the element is abstract
+ */
+ bool get isAbstract;
+
+ /**
+ * Return `true` if the element is private.
+ *
+ * @return `true` if the element is private
+ */
+ bool get isPrivate;
+
+ /**
+ * Return `true` if the element is a class member and is a static element.
+ *
+ * @return `true` if the element is a static element
+ */
+ bool get isStatic;
+}
+
+/**
+ * The enumeration `ElementKind` defines the various kinds of [Element]s.
+ */
+class ElementKind extends Enum<ElementKind> {
+ static const ElementKind CLASS = const ElementKind('CLASS', 0);
+
+ static const ElementKind CLASS_TYPE_ALIAS = const ElementKind('CLASS_TYPE_ALIAS', 1);
+
+ static const ElementKind COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT', 2);
+
+ static const ElementKind CONSTRUCTOR = const ElementKind('CONSTRUCTOR', 3);
+
+ static const ElementKind GETTER = const ElementKind('GETTER', 4);
+
+ static const ElementKind FIELD = const ElementKind('FIELD', 5);
+
+ static const ElementKind FUNCTION = const ElementKind('FUNCTION', 6);
+
+ static const ElementKind FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS', 7);
+
+ static const ElementKind LIBRARY = const ElementKind('LIBRARY', 8);
+
+ static const ElementKind METHOD = const ElementKind('METHOD', 9);
+
+ static const ElementKind SETTER = const ElementKind('SETTER', 10);
+
+ static const ElementKind TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE', 11);
+
+ static const ElementKind UNKNOWN = const ElementKind('UNKNOWN', 12);
+
+ static const ElementKind UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE', 13);
+
+ static const ElementKind UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP', 14);
+
+ static const List<ElementKind> values = const [
+ CLASS,
+ CLASS_TYPE_ALIAS,
+ COMPILATION_UNIT,
+ CONSTRUCTOR,
+ GETTER,
+ FIELD,
+ FUNCTION,
+ FUNCTION_TYPE_ALIAS,
+ LIBRARY,
+ METHOD,
+ SETTER,
+ TOP_LEVEL_VARIABLE,
+ UNKNOWN,
+ UNIT_TEST_CASE,
+ UNIT_TEST_GROUP];
+
+ const ElementKind(String name, int ordinal) : super(name, ordinal);
+}
/**
* The interface `HighlightRegion` defines the behavior of objects representing a particular
@@ -167,6 +315,20 @@
}
/**
+ * The interface `MinorRefactoringsConsumer` defines the behavior of objects that consume
+ * minor refactorings [CorrectionProposal]s.
+ */
+abstract class MinorRefactoringsConsumer {
+ /**
+ * A set [CorrectionProposal]s has been computed.
+ *
+ * @param proposals an array of computed [CorrectionProposal]s
+ * @param isLastResult is `true` if this is the last set of results
+ */
+ void computedProposals(List<CorrectionProposal> proposals, bool isLastResult);
+}
+
+/**
* The interface `NavigationRegion` defines the behavior of objects representing a list of
* elements with which a source region is associated.
*/
@@ -177,45 +339,11 @@
static final List<NavigationRegion> EMPTY_ARRAY = new List<NavigationRegion>(0);
/**
- * Return the identifiers of the elements associated with the region.
+ * Return the elements associated with the region.
*
- * @return the identifiers of the elements associated with the region
+ * @return the elements associated with the region
*/
- List<NavigationTarget> get targets;
-}
-
-/**
- * The interface `NavigationTarget` defines the behavior of objects that provide information
- * about the target of a navigation region.
- */
-abstract class NavigationTarget {
- /**
- * Return the id of the element to which this target will navigate.
- *
- * @return the id of the element to which this target will navigate
- */
- String get elementId;
-
- /**
- * Return the length of the region to which the target will navigate.
- *
- * @return the length of the region to which the target will navigate
- */
- int get length;
-
- /**
- * Return the offset to the region to which the target will navigate.
- *
- * @return the offset to the region to which the target will navigate
- */
- int get offset;
-
- /**
- * Return the source containing the element to which this target will navigate.
- *
- * @return the source containing the element to which this target will navigate
- */
- Source get source;
+ List<Element> get targets;
}
/**
@@ -237,8 +365,8 @@
}
/**
- * The interface `Outline` defines the behavior of objects that represent an outline for a
- * single source.
+ * The interface `Outline` defines the behavior of objects that represent an outline for an
+ * element.
*/
abstract class Outline {
/**
@@ -247,49 +375,19 @@
static final List<Outline> EMPTY_ARRAY = new List<Outline>(0);
/**
- * Return an array containing the children of the element. The array will be empty if the element
- * has no children.
+ * Return an array containing the children outline. The array will be empty if the outline has no
+ * children.
*
* @return an array containing the children of the element
*/
List<Outline> get children;
/**
- * Return the kind of the element.
+ * Return the information about the element.
*
- * @return the kind of the element
+ * @return the information about the element
*/
- OutlineKind get kind;
-
- /**
- * Return the length of the element's name.
- *
- * @return the length of the element's name
- */
- int get length;
-
- /**
- * Return the name of the element.
- *
- * @return the name of the element
- */
- String get name;
-
- /**
- * Return the offset to the beginning of the element's name.
- *
- * @return the offset to the beginning of the element's name
- */
- int get offset;
-
- /**
- * Return the parameter list for the element, or `null` if the element is not a constructor,
- * method or function. If the element has zero arguments, the string `"()"` will be
- * returned.
- *
- * @return the parameter list for the element
- */
- String get parameters;
+ Element get element;
/**
* Return the outline that either physically or logically encloses this outline. This will be
@@ -300,83 +398,168 @@
Outline get parent;
/**
- * Return the return type of the element, or `null` if the element is not a method or
- * function. If the element does not have a declared return type then an empty string will be
- * returned.
+ * Return the source range associated with this outline.
*
- * @return the return type of the element
- */
- String get returnType;
-
- /**
- * Return the element's source range.
- *
- * @return the element's source range
+ * @return the source range associated with this outline
*/
SourceRegion get sourceRegion;
-
- /**
- * Return `true` if the element is abstract.
- *
- * @return `true` if the element is abstract
- */
- bool get isAbstract;
-
- /**
- * Return `true` if the element is private.
- *
- * @return `true` if the element is private
- */
- bool get isPrivate;
-
- /**
- * Return `true` if the element is a class member and is a static element.
- *
- * @return `true` if the element is a static element
- */
- bool get isStatic;
}
/**
- * The enumeration `OutlineKind` defines the various kinds of [Outline] items.
+ * The interface `SearchResult` defines the behavior of objects that represent a search
+ * result.
*/
-class OutlineKind extends Enum<OutlineKind> {
- static const OutlineKind CLASS = const OutlineKind('CLASS', 0);
+abstract class SearchResult {
+ /**
+ * An empty array of [SearchResult]s.
+ */
+ static final List<SearchResult> EMPTY_ARRAY = new List<SearchResult>(0);
- static const OutlineKind CLASS_TYPE_ALIAS = const OutlineKind('CLASS_TYPE_ALIAS', 1);
+ /**
+ * Return the kind to this result.
+ *
+ * @return the kind of this result
+ */
+ SearchResultKind get kind;
- static const OutlineKind CONSTRUCTOR = const OutlineKind('CONSTRUCTOR', 2);
+ /**
+ * Return the length of the result.
+ *
+ * @return the length of the result
+ */
+ int get length;
- static const OutlineKind GETTER = const OutlineKind('GETTER', 3);
+ /**
+ * Return the offset to the beginning of the result in [getSource].
+ *
+ * @return the offset to the beginning of the result
+ */
+ int get offset;
- static const OutlineKind FIELD = const OutlineKind('FIELD', 4);
+ /**
+ * Return the path to this result starting with the element that encloses it, then for its
+ * enclosing element, etc up to the library.
+ *
+ * @return the path to this result
+ */
+ List<Element> get path;
- static const OutlineKind FUNCTION = const OutlineKind('FUNCTION', 5);
+ /**
+ * Return the source containing the result.
+ *
+ * @return the source containing the result
+ */
+ Source get source;
+}
- static const OutlineKind FUNCTION_TYPE_ALIAS = const OutlineKind('FUNCTION_TYPE_ALIAS', 6);
+/**
+ * The enumeration `SearchResultKind` defines the various kinds of [SearchResult].
+ */
+class SearchResultKind extends Enum<SearchResultKind> {
+ /**
+ * A reference to a constructor.
+ */
+ static const SearchResultKind CONSTRUCTOR_REFERENCE = const SearchResultKind('CONSTRUCTOR_REFERENCE', 0);
- static const OutlineKind METHOD = const OutlineKind('METHOD', 7);
+ /**
+ * A reference to a field (from field formal parameter).
+ */
+ static const SearchResultKind FIELD_REFERENCE = const SearchResultKind('FIELD_REFERENCE', 1);
- static const OutlineKind SETTER = const OutlineKind('SETTER', 8);
+ /**
+ * A reference to a field in which it is read.
+ */
+ static const SearchResultKind FIELD_READ = const SearchResultKind('FIELD_READ', 2);
- static const OutlineKind TOP_LEVEL_VARIABLE = const OutlineKind('TOP_LEVEL_VARIABLE', 9);
+ /**
+ * A reference to a field in which it is written.
+ */
+ static const SearchResultKind FIELD_WRITE = const SearchResultKind('FIELD_WRITE', 3);
- static const OutlineKind COMPILATION_UNIT = const OutlineKind('COMPILATION_UNIT', 10);
+ /**
+ * A reference to a function in which it is invoked.
+ */
+ static const SearchResultKind FUNCTION_INVOCATION = const SearchResultKind('FUNCTION_INVOCATION', 4);
- static const List<OutlineKind> values = const [
- CLASS,
- CLASS_TYPE_ALIAS,
- CONSTRUCTOR,
- GETTER,
- FIELD,
- FUNCTION,
- FUNCTION_TYPE_ALIAS,
- METHOD,
- SETTER,
- TOP_LEVEL_VARIABLE,
- COMPILATION_UNIT];
+ /**
+ * A reference to a function in which it is referenced.
+ */
+ static const SearchResultKind FUNCTION_REFERENCE = const SearchResultKind('FUNCTION_REFERENCE', 5);
- const OutlineKind(String name, int ordinal) : super(name, ordinal);
+ /**
+ * A reference to a method in which it is invoked.
+ */
+ static const SearchResultKind METHOD_INVOCATION = const SearchResultKind('METHOD_INVOCATION', 6);
+
+ /**
+ * A reference to a method in which it is referenced.
+ */
+ static const SearchResultKind METHOD_REFERENCE = const SearchResultKind('METHOD_REFERENCE', 7);
+
+ /**
+ * A reference to a property accessor.
+ */
+ static const SearchResultKind PROPERTY_ACCESSOR_REFERENCE = const SearchResultKind('PROPERTY_ACCESSOR_REFERENCE', 8);
+
+ /**
+ * A reference to a type.
+ */
+ static const SearchResultKind TYPE_REFERENCE = const SearchResultKind('TYPE_REFERENCE', 9);
+
+ /**
+ * A declaration of a variable.
+ */
+ static const SearchResultKind VARIABLE_DECLARATION = const SearchResultKind('VARIABLE_DECLARATION', 10);
+
+ /**
+ * A reference to a variable in which it is read.
+ */
+ static const SearchResultKind VARIABLE_READ = const SearchResultKind('VARIABLE_READ', 11);
+
+ /**
+ * A reference to a variable in which it is both read and written.
+ */
+ static const SearchResultKind VARIABLE_READ_WRITE = const SearchResultKind('VARIABLE_READ_WRITE', 12);
+
+ /**
+ * A reference to a variable in which it is written.
+ */
+ static const SearchResultKind VARIABLE_WRITE = const SearchResultKind('VARIABLE_WRITE', 13);
+
+ static const List<SearchResultKind> values = const [
+ CONSTRUCTOR_REFERENCE,
+ FIELD_REFERENCE,
+ FIELD_READ,
+ FIELD_WRITE,
+ FUNCTION_INVOCATION,
+ FUNCTION_REFERENCE,
+ METHOD_INVOCATION,
+ METHOD_REFERENCE,
+ PROPERTY_ACCESSOR_REFERENCE,
+ TYPE_REFERENCE,
+ VARIABLE_DECLARATION,
+ VARIABLE_READ,
+ VARIABLE_READ_WRITE,
+ VARIABLE_WRITE];
+
+ const SearchResultKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `SearchReferencesConsumer` defines the behavior of objects that consume
+ * [SearchResult]s.
+ */
+abstract class SearchResultsConsumer {
+ /**
+ * [SearchResult]s have been computed.
+ *
+ * @param contextId the identifier of the context to search within
+ * @param source the [Source] with element
+ * @param offset the offset within the `source`
+ * @param searchResults an array of [SearchResult]s computed so far
+ * @param isLastResult is `true` if this is the last set of results
+ */
+ void computedReferences(String contextId, Source source, int offset, List<SearchResult> searchResults, bool isLastResult);
}
/**
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 84ddf94..da3c136 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,8 @@
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
- analyzer: 0.14.2
+ analysis_services: any
+ analyzer: 0.15.1
args: any
logging: any
dev_dependencies:
diff --git a/pkg/analysis_services/lib/src/generated/change.dart b/pkg/analysis_services/lib/src/generated/change.dart
index 35935cf..9cc094f 100644
--- a/pkg/analysis_services/lib/src/generated/change.dart
+++ b/pkg/analysis_services/lib/src/generated/change.dart
@@ -7,6 +7,7 @@
library services.change;
+import 'dart:collection';
import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
import 'package:analyzer/src/generated/source.dart';
@@ -118,7 +119,7 @@
final List<Edit> edits = [];
- Map<String, List<Edit>> _editGroups = {};
+ Map<String, List<Edit>> _editGroups = new LinkedHashMap();
/**
* @param name the name of this change to display in UI
diff --git a/pkg/analysis_services/lib/src/generated/completion.dart b/pkg/analysis_services/lib/src/generated/completion.dart
new file mode 100644
index 0000000..d2c50c6
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/completion.dart
@@ -0,0 +1,3770 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.completion;
+
+import 'dart:collection';
+import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+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/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'stubs.dart';
+import 'util.dart';
+
+class AstNodeClassifier_CompletionEngine_typeOf extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ List<DartType> result;
+
+ AstNodeClassifier_CompletionEngine_typeOf(this.CompletionEngine_this, this.result) : super();
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) => visitSimpleIdentifier(node.identifier);
+
+ @override
+ Object visitSimpleIdentifier(SimpleIdentifier node) {
+ Element elem = node.bestElement;
+ if (elem != null && elem.kind == ElementKind.GETTER) {
+ PropertyAccessorElement accessor = elem as PropertyAccessorElement;
+ if (accessor.isSynthetic) {
+ PropertyInducingElement var2 = accessor.variable;
+ result[0] = CompletionEngine_this._typeSearch(var2);
+ }
+ }
+ return null;
+ }
+}
+
+/**
+ * The analysis engine for code completion.
+ *
+ * Note: During development package-private methods are used to group element-specific completion
+ * utilities.
+ *
+ * TODO: Recognize when completion is requested in the middle of a multi-character operator.
+ * Re-write the AST as it would be if an identifier were present at the completion point then
+ * restart the analysis.
+ */
+class CompletionEngine {
+ static String _C_DYNAMIC = "dynamic";
+
+ static String _C_FALSE = "false";
+
+ static String _C_NULL = "null";
+
+ static String _C_PARAMNAME = "arg";
+
+ static String _C_TRUE = "true";
+
+ static String _C_VAR = "var";
+
+ static String _C_VOID = "void";
+
+ static bool _isPrivate(Element element) {
+ String name = element.displayName;
+ return Identifier.isPrivateName(name);
+ }
+
+ static bool _isSyntheticIdentifier(Expression expression) => expression is SimpleIdentifier && expression.isSynthetic;
+
+ CompletionRequestor _requestor;
+
+ final CompletionFactory _factory;
+
+ AssistContext _context;
+
+ Filter _filter;
+
+ CompletionState _state;
+
+ List<LibraryElement> _libraries;
+
+ CompletionEngine(CompletionRequestor requestor, this._factory) {
+ this._requestor = requestor;
+ this._state = new CompletionState();
+ }
+
+ /**
+ * Analyze the source unit in the given context to determine completion proposals at the selection
+ * offset of the context.
+ *
+ * @throws Exception
+ */
+ void complete(AssistContext context) {
+ this._context = context;
+ _requestor.beginReporting();
+ AstNode completionNode = context.coveredNode;
+ if (completionNode != null) {
+ _state.context = completionNode;
+ CompletionEngine_TerminalNodeCompleter visitor = new CompletionEngine_TerminalNodeCompleter(this);
+ completionNode.accept(visitor);
+ }
+ _requestor.endReporting();
+ }
+
+ void _analyzeAnnotationName(SimpleIdentifier identifier) {
+ _filter = _createFilter(identifier);
+ CompletionEngine_NameCollector names = _collectTopLevelElementVisibleAt(identifier);
+ for (Element element in names.uniqueElements) {
+ if (element is PropertyAccessorElement) {
+ element = (element as PropertyAccessorElement).variable;
+ }
+ if (element is TopLevelVariableElement) {
+ TopLevelVariableElement variable = element as TopLevelVariableElement;
+ if (_state._isCompileTimeConstantRequired && !variable.isConst) {
+ continue;
+ }
+ _proposeName(element, identifier, names);
+ }
+ if (element is ClassElement) {
+ ClassElement classElement = element as ClassElement;
+ for (ConstructorElement constructor in classElement.constructors) {
+ _pNamedConstructor(classElement, constructor, identifier);
+ }
+ }
+ }
+ }
+
+ void _analyzeConstructorTypeName(SimpleIdentifier identifier) {
+ _filter = _createFilter(identifier);
+ List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+ for (Element type in types) {
+ if (type is ClassElement) {
+ _namedConstructorReference(type, identifier);
+ }
+ }
+ List<Element> prefixes = _findAllPrefixes();
+ for (Element prefix in prefixes) {
+ _pName(prefix, identifier);
+ }
+ }
+
+ void _analyzeDeclarationName(VariableDeclaration varDecl) {
+ // We might want to propose multiple names for a declaration based on types someday.
+ // For now, just use whatever is already there.
+ SimpleIdentifier identifier = varDecl.name;
+ _filter = _createFilter(identifier);
+ VariableDeclarationList varList = varDecl.parent as VariableDeclarationList;
+ TypeName type = varList.type;
+ if (identifier.length > 0) {
+ _pName3(identifier.name, ProposalKind.VARIABLE);
+ }
+ if (type == null) {
+ if (varList.keyword == null) {
+ // Interpret as the type name of a typed variable declaration { DivE!; }
+ _analyzeLocalName(identifier);
+ }
+ } else {
+ _pParamName(type.name.name.toLowerCase());
+ }
+ }
+
+ void _analyzeDirectAccess(DartType receiverType, SimpleIdentifier completionNode) {
+ if (receiverType != null) {
+ // Complete this.!y where this is absent
+ Element rcvrTypeElem = receiverType.element;
+ if (receiverType.isDynamic) {
+ rcvrTypeElem = objectClassElement;
+ }
+ if (rcvrTypeElem is ClassElement) {
+ _directAccess(rcvrTypeElem as ClassElement, completionNode);
+ }
+ }
+ }
+
+ void _analyzeImmediateField(SimpleIdentifier fieldName) {
+ _filter = _createFilter(fieldName);
+ ClassDeclaration classDecl = fieldName.getAncestor((node) => node is ClassDeclaration);
+ ClassElement classElement = classDecl.element;
+ for (FieldElement field in classElement.fields) {
+ _pName3(field.displayName, ProposalKind.FIELD);
+ }
+ }
+
+ void _analyzeLiteralReference(BooleanLiteral literal) {
+ // state.setContext(literal);
+ Ident ident = _createIdent(literal.parent);
+ ident.token = literal.literal;
+ _filter = _createFilter(ident);
+ _analyzeLocalName(ident);
+ }
+
+ void _analyzeLocalName(SimpleIdentifier identifier) {
+ // Completion x!
+ _filter = _createFilter(identifier);
+ // TODO Filter out types that have no static members.
+ CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
+ for (Element element in names.uniqueElements) {
+ if (_state._isSourceDeclarationStatic) {
+ if (element is FieldElement) {
+ if (!element.isStatic) {
+ continue;
+ }
+ } else if (element is PropertyAccessorElement) {
+ if (!element.isStatic) {
+ continue;
+ }
+ }
+ }
+ if (_state._isOptionalArgumentRequired) {
+ if (element is! ParameterElement) {
+ continue;
+ }
+ ParameterElement param = element as ParameterElement;
+ if (!param.parameterKind.isOptional) {
+ continue;
+ }
+ }
+ _proposeName(element, identifier, names);
+ }
+ if (_state._areLiteralsAllowed) {
+ _pNull();
+ _pTrue();
+ _pFalse();
+ }
+ }
+
+ void _analyzeNamedParameter(ArgumentList args, SimpleIdentifier identifier) {
+ // Completion x!
+ _filter = _createFilter(identifier);
+ // prepare parameters
+ List<ParameterElement> parameters = _getParameterElements(args);
+ if (parameters == null) {
+ return;
+ }
+ // remember already used names
+ Set<String> usedNames = new Set();
+ for (Expression arg in args.arguments) {
+ if (arg is NamedExpression) {
+ NamedExpression namedExpr = arg;
+ String name = namedExpr.name.label.name;
+ usedNames.add(name);
+ }
+ }
+ // propose named parameters
+ for (ParameterElement parameterElement in parameters) {
+ // should be named
+ if (parameterElement.parameterKind != ParameterKind.NAMED) {
+ continue;
+ }
+ // filter by name
+ if (_filterDisallows(parameterElement)) {
+ continue;
+ }
+ // may be already used
+ String parameterName = parameterElement.name;
+ if (usedNames.contains(parameterName)) {
+ continue;
+ }
+ // OK, add proposal
+ CompletionProposal prop = _createProposal4(ProposalKind.NAMED_ARGUMENT);
+ prop.setCompletion(parameterName);
+ prop.setParameterName(parameterName);
+ prop.setParameterType(parameterElement.type.displayName);
+ prop.setLocation(identifier.offset);
+ prop.setReplacementLength(identifier.length);
+ prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+ _requestor.accept(prop);
+ }
+ }
+
+ void _analyzeNewParameterName(List<FormalParameter> params, SimpleIdentifier typeIdent, String identifierName) {
+ String typeName = typeIdent.name;
+ _filter = _createFilter(_createIdent(typeIdent));
+ List<String> names = new List<String>();
+ for (FormalParameter node in params) {
+ names.add(node.identifier.name);
+ }
+ // Find name similar to typeName not in names, ditto for identifierName.
+ if (identifierName == null || identifierName.isEmpty) {
+ String candidate = typeName == null || typeName.isEmpty ? _C_PARAMNAME : typeName.toLowerCase();
+ _pParamName(_makeNonconflictingName(candidate, names));
+ } else {
+ _pParamName(_makeNonconflictingName(identifierName, names));
+ if (typeName != null && !typeName.isEmpty) {
+ _pParamName(_makeNonconflictingName(typeName.toLowerCase(), names));
+ }
+ }
+ }
+
+ void _analyzePositionalArgument(ArgumentList args, SimpleIdentifier identifier) {
+ // Show parameter name only if there is nothing to complete, so that if there is only
+ // one match, we won't to force user to choose.
+ if (!StringUtils.isEmpty(identifier.name)) {
+ return;
+ }
+ // prepare parameters
+ List<ParameterElement> parameters = _getParameterElements(args);
+ if (parameters == null) {
+ return;
+ }
+ // show current parameter
+ int argIndex = args.arguments.indexOf(identifier);
+ if (argIndex == -1) {
+ argIndex = 0;
+ }
+ if (argIndex >= 0 && argIndex < parameters.length) {
+ ParameterElement parameter = parameters[argIndex];
+ if (parameter.parameterKind != ParameterKind.NAMED) {
+ String parameterName = parameter.displayName;
+ CompletionProposal prop = _createProposal4(ProposalKind.OPTIONAL_ARGUMENT);
+ prop.setCompletion(parameterName);
+ prop.setParameterName(parameterName);
+ prop.setParameterType(parameter.type.displayName);
+ prop.setLocation(identifier.offset);
+ prop.setReplacementLength(identifier.length);
+ prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+ _requestor.accept(prop);
+ }
+ }
+ }
+
+ void _analyzePrefixedAccess(Expression receiver, SimpleIdentifier completionNode) {
+ if (receiver is ThisExpression && !_state._isThisAllowed) {
+ return;
+ }
+ DartType receiverType = _typeOf2(receiver);
+ bool forSuper = receiver is SuperExpression;
+ _analyzePrefixedAccess2(receiverType, forSuper, completionNode);
+ }
+
+ void _analyzePrefixedAccess2(DartType receiverType, bool forSuper, SimpleIdentifier completionNode) {
+ if (receiverType != null) {
+ // Complete x.!y
+ Element rcvrTypeElem = receiverType.element;
+ if (receiverType.isBottom) {
+ receiverType = objectType;
+ }
+ if (receiverType.isDynamic) {
+ receiverType = objectType;
+ }
+ if (receiverType is InterfaceType) {
+ _prefixedAccess(receiverType, forSuper, completionNode);
+ } else if (rcvrTypeElem is TypeParameterElement) {
+ TypeParameterElement typeParamElem = rcvrTypeElem;
+ _analyzePrefixedAccess2(typeParamElem.bound, false, completionNode);
+ }
+ }
+ }
+
+ void _analyzeReceiver(SimpleIdentifier identifier) {
+ // Completion x!.y
+ _filter = _createFilter(identifier);
+ CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
+ for (Element element in names.uniqueElements) {
+ _proposeName(element, identifier, names);
+ }
+ }
+
+ void _analyzeSuperConstructorInvocation(SuperConstructorInvocation node) {
+ ClassDeclaration enclosingClassNode = node.getAncestor((node) => node is ClassDeclaration);
+ if (enclosingClassNode != null) {
+ ClassElement enclosingClassElement = enclosingClassNode.element;
+ if (enclosingClassElement != null) {
+ ClassElement superClassElement = enclosingClassElement.supertype.element;
+ _constructorReference(superClassElement, node.constructorName);
+ }
+ }
+ }
+
+ void _analyzeTypeName(SimpleIdentifier identifier, SimpleIdentifier nameIdent) {
+ _filter = _createFilter(identifier);
+ String name = nameIdent == null ? "" : nameIdent.name;
+ List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+ for (Element type in types) {
+ if (_state._isForMixin) {
+ if (type is! ClassElement) {
+ continue;
+ }
+ ClassElement classElement = type as ClassElement;
+ if (!classElement.isValidMixin) {
+ continue;
+ }
+ }
+ if (type.displayName == name) {
+ continue;
+ }
+ _pName(type, nameIdent);
+ }
+ if (!_state._isForMixin) {
+ ClassDeclaration classDecl = identifier.getAncestor((node) => node is ClassDeclaration);
+ if (classDecl != null) {
+ ClassElement classElement = classDecl.element;
+ for (TypeParameterElement param in classElement.typeParameters) {
+ _pName(param, nameIdent);
+ }
+ }
+ }
+ List<Element> prefixes = _findAllPrefixes();
+ for (Element prefix in prefixes) {
+ _pName(prefix, nameIdent);
+ }
+ if (_state._isDynamicAllowed) {
+ _pDynamic();
+ }
+ if (_state._isVarAllowed) {
+ _pVar();
+ }
+ if (_state._isVoidAllowed) {
+ _pVoid();
+ }
+ }
+
+ void _constructorReference(ClassElement classElement, SimpleIdentifier identifier) {
+ // Complete identifier when it refers to a constructor defined in classElement.
+ _filter = _createFilter(identifier);
+ for (ConstructorElement cons in classElement.constructors) {
+ if (_state._isCompileTimeConstantRequired == cons.isConst && _filterAllows(cons)) {
+ _pExecutable2(cons, identifier, false);
+ }
+ }
+ }
+
+ void _directAccess(ClassElement classElement, SimpleIdentifier identifier) {
+ _filter = _createFilter(identifier);
+ CompletionEngine_NameCollector names = _createNameCollector();
+ names.addLocalNames(identifier);
+ names._addNamesDefinedByHierarchy(classElement, false);
+ names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+ _proposeNames(names, identifier);
+ }
+
+ void _dispatchPrefixAnalysis(InstanceCreationExpression node) {
+ // prepare ClassElement
+ ClassElement classElement;
+ {
+ Element typeElement = _typeOf2(node).element;
+ if (typeElement is! ClassElement) {
+ return;
+ }
+ classElement = typeElement as ClassElement;
+ }
+ // prepare constructor name
+ Identifier typeName = node.constructorName.type.name;
+ SimpleIdentifier identifier = null;
+ if (typeName is SimpleIdentifier) {
+ identifier = typeName;
+ } else if (typeName is PrefixedIdentifier) {
+ identifier = typeName.identifier;
+ }
+ if (identifier == null) {
+ identifier = _createIdent(node);
+ }
+ // analyze constructor name
+ _analyzeConstructorTypeName(identifier);
+ _constructorReference(classElement, identifier);
+ }
+
+ void _dispatchPrefixAnalysis2(MethodInvocation node) {
+ // This might be a library prefix on a top-level function
+ Expression expr = node.realTarget;
+ if (expr is SimpleIdentifier) {
+ SimpleIdentifier ident = expr;
+ if (ident.bestElement is PrefixElement) {
+ _prefixedAccess2(ident, node.methodName);
+ return;
+ } else if (ident.bestElement is ClassElement) {
+ _state._areInstanceReferencesProhibited = true;
+ _state._areStaticReferencesProhibited = false;
+ } else {
+ _state._areInstanceReferencesProhibited = false;
+ _state._areStaticReferencesProhibited = true;
+ }
+ }
+ if (expr == null) {
+ _analyzeLocalName(_createIdent(node));
+ } else {
+ _analyzePrefixedAccess(expr, node.methodName);
+ }
+ }
+
+ void _dispatchPrefixAnalysis3(PrefixedIdentifier node, SimpleIdentifier identifier) {
+ SimpleIdentifier receiverName = node.prefix;
+ Element receiver = receiverName.bestElement;
+ if (receiver == null) {
+ _prefixedAccess2(receiverName, identifier);
+ return;
+ }
+ while (true) {
+ if (receiver.kind == ElementKind.PREFIX || receiver.kind == ElementKind.IMPORT) {
+ // Complete lib_prefix.name
+ _prefixedAccess2(receiverName, identifier);
+ } else {
+ {
+ DartType receiverType;
+ DartType propType = _typeOf2(receiverName);
+ if (propType == null || propType.isDynamic) {
+ receiverType = _typeOf(receiver);
+ } else {
+ DartType declType = _typeOf(receiver);
+ if (propType.isMoreSpecificThan(declType)) {
+ receiverType = propType;
+ } else {
+ receiverType = declType;
+ }
+ }
+ _analyzePrefixedAccess2(receiverType, false, identifier);
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ void _fieldReference(ClassElement classElement, SimpleIdentifier identifier) {
+ // Complete identifier when it refers to a constructor defined in classElement.
+ _filter = _createFilter(identifier);
+ for (FieldElement cons in classElement.fields) {
+ if (_filterAllows(cons)) {
+ _pField(cons, identifier, classElement);
+ }
+ }
+ }
+
+ void _namedConstructorReference(ClassElement classElement, SimpleIdentifier identifier) {
+ // Complete identifier when it refers to a named constructor defined in classElement.
+ if (_filter == null) {
+ _filter = _createFilter(identifier);
+ }
+ for (ConstructorElement cons in classElement.constructors) {
+ if (!_isVisible(cons)) {
+ continue;
+ }
+ if (_state._isCompileTimeConstantRequired && !cons.isConst) {
+ continue;
+ }
+ _pNamedConstructor(classElement, cons, identifier);
+ }
+ }
+
+ void _namespacePubReference(NamespaceDirective node, Set<String> packageUris) {
+ // no import URI or package:
+ String prefix = _filter._prefix;
+ List<String> prefixStrings = prefix.split(":");
+ if (!prefix.isEmpty && !"package:".startsWith(prefixStrings[0])) {
+ return;
+ }
+ // if no URI yet, propose package:
+ if (prefix.isEmpty) {
+ _pImportUriWithScheme(node, "package:");
+ return;
+ }
+ // check "packages" folder for package libraries that are not added to AnalysisContext
+ {
+ Source contextSource = _context.source;
+ if (contextSource is FileBasedSource) {
+ FileBasedSource contextFileSource = contextSource;
+ String contextFilePath = contextFileSource.fullName;
+ JavaFile contextFile = new JavaFile(contextFilePath);
+ JavaFile contextFolder = contextFile.getParentFile();
+ JavaFile contextPackages = new JavaFile.relative(contextFolder, "packages");
+ if (contextPackages.isDirectory()) {
+ for (JavaFile packageFolder in contextPackages.listFiles()) {
+ String packageName = packageFolder.getName();
+ String packageLibName = "${packageName}.dart";
+ JavaFile packageFile = new JavaFile.relative(packageFolder, packageLibName);
+ if (packageFile.exists() && packageFile.isFile()) {
+ packageUris.add("package:${packageName}/${packageLibName}");
+ }
+ }
+ }
+ }
+ }
+ // add known package: URIs
+ for (String uri in packageUris) {
+ if (_filterDisallows2(uri)) {
+ continue;
+ }
+ CompletionProposal prop = _createProposal4(ProposalKind.IMPORT);
+ prop.setCompletion(uri);
+ // put "lib" before "lib/src"
+ if (!uri.contains("/src/")) {
+ prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+ }
+ // done
+ _requestor.accept(prop);
+ }
+ }
+
+ void _namespaceReference(NamespaceDirective node, SimpleStringLiteral literal) {
+ String lit = literal.literal.lexeme;
+ if (!lit.isEmpty) {
+ lit = lit.substring(1, Math.max(lit.length - 1, 0));
+ }
+ _filter = _createFilter(new Ident.con2(node, lit, literal.offset + 1));
+ Set<String> packageUris = new Set();
+ List<LibraryElement> libraries = new List<LibraryElement>();
+ List<LibraryElement> librariesInLib = new List<LibraryElement>();
+ String currentLibraryName = currentLibrary.source.fullName;
+ AnalysisContext ac = analysisContext;
+ List<Source> sources = ac.librarySources;
+ for (Source s in sources) {
+ String sName = s.fullName;
+ // skip current library
+ if (currentLibraryName == sName) {
+ continue;
+ }
+ // ".pub-cache/..../unittest-0.8.8/lib/unittest.dart" -> "package:unittest/unittest.dart"
+ {
+ Uri uri = ac.sourceFactory.restoreUri(s);
+ if (uri != null) {
+ String uriString = uri.toString();
+ if (uriString.startsWith("package:")) {
+ packageUris.add(uriString);
+ }
+ }
+ }
+ LibraryElement lib = ac.getLibraryElement(s);
+ if (lib == null) {
+ continue;
+ } else if (_isUnitInLibFolder(lib.definingCompilationUnit)) {
+ librariesInLib.add(lib);
+ } else {
+ libraries.add(lib);
+ }
+ }
+ _namespaceSdkReference(node);
+ _namespacePubReference(node, packageUris);
+ }
+
+ void _namespaceSdkReference(NamespaceDirective node) {
+ String prefix = _filter._prefix;
+ List<String> prefixStrings = prefix.split(":");
+ if (!prefix.isEmpty && !"dart:".startsWith(prefixStrings[0])) {
+ return;
+ }
+ if (prefix.isEmpty) {
+ _pImportUriWithScheme(node, "dart:");
+ return;
+ }
+ // add DartSdk libraries
+ DartSdk dartSdk = analysisContext.sourceFactory.dartSdk;
+ for (SdkLibrary library in dartSdk.sdkLibraries) {
+ String name = library.shortName;
+ // ignore internal
+ if (library.isInternal) {
+ continue;
+ }
+ // ignore implementation
+ if (library.isImplementation) {
+ continue;
+ }
+ // standard libraries name name starting with "dart:"
+ name = StringUtils.removeStart(name, "dart:");
+ // ignore private libraries
+ if (Identifier.isPrivateName(name)) {
+ continue;
+ }
+ // add with "dart:" prefix
+ _pName3("dart:${name}", ProposalKind.IMPORT);
+ }
+ }
+
+ void _operatorAccess(Expression expr, SimpleIdentifier identifier) {
+ _state._requiresOperators();
+ _analyzePrefixedAccess(expr, identifier);
+ }
+
+ void _prefixedAccess(InterfaceType type, bool forSuper, SimpleIdentifier identifier) {
+ // Complete identifier when it refers to field or method in classElement.
+ _filter = _createFilter(identifier);
+ CompletionEngine_NameCollector names = _createNameCollector();
+ if (_state._areInstanceReferencesProhibited) {
+ names._addNamesDefinedByType2(type);
+ } else {
+ names._addNamesDefinedByHierarchy2(type, forSuper);
+ }
+ _proposeNames(names, identifier);
+ }
+
+ void _prefixedAccess2(SimpleIdentifier prefixName, SimpleIdentifier identifier) {
+ if (_filter == null) {
+ _filter = _createFilter(identifier);
+ }
+ CompletionEngine_NameCollector names = _createNameCollector();
+ List<ImportElement> prefixImports = _importsWithName(prefixName);
+ // Library prefixes do not have a unique AST representation so we need to fudge state vars.
+ bool litsAllowed = _state._areLiteralsAllowed;
+ _state._areLiteralsAllowed = false;
+ names._addTopLevelNames(prefixImports, TopLevelNamesKind.DECLARED_AND_EXPORTS);
+ _state._areLiteralsAllowed = litsAllowed;
+ _proposeNames(names, identifier);
+ }
+
+ List<InterfaceType> _allSubtypes(ClassElement classElement) {
+ // TODO(scheglov) translate it
+ return [];
+ }
+
+ CompletionEngine_NameCollector _collectIdentifiersVisibleAt(AstNode ident) {
+ CompletionEngine_NameCollector names = _createNameCollector();
+ ScopedNameFinder finder = new ScopedNameFinder(_completionLocation());
+ ident.accept(finder);
+ names.addAll(finder.locals.values);
+ Declaration decl = finder.declaration;
+ if (decl != null && decl.parent is ClassDeclaration) {
+ ClassElement classElement = (decl.parent as ClassDeclaration).element;
+ names._addNamesDefinedByHierarchy(classElement, false);
+ }
+ names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+ return names;
+ }
+
+ CompletionEngine_NameCollector _collectTopLevelElementVisibleAt(AstNode ident) {
+ CompletionEngine_NameCollector names = _createNameCollector();
+ names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
+ return names;
+ }
+
+ int _completionLocation() => _context.selectionOffset;
+
+ int _completionTokenOffset() => _completionLocation() - _filter._prefix.length;
+
+ List<FormalParameter> _copyWithout(NodeList oldList, AstNode deletion) {
+ List<FormalParameter> newList = new List<FormalParameter>();
+ oldList.accept(new GeneralizingAstVisitor_CompletionEngine_copyWithout(deletion, newList));
+ return newList;
+ }
+
+ Filter _createFilter(SimpleIdentifier ident) => new Filter.con1(ident, _context.selectionOffset);
+
+ Ident _createIdent(AstNode node) => new Ident.con1(node, _completionLocation());
+
+ CompletionEngine_NameCollector _createNameCollector() => new CompletionEngine_NameCollector(this);
+
+ CompletionProposal _createProposal(Element element) {
+ String completion = element.displayName;
+ return _createProposal3(element, completion);
+ }
+
+ CompletionProposal _createProposal2(Element element, SimpleIdentifier identifier) {
+ // Create a completion proposal for the element: variable, field, class, function.
+ if (_filterDisallows(element)) {
+ return null;
+ }
+ CompletionProposal prop = _createProposal(element);
+ Element container = element.enclosingElement;
+ if (container != null) {
+ prop.setDeclaringType(container.displayName);
+ }
+ DartType type = _typeOf(element);
+ if (type != null) {
+ prop.setReturnType(type.name);
+ }
+ if (identifier != null) {
+ prop.setReplacementLengthIdentifier(identifier.length);
+ }
+ return prop;
+ }
+
+ CompletionProposal _createProposal3(Element element, String completion) {
+ ProposalKind kind = _proposalKindOf(element);
+ CompletionProposal prop = _createProposal4(kind);
+ prop.setElement(element);
+ prop.setCompletion(completion);
+ prop.setDeprecated(_isDeprecated(element));
+ if (_isPrivate(element)) {
+ prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
+ }
+ if (_filter._isSameCasePrefix(element.name)) {
+ prop.incRelevance();
+ }
+ return prop;
+ }
+
+ CompletionProposal _createProposal4(ProposalKind kind) => _factory.createCompletionProposal(kind, _completionTokenOffset());
+
+ List<LibraryElement> _currentLibraryList() {
+ Set<LibraryElement> libraries = new Set<LibraryElement>();
+ LibraryElement curLib = currentLibrary;
+ libraries.add(curLib);
+ Queue<LibraryElement> queue = new Queue<LibraryElement>();
+ queue.addAll(curLib.importedLibraries);
+ _currentLibraryLister(queue, libraries);
+ return new List.from(libraries);
+ }
+
+ void _currentLibraryLister(Queue<LibraryElement> queue, Set<LibraryElement> libraries) {
+ while (!queue.isEmpty) {
+ LibraryElement sourceLib = queue.removeFirst();
+ libraries.add(sourceLib);
+ List<LibraryElement> expLibs = sourceLib.exportedLibraries;
+ for (LibraryElement lib in expLibs) {
+ if (!libraries.contains(lib)) {
+ queue.add(lib);
+ }
+ }
+ }
+ }
+
+ bool _filterAllows(Element element) => _filter._match(element);
+
+ bool _filterDisallows(Element element) => !_filter._match(element);
+
+ bool _filterDisallows2(String name) => !_filter._match2(name);
+
+ List<Element> _findAllNotTypes(List<Element> elements) {
+ elements = [];
+ for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+ Element element = I.next();
+ ElementKind kind = element.kind;
+ if (kind == ElementKind.FUNCTION || kind == ElementKind.TOP_LEVEL_VARIABLE || kind == ElementKind.GETTER || kind == ElementKind.SETTER) {
+ continue;
+ }
+ I.remove();
+ }
+ return new List.from(elements);
+ }
+
+ List<Element> _findAllPrefixes() {
+ LibraryElement lib = _context.compilationUnitElement.enclosingElement;
+ return lib.prefixes;
+ }
+
+ List<Element> _findAllTypes(LibraryElement library, TopLevelNamesKind topKind) {
+ List<Element> elements = _findTopLevelElements(library, topKind);
+ return _findAllTypes2(elements);
+ }
+
+ List<Element> _findAllTypes2(List<Element> elements) {
+ elements = [];
+ for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+ Element element = I.next();
+ ElementKind kind = element.kind;
+ if (kind == ElementKind.CLASS || kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+ continue;
+ }
+ I.remove();
+ }
+ return new List.from(elements);
+ }
+
+ List<Element> _findTopLevelElements(LibraryElement library, TopLevelNamesKind topKind) {
+ List<Element> elements = [];
+ if (topKind == TopLevelNamesKind.DECLARED_AND_IMPORTS) {
+ elements.addAll(CorrectionUtils.getTopLevelElements(library));
+ for (ImportElement imp in library.imports) {
+ elements.addAll(CorrectionUtils.getImportNamespace(imp).values);
+ }
+ _removeNotMatchingFilter(elements);
+ }
+ if (topKind == TopLevelNamesKind.DECLARED_AND_EXPORTS) {
+ elements.addAll(CorrectionUtils.getExportNamespace2(library).values);
+ _removeNotMatchingFilter(elements);
+ }
+ return elements;
+ }
+
+ AnalysisContext get analysisContext => _context.compilationUnitElement.context;
+
+ LibraryElement get currentLibrary => _context.compilationUnitElement.enclosingElement;
+
+ FunctionType _getFunctionType(Element element) {
+ if (element is ExecutableElement) {
+ ExecutableElement executableElement = element;
+ return executableElement.type;
+ }
+ if (element is VariableElement) {
+ VariableElement variableElement = element;
+ DartType type = variableElement.type;
+ if (type is FunctionType) {
+ return type;
+ }
+ }
+ return null;
+ }
+
+ ClassElement get objectClassElement => typeProvider.objectType.element;
+
+ InterfaceType get objectType => typeProvider.objectType;
+
+ List<ParameterElement> _getParameterElements(ArgumentList args) {
+ List<ParameterElement> parameters = null;
+ AstNode argsParent = args.parent;
+ if (argsParent is MethodInvocation) {
+ MethodInvocation invocation = argsParent;
+ Element nameElement = invocation.methodName.staticElement;
+ FunctionType functionType = _getFunctionType(nameElement);
+ if (functionType != null) {
+ parameters = functionType.parameters;
+ }
+ }
+ if (argsParent is InstanceCreationExpression) {
+ InstanceCreationExpression creation = argsParent;
+ ConstructorElement element = creation.staticElement;
+ if (element != null) {
+ parameters = element.parameters;
+ }
+ }
+ if (argsParent is Annotation) {
+ Annotation annotation = argsParent;
+ Element element = annotation.element;
+ if (element is ConstructorElement) {
+ parameters = element.parameters;
+ }
+ }
+ return parameters;
+ }
+
+ TypeProvider get typeProvider {
+ AnalysisContext analysisContext = _context.compilationUnitElement.context;
+ try {
+ return (analysisContext as InternalAnalysisContext).typeProvider;
+ } on AnalysisException catch (exception) {
+ // TODO(brianwilkerson) Figure out the right thing to do if the core cannot be resolved.
+ return null;
+ }
+ }
+
+ bool get hasErrorBeforeCompletionLocation {
+ List<AnalysisError> errors = _context.errors;
+ if (errors == null || errors.length == 0) {
+ return false;
+ }
+ return errors[0].offset <= _completionLocation();
+ }
+
+ List<ImportElement> _importsWithName(SimpleIdentifier libName) {
+ String name = libName.name;
+ List<ImportElement> imports = [];
+ for (ImportElement imp in currentLibrary.imports) {
+ PrefixElement prefix = imp.prefix;
+ if (prefix != null) {
+ String impName = prefix.displayName;
+ if (name == impName) {
+ imports.add(imp);
+ }
+ }
+ }
+ return new List.from(imports);
+ }
+
+ bool _isCompletingKeyword(Token keyword) {
+ if (keyword == null) {
+ return false;
+ }
+ int completionLoc = _context.selectionOffset;
+ if (completionLoc >= keyword.offset && completionLoc <= keyword.end) {
+ return true;
+ }
+ return false;
+ }
+
+ bool _isCompletionAfter(int loc) => loc <= _completionLocation();
+
+ bool _isCompletionBefore(int loc) => _completionLocation() <= loc;
+
+ bool _isCompletionBetween(int firstLoc, int secondLoc) => _isCompletionAfter(firstLoc) && _isCompletionBefore(secondLoc);
+
+ bool _isDeprecated(Element element) => element != null && element.isDeprecated;
+
+ bool _isInCurrentLibrary(Element element) {
+ LibraryElement libElement = currentLibrary;
+ return identical(element.library, libElement);
+ }
+
+ bool _isUnitInLibFolder(CompilationUnitElement cu) {
+ String pathString = cu.source.fullName;
+ if (pathString.indexOf("/lib/") == -1) {
+ return false;
+ }
+ return true;
+ }
+
+ bool _isVisible(Element element) => !_isPrivate(element) || _isInCurrentLibrary(element);
+
+ String _makeNonconflictingName(String candidate, List<String> names) {
+ String possibility = candidate;
+ int count = 0;
+ loop: while (true) {
+ String name = count == 0 ? possibility : "${possibility}${count}";
+ for (String conflict in names) {
+ if (name == conflict) {
+ count += 1;
+ continue loop;
+ }
+ }
+ return name;
+ }
+ }
+
+ void _pArgumentList(CompletionProposal proposal, int offset, int len) {
+ // prepare parameters
+ List<String> parameterNames = proposal.parameterNames;
+ if (parameterNames.length == 0) {
+ return;
+ }
+ // fill arguments proposal
+ CompletionProposal prop = _createProposal4(ProposalKind.ARGUMENT_LIST);
+ prop.setElement(proposal.element);
+ prop.setCompletion(proposal.completion).setReturnType(proposal.returnType);
+ prop.setParameterNames(parameterNames);
+ prop.setParameterTypes(proposal.parameterTypes);
+ prop.setParameterStyle(proposal.positionalParameterCount, proposal.hasNamed, proposal.hasPositional);
+ prop.setReplacementLength(0).setLocation(_completionLocation());
+ prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+ _requestor.accept(prop);
+ }
+
+ void _pDynamic() {
+ _pWord(_C_DYNAMIC, ProposalKind.VARIABLE);
+ }
+
+ void _pExecutable(Element element, FunctionType functionType, SimpleIdentifier identifier, bool isPotentialMatch) {
+ // Create a completion proposal for the element: function, method, getter, setter, constructor.
+ String name = element.displayName;
+ if (name.isEmpty) {
+ return;
+ }
+ if (_filterDisallows(element)) {
+ return;
+ }
+ if (!_isVisible(element)) {
+ return;
+ }
+ // May be we are in argument of function type parameter, propose function reference.
+ if (_state._targetParameter != null) {
+ DartType parameterType = _state._targetParameter.type;
+ if (parameterType is FunctionType) {
+ if (functionType.isAssignableTo(parameterType)) {
+ _pName2(name, element, CompletionProposal.RELEVANCE_HIGH, ProposalKind.METHOD_NAME);
+ }
+ }
+ }
+ CompletionProposal prop = _createProposal(element);
+ prop.setPotentialMatch(isPotentialMatch);
+ if (isPotentialMatch) {
+ prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
+ }
+ _setParameterInfo(functionType, prop);
+ prop.setCompletion(name).setReturnType(functionType.returnType.displayName);
+ // If there is already argument list, then update only method name.
+ if (identifier.parent is MethodInvocation && (identifier.parent as MethodInvocation).argumentList != null) {
+ prop.setKind(ProposalKind.METHOD_NAME);
+ }
+ Element container = element.enclosingElement;
+ if (container != null) {
+ prop.setDeclaringType(container.displayName);
+ }
+ _requestor.accept(prop);
+ }
+
+ void _pExecutable2(ExecutableElement element, SimpleIdentifier identifier, bool isPotentialMatch) {
+ _pExecutable(element, element.type, identifier, isPotentialMatch);
+ }
+
+ void _pExecutable3(VariableElement element, SimpleIdentifier identifier) {
+ // Create a completion proposal for the element: top-level variable.
+ String name = element.displayName;
+ if (name.isEmpty || _filterDisallows(element)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal(element);
+ if (element.type != null) {
+ prop.setReturnType(element.type.name);
+ }
+ Element container = element.enclosingElement;
+ if (container != null) {
+ prop.setDeclaringType(container.displayName);
+ }
+ if (identifier != null) {
+ prop.setReplacementLengthIdentifier(identifier.length);
+ }
+ _requestor.accept(prop);
+ }
+
+ void _pFalse() {
+ _pWord(_C_FALSE, ProposalKind.VARIABLE);
+ }
+
+ void _pField(FieldElement element, SimpleIdentifier identifier, ClassElement classElement) {
+ // Create a completion proposal for the element: field only.
+ if (_filterDisallows(element)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal(element);
+ Element container = element.enclosingElement;
+ prop.setDeclaringType(container.displayName);
+ _requestor.accept(prop);
+ }
+
+ /**
+ * Proposes URI with the given scheme for the given [NamespaceDirective].
+ */
+ void _pImportUriWithScheme(NamespaceDirective node, String uriScheme) {
+ String newUri = "${uriScheme}${new String.fromCharCode(CompletionProposal.CURSOR_MARKER)}";
+ if (node.uri.isSynthetic) {
+ newUri = "'${newUri}'";
+ if (node.semicolon == null || node.semicolon.isSynthetic) {
+ newUri += ";";
+ }
+ }
+ if (_context.selectionOffset == node.keyword.end) {
+ newUri = " ${newUri}";
+ }
+ _pName3(newUri, ProposalKind.IMPORT);
+ }
+
+ void _pKeyword(Token keyword) {
+ _filter = new Filter.con2(keyword.lexeme, keyword.offset, _completionLocation());
+ // This isn't as useful as it might seem. It only works in the case that completion
+ // is requested on an existing recognizable keyword.
+ // TODO: Add keyword proposal kind
+ CompletionProposal prop = _createProposal4(ProposalKind.LIBRARY_PREFIX);
+ prop.setCompletion(keyword.lexeme);
+ _requestor.accept(prop);
+ }
+
+ void _pName(Element element, SimpleIdentifier identifier) {
+ CompletionProposal prop = _createProposal2(element, identifier);
+ if (prop != null) {
+ _requestor.accept(prop);
+ }
+ }
+
+ void _pName2(String name, Element element, int relevance, ProposalKind kind) {
+ if (_filterDisallows2(name)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal4(kind);
+ prop.setRelevance(relevance);
+ prop.setCompletion(name);
+ prop.setElement(element);
+ _requestor.accept(prop);
+ }
+
+ void _pName3(String name, ProposalKind kind) {
+ if (_filterDisallows2(name)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal4(kind);
+ prop.setCompletion(name);
+ _requestor.accept(prop);
+ }
+
+ void _pNamedConstructor(ClassElement classElement, ConstructorElement element, SimpleIdentifier identifier) {
+ // Create a completion proposal for the named constructor.
+ String name = classElement.displayName;
+ if (!element.displayName.isEmpty) {
+ name += ".${element.displayName}";
+ }
+ if (_filterDisallows2(name)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal3(element, name);
+ _setParameterInfo(element.type, prop);
+ prop.setReturnType(element.type.returnType.name);
+ Element container = element.enclosingElement;
+ prop.setDeclaringType(container.displayName);
+ if (identifier != null) {
+ prop.setReplacementLengthIdentifier(identifier.length);
+ }
+ _requestor.accept(prop);
+ }
+
+ void _pNull() {
+ _pWord(_C_NULL, ProposalKind.VARIABLE);
+ }
+
+ void _pParamName(String name) {
+ if (_filterDisallows2(name)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal4(ProposalKind.PARAMETER);
+ prop.setCompletion(name);
+ _requestor.accept(prop);
+ }
+
+ ProposalKind _proposalKindOf(Element element) {
+ ProposalKind kind;
+ while (true) {
+ if (element.kind == ElementKind.CONSTRUCTOR) {
+ kind = ProposalKind.CONSTRUCTOR;
+ } else if (element.kind == ElementKind.FUNCTION) {
+ kind = ProposalKind.FUNCTION;
+ } else if (element.kind == ElementKind.METHOD) {
+ kind = ProposalKind.METHOD;
+ } else if (element.kind == ElementKind.GETTER) {
+ kind = ProposalKind.GETTER;
+ } else if (element.kind == ElementKind.SETTER) {
+ kind = ProposalKind.SETTER;
+ } else if (element.kind == ElementKind.CLASS) {
+ kind = ProposalKind.CLASS;
+ } else if (element.kind == ElementKind.FIELD) {
+ kind = ProposalKind.FIELD;
+ } else if (element.kind == ElementKind.IMPORT) {
+ kind = ProposalKind.IMPORT;
+ } else if (element.kind == ElementKind.PARAMETER) {
+ kind = ProposalKind.PARAMETER;
+ } else if (element.kind == ElementKind.PREFIX) {
+ kind = ProposalKind.LIBRARY_PREFIX;
+ } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+ kind = ProposalKind.CLASS_ALIAS;
+ } else if (element.kind == ElementKind.TYPE_PARAMETER) {
+ kind = ProposalKind.TYPE_PARAMETER;
+ } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+ kind = ProposalKind.VARIABLE;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ break;
+ }
+ return kind;
+ }
+
+ void _proposeCombinator(Combinator node, SimpleIdentifier identifier) {
+ _filter = _createFilter(identifier);
+ NamespaceDirective directive = node.parent as NamespaceDirective;
+ LibraryElement libraryElement = directive.uriElement;
+ if (libraryElement != null) {
+ // prepare Elements with unique names
+ CompletionEngine_NameCollector nameCollector = _createNameCollector();
+ Iterable<Element> elements = CorrectionUtils.getExportNamespace2(libraryElement).values;
+ for (Element element in elements) {
+ if (_filterDisallows(element)) {
+ continue;
+ }
+ nameCollector._mergeName(element);
+ }
+ // propose each Element
+ for (Element element in nameCollector.uniqueElements) {
+ CompletionProposal proposal = _createProposal(element);
+ if (proposal.kind == ProposalKind.FUNCTION) {
+ proposal.setKind(ProposalKind.METHOD_NAME);
+ }
+ _requestor.accept(proposal);
+ }
+ }
+ }
+
+ void _proposeName(Element element, SimpleIdentifier identifier, CompletionEngine_NameCollector names) {
+ while (true) {
+ if (element.kind == ElementKind.FUNCTION || element.kind == ElementKind.GETTER || element.kind == ElementKind.METHOD || element.kind == ElementKind.SETTER) {
+ ExecutableElement candidate = element as ExecutableElement;
+ _pExecutable2(candidate, identifier, names._isPotentialMatch(candidate));
+ } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.PARAMETER || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+ FunctionType functionType = _getFunctionType(element);
+ if (functionType != null) {
+ _pExecutable(element, functionType, identifier, names._isPotentialMatch(element));
+ } else {
+ VariableElement var2 = element as VariableElement;
+ _pExecutable3(var2, identifier);
+ }
+ } else if (element.kind == ElementKind.CLASS) {
+ _pName(element, identifier);
+ } else {
+ }
+ break;
+ }
+ }
+
+ void _proposeNames(CompletionEngine_NameCollector names, SimpleIdentifier identifier) {
+ for (Element element in names.uniqueElements) {
+ _proposeName(element, identifier, names);
+ }
+ }
+
+ void _pTrue() {
+ _pWord(_C_TRUE, ProposalKind.VARIABLE);
+ }
+
+ void _pVar() {
+ _pWord(_C_VAR, ProposalKind.VARIABLE);
+ }
+
+ void _pVoid() {
+ _pWord(_C_VOID, ProposalKind.VARIABLE);
+ }
+
+ void _pWord(String word, ProposalKind kind) {
+ if (_filterDisallows2(word)) {
+ return;
+ }
+ CompletionProposal prop = _createProposal4(kind);
+ prop.setCompletion(word);
+ _requestor.accept(prop);
+ }
+
+ void _removeNotMatchingFilter(List<Element> elements) {
+ if (_filter == null) {
+ return;
+ }
+ _filter._makePattern();
+ _filter._removeNotMatching(elements);
+ }
+
+ void _setParameterInfo(FunctionType functionType, CompletionProposal prop) {
+ List<String> params = new List<String>();
+ List<String> types = new List<String>();
+ bool named = false, positional = false;
+ int posCount = 0;
+ for (ParameterElement param in functionType.parameters) {
+ if (!param.isSynthetic) {
+ while (true) {
+ if (param.parameterKind == ParameterKind.REQUIRED) {
+ posCount += 1;
+ } else if (param.parameterKind == ParameterKind.NAMED) {
+ named = true;
+ } else if (param.parameterKind == ParameterKind.POSITIONAL) {
+ positional = true;
+ }
+ break;
+ }
+ params.add(param.displayName);
+ types.add(param.type.toString());
+ }
+ }
+ prop.setParameterNames(new List.from(params));
+ prop.setParameterTypes(new List.from(types));
+ prop.setParameterStyle(posCount, named, positional);
+ }
+
+ SimpleIdentifier _typeDeclarationName(AstNode node) {
+ AstNode parent = node;
+ while (parent != null) {
+ if (parent is ClassDeclaration) {
+ return (parent as ClassDeclaration).name;
+ }
+ if (parent is ClassTypeAlias) {
+ return (parent as ClassTypeAlias).name;
+ }
+ if (parent is FunctionTypeAlias) {
+ return (parent as FunctionTypeAlias).name;
+ }
+ parent = parent.parent;
+ }
+ return null;
+ }
+
+ DartType _typeOf(Element receiver) {
+ DartType receiverType;
+ while (true) {
+ if (receiver.kind == ElementKind.FIELD || receiver.kind == ElementKind.PARAMETER || receiver.kind == ElementKind.LOCAL_VARIABLE || receiver.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+ {
+ VariableElement receiverElement = receiver as VariableElement;
+ receiverType = receiverElement.type;
+ break;
+ }
+ } else if (receiver.kind == ElementKind.GETTER) {
+ PropertyAccessorElement accessor = receiver as PropertyAccessorElement;
+ if (accessor.isSynthetic) {
+ PropertyInducingElement inducer = accessor.variable;
+ DartType inducerType = inducer.type;
+ if (inducerType == null || inducerType.isDynamic) {
+ receiverType = _typeSearch(inducer);
+ if (receiverType != null) {
+ break;
+ }
+ }
+ }
+ FunctionType accType = accessor.type;
+ receiverType = accType == null ? null : accType.returnType;
+ } else if (receiver.kind == ElementKind.CONSTRUCTOR || receiver.kind == ElementKind.FUNCTION || receiver.kind == ElementKind.METHOD || receiver.kind == ElementKind.SETTER) {
+ {
+ ExecutableElement receiverElement = receiver as ExecutableElement;
+ FunctionType funType = receiverElement.type;
+ receiverType = funType == null ? null : funType.returnType;
+ break;
+ }
+ } else if (receiver.kind == ElementKind.CLASS) {
+ {
+ ClassElement receiverElement = receiver as ClassElement;
+ receiverType = receiverElement.type;
+ break;
+ }
+ } else if (receiver.kind == ElementKind.DYNAMIC) {
+ {
+ receiverType = DynamicTypeImpl.instance;
+ break;
+ }
+ } else if (receiver.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+ {
+ FunctionTypeAliasElement receiverElement = receiver as FunctionTypeAliasElement;
+ FunctionType funType = receiverElement.type;
+ receiverType = funType == null ? null : funType.returnType;
+ break;
+ }
+ } else {
+ {
+ receiverType = null;
+ break;
+ }
+ }
+ break;
+ }
+ return receiverType;
+ }
+
+ DartType _typeOf2(Expression expr) {
+ DartType type = expr.bestType;
+ if (type.isDynamic) {
+ List<DartType> result = new List<DartType>(1);
+ CompletionEngine_AstNodeClassifier visitor = new AstNodeClassifier_CompletionEngine_typeOf(this, result);
+ expr.accept(visitor);
+ if (result[0] != null) {
+ return result[0];
+ }
+ }
+ return type;
+ }
+
+ DartType _typeOfContainingClass(AstNode node) {
+ AstNode parent = node;
+ while (parent != null) {
+ if (parent is ClassDeclaration) {
+ return (parent as ClassDeclaration).element.type;
+ }
+ parent = parent.parent;
+ }
+ return DynamicTypeImpl.instance;
+ }
+
+ DartType _typeSearch(PropertyInducingElement varElement) {
+ // TODO(scheglov) translate it
+ return null;
+ }
+}
+
+abstract class CompletionEngine_AstNodeClassifier extends GeneralizingAstVisitor<Object> {
+ @override
+ Object visitNode(AstNode node) => null;
+}
+
+class CompletionEngine_CommentReferenceCompleter extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ final SimpleIdentifier _identifier;
+
+ CompletionEngine_NameCollector _names;
+
+ Set<Element> _enclosingElements = new Set();
+
+ CompletionEngine_CommentReferenceCompleter(this.CompletionEngine_this, this._identifier) {
+ CompletionEngine_this._filter = CompletionEngine_this._createFilter(_identifier);
+ _names = CompletionEngine_this._collectTopLevelElementVisibleAt(_identifier);
+ }
+
+ @override
+ Object visitClassDeclaration(ClassDeclaration node) {
+ ClassElement classElement = node.element;
+ _names._addNamesDefinedByHierarchy(classElement, false);
+ _enclosingElements.add(classElement);
+ return null;
+ }
+
+ @override
+ Object visitComment(Comment node) {
+ node.parent.accept(this);
+ // propose names
+ for (Element element in _names.uniqueElements) {
+ CompletionProposal proposal = CompletionEngine_this._createProposal2(element, _identifier);
+ if (proposal != null) {
+ // we don't want to add arguments, just names
+ if (element is MethodElement || element is FunctionElement) {
+ proposal.setKind(ProposalKind.METHOD_NAME);
+ }
+ // elevate priority for local elements
+ if (_enclosingElements.contains(element.enclosingElement)) {
+ proposal.setRelevance(CompletionProposal.RELEVANCE_HIGH);
+ }
+ // propose
+ CompletionEngine_this._requestor.accept(proposal);
+ }
+ }
+ // done
+ return null;
+ }
+
+ @override
+ Object visitConstructorDeclaration(ConstructorDeclaration node) {
+ _visitExecutableDeclaration(node);
+ // pass through
+ return node.parent.accept(this);
+ }
+
+ @override
+ Object visitFunctionDeclaration(FunctionDeclaration node) {
+ _visitExecutableDeclaration(node);
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ FunctionTypeAliasElement element = node.element;
+ _names._mergeNames(element.parameters);
+ _enclosingElements.add(element);
+ return null;
+ }
+
+ @override
+ Object visitMethodDeclaration(MethodDeclaration node) {
+ _visitExecutableDeclaration(node);
+ // pass through
+ return node.parent.accept(this);
+ }
+
+ void _visitExecutableDeclaration(Declaration node) {
+ ExecutableElement element = node.element as ExecutableElement;
+ _names._mergeNames(element.parameters);
+ _enclosingElements.add(element);
+ }
+}
+
+/**
+ * An IdentifierCompleter is used to classify the parent of the completion node when it has
+ * previously been determined that the completion node is a SimpleIdentifier.
+ */
+class CompletionEngine_IdentifierCompleter extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ SimpleIdentifier _completionNode;
+
+ CompletionEngine_IdentifierCompleter(this.CompletionEngine_this, SimpleIdentifier node) {
+ _completionNode = node;
+ }
+
+ @override
+ Object visitAnnotation(Annotation node) {
+ if (_completionNode is SimpleIdentifier) {
+ CompletionEngine_this._analyzeAnnotationName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitArgumentList(ArgumentList node) {
+ if (_completionNode is SimpleIdentifier) {
+ if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ CompletionEngine_this._analyzePositionalArgument(node, _completionNode);
+ CompletionEngine_this._analyzeNamedParameter(node, _completionNode);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitAssignmentExpression(AssignmentExpression node) {
+ if (_completionNode is SimpleIdentifier) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitBinaryExpression(BinaryExpression node) {
+ if (identical(node.leftOperand, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ } else if (identical(node.rightOperand, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitCombinator(Combinator node) {
+ CompletionEngine_this._proposeCombinator(node, _completionNode);
+ return null;
+ }
+
+ @override
+ Object visitCommentReference(CommentReference node) {
+ AstNode comment = node.parent;
+ CompletionEngine_CommentReferenceCompleter visitor = new CompletionEngine_CommentReferenceCompleter(CompletionEngine_this, _completionNode);
+ return comment.accept(visitor);
+ }
+
+ @override
+ Object visitConstructorDeclaration(ConstructorDeclaration node) {
+ if (identical(node.returnType, _completionNode)) {
+ CompletionEngine_this._filter = CompletionEngine_this._createFilter(_completionNode);
+ CompletionEngine_this._pName3(_completionNode.name, ProposalKind.CONSTRUCTOR);
+ }
+ return null;
+ }
+
+ @override
+ Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+ // { A() : this.!x = 1; }
+ if (identical(node.fieldName, _completionNode)) {
+ ClassElement classElement = (node.parent as ConstructorDeclaration).element.enclosingElement;
+ CompletionEngine_this._fieldReference(classElement, node.fieldName);
+ }
+ return null;
+ }
+
+ @override
+ Object visitConstructorName(ConstructorName node) {
+ if (identical(node.name, _completionNode)) {
+ // { new A.!c(); }
+ TypeName typeName = node.type;
+ if (typeName != null) {
+ DartType type = typeName.type;
+ Element typeElement = type.element;
+ if (typeElement is ClassElement) {
+ ClassElement classElement = typeElement;
+ CompletionEngine_this._constructorReference(classElement, node.name);
+ }
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitDoStatement(DoStatement node) {
+ if (identical(node.condition, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitExpression(Expression node) {
+ SimpleIdentifier ident;
+ if (_completionNode is SimpleIdentifier) {
+ ident = _completionNode;
+ } else {
+ ident = CompletionEngine_this._createIdent(node);
+ }
+ CompletionEngine_this._analyzeLocalName(ident);
+ return null;
+ }
+
+ @override
+ Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+ if (identical(_completionNode, node.expression)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitExpressionStatement(ExpressionStatement node) {
+ SimpleIdentifier ident;
+ if (_completionNode is SimpleIdentifier) {
+ ident = _completionNode;
+ } else {
+ ident = CompletionEngine_this._createIdent(node);
+ }
+ CompletionEngine_this._analyzeLocalName(ident);
+ return null;
+ }
+
+ @override
+ Object visitFieldFormalParameter(FieldFormalParameter node) {
+ if (identical(_completionNode, node.identifier)) {
+ CompletionEngine_this._analyzeImmediateField(node.identifier);
+ }
+ return null;
+ }
+
+ @override
+ Object visitForEachStatement(ForEachStatement node) {
+ if (identical(node.iterator, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ if (identical(node.name, _completionNode)) {
+ if (node.returnType == null) {
+ // This may be an incomplete class type alias
+ CompletionEngine_this._state._includesUndefinedTypes();
+ CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitIfStatement(IfStatement node) {
+ if (identical(node.condition, _completionNode)) {
+ // { if (!) }
+ CompletionEngine_this._analyzeLocalName(new Ident.con3(node, _completionNode.token));
+ }
+ return null;
+ }
+
+ @override
+ Object visitInterpolationExpression(InterpolationExpression node) {
+ if (node.expression is SimpleIdentifier) {
+ SimpleIdentifier ident = node.expression as SimpleIdentifier;
+ CompletionEngine_this._analyzeLocalName(ident);
+ }
+ return null;
+ }
+
+ @override
+ Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+ @override
+ Object visitMethodDeclaration(MethodDeclaration node) {
+ if (identical(_completionNode, node.name)) {
+ if (node.returnType == null) {
+ // class Foo {const F!(); }
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitMethodInvocation(MethodInvocation node) {
+ if (identical(node.methodName, _completionNode)) {
+ // { x.!y() }
+ Expression expr = node.realTarget;
+ DartType receiverType;
+ if (expr == null) {
+ receiverType = CompletionEngine_this._typeOfContainingClass(node);
+ CompletionEngine_this._analyzeDirectAccess(receiverType, node.methodName);
+ } else {
+ CompletionEngine_this._dispatchPrefixAnalysis2(node);
+ }
+ } else if (identical(node.target, _completionNode)) {
+ // { x!.y() } -- only reached when node.getTarget() is a simple identifier.
+ if (_completionNode is SimpleIdentifier) {
+ SimpleIdentifier ident = _completionNode;
+ CompletionEngine_this._analyzeReceiver(ident);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitParenthesizedExpression(ParenthesizedExpression node) {
+ // Incomplete closure: foo((Str!)); We check if "()" is argument for function typed parameter.
+ if (node.parent is ArgumentList) {
+ ParameterElement parameterElement = node.bestParameterElement;
+ if (parameterElement != null && parameterElement.type is FunctionType) {
+ Ident ident = CompletionEngine_this._createIdent(_completionNode);
+ CompletionEngine_this._analyzeTypeName(_completionNode, ident);
+ }
+ }
+ return super.visitParenthesizedExpression(node);
+ }
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+ if (identical(node.prefix, _completionNode)) {
+ // { x!.y }
+ CompletionEngine_this._analyzeLocalName(node.prefix);
+ } else {
+ // { v.! }
+ CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
+ }
+ return null;
+ }
+
+ @override
+ Object visitPropertyAccess(PropertyAccess node) {
+ if (node.target != null && node.target.length == 0) {
+ return null;
+ }
+ // { o.!hashCode }
+ if (identical(node.propertyName, _completionNode)) {
+ CompletionEngine_this._analyzePrefixedAccess(node.realTarget, node.propertyName);
+ }
+ return null;
+ }
+
+ @override
+ Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+ // { A.Fac() : this.!b(); }
+ if (identical(node.constructorName, _completionNode)) {
+ ClassElement classElement = node.staticElement.enclosingElement;
+ CompletionEngine_this._constructorReference(classElement, node.constructorName);
+ }
+ return null;
+ }
+
+ @override
+ Object visitReturnStatement(ReturnStatement node) {
+ if (_completionNode is SimpleIdentifier) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+ if (identical(node.identifier, _completionNode)) {
+ if (node.keyword == null && node.type == null) {
+ Ident ident = CompletionEngine_this._createIdent(node);
+ CompletionEngine_this._analyzeTypeName(node.identifier, ident);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+ CompletionEngine_this._analyzeSuperConstructorInvocation(node);
+ return null;
+ }
+
+ @override
+ Object visitSwitchCase(SwitchCase node) {
+ if (identical(_completionNode, node.expression)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSwitchStatement(SwitchStatement node) {
+ if (identical(node.expression, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeName(TypeName node) {
+ AstNode parent = node.parent;
+ if (parent != null) {
+ CompletionEngine_TypeNameCompleter visitor = new CompletionEngine_TypeNameCompleter(CompletionEngine_this, _completionNode, node);
+ return parent.accept(visitor);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeParameter(TypeParameter node) {
+ // { X<!Y> }
+ if (CompletionEngine_this._isCompletionBetween(node.offset, node.end)) {
+ CompletionEngine_this._analyzeTypeName(_completionNode, CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclaration(VariableDeclaration node) {
+ if (identical(node.name, _completionNode)) {
+ CompletionEngine_this._analyzeDeclarationName(node);
+ } else if (identical(node.initializer, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(node.initializer as SimpleIdentifier);
+ }
+ return null;
+ }
+
+ @override
+ Object visitWhileStatement(WhileStatement node) {
+ if (identical(node.condition, _completionNode)) {
+ CompletionEngine_this._analyzeLocalName(_completionNode);
+ }
+ return null;
+ }
+}
+
+class CompletionEngine_NameCollector {
+ final CompletionEngine CompletionEngine_this;
+
+ Map<String, List<Element>> _uniqueNames = new Map<String, List<Element>>();
+
+ Set<Element> _potentialMatches;
+
+ CompletionEngine_NameCollector(this.CompletionEngine_this);
+
+ void addAll(Iterable<SimpleIdentifier> values) {
+ for (SimpleIdentifier id in values) {
+ _mergeName(id.bestElement);
+ }
+ }
+
+ void addLocalNames(SimpleIdentifier identifier) {
+ AstNode node = identifier;
+ Declaration decl;
+ while ((decl = node.getAncestor((node) => node is Declaration)) != null) {
+ Element declElement = decl.element;
+ if (declElement is ExecutableElement) {
+ _addNamesDefinedByExecutable(declElement);
+ } else {
+ return;
+ }
+ node = decl.parent;
+ }
+ }
+
+ void _addNamesDefinedByExecutable(ExecutableElement execElement) {
+ _mergeNames(execElement.parameters);
+ _mergeNames(execElement.localVariables);
+ _mergeNames(execElement.functions);
+ }
+
+ void _addNamesDefinedByHierarchy(ClassElement classElement, bool forSuper) {
+ _addNamesDefinedByHierarchy2(classElement.type, forSuper);
+ }
+
+ void _addNamesDefinedByHierarchy2(InterfaceType type, bool forSuper) {
+ List<InterfaceType> superTypes = type.element.allSupertypes;
+ if (!forSuper) {
+ superTypes.insert(0, type);
+ }
+ _addNamesDefinedByTypes(superTypes);
+ // Collect names defined by subtypes separately so they can be identified later.
+ CompletionEngine_NameCollector potentialMatchCollector = CompletionEngine_this._createNameCollector();
+ if (!type.isObject) {
+ potentialMatchCollector._addNamesDefinedByTypes(CompletionEngine_this._allSubtypes(type.element));
+ }
+ _potentialMatches = new Set<Element>();
+ for (List<Element> matches in potentialMatchCollector._uniqueNames.values) {
+ for (Element match in matches) {
+ _mergeName(match);
+ _potentialMatches.add(match);
+ }
+ }
+ }
+
+ void _addNamesDefinedByType(ClassElement classElement) {
+ _addNamesDefinedByType2(classElement.type);
+ }
+
+ void _addNamesDefinedByType2(InterfaceType type) {
+ if (_inPrivateLibrary(type)) {
+ return;
+ }
+ List<PropertyAccessorElement> accessors = type.accessors;
+ _mergeNames(accessors);
+ List<MethodElement> methods = type.methods;
+ _mergeNames(methods);
+ _mergeNames(type.element.typeParameters);
+ _filterStaticRefs(accessors);
+ _filterStaticRefs(methods);
+ }
+
+ void _addNamesDefinedByTypes(List<InterfaceType> types) {
+ for (InterfaceType type in types) {
+ _addNamesDefinedByType2(type);
+ }
+ }
+
+ void _addTopLevelNames(List<ImportElement> imports, TopLevelNamesKind topKind) {
+ for (ImportElement imp in imports) {
+ Iterable<Element> elementsCollection = CorrectionUtils.getImportNamespace(imp).values;
+ List<Element> elements = [];
+ _addTopLevelNames4(elements);
+ }
+ }
+
+ void _addTopLevelNames2(LibraryElement library, TopLevelNamesKind topKind) {
+ List<Element> elements = CompletionEngine_this._findTopLevelElements(library, topKind);
+ _addTopLevelNames4(elements);
+ }
+
+ void _addTopLevelNames3(List<LibraryElement> libraries, TopLevelNamesKind topKind) {
+ for (LibraryElement library in libraries) {
+ _addTopLevelNames2(library, topKind);
+ }
+ }
+
+ Iterable<List<Element>> get names => _uniqueNames.values;
+
+ Iterable<Element> get uniqueElements {
+ List<Element> uniqueElements = [];
+ for (List<Element> uniques in _uniqueNames.values) {
+ Element element = uniques[0];
+ uniqueElements.add(element);
+ }
+ return uniqueElements;
+ }
+
+ bool _isPotentialMatch(Element element) => _potentialMatches != null && _potentialMatches.contains(element);
+
+ void _remove(Element element) {
+ String name = element.displayName;
+ List<Element> list = _uniqueNames[name];
+ if (list == null) {
+ return;
+ }
+ list.remove(element);
+ if (list.isEmpty) {
+ _uniqueNames.remove(name);
+ }
+ }
+
+ void _addTopLevelNames4(List<Element> elements) {
+ _mergeNames(CompletionEngine_this._findAllTypes2(elements));
+ if (!CompletionEngine_this._state._areClassesRequired) {
+ _mergeNames(CompletionEngine_this._findAllNotTypes(elements));
+ _mergeNames(CompletionEngine_this._findAllPrefixes());
+ }
+ }
+
+ void _filterStaticRefs(List<ExecutableElement> elements) {
+ for (ExecutableElement execElem in elements) {
+ if (CompletionEngine_this._state._areInstanceReferencesProhibited && !execElem.isStatic) {
+ _remove(execElem);
+ } else if (CompletionEngine_this._state._areStaticReferencesProhibited && execElem.isStatic) {
+ _remove(execElem);
+ } else if (!CompletionEngine_this._state._areOperatorsAllowed && execElem.isOperator) {
+ _remove(execElem);
+ } else if (CompletionEngine_this._state._areMethodsProhibited && !execElem.isOperator) {
+ _remove(execElem);
+ }
+ }
+ }
+
+ bool _inPrivateLibrary(InterfaceType type) {
+ LibraryElement lib = type.element.library;
+ if (!lib.name.startsWith("_")) {
+ return false;
+ }
+ // allow completion in the same library
+ if (identical(lib, CompletionEngine_this.currentLibrary)) {
+ return false;
+ }
+ // eliminate types defined in private libraries
+ return true;
+ }
+
+ void _mergeName(Element element) {
+ if (element == null) {
+ return;
+ }
+ // ignore private
+ String name = element.displayName;
+ if (Identifier.isPrivateName(name)) {
+ if (!CompletionEngine_this._isInCurrentLibrary(element)) {
+ return;
+ }
+ }
+ // add to other Element(s) with such name
+ List<Element> dups = _uniqueNames[name];
+ if (dups == null) {
+ dups = new List<Element>();
+ _uniqueNames[name] = dups;
+ }
+ dups.add(element);
+ }
+
+ void _mergeNames(List<Element> elements) {
+ for (Element element in elements) {
+ _mergeName(element);
+ }
+ }
+}
+
+/**
+ * An StringCompleter is used to classify the parent of the completion node when it has previously
+ * been determined that the completion node is a SimpleStringLiteral.
+ */
+class CompletionEngine_StringCompleter extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ SimpleStringLiteral _completionNode;
+
+ CompletionEngine_StringCompleter(this.CompletionEngine_this, SimpleStringLiteral node) {
+ _completionNode = node;
+ }
+
+ @override
+ Object visitNamespaceDirective(NamespaceDirective node) {
+ if (identical(_completionNode, node.uri)) {
+ CompletionEngine_this._namespaceReference(node, _completionNode);
+ }
+ return null;
+ }
+}
+
+/**
+ * A TerminalNodeCompleter is used to classify the completion node when nothing else is known
+ * about it.
+ */
+class CompletionEngine_TerminalNodeCompleter extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ CompletionEngine_TerminalNodeCompleter(this.CompletionEngine_this);
+
+ @override
+ Object visitArgumentList(ArgumentList node) {
+ if (node.arguments.isEmpty && CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+ if (node.parent is MethodInvocation) {
+ // or node.getParent().accept(this); ?
+ MethodInvocation invokeNode = node.parent as MethodInvocation;
+ SimpleIdentifier methodName = invokeNode.methodName;
+ ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
+ try {
+ CompletionEngine_this._requestor = proposalRequestor;
+ CompletionEngine_this._dispatchPrefixAnalysis2(invokeNode);
+ } finally {
+ CompletionEngine_this._requestor = proposalRequestor.requestor;
+ }
+ int offset = methodName.offset;
+ int len = node.rightParenthesis.end - offset;
+ String name = methodName.name;
+ for (CompletionProposal proposal in proposalRequestor.proposals) {
+ if (proposal.completion == name) {
+ CompletionEngine_this._pArgumentList(proposal, offset, len);
+ }
+ }
+ } else if (node.parent is InstanceCreationExpression) {
+ InstanceCreationExpression invokeNode = node.parent as InstanceCreationExpression;
+ ConstructorName methodName = invokeNode.constructorName;
+ ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
+ try {
+ CompletionEngine_this._requestor = proposalRequestor;
+ CompletionEngine_this._dispatchPrefixAnalysis(invokeNode);
+ } finally {
+ CompletionEngine_this._requestor = proposalRequestor.requestor;
+ }
+ int offset = methodName.offset;
+ int len = node.rightParenthesis.end - offset;
+ for (CompletionProposal proposal in proposalRequestor.proposals) {
+ if (proposal.element == invokeNode.staticElement) {
+ CompletionEngine_this._pArgumentList(proposal, offset, len);
+ }
+ }
+ } else if (node.parent is Annotation) {
+ Annotation annotation = node.parent as Annotation;
+ Element annotationElement = annotation.element;
+ if (annotationElement is ConstructorElement) {
+ ConstructorElement constructorElement = annotationElement;
+ // we don't need any filter
+ CompletionEngine_this._filter = new Filter.con2("", -1, 0);
+ // fill parameters for "pArgumentList"
+ CompletionProposal prop = CompletionEngine_this._createProposal(constructorElement);
+ CompletionEngine_this._setParameterInfo(constructorElement.type, prop);
+ prop.setCompletion(constructorElement.enclosingElement.name);
+ // propose the whole parameters list
+ CompletionEngine_this._pArgumentList(prop, 0, 0);
+ }
+ }
+ }
+ if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+ Ident ident = CompletionEngine_this._createIdent(node);
+ CompletionEngine_this._analyzeLocalName(ident);
+ CompletionEngine_this._analyzePositionalArgument(node, ident);
+ CompletionEngine_this._analyzeNamedParameter(node, ident);
+ }
+ return null;
+ }
+
+ @override
+ Object visitAsExpression(AsExpression node) {
+ if (CompletionEngine_this._isCompletionAfter(node.asOperator.end)) {
+ CompletionEngine_this._state._isDynamicAllowed = false;
+ CompletionEngine_this._state._isVoidAllowed = false;
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitAssertStatement(AssertStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitBlock(Block node) {
+ if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+ // { {! stmt; !} }
+ CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitBooleanLiteral(BooleanLiteral node) {
+ CompletionEngine_this._analyzeLiteralReference(node);
+ return null;
+ }
+
+ @override
+ Object visitBreakStatement(BreakStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitCatchClause(CatchClause node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.onKeyword)) {
+ CompletionEngine_this._pKeyword(node.onKeyword);
+ } else if (CompletionEngine_this._isCompletingKeyword(node.catchKeyword)) {
+ CompletionEngine_this._pKeyword(node.catchKeyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitClassDeclaration(ClassDeclaration node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.classKeyword)) {
+ CompletionEngine_this._pKeyword(node.classKeyword);
+ } else if (CompletionEngine_this._isCompletingKeyword(node.abstractKeyword)) {
+ CompletionEngine_this._pKeyword(node.abstractKeyword);
+ } else if (!node.leftBracket.isSynthetic) {
+ if (CompletionEngine_this._isCompletionAfter(node.leftBracket.end)) {
+ if (node.rightBracket.isSynthetic || CompletionEngine_this._isCompletionBefore(node.rightBracket.offset)) {
+ if (!CompletionEngine_this.hasErrorBeforeCompletionLocation) {
+ CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+ }
+ }
+ }
+ }
+ // TODO { abstract ! class ! A ! extends B implements C, D ! {}}
+ return null;
+ }
+
+ @override
+ Object visitClassTypeAlias(ClassTypeAlias node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ // TODO { typedef ! A ! = ! B ! with C, D !; }
+ return null;
+ }
+
+ @override
+ Object visitCombinator(Combinator node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitCompilationUnit(CompilationUnit node) => null;
+
+ @override
+ Object visitConstructorName(ConstructorName node) {
+ // { new A.!c(); }
+ TypeName typeName = node.type;
+ if (typeName != null) {
+ DartType type = typeName.type;
+ Element typeElement = type.element;
+ if (typeElement is ClassElement) {
+ ClassElement classElement = typeElement;
+ CompletionEngine_this._constructorReference(classElement, node.name);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitContinueStatement(ContinueStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitDirective(Directive node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitDoStatement(DoStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.doKeyword)) {
+ CompletionEngine_this._pKeyword(node.doKeyword);
+ } else if (CompletionEngine_this._isCompletingKeyword(node.whileKeyword)) {
+ CompletionEngine_this._pKeyword(node.whileKeyword);
+ } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+ CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitDoubleLiteral(DoubleLiteral node) => null;
+
+ @override
+ Object visitExportDirective(ExportDirective node) {
+ visitNamespaceDirective(node);
+ return null;
+ }
+
+ @override
+ Object visitExpression(Expression node) {
+ CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+ return null;
+ }
+
+ @override
+ Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+ if (node.expression != null && node.semicolon != null) {
+ if (CompletionEngine_this._isCompletionBetween(node.expression.end, node.semicolon.offset)) {
+ CompletionEngine_this._operatorAccess(node.expression, CompletionEngine_this._createIdent(node));
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitExpressionStatement(ExpressionStatement node) {
+ CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+ return null;
+ }
+
+ @override
+ Object visitExtendsClause(ExtendsClause node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ } else if (node.superclass == null) {
+ // { X extends ! }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ } else {
+ // { X extends ! Y }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitForEachStatement(ForEachStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
+ CompletionEngine_this._pKeyword(node.forKeyword);
+ } else if (CompletionEngine_this._isCompletingKeyword(node.inKeyword)) {
+ CompletionEngine_this._pKeyword(node.inKeyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitFormalParameterList(FormalParameterList node) {
+ if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
+ NodeList<FormalParameter> params = node.parameters;
+ if (!params.isEmpty) {
+ FormalParameter last = params[params.length - 1];
+ if (CompletionEngine_this._isCompletionBetween(last.end, node.rightParenthesis.offset)) {
+ List<FormalParameter> newParams = CompletionEngine_this._copyWithout(params, last);
+ CompletionEngine_this._analyzeNewParameterName(newParams, last.identifier, null);
+ } else {
+ Ident ident = CompletionEngine_this._createIdent(node);
+ CompletionEngine_this._analyzeTypeName(ident, ident);
+ }
+ } else {
+ Ident ident = CompletionEngine_this._createIdent(node);
+ CompletionEngine_this._analyzeTypeName(ident, ident);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitForStatement(ForStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
+ CompletionEngine_this._pKeyword(node.forKeyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitIfStatement(IfStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.ifKeyword)) {
+ CompletionEngine_this._pKeyword(node.ifKeyword);
+ } else if (CompletionEngine_this._isCompletingKeyword(node.elseKeyword)) {
+ CompletionEngine_this._pKeyword(node.elseKeyword);
+ } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+ CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitImplementsClause(ImplementsClause node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ } else if (node.interfaces.isEmpty) {
+ // { X implements ! }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ } else {
+ // { X implements ! Y }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitImportDirective(ImportDirective node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.asToken)) {
+ CompletionEngine_this._pKeyword(node.asToken);
+ } else {
+ visitNamespaceDirective(node);
+ }
+ return null;
+ }
+
+ @override
+ Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ Ident ident = new Ident.con3(node, node.keyword);
+ CompletionEngine_this._analyzeLocalName(ident);
+ } else {
+ Ident ident = CompletionEngine_this._createIdent(node);
+ CompletionEngine_this._analyzeConstructorTypeName(ident);
+ }
+ return null;
+ }
+
+ @override
+ Object visitIsExpression(IsExpression node) {
+ Ident ident;
+ Token isToken = node.isOperator;
+ int isTokenEnd = isToken.end;
+ if (isTokenEnd == CompletionEngine_this._completionLocation()) {
+ Expression expression = node.expression;
+ int offset = isToken.offset;
+ // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
+ if (expression is PrefixedIdentifier) {
+ PrefixedIdentifier prefIdent = expression;
+ if (prefIdent.identifier.isSynthetic) {
+ CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
+ } else {
+ CompletionEngine_this._pKeyword(isToken);
+ }
+ return null;
+ }
+ // { expr is! }
+ if (!CompletionEngine._isSyntheticIdentifier(expression)) {
+ CompletionEngine_this._pKeyword(node.isOperator);
+ return null;
+ }
+ // { is! } possible name completion
+ ident = new Ident.con2(node, "is", offset);
+ } else if (CompletionEngine_this._isCompletionAfter(isTokenEnd)) {
+ CompletionEngine_this._state._isDynamicAllowed = false;
+ CompletionEngine_this._state._isVoidAllowed = false;
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+ return null;
+ } else {
+ ident = CompletionEngine_this._createIdent(node);
+ }
+ CompletionEngine_this._analyzeLocalName(ident);
+ return null;
+ }
+
+ @override
+ Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+ @override
+ Object visitMethodInvocation(MethodInvocation node) {
+ Token period = node.period;
+ if (period != null && CompletionEngine_this._isCompletionAfter(period.end)) {
+ // { x.!y() }
+ CompletionEngine_this._dispatchPrefixAnalysis2(node);
+ }
+ return null;
+ }
+
+ @override
+ Object visitNamespaceDirective(NamespaceDirective node) {
+ StringLiteral uri = node.uri;
+ if (uri != null && uri.isSynthetic && node.keyword.end <= CompletionEngine_this._context.selectionOffset) {
+ uri.accept(this);
+ }
+ return super.visitNamespaceDirective(node);
+ }
+
+ @override
+ Object visitPartOfDirective(PartOfDirective node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.ofToken)) {
+ CompletionEngine_this._pKeyword(node.ofToken);
+ } else {
+ visitDirective(node);
+ }
+ return null;
+ }
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+ if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
+ if (CompletionEngine_this._isCompletionBefore(node.identifier.offset)) {
+ // { x.! } or { x.! y } Note missing/implied semicolon before y; this looks like an
+ // obscure case but it occurs frequently when editing existing code.
+ CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitPropertyAccess(PropertyAccess node) {
+ if (node.target != null && node.target.length == 0) {
+ return null;
+ }
+ Expression target = node.realTarget;
+ // The "1 + str.!.length" is parsed as "(1 + str).!.length",
+ // but actually user wants "1 + (str.!).length".
+ // So, if completion inside of period-period ".!." then it is not really a cascade completion.
+ Token operator = node.operator;
+ if (operator.type == TokenType.PERIOD_PERIOD) {
+ int completionLocation = CompletionEngine_this._completionLocation();
+ if (completionLocation > operator.offset && completionLocation < operator.end) {
+ while (target is BinaryExpression) {
+ target = (target as BinaryExpression).rightOperand;
+ }
+ }
+ }
+ // do prefixed completion
+ CompletionEngine_this._analyzePrefixedAccess(target, node.propertyName);
+ return null;
+ }
+
+ @override
+ Object visitReturnStatement(ReturnStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ return null;
+ }
+ Expression expression = node.expression;
+ // return !
+ if (expression is SimpleIdentifier) {
+ SimpleIdentifier identifier = expression;
+ CompletionEngine_this._analyzeLocalName(identifier);
+ return null;
+ }
+ // return expression ! ;
+ Token semicolon = node.semicolon;
+ if (expression != null && semicolon != null && CompletionEngine_this._isCompletionBetween(expression.end, semicolon.offset)) {
+ CompletionEngine_this._operatorAccess(expression, CompletionEngine_this._createIdent(node));
+ return null;
+ }
+ return null;
+ }
+
+ @override
+ Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+ if (node.keyword != null && CompletionEngine_this._isCompletionBefore(node.keyword.end)) {
+ // f() { g(var! z) }
+ Token token = node.keyword;
+ Ident ident = new Ident.con3(node, token);
+ CompletionEngine_this._analyzeTypeName(ident, ident);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSimpleIdentifier(SimpleIdentifier node) {
+ AstNode parent = node.parent;
+ if (parent != null) {
+ CompletionEngine_IdentifierCompleter visitor = new CompletionEngine_IdentifierCompleter(CompletionEngine_this, node);
+ return parent.accept(visitor);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+ AstNode parent = node.parent;
+ if (parent is Directive) {
+ CompletionEngine_StringCompleter visitor = new CompletionEngine_StringCompleter(CompletionEngine_this, node);
+ return parent.accept(visitor);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+ CompletionEngine_this._analyzeSuperConstructorInvocation(node);
+ return null;
+ }
+
+ @override
+ Object visitSwitchMember(SwitchMember node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSwitchStatement(SwitchStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTryStatement(TryStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.tryKeyword)) {
+ CompletionEngine_this._pKeyword(node.tryKeyword);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeArgumentList(TypeArgumentList node) {
+ if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeParameter(TypeParameter node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ } else if (node.name.name.isEmpty && CompletionEngine_this._isCompletionBefore(node.keyword.offset)) {
+ // { < ! extends X> }
+ CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
+ }
+ // { <! X ! extends ! Y !> }
+ return null;
+ }
+
+ @override
+ Object visitTypeParameterList(TypeParameterList node) {
+ // { <X extends A,! B,! > }
+ if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclaration(VariableDeclaration node) {
+ if (CompletionEngine_this._isCompletionAfter(node.equals.end)) {
+ // { var x =! ...}
+ CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclarationList(VariableDeclarationList node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ CompletionEngine_this._analyzeTypeName(new Ident.con3(node, node.keyword), null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitWhileStatement(WhileStatement node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
+ CompletionEngine_this._pKeyword(node.keyword);
+ } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
+ CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitWithClause(WithClause node) {
+ if (CompletionEngine_this._isCompletingKeyword(node.withKeyword)) {
+ CompletionEngine_this._pKeyword(node.withKeyword);
+ } else if (node.mixinTypes.isEmpty) {
+ // { X with ! }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ } else {
+ // { X with ! Y }
+ CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+}
+
+/**
+ * A TypeNameCompleter is used to classify the parent of a SimpleIdentifier after it has been
+ * identified as a TypeName by the IdentifierCompleter.
+ */
+class CompletionEngine_TypeNameCompleter extends CompletionEngine_AstNodeClassifier {
+ final CompletionEngine CompletionEngine_this;
+
+ final SimpleIdentifier _identifier;
+
+ final TypeName _typeName;
+
+ CompletionEngine_TypeNameCompleter(this.CompletionEngine_this, this._identifier, this._typeName);
+
+ @override
+ Object visitAsExpression(AsExpression node) {
+ if (identical(node.type, _typeName)) {
+ CompletionEngine_this._state._isDynamicAllowed = false;
+ CompletionEngine_this._state._isVoidAllowed = false;
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitCatchClause(CatchClause node) {
+ if (identical(node.exceptionType, _typeName)) {
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitClassTypeAlias(ClassTypeAlias node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ return null;
+ }
+
+ @override
+ Object visitConstructorName(ConstructorName node) {
+ if (identical(_typeName, node.type)) {
+ if (node.period != null) {
+ if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
+ // Is this branch reachable? Probably only in IdentifierCompleter.
+ "".toString();
+ } else {
+ // { new Cla!ss.cons() }
+ Element element = _identifier.bestElement;
+ if (element is ClassElement) {
+ CompletionEngine_this._namedConstructorReference(element, _identifier);
+ }
+ }
+ } else {
+ // { new ! } { new Na!me(); } { new js!on. }
+ CompletionEngine_this._analyzeConstructorTypeName(_identifier);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitExtendsClause(ExtendsClause node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ return null;
+ }
+
+ @override
+ Object visitImplementsClause(ImplementsClause node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ return null;
+ }
+
+ @override
+ Object visitIsExpression(IsExpression node) {
+ if (identical(_typeName, node.type)) {
+ Token isToken = node.isOperator;
+ if (CompletionEngine_this._completionLocation() == isToken.end) {
+ Expression expression = node.expression;
+ int offset = isToken.offset;
+ // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
+ if (expression is PrefixedIdentifier) {
+ PrefixedIdentifier prefIdent = expression;
+ if (prefIdent.identifier.isSynthetic) {
+ CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
+ } else {
+ CompletionEngine_this._pKeyword(node.isOperator);
+ }
+ return null;
+ }
+ // { expr is! }
+ if (!CompletionEngine._isSyntheticIdentifier(expression)) {
+ CompletionEngine_this._pKeyword(node.isOperator);
+ return null;
+ }
+ // { is! } possible name completion
+ CompletionEngine_this._analyzeLocalName(new Ident.con2(node, "is", offset));
+ } else {
+ CompletionEngine_this._analyzeTypeName(node.type.name as SimpleIdentifier, null);
+ }
+ }
+ return null;
+ }
+
+ @override
+ Object visitMethodDeclaration(MethodDeclaration node) {
+ if (identical(node.returnType, _typeName)) {
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ return null;
+ }
+
+ @override
+ Object visitTypeArgumentList(TypeArgumentList node) {
+ if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeParameter(TypeParameter node) {
+ if (identical(node.bound, _typeName)) {
+ // { X<A extends !Y> }
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ }
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclarationList(VariableDeclarationList node) {
+ if (node.parent is Statement) {
+ CompletionEngine_this._analyzeLocalName(_identifier);
+ } else {
+ CompletionEngine_this._analyzeTypeName(_identifier, null);
+ }
+ return null;
+ }
+
+ @override
+ Object visitWithClause(WithClause node) {
+ CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
+ return null;
+ }
+}
+
+/**
+ * The factory class used to create completion proposals.
+ */
+class CompletionFactory {
+ /**
+ * Create a completion proposal of the given kind.
+ */
+ CompletionProposal createCompletionProposal(ProposalKind kind, int insertionPoint) {
+ CompletionProposalImpl prop = new CompletionProposalImpl();
+ prop.setKind(kind);
+ prop.setLocation(insertionPoint);
+ return prop;
+ }
+}
+
+abstract class CompletionProposal {
+ static final int RELEVANCE_LOW = 0;
+
+ static final int RELEVANCE_DEFAULT = 10;
+
+ static final int RELEVANCE_HIGH = 20;
+
+ /**
+ * This character is used to specify location of the cursor after completion.
+ */
+ static final int CURSOR_MARKER = 0x2758;
+
+ void applyPartitionOffset(int partitionOffset);
+
+ String get completion;
+
+ String get declaringType;
+
+ Element get element;
+
+ ProposalKind get kind;
+
+ int get location;
+
+ String get parameterName;
+
+ List<String> get parameterNames;
+
+ String get parameterType;
+
+ List<String> get parameterTypes;
+
+ int get positionalParameterCount;
+
+ int get relevance;
+
+ int get replacementLength;
+
+ int get replacementLengthIdentifier;
+
+ String get returnType;
+
+ bool get hasNamed;
+
+ bool get hasPositional;
+
+ CompletionProposal incRelevance();
+
+ bool get isDeprecated;
+
+ bool get isPotentialMatch;
+
+ CompletionProposal setCompletion(String x);
+
+ CompletionProposal setDeclaringType(String name);
+
+ CompletionProposal setDeprecated(bool deprecated);
+
+ CompletionProposal setElement(Element element);
+
+ CompletionProposal setKind(ProposalKind x);
+
+ CompletionProposal setLocation(int x);
+
+ CompletionProposal setParameterName(String paramName);
+
+ CompletionProposal setParameterNames(List<String> paramNames);
+
+ CompletionProposal setParameterStyle(int count, bool named, bool positional);
+
+ CompletionProposal setParameterType(String paramType);
+
+ CompletionProposal setParameterTypes(List<String> paramTypes);
+
+ CompletionProposal setPotentialMatch(bool isPotentialMatch);
+
+ CompletionProposal setRelevance(int n);
+
+ CompletionProposal setReplacementLength(int x);
+
+ CompletionProposal setReplacementLengthIdentifier(int x);
+
+ CompletionProposal setReturnType(String name);
+}
+
+class CompletionProposalImpl implements CompletionProposal {
+ Element _element;
+
+ String _completion = "";
+
+ String _returnType = "";
+
+ String _declaringType = "";
+
+ List<String> _parameterNames = StringUtilities.EMPTY_ARRAY;
+
+ List<String> _parameterTypes = StringUtilities.EMPTY_ARRAY;
+
+ String _parameterName;
+
+ String _parameterType;
+
+ ProposalKind _kind = ProposalKind.NONE;
+
+ int _location = 0;
+
+ int _replacementLength = 0;
+
+ int _replacementLength2 = 0;
+
+ int _positionalParameterCount = 0;
+
+ bool _named = false;
+
+ bool _positional = false;
+
+ bool _deprecated = false;
+
+ bool _potential = false;
+
+ int _relevance = CompletionProposal.RELEVANCE_DEFAULT;
+
+ @override
+ void applyPartitionOffset(int partitionOffset) {
+ _location += partitionOffset;
+ }
+
+ @override
+ String get completion => _completion;
+
+ @override
+ String get declaringType => _declaringType;
+
+ @override
+ Element get element => _element;
+
+ @override
+ ProposalKind get kind => _kind;
+
+ @override
+ int get location => _location;
+
+ @override
+ String get parameterName => _parameterName;
+
+ @override
+ List<String> get parameterNames => _parameterNames;
+
+ @override
+ String get parameterType => _parameterType;
+
+ @override
+ List<String> get parameterTypes => _parameterTypes;
+
+ @override
+ int get positionalParameterCount => _positionalParameterCount;
+
+ @override
+ int get relevance => _relevance;
+
+ @override
+ int get replacementLength => _replacementLength;
+
+ @override
+ int get replacementLengthIdentifier => _replacementLength2;
+
+ @override
+ String get returnType => _returnType;
+
+ @override
+ bool get hasNamed => _named;
+
+ @override
+ bool get hasPositional => _positional;
+
+ @override
+ CompletionProposal incRelevance() {
+ _relevance++;
+ return this;
+ }
+
+ @override
+ bool get isDeprecated => _deprecated;
+
+ @override
+ bool get isPotentialMatch => _potential;
+
+ @override
+ CompletionProposal setCompletion(String x) {
+ _completion = x;
+ if (_replacementLength == 0) {
+ setReplacementLength(x.length);
+ }
+ return this;
+ }
+
+ @override
+ CompletionProposal setDeclaringType(String name) {
+ _declaringType = name;
+ return this;
+ }
+
+ @override
+ CompletionProposal setDeprecated(bool deprecated) {
+ this._deprecated = deprecated;
+ return this;
+ }
+
+ @override
+ CompletionProposal setElement(Element element) {
+ this._element = element;
+ return this;
+ }
+
+ @override
+ CompletionProposal setKind(ProposalKind x) {
+ _kind = x;
+ return this;
+ }
+
+ @override
+ CompletionProposal setLocation(int x) {
+ _location = x;
+ return this;
+ }
+
+ @override
+ CompletionProposal setParameterName(String parameterName) {
+ this._parameterName = parameterName;
+ return this;
+ }
+
+ @override
+ CompletionProposal setParameterNames(List<String> paramNames) {
+ _parameterNames = paramNames;
+ return this;
+ }
+
+ @override
+ CompletionProposal setParameterStyle(int count, bool named, bool positional) {
+ this._named = named;
+ this._positional = positional;
+ this._positionalParameterCount = count;
+ return this;
+ }
+
+ @override
+ CompletionProposal setParameterType(String parameterType) {
+ this._parameterType = parameterType;
+ return this;
+ }
+
+ @override
+ CompletionProposal setParameterTypes(List<String> paramTypes) {
+ _parameterTypes = paramTypes;
+ return this;
+ }
+
+ @override
+ CompletionProposal setPotentialMatch(bool isPotentialMatch) {
+ _potential = isPotentialMatch;
+ return this;
+ }
+
+ @override
+ CompletionProposal setRelevance(int n) {
+ _relevance = n;
+ return this;
+ }
+
+ @override
+ CompletionProposal setReplacementLength(int x) {
+ _replacementLength = x;
+ return this;
+ }
+
+ @override
+ CompletionProposal setReplacementLengthIdentifier(int x) {
+ _replacementLength2 = x;
+ return this;
+ }
+
+ @override
+ CompletionProposal setReturnType(String name) {
+ _returnType = name;
+ return this;
+ }
+}
+
+/**
+ * A pathway for reporting completion proposals back to the client.
+ */
+abstract class CompletionRequestor {
+ /**
+ * Record the given completion proposal for eventual presentation to the user.
+ */
+ accept(CompletionProposal proposal);
+
+ void beginReporting();
+
+ void endReporting();
+}
+
+/**
+ */
+class CompletionState {
+ bool _isForMixin = false;
+
+ bool _isVoidAllowed = false;
+
+ bool _isDynamicAllowed = false;
+
+ bool _isSourceDeclarationStatic = false;
+
+ bool _isThisAllowed = true;
+
+ bool _isVarAllowed = false;
+
+ bool _areLiteralsAllowed = false;
+
+ bool _areLiteralsProhibited = false;
+
+ bool _areOperatorsAllowed = false;
+
+ bool _areStaticReferencesProhibited = false;
+
+ bool _areInstanceReferencesProhibited = false;
+
+ bool _areUndefinedTypesProhibited = false;
+
+ bool _isCompileTimeConstantRequired = false;
+
+ bool _isOptionalArgumentRequired = false;
+
+ bool _areMethodsProhibited = false;
+
+ bool _areClassesRequired = false;
+
+ ParameterElement _targetParameter;
+
+ void mustBeInstantiableType() {
+ _areClassesRequired = true;
+ _prohibitsLiterals();
+ }
+
+ void _includesLiterals() {
+ if (!_areLiteralsProhibited) {
+ _areLiteralsAllowed = true;
+ }
+ }
+
+ void _includesOperators() {
+ _areOperatorsAllowed = true;
+ }
+
+ void _includesUndefinedDeclarationTypes() {
+ if (!_areUndefinedTypesProhibited) {
+ _isVoidAllowed = true;
+ _isDynamicAllowed = true;
+ }
+ }
+
+ void _includesUndefinedTypes() {
+ _isVarAllowed = true;
+ _isDynamicAllowed = true;
+ }
+
+ void _mustBeMixin() {
+ _isForMixin = true;
+ }
+
+ void _prohibitsInstanceReferences() {
+ _areInstanceReferencesProhibited = true;
+ }
+
+ void _prohibitsLiterals() {
+ _areLiteralsAllowed = false;
+ _areLiteralsProhibited = true;
+ }
+
+ void _prohibitsStaticReferences() {
+ _areStaticReferencesProhibited = true;
+ }
+
+ void _prohibitThis() {
+ _isThisAllowed = false;
+ }
+
+ void _prohibitsUndefinedTypes() {
+ _areUndefinedTypesProhibited = true;
+ }
+
+ void _requiresConst(bool isConst) {
+ _isCompileTimeConstantRequired = isConst;
+ }
+
+ void _requiresOperators() {
+ _includesOperators();
+ _areMethodsProhibited = true;
+ }
+
+ void _requiresOptionalArgument() {
+ _isOptionalArgumentRequired = true;
+ _prohibitsLiterals();
+ }
+
+ void set context(AstNode base) {
+ base.accept(new ContextAnalyzer(this, base));
+ }
+
+ void _sourceDeclarationIsStatic(bool state) {
+ _isSourceDeclarationStatic = state;
+ if (state) {
+ if (!_areStaticReferencesProhibited) {
+ _prohibitsInstanceReferences();
+ }
+ }
+ }
+}
+
+/**
+ */
+class ContextAnalyzer extends GeneralizingAstVisitor<Object> {
+ final CompletionState _state;
+
+ final AstNode _completionNode;
+
+ AstNode _child;
+
+ bool _inExpression = false;
+
+ bool _inIdentifier = false;
+
+ bool _inTypeName = false;
+
+ bool _maybeInvocationArgument = true;
+
+ ContextAnalyzer(this._state, this._completionNode);
+
+ @override
+ Object visitAnnotation(Annotation node) {
+ _state._requiresConst(true);
+ return super.visitAnnotation(node);
+ }
+
+ @override
+ Object visitCatchClause(CatchClause node) {
+ if (identical(node.exceptionType, _child)) {
+ _state._prohibitsLiterals();
+ }
+ return null;
+ }
+
+ @override
+ Object visitCompilationUnitMember(CompilationUnitMember node) {
+ if (node is! ClassDeclaration) {
+ _state._prohibitThis();
+ }
+ return super.visitCompilationUnitMember(node);
+ }
+
+ @override
+ Object visitConstructorInitializer(ConstructorInitializer node) {
+ _state._prohibitThis();
+ return super.visitConstructorInitializer(node);
+ }
+
+ @override
+ Object visitDirective(Directive node) {
+ _state._prohibitsLiterals();
+ return super.visitDirective(node);
+ }
+
+ @override
+ Object visitDoStatement(DoStatement node) {
+ if (identical(_child, node.condition)) {
+ _state._includesLiterals();
+ }
+ return super.visitDoStatement(node);
+ }
+
+ @override
+ Object visitExpression(Expression node) {
+ _inExpression = true;
+ _state._includesLiterals();
+ _mayBeSetParameterElement(node);
+ return super.visitExpression(node);
+ }
+
+ @override
+ Object visitFieldDeclaration(FieldDeclaration node) {
+ _state._prohibitThis();
+ return super.visitFieldDeclaration(node);
+ }
+
+ @override
+ Object visitForEachStatement(ForEachStatement node) {
+ if (identical(_child, node.iterator)) {
+ _state._includesLiterals();
+ }
+ return super.visitForEachStatement(node);
+ }
+
+ @override
+ Object visitFunctionExpression(FunctionExpression node) {
+ if (node.parent is Declaration) {
+ // Function expressions that are part of a declaration are not to be treated as expressions.
+ return visitNode(node);
+ } else {
+ return visitExpression(node);
+ }
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ if (_inTypeName || node.returnType == null) {
+ // This may be an incomplete class type alias
+ _state._includesUndefinedDeclarationTypes();
+ }
+ return super.visitFunctionTypeAlias(node);
+ }
+
+ @override
+ Object visitIdentifier(Identifier node) {
+ _mayBeSetParameterElement(node);
+ // Identifiers cannot safely be generalized to expressions, so just walk up one level.
+ // LibraryIdentifier is never an expression. PrefixedIdentifier may be an expression, but
+ // not in a catch-clause or a declaration. SimpleIdentifier may be an expression, but not
+ // in a constructor name, label, or where PrefixedIdentifier is not.
+ return visitNode(node);
+ }
+
+ @override
+ Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+ _state._requiresConst(node.isConst);
+ if (identical(_completionNode.parent.parent, _child)) {
+ _state.mustBeInstantiableType();
+ }
+ return super.visitInstanceCreationExpression(node);
+ }
+
+ @override
+ Object visitMethodDeclaration(MethodDeclaration node) {
+ _state._sourceDeclarationIsStatic(node.isStatic);
+ if (identical(_child, node.returnType)) {
+ _state._includesUndefinedDeclarationTypes();
+ }
+ if (node.isStatic) {
+ _state._prohibitThis();
+ }
+ return super.visitMethodDeclaration(node);
+ }
+
+ @override
+ Object visitNode(AstNode node) {
+ // Walk UP the tree, not down.
+ AstNode parent = node.parent;
+ _updateIfShouldGetTargetParameter(node, parent);
+ if (parent != null) {
+ _child = node;
+ parent.accept(this);
+ }
+ return null;
+ }
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+ if (identical(node, _completionNode) || identical(node.identifier, _completionNode)) {
+ SimpleIdentifier prefix = node.prefix;
+ if (_isClassLiteral(prefix)) {
+ _state._prohibitsInstanceReferences();
+ } else {
+ _state._prohibitsStaticReferences();
+ }
+ }
+ return super.visitPrefixedIdentifier(node);
+ }
+
+ @override
+ Object visitPropertyAccess(PropertyAccess node) {
+ if (identical(node, _completionNode) || identical(node.propertyName, _completionNode)) {
+ Expression target = node.realTarget;
+ if (_isClassLiteral(target)) {
+ _state._prohibitsInstanceReferences();
+ } else {
+ _state._prohibitsStaticReferences();
+ }
+ }
+ return super.visitPropertyAccess(node);
+ }
+
+ @override
+ Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+ _state._includesUndefinedTypes();
+ return super.visitSimpleFormalParameter(node);
+ }
+
+ @override
+ Object visitSimpleIdentifier(SimpleIdentifier node) {
+ _inIdentifier = true;
+ return super.visitSimpleIdentifier(node);
+ }
+
+ @override
+ Object visitSwitchStatement(SwitchStatement node) {
+ if (identical(_child, node.expression)) {
+ _state._includesLiterals();
+ }
+ return super.visitSwitchStatement(node);
+ }
+
+ @override
+ Object visitTypeArgumentList(TypeArgumentList node) {
+ _state._prohibitsUndefinedTypes();
+ return super.visitTypeArgumentList(node);
+ }
+
+ @override
+ Object visitTypeName(TypeName node) {
+ _inTypeName = true;
+ return super.visitTypeName(node);
+ }
+
+ @override
+ Object visitVariableDeclaration(VariableDeclaration node) {
+ if (identical(node.name, _completionNode)) {
+ _state._prohibitsLiterals();
+ }
+ return super.visitVariableDeclaration(node);
+ }
+
+ @override
+ Object visitVariableDeclarationList(VariableDeclarationList node) {
+ _state._includesUndefinedDeclarationTypes();
+ return super.visitVariableDeclarationList(node);
+ }
+
+ @override
+ Object visitWhileStatement(WhileStatement node) {
+ if (identical(_child, node.condition)) {
+ _state._includesLiterals();
+ }
+ return super.visitWhileStatement(node);
+ }
+
+ @override
+ Object visitWithClause(WithClause node) {
+ _state._mustBeMixin();
+ return super.visitWithClause(node);
+ }
+
+ bool _isClassLiteral(Expression expression) => expression is Identifier && expression.staticElement is ClassElement;
+
+ void _mayBeSetParameterElement(Expression node) {
+ if (!_maybeInvocationArgument) {
+ return;
+ }
+ if (node.parent is ArgumentList) {
+ if (_state._targetParameter == null) {
+ _state._targetParameter = node.bestParameterElement;
+ }
+ }
+ }
+
+ void _updateIfShouldGetTargetParameter(AstNode node, AstNode parent) {
+ if (!_maybeInvocationArgument) {
+ return;
+ }
+ // prefix.node
+ if (parent is PrefixedIdentifier) {
+ if (identical(parent.identifier, node)) {
+ return;
+ }
+ }
+ // something unknown
+ _maybeInvocationArgument = false;
+ }
+}
+
+class Filter {
+ String _prefix;
+
+ String _originalPrefix;
+
+ RegExp _pattern;
+
+ Filter.con1(SimpleIdentifier ident, int loc) : this.con2(ident.name, ident.offset, loc);
+
+ Filter.con2(String name, int pos, int loc) {
+ int len = loc - pos;
+ if (len > 0) {
+ if (len <= name.length) {
+ _prefix = name.substring(0, len);
+ } else {
+ _prefix = name;
+ }
+ } else {
+ _prefix = "";
+ }
+ _originalPrefix = _prefix;
+ _prefix = _prefix.toLowerCase();
+ }
+
+ /**
+ * @return `true` if the given name starts with the same prefix as used for filter.
+ */
+ bool _isSameCasePrefix(String name) => name.startsWith(_originalPrefix);
+
+ String _makePattern() {
+ // TODO(scheglov) translate it
+ return null;
+ }
+
+ bool _match(Element elem) => _match2(elem.displayName);
+
+ bool _match2(String name) {
+ // Return true if the filter passes.
+ if (name.toLowerCase().startsWith(_prefix)) {
+ return true;
+ }
+ return _matchPattern(name);
+ }
+
+ void _removeNotMatching(List<Element> elements) {
+ for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
+ Element element = I.next();
+ if (!_match(element)) {
+ I.remove();
+ }
+ }
+ }
+
+ bool _matchPattern(String name) {
+ // TODO(scheglov) translate it
+ return false;
+ }
+}
+
+class GeneralizingAstVisitor_CompletionEngine_copyWithout extends GeneralizingAstVisitor<Object> {
+ AstNode deletion;
+
+ List<FormalParameter> newList;
+
+ GeneralizingAstVisitor_CompletionEngine_copyWithout(this.deletion, this.newList) : super();
+
+ @override
+ Object visitNode(AstNode node) {
+ if (!identical(node, deletion)) {
+ newList.add(node as FormalParameter);
+ }
+ return null;
+ }
+}
+
+/**
+ * An [Ident] is a wrapper for a String that provides type equivalence with SimpleIdentifier.
+ */
+class Ident extends EphemeralIdentifier {
+ String _name;
+
+ Ident.con1(AstNode parent, int offset) : super(parent, offset);
+
+ Ident.con2(AstNode parent, String name, int offset) : super(parent, offset) {
+ this._name = name;
+ }
+
+ Ident.con3(AstNode parent, Token name) : super(parent, name.offset) {
+ this._name = name.lexeme;
+ }
+
+ @override
+ String get name {
+ if (_name != null) {
+ return _name;
+ }
+ String n = super.name;
+ if (n != null) {
+ return n;
+ }
+ return "";
+ }
+}
+
+class ProposalCollector implements CompletionRequestor {
+ final CompletionRequestor requestor;
+
+ List<CompletionProposal> _proposals;
+
+ ProposalCollector(this.requestor) {
+ this._proposals = new List<CompletionProposal>();
+ }
+
+ @override
+ accept(CompletionProposal proposal) {
+ _proposals.add(proposal);
+ }
+
+ @override
+ void beginReporting() {
+ requestor.beginReporting();
+ }
+
+ @override
+ void endReporting() {
+ requestor.endReporting();
+ }
+
+ List<CompletionProposal> get proposals => _proposals;
+}
+
+/**
+ * The various kinds of completion proposals. Each specifies the kind of completion to be created,
+ * corresponding to different syntactical elements.
+ */
+class ProposalKind extends Enum<ProposalKind> {
+ static const ProposalKind NONE = const ProposalKind('NONE', 0);
+
+ static const ProposalKind CLASS = const ProposalKind('CLASS', 1);
+
+ static const ProposalKind CLASS_ALIAS = const ProposalKind('CLASS_ALIAS', 2);
+
+ static const ProposalKind CONSTRUCTOR = const ProposalKind('CONSTRUCTOR', 3);
+
+ static const ProposalKind FIELD = const ProposalKind('FIELD', 4);
+
+ static const ProposalKind FUNCTION = const ProposalKind('FUNCTION', 5);
+
+ static const ProposalKind FUNCTION_ALIAS = const ProposalKind('FUNCTION_ALIAS', 6);
+
+ static const ProposalKind GETTER = const ProposalKind('GETTER', 7);
+
+ static const ProposalKind IMPORT = const ProposalKind('IMPORT', 8);
+
+ static const ProposalKind LIBRARY_PREFIX = const ProposalKind('LIBRARY_PREFIX', 9);
+
+ static const ProposalKind METHOD = const ProposalKind('METHOD', 10);
+
+ static const ProposalKind METHOD_NAME = const ProposalKind('METHOD_NAME', 11);
+
+ static const ProposalKind PARAMETER = const ProposalKind('PARAMETER', 12);
+
+ static const ProposalKind SETTER = const ProposalKind('SETTER', 13);
+
+ static const ProposalKind VARIABLE = const ProposalKind('VARIABLE', 14);
+
+ static const ProposalKind TYPE_PARAMETER = const ProposalKind('TYPE_PARAMETER', 15);
+
+ static const ProposalKind ARGUMENT_LIST = const ProposalKind('ARGUMENT_LIST', 16);
+
+ static const ProposalKind OPTIONAL_ARGUMENT = const ProposalKind('OPTIONAL_ARGUMENT', 17);
+
+ static const ProposalKind NAMED_ARGUMENT = const ProposalKind('NAMED_ARGUMENT', 18);
+
+ static const List<ProposalKind> values = const [
+ NONE,
+ CLASS,
+ CLASS_ALIAS,
+ CONSTRUCTOR,
+ FIELD,
+ FUNCTION,
+ FUNCTION_ALIAS,
+ GETTER,
+ IMPORT,
+ LIBRARY_PREFIX,
+ METHOD,
+ METHOD_NAME,
+ PARAMETER,
+ SETTER,
+ VARIABLE,
+ TYPE_PARAMETER,
+ ARGUMENT_LIST,
+ OPTIONAL_ARGUMENT,
+ NAMED_ARGUMENT];
+
+ const ProposalKind(String name, int ordinal) : super(name, ordinal);
+}
+
+class SearchFilter_CompletionEngine_allSubtypes implements SearchFilter {
+ ClassElement classElement;
+
+ SearchFilter_CompletionEngine_allSubtypes(this.classElement);
+
+ @override
+ bool passes(SearchMatch match) {
+ Element element = match.element;
+ if (element is ClassElement) {
+ ClassElement clElem = element;
+ while (clElem != null) {
+ InterfaceType ifType = clElem.supertype;
+ if (ifType == null) {
+ return false;
+ }
+ clElem = ifType.element;
+ if (identical(clElem, classElement)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
+
+class TopLevelNamesKind extends Enum<TopLevelNamesKind> {
+ static const TopLevelNamesKind DECLARED_AND_IMPORTS = const TopLevelNamesKind('DECLARED_AND_IMPORTS', 0);
+
+ static const TopLevelNamesKind DECLARED_AND_EXPORTS = const TopLevelNamesKind('DECLARED_AND_EXPORTS', 1);
+
+ static const List<TopLevelNamesKind> values = const [DECLARED_AND_IMPORTS, DECLARED_AND_EXPORTS];
+
+ const TopLevelNamesKind(String name, int ordinal) : super(name, ordinal);
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/proposal.dart b/pkg/analysis_services/lib/src/generated/proposal.dart
index ef3d9d8..4e7f842 100644
--- a/pkg/analysis_services/lib/src/generated/proposal.dart
+++ b/pkg/analysis_services/lib/src/generated/proposal.dart
@@ -228,6 +228,11 @@
* Proposal for some change.
*/
class CorrectionProposal {
+ /**
+ * An empty array of [CorrectionProposal]s.
+ */
+ static List<CorrectionProposal> EMPTY_ARRAY = new List<CorrectionProposal>(0);
+
final CorrectionKind kind;
String _name;
diff --git a/pkg/analysis_services/lib/src/generated/stubs.dart b/pkg/analysis_services/lib/src/generated/stubs.dart
index c991206..7293cad 100644
--- a/pkg/analysis_services/lib/src/generated/stubs.dart
+++ b/pkg/analysis_services/lib/src/generated/stubs.dart
@@ -12,6 +12,11 @@
import 'package:analyzer/src/generated/scanner.dart';
import 'package:analyzer/src/generated/source.dart';
+
+abstract class SearchFilter {
+ bool passes(SearchMatch match);
+}
+
class SearchMatch {
final Element element = null;
final SourceRange sourceRange = null;
diff --git a/pkg/analysis_services/lib/src/generated/util.dart b/pkg/analysis_services/lib/src/generated/util.dart
index 49c5394..fdfb01b 100644
--- a/pkg/analysis_services/lib/src/generated/util.dart
+++ b/pkg/analysis_services/lib/src/generated/util.dart
@@ -1256,7 +1256,7 @@
*/
int getLineNext(int index) {
int length = _buffer.length;
- // skip whitespace characters
+ // skip to the end of the line
while (index < length) {
int c = _buffer.codeUnitAt(index);
if (c == 0xD || c == 0xA) {
@@ -1444,7 +1444,7 @@
if (expression == null) {
return null;
}
- DartType type = expression.staticType;
+ DartType type = expression.bestType;
String typeSource = getTypeSource2(type);
if ("dynamic" == typeSource) {
return null;
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index 5321e84..960ff75 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -6,6 +6,6 @@
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
- analyzer: 0.14.2
+ analyzer: 0.15.1
dev_dependencies:
unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 4459077..90db683 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -378,69 +378,6 @@
}
/**
- * Instances of the class `ArgumentDefinitionTest` represent an argument definition test.
- *
- * <pre>
- * argumentDefinitionTest ::=
- * '?' [SimpleIdentifier]
- * </pre>
- */
-class ArgumentDefinitionTest extends Expression {
- /**
- * The token representing the question mark.
- */
- Token question;
-
- /**
- * The identifier representing the argument being tested.
- */
- SimpleIdentifier _identifier;
-
- /**
- * Initialize a newly created argument definition test.
- *
- * @param question the token representing the question mark
- * @param identifier the identifier representing the argument being tested
- */
- ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
- this._identifier = becomeParentOf(identifier);
- }
-
- @override
- accept(AstVisitor visitor) => visitor.visitArgumentDefinitionTest(this);
-
- @override
- Token get beginToken => question;
-
- @override
- Token get endToken => _identifier.endToken;
-
- /**
- * Return the identifier representing the argument being tested.
- *
- * @return the identifier representing the argument being tested
- */
- SimpleIdentifier get identifier => _identifier;
-
- @override
- int get precedence => 15;
-
- /**
- * Set the identifier representing the argument being tested to the given identifier.
- *
- * @param identifier the identifier representing the argument being tested
- */
- void set identifier(SimpleIdentifier identifier) {
- this._identifier = becomeParentOf(identifier);
- }
-
- @override
- void visitChildren(AstVisitor visitor) {
- safelyVisitChild(_identifier, visitor);
- }
-}
-
-/**
* Instances of the class `ArgumentList` represent a list of arguments in the invocation of a
* executable element: a function, method, or constructor.
*
@@ -1019,9 +956,6 @@
Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
@override
- ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, _cloneNode(node.identifier));
-
- @override
ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
@override
@@ -1417,12 +1351,6 @@
}
@override
- bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
- return _isEqualTokens(node.question, other.question) && _isEqualNodes(node.identifier, other.identifier);
- }
-
- @override
bool visitArgumentList(ArgumentList node) {
ArgumentList other = this._other as ArgumentList;
return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
@@ -2353,8 +2281,6 @@
R visitAnnotation(Annotation node);
- R visitArgumentDefinitionTest(ArgumentDefinitionTest node);
-
R visitArgumentList(ArgumentList node);
R visitAsExpression(AsExpression node);
@@ -5489,6 +5415,37 @@
}
/**
+ * This recursive Ast visitor is used to run over [Expression]s to determine if the expression
+ * is composed by at least one deferred [PrefixedIdentifier].
+ *
+ * @see PrefixedIdentifier#isDeferred()
+ */
+class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<Object> {
+ bool _result = false;
+
+ /**
+ * Return the result, `true` if the visitor found a [PrefixedIdentifier] that returned
+ * `true` to the [PrefixedIdentifier#isDeferred] query.
+ *
+ * @return `true` if the visitor found a [PrefixedIdentifier] that returned
+ * `true` to the [PrefixedIdentifier#isDeferred] query
+ */
+ bool get result => _result;
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+ // If result is already true, skip.
+ if (!_result) {
+ // Set result to true if isDeferred() is true
+ if (node.isDeferred) {
+ _result = true;
+ }
+ }
+ return null;
+ }
+}
+
+/**
* The abstract class `Directive` defines the behavior common to nodes that represent a
* directive.
*
@@ -5754,6 +5711,9 @@
* @return the associated element, or `null` if none is found
*/
static Element locateWithOffset(AstNode node, int offset) {
+ if (node == null) {
+ return null;
+ }
// try to get Element from node
{
Element nodeElement = locate(node);
@@ -7882,9 +7842,6 @@
R visitAnnotation(Annotation node) => visitNode(node);
@override
- R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
-
- @override
R visitArgumentList(ArgumentList node) => visitNode(node);
@override
@@ -8754,14 +8711,6 @@
}
@override
- ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- ArgumentDefinitionTest copy = new ArgumentDefinitionTest(_mapToken(node.question), _cloneNode(node.identifier));
- copy.propagatedType = node.propagatedType;
- copy.staticType = node.staticType;
- return copy;
- }
-
- @override
ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(_mapToken(node.leftParenthesis), _cloneNodeList(node.arguments), _mapToken(node.rightParenthesis));
@override
@@ -12473,12 +12422,6 @@
}
@override
- R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- node.visitChildren(this);
- return null;
- }
-
- @override
R visitArgumentList(ArgumentList node) {
node.visitChildren(this);
return null;
@@ -13562,9 +13505,6 @@
R visitAnnotation(Annotation node) => null;
@override
- R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
-
- @override
R visitArgumentList(ArgumentList node) => null;
@override
@@ -15055,13 +14995,6 @@
}
@override
- Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- _writer.print('?');
- _visitNode(node.identifier);
- return null;
- }
-
- @override
Object visitArgumentList(ArgumentList node) {
_writer.print('(');
_visitNodeListWithSeparator(node.arguments, ", ");
@@ -15503,6 +15436,9 @@
_visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
_writer.print("import ");
_visitNode(node.uri);
+ if (node.deferredToken != null) {
+ _writer.print(" deferred");
+ }
_visitNodeWithPrefix(" as ", node.prefix);
_visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
_writer.print(';');
@@ -16712,9 +16648,6 @@
R visitAnnotation(Annotation node) => visitNode(node);
@override
- R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitNode(node);
-
- @override
R visitArgumentList(ArgumentList node) => visitNode(node);
@override
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index cab0aae..9be227d 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -2718,6 +2718,15 @@
Element get enclosingElement;
/**
+ * Return a display name for the given element that includes the path to the compilation unit in
+ * which the type is defined.
+ *
+ * @param type the type for which an extended display name is to be returned
+ * @return a display name that can help distinguish between two types with the same name
+ */
+ String get extendedDisplayName;
+
+ /**
* Return the kind of element that this is.
*
* @return the kind of this element
@@ -3095,6 +3104,16 @@
Element get enclosingElement => _enclosingElement;
@override
+ String get extendedDisplayName {
+ String displayName = this.displayName;
+ Source source = this.source;
+ if (source != null) {
+ return "${displayName} (${source.fullName})";
+ }
+ return displayName;
+ }
+
+ @override
LibraryElement get library => getAncestor((element) => element is LibraryElement);
@override
@@ -4446,6 +4465,18 @@
*/
abstract class FunctionElement implements ExecutableElement, LocalElement {
/**
+ * The name of the method that can be implemented by a class to allow its instances to be invoked
+ * as if they were a function.
+ */
+ static final String CALL_METHOD_NAME = "call";
+
+ /**
+ * The name of the method that will be invoked if an attempt is made to invoke an undefined method
+ * on an object.
+ */
+ static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
+
+ /**
* The name of the synthetic function defined for libraries that are deferred.
*/
static final String LOAD_LIBRARY_NAME = "loadLibrary";
@@ -5026,7 +5057,11 @@
List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
for (ParameterElement parameter in parameters) {
if (parameter.parameterKind == ParameterKind.NAMED) {
- namedParameterTypes[parameter.name] = parameter.type.substitute2(typeArguments, typeParameters);
+ DartType type = parameter.type;
+ if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+ type = type.substitute2(typeArguments, typeParameters);
+ }
+ namedParameterTypes[parameter.name] = type;
}
}
return namedParameterTypes;
@@ -5042,7 +5077,11 @@
List<DartType> types = new List<DartType>();
for (ParameterElement parameter in parameters) {
if (parameter.parameterKind == ParameterKind.REQUIRED) {
- types.add(parameter.type.substitute2(typeArguments, typeParameters));
+ DartType type = parameter.type;
+ if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+ type = type.substitute2(typeArguments, typeParameters);
+ }
+ types.add(type);
}
}
return new List.from(types);
@@ -5058,7 +5097,11 @@
List<DartType> types = new List<DartType>();
for (ParameterElement parameter in parameters) {
if (parameter.parameterKind == ParameterKind.POSITIONAL) {
- types.add(parameter.type.substitute2(typeArguments, typeParameters));
+ DartType type = parameter.type;
+ if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+ type = type.substitute2(typeArguments, typeParameters);
+ }
+ types.add(type);
}
}
return new List.from(types);
@@ -5088,6 +5131,11 @@
// understand why it is and fix it.
return DynamicTypeImpl.instance;
}
+ // If there are no arguments to substitute, or if the arguments size doesn't match the parameter
+ // size, return the base return type.
+ if (typeArguments.length == 0 || typeArguments.length != typeParameters.length) {
+ return baseReturnType;
+ }
return baseReturnType.substitute2(typeArguments, TypeParameterTypeImpl.getTypes(typeParameters));
}
@@ -6627,7 +6675,11 @@
if (supertype == null) {
return null;
}
- return supertype.substitute2(typeArguments, classElement.type.typeArguments);
+ List<DartType> typeParameters = classElement.type.typeArguments;
+ if (typeArguments.length == 0 || typeArguments.length != typeParameters.length) {
+ return supertype;
+ }
+ return supertype.substitute2(typeArguments, typeParameters);
}
@override
@@ -7913,6 +7965,9 @@
String get displayName => _baseElement.displayName;
@override
+ String get extendedDisplayName => _baseElement.extendedDisplayName;
+
+ @override
ElementKind get kind => _baseElement.kind;
@override
@@ -8433,6 +8488,9 @@
Element get enclosingElement => null;
@override
+ String get extendedDisplayName => displayName;
+
+ @override
ElementKind get kind => ElementKind.ERROR;
@override
@@ -10401,6 +10459,11 @@
static List<TypeParameterType> EMPTY_ARRAY = new List<TypeParameterType>(0);
/**
+ * The name of the type Type from dart.core.
+ */
+ static String _TYPE_CLASS_NAME = "Type";
+
+ /**
* Return an array containing the type parameter types defined by the given array of type
* parameter elements.
*
@@ -10479,12 +10542,22 @@
bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<TypeImpl_TypePair>());
bool _isMoreSpecificThan(DartType s, Set<DartType> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+ //
+ // If s is of type Type from dart.core, return true
+ //
+ Element sElement = s.element;
+ LibraryElement sLibrary = sElement != null ? sElement.library : null;
+ if (sLibrary != null && sLibrary.isDartCore && s.name == _TYPE_CLASS_NAME) {
+ return true;
+ }
+ //
// T is a type parameter and S is the upper bound of T.
//
DartType bound = element.bound;
if (s == bound) {
return true;
}
+ //
// T is a type parameter and S is Object.
//
if (s.isObject) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 3a8bdeb..9289e9a 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -74,6 +74,28 @@
}
/**
+ * Return the number of entries in this cache that have an AST associated with them.
+ *
+ * @return the number of entries in this cache that have an AST associated with them
+ */
+ int get astSize => _partitions[_partitions.length - 1].astSize;
+
+ /**
+ * Return information about each of the partitions in this cache.
+ *
+ * @return information about each of the partitions in this cache
+ */
+ List<AnalysisContextStatistics_PartitionData> get partitionData {
+ int count = _partitions.length;
+ List<AnalysisContextStatistics_PartitionData> data = new List<AnalysisContextStatistics_PartitionData>(count);
+ for (int i = 0; i < count; i++) {
+ CachePartition partition = _partitions[i];
+ data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(partition.astSize, partition.map.length);
+ }
+ return data;
+ }
+
+ /**
* Return an iterator returning all of the map entries mapping sources to cache entries.
*
* @return an iterator returning all of the map entries mapping sources to cache entries
@@ -165,155 +187,6 @@
}
/**
- * Container with statistics about the [AnalysisContext].
- */
-abstract class AnalysisContentStatistics {
- /**
- * Return the statistics for each kind of cached data.
- *
- * @return the statistics for each kind of cached data
- */
- List<AnalysisContentStatistics_CacheRow> get cacheRows;
-
- /**
- * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
- *
- * @return the exceptions that caused some entries to have a state of [CacheState#ERROR]
- */
- List<AnalysisException> get exceptions;
-
- /**
- * Return an array containing all of the sources in the cache.
- *
- * @return an array containing all of the sources in the cache
- */
- List<Source> get sources;
-}
-
-/**
- * Implementation of the [AnalysisContentStatistics].
- */
-class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
- Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
-
- List<Source> _sources = new List<Source>();
-
- Set<AnalysisException> _exceptions = new Set<AnalysisException>();
-
- void addSource(Source source) {
- _sources.add(source);
- }
-
- @override
- List<AnalysisContentStatistics_CacheRow> get cacheRows {
- Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
- return new List.from(items);
- }
-
- @override
- List<AnalysisException> get exceptions => new List.from(_exceptions);
-
- @override
- List<Source> get sources => new List.from(_sources);
-
- void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
- _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
- }
-
- void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
- _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
- }
-
- void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
- String rowName = rowDesc.toString();
- AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
- if (row == null) {
- row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
- _dataMap[rowName] = row;
- }
- row._incState(state);
- if (state == CacheState.ERROR) {
- AnalysisException exception = dartEntry.exception;
- if (exception != null) {
- _exceptions.add(exception);
- }
- }
- }
-}
-
-class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
- final String name;
-
- int _errorCount = 0;
-
- int _flushedCount = 0;
-
- int _inProcessCount = 0;
-
- int _invalidCount = 0;
-
- int _validCount = 0;
-
- AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
-
- @override
- bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
-
- @override
- int get errorCount => _errorCount;
-
- @override
- int get flushedCount => _flushedCount;
-
- @override
- int get inProcessCount => _inProcessCount;
-
- @override
- int get invalidCount => _invalidCount;
-
- @override
- int get validCount => _validCount;
-
- @override
- int get hashCode => name.hashCode;
-
- void _incState(CacheState state) {
- if (state == CacheState.ERROR) {
- _errorCount++;
- }
- if (state == CacheState.FLUSHED) {
- _flushedCount++;
- }
- if (state == CacheState.IN_PROCESS) {
- _inProcessCount++;
- }
- if (state == CacheState.INVALID) {
- _invalidCount++;
- }
- if (state == CacheState.VALID) {
- _validCount++;
- }
- }
-}
-
-/**
- * Information about single item in the cache.
- */
-abstract class AnalysisContentStatistics_CacheRow {
- int get errorCount;
-
- int get flushedCount;
-
- int get inProcessCount;
-
- int get invalidCount;
-
- String get name;
-
- int get validCount;
-}
-
-/**
* The interface `AnalysisContext` defines the behavior of objects that represent a context in
* which a single analysis can be performed and incrementally maintained. The context includes such
* information as the version of the SDK being analyzed against as well as the package-root used to
@@ -349,6 +222,14 @@
*/
abstract class AnalysisContext {
/**
+ * Apply the given delta to change the level of analysis that will be performed for the sources
+ * known to this context.
+ *
+ * @param delta a description of the level of analysis that should be performed for some sources
+ */
+ void applyAnalysisDelta(AnalysisDelta delta);
+
+ /**
* Apply the changes specified by the given change set to this context. Any analysis results that
* have been invalidated by these changes will be removed.
*
@@ -1022,7 +903,7 @@
AnalysisContextImpl() : super() {
_resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
_privatePartition = new UniversalCachePartition(AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
- _cache = _createCacheFromSourceFactory(null);
+ _cache = createCacheFromSourceFactory(null);
}
@override
@@ -1033,6 +914,20 @@
}
@override
+ void applyAnalysisDelta(AnalysisDelta delta) {
+ ChangeSet changeSet = new ChangeSet();
+ for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(delta.analysisLevels)) {
+ Source source = entry.getKey();
+ if (entry.getValue() == AnalysisLevel.NONE) {
+ changeSet.removedSource(source);
+ } else {
+ changeSet.addedSource(source);
+ }
+ }
+ applyChanges(changeSet);
+ }
+
+ @override
void applyChanges(ChangeSet changeSet) {
if (changeSet.isEmpty) {
return;
@@ -1629,9 +1524,9 @@
}
@override
- AnalysisContentStatistics get statistics {
+ AnalysisContextStatistics get statistics {
bool hintsEnabled = _options.hint;
- AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl();
+ AnalysisContextStatisticsImpl statistics = new AnalysisContextStatisticsImpl();
MapIterator<Source, SourceEntry> iterator = _cache.iterator();
while (iterator.moveNext()) {
SourceEntry sourceEntry = iterator.value;
@@ -1673,6 +1568,7 @@
statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT);
}
}
+ statistics.partitionData = _cache.partitionData;
return statistics;
}
@@ -1937,11 +1833,30 @@
factory.context = this;
_sourceFactory = factory;
_coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE);
- _cache = _createCacheFromSourceFactory(factory);
+ _cache = createCacheFromSourceFactory(factory);
_invalidateAllLocalResolutionInformation();
}
/**
+ * Create an analysis cache based on the given source factory.
+ *
+ * @param factory the source factory containing the information needed to create the cache
+ * @return the cache that was created
+ */
+ AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+ if (factory == null) {
+ return new AnalysisCache(<CachePartition> [_privatePartition]);
+ }
+ DartSdk sdk = factory.dartSdk;
+ if (sdk == null) {
+ return new AnalysisCache(<CachePartition> [_privatePartition]);
+ }
+ return new AnalysisCache(<CachePartition> [
+ AnalysisEngine.instance.partitionManager.forSdk(sdk),
+ _privatePartition]);
+ }
+
+ /**
* Record the results produced by performing a [ResolveDartLibraryCycleTask]. If the results
* were computed from data that is now out-of-date, then the results will not be recorded.
*
@@ -1969,8 +1884,11 @@
throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
}
DartEntryImpl dartCopy = unitEntry.writableCopy;
- dartCopy.recordResolutionError();
- dartCopy.exception = thrownException;
+ if (thrownException == null) {
+ dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryCycleTaskResults, resolvedLibraries was null and there was no thrown exception"));
+ } else {
+ dartCopy.recordResolutionError(thrownException);
+ }
_cache.put(unitSource, dartCopy);
_cache.remove(unitSource);
if (thrownException != null) {
@@ -1997,10 +1915,9 @@
}
_cache.storedAst(source);
} else {
- dartCopy.recordResolutionError();
+ dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source != librarySource) {
_workManager.add(source, SourcePriority.PRIORITY_PART);
@@ -2035,10 +1952,9 @@
// 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.recordResolutionError();
+ dartCopy.recordResolutionError(thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source == unitSource) {
unitEntry = dartCopy;
@@ -2083,8 +1999,11 @@
throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
}
DartEntryImpl dartCopy = unitEntry.writableCopy;
- dartCopy.recordResolutionError();
- dartCopy.exception = thrownException;
+ if (thrownException == null) {
+ dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryTaskResults, resolvedLibraries was null and there was no thrown exception"));
+ } else {
+ dartCopy.recordResolutionError(thrownException);
+ }
_cache.put(unitSource, dartCopy);
_cache.remove(unitSource);
if (thrownException != null) {
@@ -2122,10 +2041,9 @@
}
_cache.storedAst(source);
} else {
- dartCopy.recordResolutionError();
+ dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source != librarySource) {
_workManager.add(source, SourcePriority.PRIORITY_PART);
@@ -2160,10 +2078,9 @@
// 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.recordResolutionError();
+ dartCopy.recordResolutionError(thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source == unitSource) {
unitEntry = dartCopy;
@@ -2625,8 +2542,7 @@
return new AnalysisContextImpl_TaskData(new BuildDartElementModelTask(this, source, builder.librariesInCycle), false);
} on AnalysisException catch (exception) {
DartEntryImpl dartCopy = dartEntry.writableCopy;
- dartCopy.recordBuildElementError();
- dartCopy.exception = exception;
+ dartCopy.recordBuildElementErrorInLibrary(source, exception);
_cache.put(source, dartCopy);
AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
}
@@ -2634,25 +2550,6 @@
}
/**
- * Create an analysis cache based on the given source factory.
- *
- * @param factory the source factory containing the information needed to create the cache
- * @return the cache that was created
- */
- AnalysisCache _createCacheFromSourceFactory(SourceFactory factory) {
- if (factory == null) {
- return new AnalysisCache(<CachePartition> [_privatePartition]);
- }
- DartSdk sdk = factory.dartSdk;
- if (sdk == null) {
- return new AnalysisCache(<CachePartition> [_privatePartition]);
- }
- return new AnalysisCache(<CachePartition> [
- AnalysisEngine.instance.partitionManager.forSdk(sdk),
- _privatePartition]);
- }
-
- /**
* Create a [GenerateDartErrorsTask] for the given source, marking the verification errors
* as being in-process. The compilation unit and the library can be the same if the compilation
* unit is the defining compilation unit of the library.
@@ -2669,9 +2566,10 @@
}
CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
if (unit == null) {
- AnalysisEngine.instance.logger.logInformation2("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}", new AnalysisException());
+ AnalysisException exception = new AnalysisException.con1("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}");
+ AnalysisEngine.instance.logger.logInformation2(exception.toString(), exception);
DartEntryImpl dartCopy = unitEntry.writableCopy;
- dartCopy.recordResolutionError();
+ dartCopy.recordResolutionError(exception);
_cache.put(unitSource, dartCopy);
return new AnalysisContextImpl_TaskData(null, false);
}
@@ -2866,10 +2764,9 @@
return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), false);
} on AnalysisException catch (exception) {
DartEntryImpl dartCopy = dartEntry.writableCopy;
- dartCopy.recordResolutionError();
- dartCopy.exception = exception;
+ dartCopy.recordResolutionError(exception);
_cache.put(source, dartCopy);
- AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
+ AnalysisEngine.instance.logger.logError2("Internal error trying to create a ResolveDartLibraryTask", exception);
}
return new AnalysisContextImpl_TaskData(null, false);
}
@@ -3958,10 +3855,9 @@
dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new Set<LibraryElement>()));
}
} else {
- dartCopy.recordBuildElementError();
+ dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source != librarySource) {
_workManager.add(librarySource, SourcePriority.PRIORITY_PART);
@@ -3978,6 +3874,7 @@
PrintStringWriter writer = new PrintStringWriter();
writer.println("Build element model results discarded for");
for (ResolvableLibrary library in builtLibraries) {
+ Source librarySource = library.librarySource;
for (Source source in library.compilationUnitSources) {
DartEntry dartEntry = _getReadableDartEntry(source);
if (dartEntry != null) {
@@ -3996,10 +3893,9 @@
// 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.recordBuildElementError();
+ dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
_cache.remove(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
if (source == targetLibrary) {
targetEntry = dartCopy;
@@ -4077,9 +3973,8 @@
ChangeNoticeImpl notice = _getNotice(source);
notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
} else {
- dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+ dartCopy.recordVerificationErrorInLibrary(librarySource, thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
} else {
@@ -4102,9 +3997,8 @@
// cache so that we won't attempt to re-verify the source until there's a good chance
// that we'll be able to do so without error.
//
- dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+ dartCopy.recordVerificationErrorInLibrary(librarySource, thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
}
@@ -4142,8 +4036,7 @@
thrownException = new AnalysisException.con1("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}");
}
DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
- dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
- dartCopy.exception = thrownException;
+ dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
_cache.put(librarySource, dartCopy);
throw thrownException;
}
@@ -4177,9 +4070,8 @@
ChangeNoticeImpl notice = _getNotice(unitSource);
notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
} else {
- dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
+ dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(unitSource, dartCopy);
dartEntry = dartCopy;
} else {
@@ -4203,9 +4095,8 @@
// 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.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
+ dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(unitSource, dartCopy);
dartEntry = dartCopy;
}
@@ -4240,8 +4131,7 @@
sourceCopy.modificationTime = task.modificationTime;
sourceCopy.setValue(SourceEntry.CONTENT, task.content);
} else {
- sourceCopy.exception = thrownException;
- sourceCopy.recordContentError();
+ sourceCopy.recordContentError(thrownException);
_workManager.remove(source);
}
_cache.put(source, sourceCopy);
@@ -4350,10 +4240,9 @@
_incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
} else {
_removeFromParts(source, dartEntry);
- dartCopy.recordParseError();
+ dartCopy.recordParseError(thrownException);
_cache.removedAst(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
} else {
@@ -4376,9 +4265,8 @@
// 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.recordParseError();
+ dartCopy.recordParseError(thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
}
@@ -4432,10 +4320,9 @@
ChangeNoticeImpl notice = _getNotice(source);
notice.setErrors(htmlCopy.allErrors, lineInfo);
} else {
- htmlCopy.recordParseError();
+ htmlCopy.recordParseError(thrownException);
_cache.removedAst(source);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4464,12 +4351,8 @@
// 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.
//
- htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
- htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
- htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
- htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
+ htmlCopy.recordParseError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4517,9 +4400,8 @@
ChangeNoticeImpl notice = _getNotice(source);
notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
} else {
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4538,9 +4420,8 @@
// 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.
//
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4588,9 +4469,8 @@
ChangeNoticeImpl notice = _getNotice(source);
notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
} else {
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4609,9 +4489,8 @@
// 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.
//
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4660,9 +4539,8 @@
notice.htmlUnit = task.resolvedUnit;
notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
} else {
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4690,9 +4568,8 @@
// 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.
//
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4742,9 +4619,8 @@
notice.htmlUnit = task.resolvedUnit;
notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
} else {
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4772,9 +4648,8 @@
// 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.
//
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4822,10 +4697,9 @@
dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, task.resolvedUnit);
_cache.storedAst(unitSource);
} else {
- dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+ dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
_cache.removedAst(unitSource);
}
- dartCopy.exception = thrownException;
_cache.put(unitSource, dartCopy);
dartEntry = dartCopy;
} else {
@@ -4850,9 +4724,8 @@
// 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.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+ dartCopy.recordResolutionErrorInLibrary(librarySource, thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(unitSource, dartCopy);
dartEntry = dartCopy;
}
@@ -4905,10 +4778,9 @@
notice.htmlUnit = task.resolvedUnit;
notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
} else {
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
_cache.removedAst(source);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
} else {
@@ -4934,9 +4806,8 @@
// 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.
//
- htmlCopy.recordResolutionError();
+ htmlCopy.recordResolutionError(thrownException);
}
- htmlCopy.exception = thrownException;
_cache.put(source, htmlCopy);
htmlEntry = htmlCopy;
}
@@ -4990,10 +4861,9 @@
notice.setErrors(dartEntry.allErrors, lineInfo);
} else {
_removeFromParts(source, dartEntry);
- dartCopy.recordScanError();
+ dartCopy.recordScanError(thrownException);
_cache.removedAst(source);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
} else {
@@ -5016,9 +4886,8 @@
// 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.recordScanError();
+ dartCopy.recordScanError(thrownException);
}
- dartCopy.exception = thrownException;
_cache.put(source, dartCopy);
dartEntry = dartCopy;
}
@@ -5181,7 +5050,7 @@
if (sourceEntry is HtmlEntry) {
HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
_invalidateAngularResolution(htmlCopy);
- htmlCopy.recordContentError();
+ htmlCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
_cache.put(source, htmlCopy);
} else if (sourceEntry is DartEntry) {
Set<Source> libraries = new Set<Source>();
@@ -5195,7 +5064,7 @@
_invalidateLibraryResolution(librarySource);
}
DartEntryImpl dartCopy = sourceEntry.writableCopy;
- dartCopy.recordContentError();
+ dartCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
_cache.put(source, dartCopy);
}
_workManager.remove(source);
@@ -5873,6 +5742,291 @@
}
/**
+ * The interface `AnalysisContextStatistics` defines access to statistics about a single
+ * [AnalysisContext].
+ */
+abstract class AnalysisContextStatistics {
+ /**
+ * Return the statistics for each kind of cached data.
+ */
+ List<AnalysisContextStatistics_CacheRow> get cacheRows;
+
+ /**
+ * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
+ */
+ List<AnalysisException> get exceptions;
+
+ /**
+ * Return information about each of the partitions in the cache.
+ */
+ List<AnalysisContextStatistics_PartitionData> get partitionData;
+
+ /**
+ * Return an array containing all of the sources in the cache.
+ */
+ List<Source> get sources;
+}
+
+/**
+ * Implementation of the [AnalysisContextStatistics].
+ */
+class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
+ Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new Map<String, AnalysisContextStatistics_CacheRow>();
+
+ List<Source> _sources = new List<Source>();
+
+ Set<AnalysisException> _exceptions = new Set<AnalysisException>();
+
+ List<AnalysisContextStatistics_PartitionData> _partitionData;
+
+ void addSource(Source source) {
+ _sources.add(source);
+ }
+
+ @override
+ List<AnalysisContextStatistics_CacheRow> get cacheRows {
+ Iterable<AnalysisContextStatistics_CacheRow> items = _dataMap.values;
+ return new List.from(items);
+ }
+
+ @override
+ List<AnalysisException> get exceptions => new List.from(_exceptions);
+
+ @override
+ List<AnalysisContextStatistics_PartitionData> get partitionData => _partitionData;
+
+ @override
+ List<Source> get sources => new List.from(_sources);
+
+ void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
+ _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
+ }
+
+ void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
+ _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
+ }
+
+ /**
+ * Set the partition data returned by this object to the given data.
+ */
+ void set partitionData(List<AnalysisContextStatistics_PartitionData> data) {
+ _partitionData = data;
+ }
+
+ void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+ String rowName = rowDesc.toString();
+ AnalysisContextStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl;
+ if (row == null) {
+ row = new AnalysisContextStatisticsImpl_CacheRowImpl(rowName);
+ _dataMap[rowName] = row;
+ }
+ row._incState(state);
+ if (state == CacheState.ERROR) {
+ AnalysisException exception = dartEntry.exception;
+ if (exception != null) {
+ _exceptions.add(exception);
+ }
+ }
+ }
+}
+
+class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStatistics_CacheRow {
+ final String name;
+
+ int _errorCount = 0;
+
+ int _flushedCount = 0;
+
+ int _inProcessCount = 0;
+
+ int _invalidCount = 0;
+
+ int _validCount = 0;
+
+ AnalysisContextStatisticsImpl_CacheRowImpl(this.name);
+
+ @override
+ bool operator ==(Object obj) => obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name;
+
+ @override
+ int get errorCount => _errorCount;
+
+ @override
+ int get flushedCount => _flushedCount;
+
+ @override
+ int get inProcessCount => _inProcessCount;
+
+ @override
+ int get invalidCount => _invalidCount;
+
+ @override
+ int get validCount => _validCount;
+
+ @override
+ int get hashCode => name.hashCode;
+
+ void _incState(CacheState state) {
+ if (state == CacheState.ERROR) {
+ _errorCount++;
+ }
+ if (state == CacheState.FLUSHED) {
+ _flushedCount++;
+ }
+ if (state == CacheState.IN_PROCESS) {
+ _inProcessCount++;
+ }
+ if (state == CacheState.INVALID) {
+ _invalidCount++;
+ }
+ if (state == CacheState.VALID) {
+ _validCount++;
+ }
+ }
+}
+
+class AnalysisContextStatisticsImpl_PartitionDataImpl implements AnalysisContextStatistics_PartitionData {
+ final int astCount;
+
+ final int totalCount;
+
+ AnalysisContextStatisticsImpl_PartitionDataImpl(this.astCount, this.totalCount);
+}
+
+/**
+ * Information about single piece of data in the cache.
+ */
+abstract class AnalysisContextStatistics_CacheRow {
+ /**
+ * Return the number of entries whose state is [CacheState#ERROR].
+ */
+ int get errorCount;
+
+ /**
+ * Return the number of entries whose state is [CacheState#FLUSHED].
+ */
+ int get flushedCount;
+
+ /**
+ * Return the number of entries whose state is [CacheState#IN_PROCESS].
+ */
+ int get inProcessCount;
+
+ /**
+ * Return the number of entries whose state is [CacheState#INVALID].
+ */
+ int get invalidCount;
+
+ /**
+ * Return the name of the data represented by this object.
+ */
+ String get name;
+
+ /**
+ * Return the number of entries whose state is [CacheState#VALID].
+ */
+ int get validCount;
+}
+
+/**
+ * Information about a single partition in the cache.
+ */
+abstract class AnalysisContextStatistics_PartitionData {
+ /**
+ * Return the number of entries in the partition that have an AST structure in one state or
+ * another.
+ */
+ int get astCount;
+
+ /**
+ * Return the total number of entries in the partition.
+ */
+ int get totalCount;
+}
+
+/**
+ * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that
+ * should be performed.
+ */
+class AnalysisDelta {
+ /**
+ * A mapping from source to what type of analysis should be performed on that source.
+ */
+ Map<Source, AnalysisLevel> _analysisMap = new Map<Source, AnalysisLevel>();
+
+ /**
+ * Return a collection of the sources that have been added. This is equivalent to calling
+ * [getAnalysisLevels] and collecting all sources that do not have an analysis level of
+ * [AnalysisLevel#NONE].
+ *
+ * @return a collection of the sources
+ */
+ Iterable<Source> get addedSources {
+ List<Source> result = new List<Source>();
+ for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(_analysisMap)) {
+ if (entry.getValue() != AnalysisLevel.NONE) {
+ result.add(entry.getKey());
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Return a mapping of sources to the level of analysis that should be performed.
+ *
+ * @return the analysis map
+ */
+ Map<Source, AnalysisLevel> get analysisLevels => _analysisMap;
+
+ /**
+ * Record that the specified source should be analyzed at the specified level.
+ *
+ * @param source the source
+ * @param level the level at which the given source should be analyzed
+ */
+ void setAnalysisLevel(Source source, AnalysisLevel level) {
+ _analysisMap[source] = level;
+ }
+
+ @override
+ String toString() {
+ JavaStringBuilder builder = new JavaStringBuilder();
+ bool needsSeparator = _appendSources(builder, false, AnalysisLevel.ALL);
+ needsSeparator = _appendSources(builder, needsSeparator, AnalysisLevel.RESOLVED);
+ _appendSources(builder, needsSeparator, AnalysisLevel.NONE);
+ return builder.toString();
+ }
+
+ /**
+ * Append sources with the given analysis level, prefixed with a label and possibly a separator.
+ *
+ * @param builder the builder to which the sources are to be appended
+ * @param needsSeparator `true` if a separator is needed before the label
+ * @param level the analysis level of the sources to be appended
+ * @return `true` if future lists of sources will need a separator
+ */
+ bool _appendSources(JavaStringBuilder builder, bool needsSeparator, AnalysisLevel level) {
+ bool first = true;
+ for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(_analysisMap)) {
+ if (entry.getValue() == level) {
+ if (first) {
+ first = false;
+ if (needsSeparator) {
+ builder.append("; ");
+ }
+ builder.append(level);
+ builder.append(" ");
+ } else {
+ builder.append(", ");
+ }
+ builder.append(entry.getKey().fullName);
+ }
+ }
+ return needsSeparator || !first;
+ }
+}
+
+/**
* The unique instance of the class `AnalysisEngine` serves as the entry point for the
* functionality provided by the analysis engine.
*/
@@ -6054,6 +6208,36 @@
}
/**
+ * The enumeration `AnalysisLevel` encodes the different levels at which a source can be
+ * analyzed.
+ */
+class AnalysisLevel extends Enum<AnalysisLevel> {
+ /**
+ * Indicates a source should be fully analyzed.
+ */
+ static const AnalysisLevel ALL = const AnalysisLevel('ALL', 0);
+
+ /**
+ * Indicates a source should be resolved and that errors, warnings and hints are needed.
+ */
+ static const AnalysisLevel ERRORS = const AnalysisLevel('ERRORS', 1);
+
+ /**
+ * Indicates a source should be resolved, but that errors, warnings and hints are not needed.
+ */
+ static const AnalysisLevel RESOLVED = const AnalysisLevel('RESOLVED', 2);
+
+ /**
+ * Indicates a source is not of interest to the client.
+ */
+ static const AnalysisLevel NONE = const AnalysisLevel('NONE', 3);
+
+ static const List<AnalysisLevel> values = const [ALL, ERRORS, RESOLVED, NONE];
+
+ const AnalysisLevel(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
* The interface `AnalysisOptions` defines the behavior of objects that provide access to a
* set of analysis options used to control the behavior of an analysis context.
*/
@@ -7817,6 +8001,30 @@
SourceEntry get(Source source) => _sourceMap[source];
/**
+ * Return the number of entries in this partition that have an AST associated with them.
+ *
+ * @return the number of entries in this partition that have an AST associated with them
+ */
+ int get astSize {
+ int astSize = 0;
+ int count = _recentlyUsed.length;
+ for (int i = 0; i < count; i++) {
+ Source source = _recentlyUsed[i];
+ SourceEntry sourceEntry = _sourceMap[source];
+ if (sourceEntry is DartEntry) {
+ if (sourceEntry.anyParsedCompilationUnit != null) {
+ astSize++;
+ }
+ } else if (sourceEntry is HtmlEntry) {
+ if (sourceEntry.anyParsedUnit != null) {
+ astSize++;
+ }
+ }
+ }
+ return astSize;
+ }
+
+ /**
* Return a table mapping the sources known to the context to the information known about the
* source.
*
@@ -8964,7 +9172,7 @@
state = state._nextState;
}
;
- if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+ if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
return CacheState.INVALID;
} else {
throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
@@ -9175,14 +9383,19 @@
* Record that an error occurred while attempting to build the element model for the source
* represented by this entry. This will set the state of all resolution-based information as being
* in error, but will not change the state of any parse results.
+ *
+ * @param librarySource the source of the library in which the element model was being built
+ * @param exception the exception that shows where the error occurred
*/
- void recordBuildElementError() {
+ void recordBuildElementErrorInLibrary(Source librarySource, AnalysisException exception) {
+ this.exception = exception;
_element = null;
_elementState = CacheState.ERROR;
clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
_clientServerState = CacheState.ERROR;
_launchableState = CacheState.ERROR;
- recordResolutionError();
+ DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+ state.recordBuildElementError();
}
/**
@@ -9202,17 +9415,32 @@
}
@override
- void recordContentError() {
- super.recordContentError();
- recordScanError();
+ void recordContentError(AnalysisException exception) {
+ super.recordContentError(exception);
+ recordScanError(exception);
+ }
+
+ /**
+ * Record that an error occurred while attempting to generate hints for the source represented by
+ * this entry. This will set the state of all verification information as being in error.
+ *
+ * @param librarySource the source of the library in which hints were being generated
+ * @param exception the exception that shows where the error occurred
+ */
+ void recordHintErrorInLibrary(Source librarySource, AnalysisException exception) {
+ this.exception = exception;
+ DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+ state.recordHintError();
}
/**
* 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.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordParseError() {
+ void recordParseError(AnalysisException exception) {
_sourceKind = SourceKind.UNKNOWN;
_sourceKindState = CacheState.ERROR;
_parseErrors = AnalysisError.NO_ERRORS;
@@ -9226,7 +9454,7 @@
_importedLibrariesState = CacheState.ERROR;
_includedParts = Source.EMPTY_ARRAY;
_includedPartsState = CacheState.ERROR;
- recordResolutionError();
+ recordResolutionError(exception);
}
/**
@@ -9286,8 +9514,11 @@
* Record that an error occurred while attempting to resolve the source represented by this entry.
* This will set the state of all resolution-based information as being in error, but will not
* change the state of any parse results.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordResolutionError() {
+ void recordResolutionError(AnalysisException exception) {
+ this.exception = exception;
_element = null;
_elementState = CacheState.ERROR;
clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
@@ -9295,7 +9526,28 @@
_launchableState = CacheState.ERROR;
_publicNamespace = null;
_publicNamespaceState = CacheState.ERROR;
- _resolutionState.recordResolutionError();
+ _resolutionState.recordResolutionErrorsInAllLibraries();
+ }
+
+ /**
+ * Record that an error occurred while attempting to resolve the source represented by this entry.
+ * This will set the state of all resolution-based information as being in error, but will not
+ * change the state of any parse results.
+ *
+ * @param librarySource the source of the library in which resolution was being performed
+ * @param exception the exception that shows where the error occurred
+ */
+ void recordResolutionErrorInLibrary(Source librarySource, AnalysisException exception) {
+ this.exception = exception;
+ _element = null;
+ _elementState = CacheState.ERROR;
+ clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
+ _clientServerState = CacheState.ERROR;
+ _launchableState = CacheState.ERROR;
+ _publicNamespace = null;
+ _publicNamespaceState = CacheState.ERROR;
+ DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+ state.recordResolutionError();
}
/**
@@ -9324,14 +9576,17 @@
* 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.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordScanError() {
- setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+ @override
+ void recordScanError(AnalysisException exception) {
+ super.recordScanError(exception);
_scanErrors = AnalysisError.NO_ERRORS;
_scanErrorsState = CacheState.ERROR;
_tokenStream = null;
_tokenStreamState = CacheState.ERROR;
- recordParseError();
+ recordParseError(exception);
}
/**
@@ -9367,6 +9622,20 @@
}
/**
+ * Record that an error occurred while attempting to generate errors and warnings for the source
+ * represented by this entry. This will set the state of all verification information as being in
+ * error.
+ *
+ * @param librarySource the source of the library in which verification was being performed
+ * @param exception the exception that shows where the error occurred
+ */
+ void recordVerificationErrorInLibrary(Source librarySource, AnalysisException exception) {
+ this.exception = exception;
+ DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+ state.recordVerificationError();
+ }
+
+ /**
* Remove the given library from the list of libraries that contain this part. This method should
* only be invoked on entries that represent a part.
*
@@ -9852,11 +10121,44 @@
}
/**
+ * Record that an error occurred while attempting to build the element model for the source
+ * represented by this state.
+ */
+ void recordBuildElementError() {
+ _builtUnitState = CacheState.ERROR;
+ _builtUnit = null;
+ _buildElementErrorsState = CacheState.ERROR;
+ _buildElementErrors = AnalysisError.NO_ERRORS;
+ recordResolutionError();
+ }
+
+ /**
+ * Record that an error occurred while attempting to generate hints for the source represented
+ * by this entry. This will set the state of all verification information as being in error.
+ */
+ void recordHintError() {
+ _hints = AnalysisError.NO_ERRORS;
+ _hintsState = CacheState.ERROR;
+ }
+
+ /**
+ * Record that an error occurred while attempting to resolve the source represented by this
+ * state.
+ */
+ void recordResolutionError() {
+ _resolvedUnitState = CacheState.ERROR;
+ _resolvedUnit = null;
+ _resolutionErrorsState = CacheState.ERROR;
+ _resolutionErrors = AnalysisError.NO_ERRORS;
+ recordVerificationError();
+ }
+
+ /**
* Record that an error occurred while attempting to scan or parse the entry represented by this
* entry. This will set the state of all resolution-based information as being in error, but
* will not change the state of any parse results.
*/
- void recordResolutionError() {
+ void recordResolutionErrorsInAllLibraries() {
_builtUnitState = CacheState.ERROR;
_builtUnit = null;
_buildElementErrorsState = CacheState.ERROR;
@@ -9865,12 +10167,9 @@
_resolvedUnit = null;
_resolutionErrorsState = CacheState.ERROR;
_resolutionErrors = AnalysisError.NO_ERRORS;
- _verificationErrorsState = CacheState.ERROR;
- _verificationErrors = AnalysisError.NO_ERRORS;
- _hintsState = CacheState.ERROR;
- _hints = AnalysisError.NO_ERRORS;
+ recordVerificationError();
if (_nextState != null) {
- _nextState.recordResolutionError();
+ _nextState.recordResolutionErrorsInAllLibraries();
}
}
@@ -9897,6 +10196,17 @@
}
/**
+ * Record that an error occurred while attempting to generate errors and warnings for the source
+ * represented by this entry. This will set the state of all verification information as being
+ * in error.
+ */
+ void recordVerificationError() {
+ _verificationErrors = AnalysisError.NO_ERRORS;
+ _verificationErrorsState = CacheState.ERROR;
+ recordHintError();
+ }
+
+ /**
* Write a textual representation of this state to the given builder. The result will only be
* used for debugging purposes.
*
@@ -10723,35 +11033,51 @@
}
@override
- void recordContentError() {
- super.recordContentError();
- recordParseError();
+ void recordContentError(AnalysisException exception) {
+ super.recordContentError(exception);
+ recordParseError(exception);
}
/**
* Record that an error was encountered while attempting to parse the source associated with this
* entry.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordParseError() {
- setState(SourceEntry.LINE_INFO, CacheState.ERROR);
- setState(HtmlEntry.PARSE_ERRORS, CacheState.ERROR);
- setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
- setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
- recordResolutionError();
+ void recordParseError(AnalysisException exception) {
+ // If the scanning and parsing of HTML are separated, the following line can be removed.
+ recordScanError(exception);
+ _parseErrors = AnalysisError.NO_ERRORS;
+ _parseErrorsState = CacheState.ERROR;
+ _parsedUnit = null;
+ _parsedUnitState = CacheState.ERROR;
+ _referencedLibraries = Source.EMPTY_ARRAY;
+ _referencedLibrariesState = CacheState.ERROR;
+ recordResolutionError(exception);
}
/**
* Record that an error was encountered while attempting to resolve the source associated with
* this entry.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordResolutionError() {
- setState(HtmlEntry.ANGULAR_ERRORS, CacheState.ERROR);
- setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
- setState(HtmlEntry.ELEMENT, CacheState.ERROR);
- setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
- setState(HtmlEntry.HINTS, CacheState.ERROR);
- setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.ERROR);
- setState(HtmlEntry.POLYMER_RESOLUTION_ERRORS, CacheState.ERROR);
+ void recordResolutionError(AnalysisException exception) {
+ this.exception = exception;
+ _angularErrors = AnalysisError.NO_ERRORS;
+ _angularErrorsState = CacheState.ERROR;
+ _resolvedUnit = null;
+ _resolvedUnitState = CacheState.ERROR;
+ _element = null;
+ _elementState = CacheState.ERROR;
+ _resolutionErrors = AnalysisError.NO_ERRORS;
+ _resolutionErrorsState = CacheState.ERROR;
+ _hints = AnalysisError.NO_ERRORS;
+ _hintsState = CacheState.ERROR;
+ _polymerBuildErrors = AnalysisError.NO_ERRORS;
+ _polymerBuildErrorsState = CacheState.ERROR;
+ _polymerResolutionErrors = AnalysisError.NO_ERRORS;
+ _polymerResolutionErrorsState = CacheState.ERROR;
}
@override
@@ -11233,6 +11559,18 @@
}
@override
+ void applyAnalysisDelta(AnalysisDelta delta) {
+ InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-updateAnalysis");
+ _checkThread(instrumentation);
+ try {
+ instrumentation.metric3("contextId", _contextId);
+ _basis.applyAnalysisDelta(delta);
+ } finally {
+ instrumentation.log();
+ }
+ }
+
+ @override
void applyChanges(ChangeSet changeSet) {
InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-applyChanges");
_checkThread(instrumentation);
@@ -11696,7 +12034,7 @@
}
@override
- AnalysisContentStatistics get statistics => _basis.statistics;
+ AnalysisContextStatistics get statistics => _basis.statistics;
@override
TypeProvider get typeProvider => _basis.typeProvider;
@@ -11980,7 +12318,7 @@
/**
* Returns a statistics about this context.
*/
- AnalysisContentStatistics get statistics;
+ AnalysisContextStatistics get statistics;
/**
* Returns a type provider for this context or throws an exception if dart:core cannot be
@@ -14296,6 +14634,24 @@
}
/**
+ * Instances of the class `SdkAnalysisContext` implement an [AnalysisContext] that only
+ * contains sources for a Dart SDK.
+ */
+class SdkAnalysisContext extends AnalysisContextImpl {
+ @override
+ AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+ if (factory == null) {
+ return super.createCacheFromSourceFactory(factory);
+ }
+ DartSdk sdk = factory.dartSdk;
+ if (sdk == null) {
+ throw new IllegalArgumentException("The source factory for an SDK analysis context must have a DartUriResolver");
+ }
+ return new AnalysisCache(<CachePartition> [AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
+ }
+}
+
+/**
* Instances of the class `SdkCachePartition` implement a cache partition that contains all of
* the sources in the SDK.
*/
@@ -14406,7 +14762,7 @@
/**
* The exception that caused one or more values to have a state of [CacheState#ERROR].
*/
- AnalysisException exception;
+ AnalysisException _exception;
/**
* The state of the cached content.
@@ -14440,19 +14796,28 @@
*/
void fixExceptionState() {
if (hasErrorState) {
- if (exception == null) {
+ if (_exception == null) {
//
// This code should never be reached, but is a fail-safe in case an exception is not
// recorded when it should be.
//
- exception = new AnalysisException.con1("State set to ERROR without setting an exception");
+ _exception = new AnalysisException.con1("State set to ERROR without setting an exception");
}
} else {
- exception = null;
+ _exception = null;
}
}
/**
+ * Return the exception that caused one or more values to have a state of [CacheState#ERROR]
+ * .
+ *
+ * @return the exception that caused one or more values to be uncomputable
+ */
+ @override
+ AnalysisException get exception => _exception;
+
+ /**
* Return `true` if the source was explicitly added to the context or `false` if the
* source was implicitly added because it was referenced by another source.
*
@@ -14500,10 +14865,26 @@
* Record that an error occurred while attempting to get the contents of the source represented by
* this entry. This will set the state of all information, including any resolution-based
* information, as being in error.
+ *
+ * @param exception the exception that shows where the error occurred
*/
- void recordContentError() {
+ void recordContentError(AnalysisException exception) {
_content = null;
_contentState = CacheState.ERROR;
+ recordScanError(exception);
+ }
+
+ /**
+ * 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.
+ *
+ * @param exception the exception that shows where the error occurred
+ */
+ void recordScanError(AnalysisException exception) {
+ this.exception = exception;
+ _lineInfo = null;
+ _lineInfoState = CacheState.ERROR;
}
/**
@@ -14587,7 +14968,7 @@
void copyFrom(SourceEntryImpl entry) {
_modificationTime = entry._modificationTime;
_flags = entry._flags;
- exception = entry.exception;
+ _exception = entry._exception;
_contentState = entry._contentState;
_content = entry._content;
_lineInfoState = entry._lineInfoState;
@@ -14610,6 +14991,19 @@
bool get hasErrorState => _contentState == CacheState.ERROR || _lineInfoState == CacheState.ERROR;
/**
+ * Set the exception that caused one or more values to have a state of [CacheState#ERROR] to
+ * the given exception.
+ *
+ * @param exception the exception that caused one or more values to be uncomputable
+ */
+ void set exception(AnalysisException exception) {
+ if (exception == null) {
+ throw new IllegalArgumentException("exception cannot be null");
+ }
+ this._exception = exception;
+ }
+
+ /**
* Set the value of the flag with the given index to the given value.
*
* @param index the index of the flag whose value is to be returned
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 705d264..5257ff0 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -534,17 +534,26 @@
static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 20, "'const' variables must be constant value");
/**
+ * 5 Variables: A constant variable must be initialized to a compile-time constant or a
+ * compile-time error occurs.
+ *
+ * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+ * deferred prefix.
+ */
+ static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 21, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+
+ /**
* 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
* constant.
*/
- static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 21, "Only static fields can be declared as 'const'");
+ static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 22, "Only static fields can be declared as 'const'");
/**
* 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
* instance of a class that implements the operator <i>==</i> unless the key is a string or
* integer.
*/
- static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 22, "The constant map entry key expression type '%s' cannot override the == operator");
+ static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 23, "The constant map entry key expression type '%s' cannot override the == operator");
/**
* 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -552,45 +561,45 @@
*
* @param name the name of the uninitialized final variable
*/
- static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 23, "The const variable '%s' must be initialized");
+ static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 24, "The const variable '%s' must be initialized");
/**
* 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
* are constant expressions that evaluate to a boolean value.
*/
- static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 24, "An expression of type 'bool' was expected");
+ static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 25, "An expression of type 'bool' was expected");
/**
* 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
* constant expressions that evaluate to a numeric, string or boolean value or to null.
*/
- static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 25, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+ static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 26, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
/**
* 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
* << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
* null.
*/
- static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 26, "An expression of type 'int' was expected");
+ static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 27, "An expression of type 'int' was expected");
/**
* 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
* e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
* expressions that evaluate to a numeric value or to null..
*/
- static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 27, "An expression of type 'num' was expected");
+ static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 28, "An expression of type 'num' was expected");
/**
* 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
* uncaught exception being thrown.
*/
- static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 28, "Evaluation of this constant expression causes exception");
+ static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 29, "Evaluation of this constant expression causes exception");
/**
* 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
* uncaught exception being thrown.
*/
- static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 29, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+ static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 30, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
/**
* 12.11.2 Const: If <i>T</i> is a parameterized type <i>S<U<sub>1</sub>, …,
@@ -603,7 +612,7 @@
* @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
* @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
*/
- static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 30, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+ static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 31, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
/**
* 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, …, a<sub>n</sub>,
@@ -611,13 +620,13 @@
* compile-time error if the type <i>T</i> does not declare a constant constructor with the same
* name as the declaration of <i>T</i>.
*/
- static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 31, "The constructor being called is not a 'const' constructor");
+ static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 32, "The constructor being called is not a 'const' constructor");
/**
* 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
* <= i <= n + k</i>, is not a compile-time constant expression.
*/
- static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 32, "Arguments of a constant creation must be constant expressions");
+ static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 33, "Arguments of a constant creation must be constant expressions");
/**
* 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -630,12 +639,12 @@
*
* @param name the name of the non-type element
*/
- static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 33, "The name '%s' is not a class");
+ static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 34, "The name '%s' is not a class");
/**
* 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
*/
- static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 34, "The constant creation cannot use a type parameter");
+ static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 35, "The constant creation cannot use a type parameter");
/**
* 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -644,7 +653,7 @@
* @param typeName the name of the type
* @param constructorName the name of the requested constant constructor
*/
- static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 35, "The class '%s' does not have a constant constructor '%s'");
+ static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 36, "The class '%s' does not have a constant constructor '%s'");
/**
* 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -652,32 +661,32 @@
*
* @param typeName the name of the type
*/
- static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 36, "The class '%s' does not have a default constant constructor");
+ static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 37, "The class '%s' does not have a default constant constructor");
/**
* 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
* of a function type alias.
*/
- static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 37, "Default values aren't allowed in typedefs");
+ static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 38, "Default values aren't allowed in typedefs");
/**
* 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
* its type as a function type. It is a compile-time error if any default values are specified in
* the signature of such a function type.
*/
- static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 38, "Default values aren't allowed in function type parameters");
+ static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 39, "Default values aren't allowed in function type parameters");
/**
* 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
* for an optional parameter.
*/
- static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 39, "Default values aren't allowed in factory constructors that redirect to another constructor");
+ static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 40, "Default values aren't allowed in factory constructors that redirect to another constructor");
/**
* 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
* declared in the same scope.
*/
- static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 40, "The default constructor is already defined");
+ static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 41, "The default constructor is already defined");
/**
* 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -685,7 +694,7 @@
*
* @param duplicateName the name of the duplicate entity
*/
- static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 41, "The constructor with name '%s' is already defined");
+ static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 42, "The constructor with name '%s' is already defined");
/**
* 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -698,7 +707,7 @@
*
* @param duplicateName the name of the duplicate entity
*/
- static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 42, "The name '%s' is already defined");
+ static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 43, "The name '%s' is already defined");
/**
* 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -710,21 +719,21 @@
* @param name the name of the conflicting members
* @see #DUPLICATE_DEFINITION
*/
- static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 43, "The name '%s' is already defined in '%s'");
+ static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 44, "The name '%s' is already defined in '%s'");
/**
* 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
* q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
* argument].
*/
- static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 44, "The argument for the named parameter '%s' was already specified");
+ static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 45, "The argument for the named parameter '%s' was already specified");
/**
* SDK implementation libraries can be exported only by other SDK libraries.
*
* @param uri the uri pointing to a library
*/
- static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 45, "The library '%s' is internal and cannot be exported");
+ static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 46, "The library '%s' is internal and cannot be exported");
/**
* 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -732,7 +741,7 @@
*
* @param uri the uri pointing to a non-library declaration
*/
- static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 46, "The exported library '%s' must not have a part-of directive");
+ static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 47, "The exported library '%s' must not have a part-of directive");
/**
* 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -740,7 +749,7 @@
*
* @param typeName the name of the superclass that was not found
*/
- static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 47, "Classes can only extend other classes");
+ static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 48, "Classes can only extend other classes");
/**
* 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -759,7 +768,7 @@
* @param typeName the name of the type that cannot be extended
* @see #IMPLEMENTS_DISALLOWED_CLASS
*/
- static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 48, "Classes cannot extend '%s'");
+ static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 49, "Classes cannot extend '%s'");
/**
* 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -769,7 +778,7 @@
* @see #IMPLEMENTS_DEFERRED_CLASS
* @see #MIXIN_DEFERRED_CLASS
*/
- static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 49, "This class cannot extend the deferred class '%s'");
+ static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 50, "This class cannot extend the deferred class '%s'");
/**
* 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m >
@@ -781,21 +790,21 @@
* @param requiredCount the maximum number of positional arguments
* @param argumentCount the actual number of positional arguments given
*/
- static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 50, "%d positional arguments expected, but %d found");
+ static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 51, "%d positional arguments expected, but %d found");
/**
* 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
* error if more than one initializer corresponding to a given instance variable appears in
* <i>k</i>'s list.
*/
- static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 51, "The field '%s' cannot be initialized twice in the same constructor");
+ static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 52, "The field '%s' cannot be initialized twice in the same constructor");
/**
* 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
* error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
* by means of an initializing formal of <i>k</i>.
*/
- static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 52, "Fields cannot be initialized in both the parameter list and the initializers");
+ static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 53, "Fields cannot be initialized in both the parameter list and the initializers");
/**
* 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -804,19 +813,19 @@
*
* @param name the name of the field in question
*/
- static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 53, "'%s' is a final field and so can only be set once");
+ static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 54, "'%s' is a final field and so can only be set once");
/**
* 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
* a function other than a non-redirecting generative constructor.
*/
- static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 54, "Initializing formal fields cannot be used in factory constructors");
+ static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 55, "Initializing formal fields cannot be used in factory constructors");
/**
* 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
* a function other than a non-redirecting generative constructor.
*/
- static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 55, "Initializing formal fields can only be used in constructors");
+ static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 56, "Initializing formal fields can only be used in constructors");
/**
* 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -825,7 +834,7 @@
* 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
* a function other than a non-redirecting generative constructor.
*/
- static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 56, "The redirecting constructor cannot have a field initializer");
+ static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 57, "The redirecting constructor cannot have a field initializer");
/**
* 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -833,7 +842,7 @@
*
* @param name the conflicting name of the getter and method
*/
- static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 57, "'%s' cannot be used to name a getter, there is already a method with the same name");
+ static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 58, "'%s' cannot be used to name a getter, there is already a method with the same name");
/**
* 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -843,7 +852,7 @@
* @see #EXTENDS_DEFERRED_CLASS
* @see #MIXIN_DEFERRED_CLASS
*/
- static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 58, "This class cannot implement the deferred class '%s'");
+ static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 59, "This class cannot implement the deferred class '%s'");
/**
* 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -862,13 +871,13 @@
* @param typeName the name of the type that cannot be implemented
* @see #EXTENDS_DISALLOWED_CLASS
*/
- static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 59, "Classes cannot implement '%s'");
+ static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 60, "Classes cannot implement '%s'");
/**
* 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
* type dynamic.
*/
- static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 60, "Classes cannot implement 'dynamic'");
+ static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 61, "Classes cannot implement 'dynamic'");
/**
* 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -877,7 +886,7 @@
*
* @param typeName the name of the interface that was not found
*/
- static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 61, "Classes can only implement other classes");
+ static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 62, "Classes can only implement other classes");
/**
* 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -885,7 +894,7 @@
*
* @param className the name of the class that is implemented more than once
*/
- static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 62, "'%s' can only be implemented once");
+ static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 63, "'%s' can only be implemented once");
/**
* 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -893,7 +902,7 @@
*
* @param className the name of the class that appears in both "extends" and "implements" clauses
*/
- static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 63, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+ static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 64, "'%s' cannot be used in both 'extends' and 'implements' clauses");
/**
* 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -905,14 +914,7 @@
*
* @param name the name of the type in question
*/
- static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 64, "Only static members can be accessed in initializers");
-
- /**
- * Speculative.
- *
- * TODO (jwren) Revisit to remove after we know for sure that this won't be in the Spec.
- */
- static const CompileTimeErrorCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const CompileTimeErrorCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 65, "The library '%s' defines a top-level function named 'loadLibrary' and therefore cannot be deferred");
+ static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 65, "Only static members can be accessed in initializers");
/**
* SDK implementation libraries can be imported only by other SDK libraries.
@@ -998,31 +1000,41 @@
static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 74, "Annotation can be only constant variable or constant constructor invocation");
/**
+ * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
+ * character @, followed by a constant expression that must be either a reference to a
+ * compile-time constant variable, or a call to a constant constructor.
+ *
+ * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+ * deferred prefix.
+ */
+ static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 75, "Constant values from a deferred library cannot be used as annotations");
+
+ /**
* TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
* constants. Until then, this acts as a placeholder for more informative errors.
*
* See TODOs in ConstantVisitor
*/
- static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 75, "Invalid constant value");
+ static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 76, "Invalid constant value");
/**
* 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
* name.
*/
- static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 76, "Invalid constructor name");
+ static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 77, "Invalid constructor name");
/**
* 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
* enclosing class.
*/
- static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 77, "The name of the immediately enclosing class expected");
+ static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 78, "The name of the immediately enclosing class expected");
/**
* 12.10 This: It is a compile-time error if this appears in a top-level function or variable
* initializer, in a factory constructor, or in a static method or variable initializer, or in the
* initializer of an instance variable.
*/
- static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 78, "Invalid reference to 'this' expression");
+ static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 79, "Invalid reference to 'this' expression");
/**
* 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1030,7 +1042,7 @@
*
* @name the name of the type parameter
*/
- static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 79, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+ static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 80, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
/**
* 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1038,7 +1050,7 @@
*
* @name the name of the type parameter
*/
- static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 80, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+ static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 81, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
/**
* 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1053,7 +1065,7 @@
* @param uri the URI that is invalid
* @see #URI_DOES_NOT_EXIST
*/
- static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 81, "Invalid URI syntax: '%s'");
+ static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 82, "Invalid URI syntax: '%s'");
/**
* 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1064,7 +1076,7 @@
*
* @param labelName the name of the unresolvable label
*/
- static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 82, "Cannot reference label '%s' declared in an outer method");
+ static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 83, "Cannot reference label '%s' declared in an outer method");
/**
* 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1075,7 +1087,7 @@
*
* @param labelName the name of the unresolvable label
*/
- static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 83, "Cannot reference undefined label '%s'");
+ static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 84, "Cannot reference undefined label '%s'");
/**
* 12.6 Lists: A run-time list literal <<i>E</i>> [<i>e<sub>1</sub></i> ...
@@ -1089,7 +1101,7 @@
* It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 <=
* j <= m</i>.
*/
- static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 84, "The element type '%s' cannot be assigned to the list type '%s'");
+ static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the list type '%s'");
/**
* 12.7 Map: A run-time map literal <<i>K</i>, <i>V</i>> [<i>k<sub>1</sub></i> :
@@ -1103,7 +1115,7 @@
* It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 <=
* j <= m</i>.
*/
- static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the map key type '%s'");
+ static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map key type '%s'");
/**
* 12.7 Map: A run-time map literal <<i>K</i>, <i>V</i>> [<i>k<sub>1</sub></i> :
@@ -1117,13 +1129,13 @@
* It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 <=
* j <= m</i>.
*/
- static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map value type '%s'");
+ static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map value type '%s'");
/**
* 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
* as <i>C</i>.
*/
- static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 87, "Class members cannot have the same name as the enclosing class");
+ static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 88, "Class members cannot have the same name as the enclosing class");
/**
* 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1131,17 +1143,17 @@
*
* @param name the conflicting name of the getter and method
*/
- static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 88, "'%s' cannot be used to name a method, there is already a getter with the same name");
+ static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 89, "'%s' cannot be used to name a method, there is already a getter with the same name");
/**
* 12.1 Constants: A constant expression is ... a constant list literal.
*/
- static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 89, "List literals must be prefixed with 'const' when used as a constant expression");
+ static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 90, "List literals must be prefixed with 'const' when used as a constant expression");
/**
* 12.1 Constants: A constant expression is ... a constant map literal.
*/
- static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 90, "Map literals must be prefixed with 'const' when used as a constant expression");
+ static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 91, "Map literals must be prefixed with 'const' when used as a constant expression");
/**
* 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1149,7 +1161,7 @@
*
* @param typeName the name of the mixin that is invalid
*/
- static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 91, "The class '%s' cannot be used as a mixin because it declares a constructor");
+ static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 92, "The class '%s' cannot be used as a mixin because it declares a constructor");
/**
* 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1159,7 +1171,7 @@
* @see #EXTENDS_DEFERRED_CLASS
* @see #IMPLEMENTS_DEFERRED_CLASS
*/
- static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 92, "This class cannot mixin the deferred class '%s'");
+ static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 93, "This class cannot mixin the deferred class '%s'");
/**
* 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1167,7 +1179,7 @@
*
* @param typeName the name of the mixin that is invalid
*/
- static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 93, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+ static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 94, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
/**
* 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1186,43 +1198,43 @@
* @param typeName the name of the type that cannot be extended
* @see #IMPLEMENTS_DISALLOWED_CLASS
*/
- static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 94, "Classes cannot mixin '%s'");
+ static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 95, "Classes cannot mixin '%s'");
/**
* 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
* available in the immediately enclosing scope.
*/
- static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 95, "Classes can only mixin other classes");
+ static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 96, "Classes can only mixin other classes");
/**
* 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
*/
- static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 96, "The class '%s' cannot be used as a mixin because it references 'super'");
+ static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 97, "The class '%s' cannot be used as a mixin because it references 'super'");
/**
* 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
* in the immediately enclosing scope.
*/
- static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 97, "Mixin can only be applied to class");
+ static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 98, "Mixin can only be applied to class");
/**
* 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
* only action is to invoke another generative constructor.
*/
- static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 98, "Constructor may have at most one 'this' redirection");
+ static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 99, "Constructor may have at most one 'this' redirection");
/**
* 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
* include at most one superinitializer in its initializer list or a compile time error occurs.
*/
- static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 99, "Constructor may have at most one 'super' initializer");
+ static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 100, "Constructor may have at most one 'super' initializer");
/**
* 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
* character @, followed by a constant expression that must be either a reference to a
* compile-time constant variable, or a call to a constant constructor.
*/
- static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 100, "Annotation creation must have arguments");
+ static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 101, "Annotation creation must have arguments");
/**
* 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1232,7 +1244,7 @@
* 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
* generative constructor named <i>S</i> (respectively <i>S.id</i>)
*/
- static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 101, "The class '%s' does not have a default constructor");
+ static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 102, "The class '%s' does not have a default constructor");
/**
* 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1241,13 +1253,13 @@
* 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
* generative constructor named <i>S</i> (respectively <i>S.id</i>)
*/
- static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 102, "The class '%s' does not have a default constructor");
+ static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 103, "The class '%s' does not have a default constructor");
/**
* 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
* no explicit type arguments appears in a place where a statement is expected.
*/
- static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 103, "A non-constant map literal without type arguments cannot be used as an expression statement");
+ static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 104, "A non-constant map literal without type arguments cannot be used as an expression statement");
/**
* 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> …
@@ -1257,45 +1269,58 @@
* s<sub>1</sub> … label<sub>n1</sub> … label<sub>njn</sub> case e<sub>n</sub>:
* s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
* compile-time constants, for all <i>1 <= k <= n</i>.
+ *
+ * TODO (jwren) For this and all other NON_CONSTANT_* error codes we need a corresponding
+ * NON_CONSTANT_*_FROM_DEFERRED_LIBRARY, see NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY or
+ * CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY.
*/
- static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 104, "Case expressions must be constant");
+ static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 105, "Case expressions must be constant");
/**
* 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
* parameter is not a compile-time constant.
*/
- static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 105, "Default values of an optional parameter must be constant");
+ static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 106, "Default values of an optional parameter must be constant");
+
+ /**
+ * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
+ * parameter is not a compile-time constant.
+ *
+ * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+ * deferred prefix.
+ */
+ static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a default parameter value");
/**
* 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
* compile-time constant.
*/
- static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 106, "'const' lists must have all constant values");
+ static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 108, "'const' lists must have all constant values");
/**
* 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
* literal is not a compile-time constant.
*/
- static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 107, "The keys in a map must be constant");
+ static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 109, "The keys in a map must be constant");
/**
* 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
* literal is not a compile-time constant.
*/
- static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 108, "The values in a 'const' map must be constant");
+ static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 110, "The values in a 'const' map must be constant");
/**
* 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
* character @, followed by a constant expression that must be either a reference to a
* compile-time constant variable, or a call to a constant constructor.
*/
- static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 109, "Annotation creation can use only 'const' constructor");
+ static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 111, "Annotation creation can use only 'const' constructor");
/**
* 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
* constant constructor must be a potentially constant expression, or a compile-time error occurs.
*/
- static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 110, "Initializer expressions in constant constructors must be constants");
+ static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 112, "Initializer expressions in constant constructors must be constants");
/**
* 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1306,7 +1331,7 @@
* @param requiredCount the expected number of required arguments
* @param argumentCount the actual number of positional arguments given
*/
- static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 111, "%d required argument(s) expected, but %d found");
+ static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 113, "%d required argument(s) expected, but %d found");
/**
* 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1314,17 +1339,17 @@
* a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
* (respectively <i>S.id</i>)
*/
- static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 112, "The generative constructor '%s' expected, but factory found");
+ static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 114, "The generative constructor '%s' expected, but factory found");
/**
* 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
*/
- static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 113, "");
+ static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 115, "");
/**
* 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
*/
- static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 114, "Optional parameters are not allowed when defining an operator");
+ static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 116, "Optional parameters are not allowed when defining an operator");
/**
* 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1332,25 +1357,25 @@
*
* @param uri the uri pointing to a non-library declaration
*/
- static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 115, "The included part '%s' must have a part-of directive");
+ static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 117, "The included part '%s' must have a part-of directive");
/**
* 14.1 Imports: It is a compile-time error if the current library declares a top-level member
* named <i>p</i>.
*/
- static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 116, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+ static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 118, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
/**
* 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
* begins with an '_' character.
*/
- static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 117, "Named optional parameters cannot start with an underscore");
+ static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 119, "Named optional parameters cannot start with an underscore");
/**
* 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
* depends on itself.
*/
- static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 118, "");
+ static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 120, "");
/**
* 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1361,13 +1386,13 @@
*
* https://code.google.com/p/dart/issues/detail?id=954
*/
- static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 119, "Cycle in redirecting generative constructors");
+ static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 121, "Cycle in redirecting generative constructors");
/**
* 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
* itself, either directly or indirectly via a sequence of redirections.
*/
- static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 120, "Cycle in redirecting factory constructors");
+ static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 122, "Cycle in redirecting factory constructors");
/**
* 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1380,7 +1405,7 @@
* @param className the name of the class that implements itself recursively
* @param strImplementsPath a string representation of the implements loop
*/
- static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 121, "'%s' cannot be a superinterface of itself: %s");
+ static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 123, "'%s' cannot be a superinterface of itself: %s");
/**
* 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1392,7 +1417,7 @@
*
* @param className the name of the class that implements itself recursively
*/
- static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 122, "'%s' cannot extend itself");
+ static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 124, "'%s' cannot extend itself");
/**
* 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1404,49 +1429,49 @@
*
* @param className the name of the class that implements itself recursively
*/
- static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 123, "'%s' cannot implement itself");
+ static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 125, "'%s' cannot implement itself");
/**
* 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
* <i>k'</i> is not a constant constructor.
*/
- static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 124, "The constructor '%s' could not be found in '%s'");
+ static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 126, "The constructor '%s' could not be found in '%s'");
/**
* 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
* <i>k'</i> is not a constant constructor.
*/
- static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 125, "The name '%s' is not a type and cannot be used in a redirected constructor");
+ static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 127, "The name '%s' is not a type and cannot be used in a redirected constructor");
/**
* 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
* <i>k'</i> is not a constant constructor.
*/
- static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 126, "Constant factory constructor cannot delegate to a non-constant constructor");
+ static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 128, "Constant factory constructor cannot delegate to a non-constant constructor");
/**
* 5 Variables: A local variable may only be referenced at a source code location that is after
* its initializer, if any, is complete, or a compile-time error occurs.
*/
- static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 127, "Local variables cannot be referenced before they are declared");
+ static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 129, "Local variables cannot be referenced before they are declared");
/**
* 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
* enclosed within a on-catch clause.
*/
- static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 128, "rethrow must be inside of a catch clause");
+ static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 130, "rethrow must be inside of a catch clause");
/**
* 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
* appears in a generative constructor.
*/
- static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 129, "Constructors cannot return a value");
+ static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 131, "Constructors cannot return a value");
/**
* 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
* another import clause.
*/
- static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 130, "The prefix of a deferred import cannot be used in other import directives");
+ static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 132, "The prefix of a deferred import cannot be used in other import directives");
/**
* 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1456,19 +1481,19 @@
* initializer list, in class Object, in a factory constructor, or in a static method or variable
* initializer.
*/
- static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 131, "Invalid context for 'super' invocation");
+ static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 133, "Invalid context for 'super' invocation");
/**
* 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
* only action is to invoke another generative constructor.
*/
- static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 132, "The redirecting constructor cannot have a 'super' initializer");
+ static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 134, "The redirecting constructor cannot have a 'super' initializer");
/**
* 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
* error if a generative constructor of class Object includes a superinitializer.
*/
- static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 133, "");
+ static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 135, "");
/**
* 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1487,19 +1512,19 @@
* @param boundingTypeName the name of the bounding type
* @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
*/
- static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 134, "'%s' does not extend '%s'");
+ static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 136, "'%s' does not extend '%s'");
/**
* 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
* compile time error.
*/
- static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 135, "Type alias cannot reference itself directly or recursively via another typedef");
+ static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 137, "Type alias cannot reference itself directly or recursively via another typedef");
/**
* 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
* scope, optionally followed by type arguments.
*/
- static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 136, "Undefined class '%s'");
+ static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 138, "Undefined class '%s'");
/**
* 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1507,7 +1532,7 @@
* a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
* (respectively <i>S.id</i>)
*/
- static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 137, "The class '%s' does not have a generative constructor '%s'");
+ static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 139, "The class '%s' does not have a generative constructor '%s'");
/**
* 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1515,7 +1540,7 @@
* a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
* (respectively <i>S.id</i>)
*/
- static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 138, "The class '%s' does not have a default generative constructor");
+ static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 140, "The class '%s' does not have a default generative constructor");
/**
* 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1527,7 +1552,7 @@
*
* @param name the name of the requested named parameter
*/
- static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 139, "The named parameter '%s' is not defined");
+ static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 141, "The named parameter '%s' is not defined");
/**
* 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1542,7 +1567,7 @@
* @param uri the URI pointing to a non-existent file
* @see #INVALID_URI
*/
- static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 140, "Target of URI does not exist: '%s'");
+ static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 142, "Target of URI does not exist: '%s'");
/**
* 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1554,7 +1579,7 @@
* 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
* not a compile-time constant, or if <i>x</i> involves string interpolation.
*/
- static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 141, "URIs cannot use string interpolation");
+ static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 143, "URIs cannot use string interpolation");
/**
* 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1567,7 +1592,7 @@
* @param expectedNumberOfParameters the number of parameters expected
* @param actualNumberOfParameters the number of parameters found in the operator declaration
*/
- static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 142, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 144, "Operator '%s' should declare exactly %d parameter(s), but %d found");
/**
* 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1575,13 +1600,13 @@
*
* @param actualNumberOfParameters the number of parameters found in the operator declaration
*/
- static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 143, "Operator '-' should declare 0 or 1 parameter, but %d found");
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 145, "Operator '-' should declare 0 or 1 parameter, but %d found");
/**
* 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
* exactly one required formal parameter <i>p</i>.
*/
- static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 144, "Setters should declare exactly one required parameter");
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 146, "Setters should declare exactly one required parameter");
static const List<CompileTimeErrorCode> values = const [
AMBIGUOUS_EXPORT,
@@ -1605,6 +1630,7 @@
CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
CONST_FORMAL_PARAMETER,
CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
+ CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY,
CONST_INSTANCE_FIELD,
CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
CONST_NOT_INITIALIZED,
@@ -1649,7 +1675,6 @@
IMPLEMENTS_REPEATED,
IMPLEMENTS_SUPER_CLASS,
IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
- IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
IMPORT_INTERNAL_LIBRARY,
IMPORT_OF_NON_LIBRARY,
INCONSISTENT_CASE_EXPRESSION_TYPES,
@@ -1659,6 +1684,7 @@
INITIALIZING_FORMAL_FOR_STATIC_FIELD,
INSTANCE_MEMBER_ACCESS_FROM_STATIC,
INVALID_ANNOTATION,
+ INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
INVALID_CONSTANT,
INVALID_CONSTRUCTOR_NAME,
INVALID_FACTORY_NAME_NOT_A_CLASS,
@@ -1690,6 +1716,7 @@
NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
NON_CONSTANT_CASE_EXPRESSION,
NON_CONSTANT_DEFAULT_VALUE,
+ NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY,
NON_CONSTANT_LIST_ELEMENT,
NON_CONSTANT_MAP_KEY,
NON_CONSTANT_MAP_VALUE,
@@ -2140,6 +2167,11 @@
static const HintCode IS_NOT_INT = const HintCode.con1('IS_NOT_INT', 10, "When compiled to JS, this test might return false when the left hand side is a double");
/**
+ * Deferred libraries shouldn't define a top level function 'loadLibrary'.
+ */
+ static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const HintCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 11, "The library '%s' defines a top-level function named 'loadLibrary' which is hidden by deferring this library");
+
+ /**
* This hint is generated anywhere where the [StaticTypeWarningCode#INVALID_ASSIGNMENT]
* would have been generated, if we used propagated information for the warnings.
*
@@ -2147,7 +2179,7 @@
* @param lhsTypeName the name of the left hand side type
* @see StaticTypeWarningCode#INVALID_ASSIGNMENT
*/
- static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 11, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+ static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 12, "A value of type '%s' cannot be assigned to a variable of type '%s'");
/**
* Generate a hint for methods or functions that have a return type, but do not have a non-void
@@ -2156,39 +2188,39 @@
*
* @param returnType the name of the declared return type
*/
- static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 12, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
+ static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 13, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
/**
* A getter with the override annotation does not override an existing getter.
*/
- static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 13, "Getter does not override an inherited getter");
+ static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 14, "Getter does not override an inherited getter");
/**
* A method with the override annotation does not override an existing method.
*/
- static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 14, "Method does not override an inherited method");
+ static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 15, "Method does not override an inherited method");
/**
* A setter with the override annotation does not override an existing setter.
*/
- static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 15, "Setter does not override an inherited setter");
+ static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 16, "Setter does not override an inherited setter");
/**
* Hint for classes that override equals, but not hashCode.
*
* @param className the name of the current class
*/
- static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 16, "The class '%s' overrides 'operator==', but not 'get hashCode'");
+ static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 17, "The class '%s' overrides 'operator==', but not 'get hashCode'");
/**
* Type checks of the type `x is! Null` should be done with `x != null`.
*/
- static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 17, "Tests for non-null should be done with '!= null'");
+ static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 18, "Tests for non-null should be done with '!= null'");
/**
* Type checks of the type `x is Null` should be done with `x == null`.
*/
- static const HintCode TYPE_CHECK_IS_NULL = const HintCode.con1('TYPE_CHECK_IS_NULL', 18, "Tests for null should be done with '== null'");
+ static const HintCode TYPE_CHECK_IS_NULL = const HintCode.con1('TYPE_CHECK_IS_NULL', 19, "Tests for null should be done with '== null'");
/**
* This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_GETTER] or
@@ -2200,7 +2232,7 @@
* @see StaticTypeWarningCode#UNDEFINED_GETTER
* @see StaticWarningCode#UNDEFINED_GETTER
*/
- static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 19, "There is no such getter '%s' in '%s'");
+ static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 20, "There is no such getter '%s' in '%s'");
/**
* This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_METHOD] would
@@ -2210,7 +2242,7 @@
* @param typeName the resolved type name that the method lookup is happening on
* @see StaticTypeWarningCode#UNDEFINED_METHOD
*/
- static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 20, "The method '%s' is not defined for the class '%s'");
+ static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 21, "The method '%s' is not defined for the class '%s'");
/**
* This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_OPERATOR]
@@ -2220,7 +2252,7 @@
* @param enclosingType the name of the enclosing type where the operator is being looked for
* @see StaticTypeWarningCode#UNDEFINED_OPERATOR
*/
- static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 21, "There is no such operator '%s' in '%s'");
+ static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 22, "There is no such operator '%s' in '%s'");
/**
* This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_SETTER] or
@@ -2232,27 +2264,27 @@
* @see StaticTypeWarningCode#UNDEFINED_SETTER
* @see StaticWarningCode#UNDEFINED_SETTER
*/
- static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 22, "There is no such setter '%s' in '%s'");
+ static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 23, "There is no such setter '%s' in '%s'");
/**
* Unnecessary cast.
*/
- static const HintCode UNNECESSARY_CAST = const HintCode.con1('UNNECESSARY_CAST', 23, "Unnecessary cast");
+ static const HintCode UNNECESSARY_CAST = const HintCode.con1('UNNECESSARY_CAST', 24, "Unnecessary cast");
/**
* Unnecessary type checks, the result is always true.
*/
- static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 24, "Unnecessary type check, the result is always false");
+ static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 25, "Unnecessary type check, the result is always false");
/**
* Unnecessary type checks, the result is always false.
*/
- static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 25, "Unnecessary type check, the result is always true");
+ static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 26, "Unnecessary type check, the result is always true");
/**
* Unused imports are imports which are never not used.
*/
- static const HintCode UNUSED_IMPORT = const HintCode.con1('UNUSED_IMPORT', 26, "Unused import");
+ static const HintCode UNUSED_IMPORT = const HintCode.con1('UNUSED_IMPORT', 27, "Unused import");
/**
* Hint for cases where the source expects a method or function to return a non-void result, but
@@ -2260,7 +2292,7 @@
*
* @param name the name of the method or function that returns void
*/
- static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 27, "The result of '%s' is being used, even though it is declared to be 'void'");
+ static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 28, "The result of '%s' is being used, even though it is declared to be 'void'");
static const List<HintCode> values = const [
ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -2274,6 +2306,7 @@
IS_INT,
IS_NOT_DOUBLE,
IS_NOT_INT,
+ IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
INVALID_ASSIGNMENT,
MISSING_RETURN,
OVERRIDE_ON_NON_OVERRIDING_GETTER,
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 34c3f4f..93a86b6 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -113,14 +113,6 @@
}
@override
- AstNode visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- if (identical(_oldNode, node.identifier)) {
- return _parser.parseSimpleIdentifier();
- }
- return _notAChild(node);
- }
-
- @override
AstNode visitArgumentList(ArgumentList node) {
if (node.arguments.contains(_oldNode)) {
return _parser.parseArgument();
@@ -1886,6 +1878,13 @@
_validateModifiersForGetterOrSetterOrMethod(modifiers);
_validateFormalParameterList(parameters);
return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
+ } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) {
+ // We have found "TypeName identifier {", and are guessing that this is a getter without the
+ // keyword 'get'.
+ _validateModifiersForGetterOrSetterOrMethod(modifiers);
+ _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET, []);
+ _currentToken = _injectToken(new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset));
+ return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
}
return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
}
@@ -3422,23 +3421,6 @@
}
/**
- * Parse an argument definition test.
- *
- * <pre>
- * argumentDefinitionTest ::=
- * '?' identifier
- * </pre>
- *
- * @return the argument definition test that was parsed
- */
- ArgumentDefinitionTest _parseArgumentDefinitionTest() {
- Token question = _expect(TokenType.QUESTION);
- SimpleIdentifier identifier = parseSimpleIdentifier();
- _reportErrorForToken(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
- return new ArgumentDefinitionTest(question, identifier);
- }
-
- /**
* Parse an assert statement.
*
* <pre>
@@ -5788,8 +5770,10 @@
}
} else if (_matches(TokenType.LT)) {
return _parseListOrMapLiteral(null);
- } else if (_matches(TokenType.QUESTION)) {
- return _parseArgumentDefinitionTest();
+ } else if (_matches(TokenType.QUESTION) && _tokenMatches(_peek(), TokenType.IDENTIFIER)) {
+ _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+ _advance();
+ return _parsePrimaryExpression();
} else if (_matchesKeyword(Keyword.VOID)) {
//
// Recover from having a return type of "void" where a return type is not expected.
@@ -7472,119 +7456,119 @@
static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
- static const ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = const ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 20, "The argument definition test ('?' operator) has been deprecated");
+ static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 20, "The 'typedef' mixin application was replaced with 'class'");
- static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
+ static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 21, "Directives must appear before any declarations");
- static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
+ static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 22, "The label %s was already used in this switch statement");
- static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
+ static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 23, "The modifier '%s' was already specified.");
- static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
+ static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 24, "Equality expression cannot be operand of another equality expression.");
- static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
+ static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 25, "Expected 'case' or 'default'");
- static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
+ static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 26, "Expected a class member");
- static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
+ static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 27, "Expected a method, getter, setter or operator declaration");
- static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
+ static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 28, "Expected a list or map literal");
- static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
+ static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 29, "Expected a string literal");
- static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
+ static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 30, "Expected to find '%s'");
- static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
+ static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 31, "Expected a type name");
- static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
+ static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 32, "Export directives must preceed part directives");
- static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
+ static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 33, "The modifier 'external' should be before the modifier 'const'");
- static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
+ static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 34, "The modifier 'external' should be before the modifier 'factory'");
- static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
+ static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 35, "The modifier 'external' should be before the modifier 'static'");
- static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
+ static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 36, "Classes cannot be declared to be 'external'");
- static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
+ static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 37, "External constructors cannot have a body");
- static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
+ static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 38, "Fields cannot be declared to be 'external'");
- static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
+ static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 39, "External getters cannot have a body");
- static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
+ static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 40, "External methods cannot have a body");
- static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
+ static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 41, "External operators cannot have a body");
- static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
+ static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 42, "External setters cannot have a body");
- static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
+ static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 43, "Type aliases cannot be declared to be 'external'");
- static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
+ static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 44, "Top-level declarations cannot be declared to be 'factory'");
- static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
+ static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 45, "A non-redirecting 'factory' constructor must have a body");
- static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
+ static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 46, "Field initializers can only be used in a constructor");
- static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
+ static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 47, "Members cannot be declared to be both 'final' and 'var'");
- static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
+ static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 48, "Classes cannot be declared to be 'final'");
- static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
+ static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 49, "A constructor cannot be declared to be 'final'");
- static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
+ static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 50, "Getters, setters and methods cannot be declared to be 'final'");
- static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
+ static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 51, "Type aliases cannot be declared to be 'final'");
- static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
+ static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 52, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
- static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+ static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 53, "Getters cannot be defined within methods or functions");
- static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
+ static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 54, "Getter should be declared without a parameter list");
- static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
+ static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 55, "Illegal assignment to non-assignable expression");
- static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
+ static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 56, "The extends clause must be before the implements clause");
- static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
+ static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 57, "The with clause must be before the implements clause");
- static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
+ static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 58, "Import directives must preceed part directives");
- static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
+ static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 59, "The loop variable in a for-each loop cannot be initialized");
- static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
+ static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 60, "The escape sequence '%s' is not a valid code point");
- static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
+ static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 61, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
- static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 62, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+ static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 62, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
- static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+ static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 63, "The string '%s' is not a valid operator");
- static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
+ static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 64, "The operator '%s' cannot be used with 'super'");
- static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
+ static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 65, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
- static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 66, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+ static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 66, "The library directive must appear before all other directives");
- static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
+ static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 67, "Local function declarations cannot specify any modifier");
- static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
+ static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 68, "Missing selector such as \".<identifier>\" or \"[0]\"");
- static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
+ static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 69, "A try statement must have either a catch or finally clause");
- static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
+ static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 70, "A class definition must have a body, even if it is empty");
- static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
+ static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 71, "The closing parenthesis is missing");
- static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
+ static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 72, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
- static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+ static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 73, "Throw expressions must compute the object to be thrown");
- static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
+ static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 74, "A function body must be provided");
- static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
+ static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 75, "Functions must have an explicit list of parameters");
- static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
+ static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 76, "Getters must have the keyword 'get' before the getter name");
static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
@@ -7719,7 +7703,6 @@
CONSTRUCTOR_WITH_RETURN_TYPE,
CONTINUE_OUTSIDE_OF_LOOP,
CONTINUE_WITHOUT_LABEL_IN_CASE,
- DEPRECATED_ARGUMENT_DEFINITION_TEST,
DEPRECATED_CLASS_TYPE_ALIAS,
DIRECTIVE_AFTER_DECLARATION,
DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
@@ -7776,6 +7759,7 @@
MISSING_EXPRESSION_IN_THROW,
MISSING_FUNCTION_BODY,
MISSING_FUNCTION_PARAMETERS,
+ MISSING_GET,
MISSING_IDENTIFIER,
MISSING_KEYWORD_OPERATOR,
MISSING_NAME_IN_LIBRARY_DIRECTIVE,
@@ -7936,17 +7920,6 @@
}
@override
- bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
- if (javaBooleanAnd(_isEqualTokens(node.question, toNode.question), _isEqualNodes(node.identifier, toNode.identifier))) {
- toNode.propagatedType = node.propagatedType;
- toNode.staticType = node.staticType;
- return true;
- }
- return false;
- }
-
- @override
bool visitArgumentList(ArgumentList node) {
ArgumentList toNode = this._toNode as ArgumentList;
return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
@@ -8938,7 +8911,6 @@
'matchesString_1': new MethodTrampoline(1, (Parser target, arg0) => target._matchesString(arg0)),
'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target._optional(arg0)),
'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target._parseAdditiveExpression()),
- 'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target._parseArgumentDefinitionTest()),
'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target._parseAssertStatement()),
'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseAssignableExpression(arg0)),
'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseAssignableSelector(arg0, arg1)),
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index a71751a9..f106655 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -744,6 +744,12 @@
@override
Object visitImportDirective(ImportDirective node) {
_checkForDeprecatedMemberUse(node.uriElement, node);
+ ImportElement importElement = node.element;
+ if (importElement != null) {
+ if (importElement.isDeferred) {
+ _checkForLoadLibraryFunction(node, importElement);
+ }
+ }
return super.visitImportDirective(node);
}
@@ -1065,8 +1071,8 @@
if (lhs == null || rhs == null) {
return false;
}
- VariableElement leftElement = ErrorVerifier.getVariableElement(lhs);
- DartType leftType = (leftElement == null) ? ErrorVerifier.getStaticType(lhs) : leftElement.type;
+ VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
+ DartType leftType = (leftVariableElement == null) ? ErrorVerifier.getStaticType(lhs) : leftVariableElement.type;
DartType staticRightType = ErrorVerifier.getStaticType(rhs);
if (!staticRightType.isAssignableTo(leftType)) {
// The warning was generated on this rhs
@@ -1079,8 +1085,12 @@
String leftName = leftType.displayName;
String rightName = bestRightType.displayName;
if (leftName == rightName) {
- leftName = ErrorVerifier.getExtendedDisplayName(leftType);
- rightName = ErrorVerifier.getExtendedDisplayName(bestRightType);
+ Element leftElement = leftType.element;
+ Element rightElement = bestRightType.element;
+ if (leftElement != null && rightElement != null) {
+ leftName = leftElement.extendedDisplayName;
+ rightName = rightElement.extendedDisplayName;
+ }
}
_errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
return true;
@@ -1090,6 +1100,27 @@
}
/**
+ * Check that the imported library does not define a loadLibrary function. The import has already
+ * been determined to be deferred when this is called.
+ *
+ * @param node the import directive to evaluate
+ * @param importElement the [ImportElement] retrieved from the node
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
+ */
+ bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
+ LibraryElement importedLibrary = importElement.importedLibrary;
+ if (importedLibrary == null) {
+ return false;
+ }
+ if (importedLibrary.hasLoadLibraryFunction) {
+ _errorReporter.reportErrorForNode(HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Generate a hint for functions or methods that have a return type, but do not have a return
* statement on all branches. At the end of blocks with no return, Dart implicitly returns
* `null`, avoiding these implicit returns is considered a best practice.
@@ -1462,8 +1493,16 @@
//
result = _validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
element.evaluationResult = result;
+ return null;
} else if (result is ErrorResult) {
_reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+ return null;
+ }
+ DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
+ initializer.accept(referenceDetector);
+ if (referenceDetector.result) {
+ _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY, initializer, []);
+ return null;
}
}
return null;
@@ -1537,6 +1576,11 @@
EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
VariableElementImpl element = parameter.element as VariableElementImpl;
element.evaluationResult = result;
+ DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
+ defaultValue.accept(referenceDetector);
+ if (result is ValidResult && referenceDetector.result) {
+ _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY, defaultValue, []);
+ }
}
}
}
@@ -1771,19 +1815,7 @@
@override
Object visitBlock(Block node) {
NodeList<Statement> statements = node.statements;
- int size = statements.length;
- for (int i = 0; i < size; i++) {
- Statement currentStatement = statements[i];
- _safelyVisit(currentStatement);
- if (currentStatement is ReturnStatement && i != size - 1) {
- Statement nextStatement = statements[i + 1];
- Statement lastStatement = statements[size - 1];
- int offset = nextStatement.offset;
- int length = lastStatement.end - offset;
- _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
- return null;
- }
- }
+ _checkForDeadStatementsInNodeList(statements);
return null;
}
@@ -1837,6 +1869,18 @@
}
@override
+ Object visitSwitchCase(SwitchCase node) {
+ _checkForDeadStatementsInNodeList(node.statements);
+ return super.visitSwitchCase(node);
+ }
+
+ @override
+ Object visitSwitchDefault(SwitchDefault node) {
+ _checkForDeadStatementsInNodeList(node.statements);
+ return super.visitSwitchDefault(node);
+ }
+
+ @override
Object visitTryStatement(TryStatement node) {
_safelyVisit(node.body);
_safelyVisit(node.finallyBlock);
@@ -1854,10 +1898,10 @@
if (currentType.isObject) {
// Found catch clause clause that has Object as an exception type, this is equivalent to
// having a catch clause that doesn't have an exception type, visit the block, but
- // generate an error on any following catch clauses (and don't visit them).
+ // generate an error on any following catch clauses (and don't visit them).
_safelyVisit(catchClause);
if (i + 1 != numOfCatchClauses) {
- // this catch clause is not the last in the try statement
+ // this catch clause is not the last in the try statement
CatchClause nextCatchClause = catchClauses[i + 1];
CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
int offset = nextCatchClause.offset;
@@ -1879,7 +1923,7 @@
}
_safelyVisit(catchClause);
} else {
- // Found catch clause clause that doesn't have an exception type, visit the block, but
+ // Found catch clause clause that doesn't have an exception type, visit the block, but
// generate an error on any following catch clauses (and don't visit them).
_safelyVisit(catchClause);
if (i + 1 != numOfCatchClauses) {
@@ -1915,6 +1959,30 @@
}
/**
+ * Given some [NodeList] of [Statement]s, from either a [Block] or
+ * [SwitchMember], this loops through the list in reverse order searching for statements
+ * after a return, unlabeled break or unlabeled continue statement to mark them as dead code.
+ *
+ * @param statements some ordered list of statements in a [Block] or [SwitchMember]
+ */
+ void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) {
+ int size = statements.length;
+ for (int i = 0; i < size; i++) {
+ Statement currentStatement = statements[i];
+ _safelyVisit(currentStatement);
+ bool returnOrBreakingStatement = currentStatement is ReturnStatement || (currentStatement is BreakStatement && currentStatement.label == null) || (currentStatement is ContinueStatement && currentStatement.label == null);
+ if (returnOrBreakingStatement && i != size - 1) {
+ Statement nextStatement = statements[i + 1];
+ Statement lastStatement = statements[size - 1];
+ int offset = nextStatement.offset;
+ int length = lastStatement.end - offset;
+ _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
+ return;
+ }
+ }
+ }
+
+ /**
* Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
* `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
* expression is not a constant boolean value.
@@ -1934,15 +2002,24 @@
}
// Don't consider situations where we could evaluate to a constant boolean expression with the
// ConstantVisitor
- // else {
- // EvaluationResultImpl result = expression.accept(new ConstantVisitor());
- // if (result == ValidResult.RESULT_TRUE) {
- // return ValidResult.RESULT_TRUE;
- // } else if (result == ValidResult.RESULT_FALSE) {
- // return ValidResult.RESULT_FALSE;
- // }
- // return null;
- // }
+//
+ // else {
+//
+ // EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+//
+ // if (result == ValidResult.RESULT_TRUE) {
+//
+ // return ValidResult.RESULT_TRUE;
+//
+ // } else if (result == ValidResult.RESULT_FALSE) {
+//
+ // return ValidResult.RESULT_FALSE;
+//
+ // }
+//
+ // return null;
+//
+ // }
return null;
}
@@ -4431,18 +4508,6 @@
TypePromotionManager _promoteManager;
/**
- * The name of the method that can be implemented by a class to allow its instances to be invoked
- * as if they were a function.
- */
- static String CALL_METHOD_NAME = "call";
-
- /**
- * The name of the method that will be invoked if an attempt is made to invoke an undefined method
- * on an object.
- */
- static String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
-
- /**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
*
* @param resolver the resolver driving this participant
@@ -4865,7 +4930,7 @@
if (target == null) {
staticElement = _resolveInvokedElement(methodName);
propagatedElement = null;
- } else if (_isDeferredPrefix(target) && methodName.name == FunctionElement.LOAD_LIBRARY_NAME) {
+ } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(target)) {
LibraryElement importedLibrary = _getImportedLibrary(target);
methodName.staticElement = importedLibrary.loadLibraryFunction;
return null;
@@ -4965,7 +5030,7 @@
targetType = _getStaticType(target);
}
}
- if (targetType != null && targetType.isDartCoreFunction && methodName.name == CALL_METHOD_NAME) {
+ if (targetType != null && targetType.isDartCoreFunction && methodName.name == FunctionElement.CALL_METHOD_NAME) {
// TODO(brianwilkerson) Can we ever resolve the function being invoked?
//resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
return null;
@@ -5025,7 +5090,15 @@
SimpleIdentifier prefix = node.prefix;
SimpleIdentifier identifier = node.identifier;
//
- // First, check to see whether the prefix is really a prefix.
+ // First, check the "lib.loadLibrary" case
+ //
+ if (identifier.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(prefix)) {
+ LibraryElement importedLibrary = _getImportedLibrary(prefix);
+ identifier.staticElement = importedLibrary.loadLibraryFunction;
+ return null;
+ }
+ //
+ // Check to see whether the prefix is really a prefix.
//
Element prefixElement = prefix.staticElement;
if (prefixElement is PrefixElement) {
@@ -5431,7 +5504,7 @@
if (getterType != null) {
DartType getterReturnType = getterType.returnType;
if (getterReturnType is InterfaceType) {
- MethodElement callMethod = getterReturnType.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+ MethodElement callMethod = getterReturnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
if (callMethod != null) {
return _resolveArgumentsToFunction(false, argumentList, callMethod);
}
@@ -5453,7 +5526,7 @@
return _resolveArgumentsToParameters(false, argumentList, parameters);
} else if (type is InterfaceType) {
// "call" invocation
- MethodElement callMethod = type.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+ MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
if (callMethod != null) {
List<ParameterElement> parameters = callMethod.parameters;
return _resolveArgumentsToParameters(false, argumentList, parameters);
@@ -5639,7 +5712,7 @@
if (classElement.isProxy && type.isSubtypeOf(_resolver.typeProvider.functionType)) {
return true;
}
- MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+ MethodElement methodElement = classElement.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
return methodElement != null;
}
return false;
@@ -6811,24 +6884,6 @@
*/
class ErrorVerifier extends RecursiveAstVisitor<Object> {
/**
- * Return a display name for the given type that includes the path to the compilation unit in
- * which the type is defined.
- *
- * @param type the type for which an extended display name is to be returned
- * @return a display name that can help distiguish between two types with the same name
- */
- static String getExtendedDisplayName(DartType type) {
- Element element = type.element;
- if (element != null) {
- Source source = element.source;
- if (source != null) {
- return "${type.displayName} (${source.fullName})";
- }
- }
- return type.displayName;
- }
-
- /**
* Return the static type of the given expression that is to be used for type analysis.
*
* @param expression the expression whose type is to be returned
@@ -7090,6 +7145,12 @@
}
@override
+ Object visitAnnotation(Annotation node) {
+ _checkForInvalidAnnotationFromDeferredLibrary(node);
+ return super.visitAnnotation(node);
+ }
+
+ @override
Object visitArgumentList(ArgumentList node) {
_checkForArgumentTypesNotAssignableInList(node);
return super.visitArgumentList(node);
@@ -7104,13 +7165,15 @@
@override
Object visitAssignmentExpression(AssignmentExpression node) {
sc.TokenType operatorType = node.operator.type;
+ Expression lhs = node.leftHandSide;
+ Expression rhs = node.rightHandSide;
if (operatorType == sc.TokenType.EQ) {
- _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+ _checkForInvalidAssignment(lhs, rhs);
} else {
- _checkForInvalidCompoundAssignment(node);
+ _checkForInvalidCompoundAssignment(node, lhs, rhs);
}
- _checkForAssignmentToFinal(node.leftHandSide);
- _checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
+ _checkForAssignmentToFinal(lhs);
+ _checkForArgumentTypeNotAssignableForArgument(rhs);
return super.visitAssignmentExpression(node);
}
@@ -7192,9 +7255,8 @@
}
}
// initialize initialFieldElementsMap
- ClassElement classElement = node.element;
- if (classElement != null) {
- List<FieldElement> fieldElements = classElement.fields;
+ if (_enclosingClass != null) {
+ List<FieldElement> fieldElements = _enclosingClass.fields;
_initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
for (FieldElement fieldElement in fieldElements) {
if (!fieldElement.isSynthetic) {
@@ -7219,12 +7281,13 @@
ClassElement outerClassElement = _enclosingClass;
try {
_enclosingClass = node.element;
+ ImplementsClause implementsClause = node.implementsClause;
// Only check for all of the inheritance logic around clauses if there isn't an error code
// such as "Cannot extend double" already on the class.
- if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(node.implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
+ if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
_checkForExtendsDeferredClassInTypeAlias(node);
- _checkForImplementsDeferredClass(node.implementsClause);
- _checkForRecursiveInterfaceInheritance(node.element);
+ _checkForImplementsDeferredClass(implementsClause);
+ _checkForRecursiveInterfaceInheritance(_enclosingClass);
_checkForTypeAliasCannotReferenceItself_mixin(node);
_checkForNonAbstractClassInheritsAbstractMember(node.name);
}
@@ -7260,20 +7323,21 @@
Object visitConstructorDeclaration(ConstructorDeclaration node) {
ExecutableElement outerFunction = _enclosingFunction;
try {
- _enclosingFunction = node.element;
+ ConstructorElement constructorElement = node.element;
+ _enclosingFunction = constructorElement;
_isEnclosingConstructorConst = node.constKeyword != null;
- _checkForConstConstructorWithNonFinalField(node);
+ _checkForConstConstructorWithNonFinalField(node, constructorElement);
_checkForConstConstructorWithNonConstSuper(node);
- _checkForConflictingConstructorNameAndMember(node);
+ _checkForConflictingConstructorNameAndMember(node, constructorElement);
_checkForAllFinalInitializedErrorCodes(node);
_checkForRedirectingConstructorErrorCodes(node);
_checkForMultipleSuperInitializers(node);
- _checkForRecursiveConstructorRedirect(node);
- if (!_checkForRecursiveFactoryRedirect(node)) {
+ _checkForRecursiveConstructorRedirect(node, constructorElement);
+ if (!_checkForRecursiveFactoryRedirect(node, constructorElement)) {
_checkForAllRedirectConstructorErrorCodes(node);
}
_checkForUndefinedConstructorInInitializerImplicit(node);
- _checkForRedirectToNonConstConstructor(node);
+ _checkForRedirectToNonConstConstructor(node, constructorElement);
_checkForReturnInGenerativeConstructor(node);
return super.visitConstructorDeclaration(node);
} finally {
@@ -7286,8 +7350,10 @@
Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
_isInConstructorInitializer = true;
try {
- _checkForInvalidField(node);
- _checkForFieldInitializerNotAssignable(node);
+ SimpleIdentifier fieldName = node.fieldName;
+ Element staticElement = fieldName.staticElement;
+ _checkForInvalidField(node, fieldName, staticElement);
+ _checkForFieldInitializerNotAssignable(node, staticElement);
return super.visitConstructorFieldInitializer(node);
} finally {
_isInConstructorInitializer = false;
@@ -7323,8 +7389,9 @@
Object visitExportDirective(ExportDirective node) {
ExportElement exportElement = node.element;
if (exportElement != null) {
- _checkForAmbiguousExport(node, exportElement);
- _checkForExportDuplicateLibraryName(node, exportElement);
+ LibraryElement exportedLibrary = exportElement.exportedLibrary;
+ _checkForAmbiguousExport(node, exportElement, exportedLibrary);
+ _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
_checkForExportInternalLibrary(node, exportElement);
}
return super.visitExportDirective(node);
@@ -7377,18 +7444,18 @@
methodName = identifier.name;
}
_enclosingFunction = node.element;
+ TypeName returnType = node.returnType;
if (node.isSetter || node.isGetter) {
_checkForMismatchedAccessorTypes(node, methodName);
if (node.isSetter) {
FunctionExpression functionExpression = node.functionExpression;
if (functionExpression != null) {
- _checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
+ _checkForWrongNumberOfParametersForSetter(identifier, functionExpression.parameters);
}
- TypeName returnType = node.returnType;
_checkForNonVoidReturnTypeForSetter(returnType);
}
}
- _checkForTypeAnnotationDeferredClass(node.returnType);
+ _checkForTypeAnnotationDeferredClass(returnType);
return super.visitFunctionDeclaration(node);
} finally {
_enclosingFunction = outerFunction;
@@ -7454,9 +7521,6 @@
if (importElement != null) {
_checkForImportDuplicateLibraryName(node, importElement);
_checkForImportInternalLibrary(node, importElement);
- if (importElement.isDeferred) {
- _checkForLoadLibraryFunction(node, importElement);
- }
}
return super.visitImportDirective(node);
}
@@ -7479,11 +7543,11 @@
_checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
if (_isInConstInstanceCreation) {
_checkForConstWithNonConst(node);
- _checkForConstWithUndefinedConstructor(node);
- _checkForConstWithTypeParametersInCreation(node);
+ _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
+ _checkForConstWithTypeParameters(typeName);
_checkForConstDeferredClass(node, constructorName, typeName);
} else {
- _checkForNewWithUndefinedConstructor(node);
+ _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
}
}
return super.visitInstanceCreationExpression(node);
@@ -7494,17 +7558,17 @@
@override
Object visitListLiteral(ListLiteral node) {
- if (node.constKeyword != null) {
- TypeArgumentList typeArguments = node.typeArguments;
- if (typeArguments != null) {
+ TypeArgumentList typeArguments = node.typeArguments;
+ if (typeArguments != null) {
+ if (node.constKeyword != null) {
NodeList<TypeName> arguments = typeArguments.arguments;
if (arguments.length != 0) {
_checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
}
}
+ _checkForExpectedOneListTypeArgument(node, typeArguments);
+ _checkForListElementTypeNotAssignable(node, typeArguments);
}
- _checkForExpectedOneListTypeArgument(node);
- _checkForListElementTypeNotAssignable(node);
return super.visitListLiteral(node);
}
@@ -7518,10 +7582,10 @@
_checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
}
}
+ _checkExpectedTwoMapTypeArguments(typeArguments);
+ _checkForMapTypeNotAssignable(node, typeArguments);
}
- _checkExpectedTwoMapTypeArguments(typeArguments);
_checkForNonConstMapAsExpressionStatement(node);
- _checkForMapTypeNotAssignable(node);
_checkForConstMapKeyExpressionTypeImplementsEquals(node);
return super.visitMapLiteral(node);
}
@@ -7713,6 +7777,15 @@
}
@override
+ Object visitTypeArgumentList(TypeArgumentList node) {
+ NodeList<TypeName> list = node.arguments;
+ for (TypeName typeName in list) {
+ _checkForTypeAnnotationDeferredClass(typeName);
+ }
+ return super.visitTypeArgumentList(node);
+ }
+
+ @override
Object visitTypeName(TypeName node) {
_checkForTypeArgumentNotMatchingBounds(node);
_checkForTypeParameterReferencedByStatic(node);
@@ -7772,15 +7845,11 @@
/**
* This verifies if the passed map literal has type arguments then there is exactly two.
*
- * @param node the map literal to evaluate
+ * @param typeArguments the type arguments, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
*/
bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
- // has type arguments
- if (typeArguments == null) {
- return false;
- }
// check number of type arguments
int num = typeArguments.arguments.length;
if (num == 2) {
@@ -8394,12 +8463,11 @@
* @param node the export directive node to report problem on
* @param exportElement the [ExportElement] retrieved from the node, if the element in the
* node was `null`, then this method is not called
+ * @param exportedLibrary the library element containing the exported element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
*/
- bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
- // prepare exported library
- LibraryElement exportedLibrary = exportElement.exportedLibrary;
+ bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
if (exportedLibrary == null) {
return false;
}
@@ -8688,14 +8756,14 @@
* members of the same class.
*
* @param node the constructor declaration to evaluate
+ * @param constructorElement the constructor element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
* @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
* @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
* @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
*/
- bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
- ConstructorElement constructorElement = node.element;
+ bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node, ConstructorElement constructorElement) {
SimpleIdentifier constructorName = node.name;
String name = constructorElement.name;
ClassElement classElement = constructorElement.enclosingElement;
@@ -9091,15 +9159,15 @@
* instance variable.
*
* @param node the constructor declaration to evaluate
+ * @param constructorElement the constructor element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
*/
- bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
+ bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node, ConstructorElement constructorElement) {
if (!_isEnclosingConstructorConst) {
return false;
}
// check if there is non-final field
- ConstructorElement constructorElement = node.element;
ClassElement classElement = constructorElement.enclosingElement;
if (!classElement.hasNonFinalField) {
return false;
@@ -9114,8 +9182,8 @@
* type.
*
* @param node the instance creation expression to evaluate
- * @param constructorName the constructor name from the instance creation expression
- * @param typeName the type name off of the constructor name
+ * @param constructorName the constructor name, always non-`null`
+ * @param typeName the name of the type defining the constructor, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_DEFERRED_CLASS
*/
@@ -9264,51 +9332,24 @@
}
/**
- * This verifies that the passed 'const' instance creation expression does not reference any type
- * parameters.
- *
- * This method assumes that the instance creation was tested to be 'const' before being called.
- *
- * @param node the instance creation expression to evaluate
- * @return `true` if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
- */
- bool _checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
- ConstructorName constructorName = node.constructorName;
- if (constructorName == null) {
- return false;
- }
- TypeName typeName = constructorName.type;
- return _checkForConstWithTypeParameters(typeName);
- }
-
- /**
* This verifies that if the passed 'const' instance creation expression is being invoked on the
* resolved constructor.
*
* This method assumes that the instance creation was tested to be 'const' before being called.
*
* @param node the instance creation expression to evaluate
+ * @param constructorName the constructor name, always non-`null`
+ * @param typeName the name of the type defining the constructor, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
* @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
*/
- bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
+ bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
// OK if resolved
if (node.staticElement != null) {
return false;
}
- // prepare constructor name
- ConstructorName constructorName = node.constructorName;
- if (constructorName == null) {
- return false;
- }
- // prepare class name
- TypeName type = constructorName.type;
- if (type == null) {
- return false;
- }
- Identifier className = type.name;
+ Identifier className = typeName.name;
// report as named or default constructor absence
SimpleIdentifier name = constructorName.name;
if (name != null) {
@@ -9455,8 +9496,17 @@
if (inheritedMember.isStatic) {
return false;
}
+ // determine the display name, use the extended display name if the enclosing class of the
+ // inherited member is in a different source
+ String displayName;
+ Element enclosingElement = inheritedMember.enclosingElement;
+ if (enclosingElement.source == _enclosingClass.source) {
+ displayName = enclosingElement.displayName;
+ } else {
+ displayName = enclosingElement.extendedDisplayName;
+ }
// report problem
- _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+ _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, displayName]);
return true;
}
@@ -9464,15 +9514,11 @@
* This verifies if the passed list literal has type arguments then there is exactly one.
*
* @param node the list literal to evaluate
+ * @param typeArguments the type arguments, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
*/
- bool _checkForExpectedOneListTypeArgument(ListLiteral node) {
- // prepare type arguments
- TypeArgumentList typeArguments = node.typeArguments;
- if (typeArguments == null) {
- return false;
- }
+ bool _checkForExpectedOneListTypeArgument(ListLiteral node, TypeArgumentList typeArguments) {
// check number of type arguments
int num = typeArguments.arguments.length;
if (num == 1) {
@@ -9489,28 +9535,27 @@
* @param node the export directive to evaluate
* @param exportElement the [ExportElement] retrieved from the node, if the element in the
* node was `null`, then this method is not called
+ * @param exportedLibrary the library element containing the exported element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
*/
- bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
- // prepare exported library
- LibraryElement nodeLibrary = exportElement.exportedLibrary;
- if (nodeLibrary == null) {
+ bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
+ if (exportedLibrary == null) {
return false;
}
- String name = nodeLibrary.name;
+ String name = exportedLibrary.name;
// check if there is other exported library with the same name
LibraryElement prevLibrary = _nameToExportElement[name];
if (prevLibrary != null) {
- if (prevLibrary != nodeLibrary) {
+ if (prevLibrary != exportedLibrary) {
_errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
prevLibrary.definingCompilationUnit.displayName,
- nodeLibrary.definingCompilationUnit.displayName,
+ exportedLibrary.definingCompilationUnit.displayName,
name]);
return true;
}
} else {
- _nameToExportElement[name] = nodeLibrary;
+ _nameToExportElement[name] = exportedLibrary;
}
// OK
return false;
@@ -9676,13 +9721,14 @@
* initializer expression types.
*
* @param node the constructor field initializer to test
+ * @param staticElement the static element from the name in the
+ * [ConstructorFieldInitializer]
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
* @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
*/
- bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
+ bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node, Element staticElement) {
// prepare field element
- Element staticElement = node.fieldName.staticElement;
if (staticElement is! FieldElement) {
return false;
}
@@ -10076,6 +10122,24 @@
}
/**
+ * This verifies that the passed [Annotation] isn't defined in a deferred library.
+ *
+ * @param node the [Annotation]
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+ */
+ bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation node) {
+ Identifier nameIdentifier = node.name;
+ if (nameIdentifier is PrefixedIdentifier) {
+ if (nameIdentifier.isDeferred) {
+ _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY, node.name, []);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* This verifies that the passed left hand side and right hand side represent a valid assignment.
*
* @param lhs the left hand side expression
@@ -10087,15 +10151,19 @@
if (lhs == null || rhs == null) {
return false;
}
- VariableElement leftElement = getVariableElement(lhs);
- DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+ VariableElement leftVariableElement = getVariableElement(lhs);
+ DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
DartType staticRightType = getStaticType(rhs);
if (!staticRightType.isAssignableTo(leftType)) {
String leftName = leftType.displayName;
String rightName = staticRightType.displayName;
if (leftName == rightName) {
- leftName = getExtendedDisplayName(leftType);
- rightName = getExtendedDisplayName(staticRightType);
+ Element leftElement = leftType.element;
+ Element rightElement = staticRightType.element;
+ if (leftElement != null && rightElement != null) {
+ leftName = leftElement.extendedDisplayName;
+ rightName = rightElement.extendedDisplayName;
+ }
}
_errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
return true;
@@ -10108,16 +10176,17 @@
* assignment is valid.
*
* @param node the assignment expression being tested
+ * @param lhs the left hand side expression
+ * @param rhs the right hand side expression
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#INVALID_ASSIGNMENT
*/
- bool _checkForInvalidCompoundAssignment(AssignmentExpression node) {
- Expression lhs = node.leftHandSide;
+ bool _checkForInvalidCompoundAssignment(AssignmentExpression node, Expression lhs, Expression rhs) {
if (lhs == null) {
return false;
}
- VariableElement leftElement = getVariableElement(lhs);
- DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+ VariableElement leftVariableElement = getVariableElement(lhs);
+ DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
MethodElement invokedMethod = node.staticElement;
if (invokedMethod == null) {
return false;
@@ -10130,10 +10199,14 @@
String leftName = leftType.displayName;
String rightName = rightType.displayName;
if (leftName == rightName) {
- leftName = getExtendedDisplayName(leftType);
- rightName = getExtendedDisplayName(rightType);
+ Element leftElement = leftType.element;
+ Element rightElement = rightType.element;
+ if (leftElement != null && rightElement != null) {
+ leftName = leftElement.extendedDisplayName;
+ rightName = rightElement.extendedDisplayName;
+ }
}
- _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
+ _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
return true;
}
return false;
@@ -10143,10 +10216,11 @@
* Check the given initializer to ensure that the field being initialized is a valid field.
*
* @param node the field initializer being checked
+ * @param fieldName the field name from the [ConstructorFieldInitializer]
+ * @param staticElement the static element from the name in the
+ * [ConstructorFieldInitializer]
*/
- void _checkForInvalidField(ConstructorFieldInitializer node) {
- SimpleIdentifier fieldName = node.fieldName;
- Element staticElement = fieldName.staticElement;
+ void _checkForInvalidField(ConstructorFieldInitializer node, SimpleIdentifier fieldName, Element staticElement) {
if (staticElement is FieldElement) {
FieldElement fieldElement = staticElement;
if (fieldElement.isSynthetic) {
@@ -10201,21 +10275,17 @@
* type.
*
* @param node the list literal to evaluate
+ * @param typeArguments the type arguments, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
* @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
*/
- bool _checkForListElementTypeNotAssignable(ListLiteral node) {
- // Prepare list element type.
- TypeArgumentList typeArgumentList = node.typeArguments;
- if (typeArgumentList == null) {
+ bool _checkForListElementTypeNotAssignable(ListLiteral node, TypeArgumentList typeArguments) {
+ NodeList<TypeName> typeNames = typeArguments.arguments;
+ if (typeNames.length < 1) {
return false;
}
- NodeList<TypeName> typeArguments = typeArgumentList.arguments;
- if (typeArguments.length < 1) {
- return false;
- }
- DartType listElementType = typeArguments[0].type;
+ DartType listElementType = typeNames[0].type;
// Prepare problem to report.
ErrorCode errorCode;
if (node.constKeyword != null) {
@@ -10232,48 +10302,25 @@
}
/**
- * Check that the imported library does not define a loadLibrary function.
- *
- * @param node the import directive to evaluate
- * @param importElement the [ImportElement] retrieved from the node
- * @return `true` if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
- */
- bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
- LibraryElement importedLibrary = importElement.importedLibrary;
- if (importedLibrary == null) {
- return false;
- }
- if (importedLibrary.hasLoadLibraryFunction) {
- _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
- return true;
- }
- return false;
- }
-
- /**
* This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
* key/value types specified in the type arguments.
*
* @param node the map literal to evaluate
+ * @param typeArguments the type arguments, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
* @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
* @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
* @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
*/
- bool _checkForMapTypeNotAssignable(MapLiteral node) {
+ bool _checkForMapTypeNotAssignable(MapLiteral node, TypeArgumentList typeArguments) {
// Prepare maps key/value types.
- TypeArgumentList typeArgumentList = node.typeArguments;
- if (typeArgumentList == null) {
+ NodeList<TypeName> typeNames = typeArguments.arguments;
+ if (typeNames.length < 2) {
return false;
}
- NodeList<TypeName> typeArguments = typeArgumentList.arguments;
- if (typeArguments.length < 2) {
- return false;
- }
- DartType keyType = typeArguments[0].type;
- DartType valueType = typeArguments[1].type;
+ DartType keyType = typeNames[0].type;
+ DartType valueType = typeNames[1].type;
// Prepare problem to report.
ErrorCode keyErrorCode;
ErrorCode valueErrorCode;
@@ -10524,25 +10571,18 @@
* This method assumes that the instance creation was tested to be 'new' before being called.
*
* @param node the instance creation expression to evaluate
+ * @param constructorName the constructor name, always non-`null`
+ * @param typeName the name of the type defining the constructor, always non-`null`
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
*/
- bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
+ bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
// OK if resolved
if (node.staticElement != null) {
return false;
}
- // prepare constructor name
- ConstructorName constructorName = node.constructorName;
- if (constructorName == null) {
- return false;
- }
// prepare class name
- TypeName type = constructorName.type;
- if (type == null) {
- return false;
- }
- Identifier className = type.name;
+ Identifier className = typeName.name;
// report as named or default constructor absence
SimpleIdentifier name = constructorName.name;
if (name != null) {
@@ -10616,7 +10656,7 @@
// From Spec: It is a static warning if a concrete class does not have an implementation for
// a method in any of its superinterfaces unless it declares its own noSuchMethod
// method (7.10).
- if (methodName == ElementResolver.NO_SUCH_METHOD_METHOD_NAME) {
+ if (methodName == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
return false;
}
}
@@ -10917,10 +10957,11 @@
* references itself directly or indirectly.
*
* @param node the constructor declaration to evaluate
+ * @param constructorElement the constructor element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
*/
- bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
+ bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
// we check generative constructor here
if (node.factoryKeyword != null) {
return false;
@@ -10929,8 +10970,7 @@
for (ConstructorInitializer initializer in node.initializers) {
if (initializer is RedirectingConstructorInvocation) {
// OK if no cycle
- ConstructorElement element = node.element;
- if (!_hasRedirectingFactoryConstructorCycle(element)) {
+ if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
return false;
}
// report error
@@ -10947,18 +10987,18 @@
* itself directly or indirectly.
*
* @param node the constructor declaration to evaluate
+ * @param constructorElement the constructor element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
*/
- bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
+ bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
// prepare redirected constructor
ConstructorName redirectedConstructorNode = node.redirectedConstructor;
if (redirectedConstructorNode == null) {
return false;
}
// OK if no cycle
- ConstructorElement element = node.element;
- if (!_hasRedirectingFactoryConstructorCycle(element)) {
+ if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
return false;
}
// report error
@@ -11040,26 +11080,26 @@
* itself directly or indirectly.
*
* @param node the constructor declaration to evaluate
+ * @param constructorElement the constructor element
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
*/
- bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
+ bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node, ConstructorElement constructorElement) {
// prepare redirected constructor
ConstructorName redirectedConstructorNode = node.redirectedConstructor;
if (redirectedConstructorNode == null) {
return false;
}
// prepare element
- ConstructorElement element = node.element;
- if (element == null) {
+ if (constructorElement == null) {
return false;
}
// OK, it is not 'const'
- if (!element.isConst) {
+ if (!constructorElement.isConst) {
return false;
}
// prepare redirected constructor
- ConstructorElement redirectedConstructor = element.redirectedConstructor;
+ ConstructorElement redirectedConstructor = constructorElement.redirectedConstructor;
if (redirectedConstructor == null) {
return false;
}
@@ -11292,7 +11332,9 @@
DartType argType = argTypeName.type;
DartType boundType = boundingElts[i].bound;
if (argType != null && boundType != null) {
- boundType = boundType.substitute2(typeArguments, typeParameters);
+ if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+ boundType = boundType.substitute2(typeArguments, typeParameters);
+ }
if (!argType.isSubtypeOf(boundType)) {
ErrorCode errorCode;
if (_isInConstInstanceCreation) {
@@ -11573,7 +11615,7 @@
return false;
}
// If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
- if (classElement.getMethod(ElementResolver.NO_SUCH_METHOD_METHOD_NAME) != null) {
+ if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) != null) {
return false;
}
ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
@@ -11754,7 +11796,7 @@
} else if (type is FunctionType || type.isDartCoreFunction) {
return true;
} else if (type is InterfaceType) {
- MethodElement callMethod = type.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
+ MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
return callMethod != null;
}
return false;
@@ -19862,16 +19904,6 @@
}
/**
- * The Dart Language Specification, 12.33: <blockquote>The static type of an argument definition
- * test is `bool`.</blockquote>
- */
- @override
- Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- _recordStaticType(node, _typeProvider.boolType);
- return null;
- }
-
- /**
* The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
*
* It is a static warning if <i>T</i> does not denote a type available in the current lexical
@@ -20962,7 +20994,7 @@
if (returnType.isDartCoreFunction) {
return _dynamicType;
} else if (returnType is InterfaceType) {
- MethodElement callMethod = returnType.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
+ MethodElement callMethod = returnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
if (callMethod != null) {
return callMethod.type.returnType;
}
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index fc67528..64dbef6 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -235,12 +235,13 @@
@override
AnalysisContext get context {
if (_analysisContext == null) {
- _analysisContext = new AnalysisContextImpl();
- _analysisContext.sourceFactory = new SourceFactory([new DartUriResolver(this)]);
+ _analysisContext = new SdkAnalysisContext();
+ SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+ _analysisContext.sourceFactory = factory;
List<String> uris = this.uris;
ChangeSet changeSet = new ChangeSet();
for (String uri in uris) {
- changeSet.addedSource(_analysisContext.sourceFactory.forUri(uri));
+ changeSet.addedSource(factory.forUri(uri));
}
_analysisContext.applyChanges(changeSet);
}
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index b9d8067..fa87510 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -11,6 +11,7 @@
import 'java_core.dart';
import 'java_io.dart';
import 'utilities_general.dart';
+import 'instrumentation.dart';
import 'engine.dart';
export 'source.dart';
@@ -125,7 +126,7 @@
try {
return contentsFromFile;
} finally {
- handle.stop();
+ _reportIfSlowIO(handle.stop());
}
}
@@ -184,6 +185,22 @@
TimestampedData<String> get contentsFromFile {
return new TimestampedData<String>(file.lastModified(), file.readAsStringSync());
}
+
+ /**
+ * Record the time the IO took if it was slow
+ */
+ void _reportIfSlowIO(int nanos) {
+ //If slower than 10ms
+ if (nanos > 10 * TimeCounter.NANOS_PER_MILLI) {
+ InstrumentationBuilder builder = Instrumentation.builder2("SlowIO");
+ try {
+ builder.data3("fileName", fullName);
+ builder.metric2("IO-Time-Nanos", nanos);
+ } finally {
+ builder.log();
+ }
+ }
+ }
}
/**
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 78089ec..f5531a4 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -11,6 +11,8 @@
* Helper for measuring how much time is spent doing some operation.
*/
class TimeCounter {
+ static final int NANOS_PER_MILLI = 1000 * 1000;
+ static final int NANOS_PER_MICRO = 1000;
static TimeCounter _current = null;
final Stopwatch _sw = new Stopwatch();
@@ -34,6 +36,7 @@
*/
class TimeCounter_TimeCounterHandle {
final TimeCounter _counter;
+ int _startMicros;
TimeCounter _prev;
TimeCounter_TimeCounterHandle(this._counter) {
@@ -44,18 +47,23 @@
}
TimeCounter._current = _counter;
// start this counter
+ _startMicros = _counter._sw.elapsedMicroseconds;
_counter._sw.start();
}
/**
* Stops counting time and updates counter.
*/
- void stop() {
+ int stop() {
_counter._sw.stop();
+ int elapsed = (_counter._sw.elapsedMicroseconds - _startMicros) *
+ TimeCounter.NANOS_PER_MICRO;
// restore previous counter and resume it
TimeCounter._current = _prev;
if (_prev != null) {
_prev._sw.start();
}
+ // done
+ return elapsed;
}
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 22b9ebe..cfa81c9 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -421,11 +421,6 @@
visit(node.arguments);
}
- visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
- token(node.question);
- visit(node.identifier);
- }
-
visitArgumentList(ArgumentList node) {
token(node.leftParenthesis);
breakableNonSpace();
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index b3dd5c0..0df5783 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,12 +1,12 @@
name: analyzer
-version: 0.14.3
+version: 0.15.2-dev
author: Dart Team <misc@dartlang.org>
description: Static analyzer for Dart.
homepage: http://www.dartlang.org
environment:
sdk: '>=0.8.10+6 <2.0.0'
dependencies:
- args: '>=0.10.0 <0.11.0'
+ args: '>=0.10.0 <0.12.0'
logging: '>=0.9.0 <0.10.0'
path: '>=0.9.0 <2.0.0'
dev_dependencies:
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 6d2fa31..7664e36 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -75,8 +75,6 @@
static Annotation annotation2(Identifier name, SimpleIdentifier constructorName, ArgumentList arguments) => new Annotation(TokenFactory.tokenFromType(TokenType.AT), name, TokenFactory.tokenFromType(TokenType.PERIOD), constructorName, arguments);
- static ArgumentDefinitionTest argumentDefinitionTest(String identifier) => new ArgumentDefinitionTest(TokenFactory.tokenFromType(TokenType.QUESTION), identifier3(identifier));
-
static ArgumentList argumentList(List<Expression> arguments) => new ArgumentList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(arguments), TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
static AsExpression asExpression(Expression expression, TypeName type) => new AsExpression(expression, TokenFactory.tokenFromKeyword(Keyword.AS), type);
@@ -230,9 +228,11 @@
static ImplementsClause implementsClause(List<TypeName> types) => new ImplementsClause(TokenFactory.tokenFromKeyword(Keyword.IMPLEMENTS), list(types));
- static ImportDirective importDirective(List<Annotation> metadata, String uri, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.IMPORT), string2(uri), null, prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
+ static ImportDirective importDirective(List<Annotation> metadata, String uri, bool isDeferred, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.IMPORT), string2(uri), !isDeferred ? null : TokenFactory.tokenFromKeyword(Keyword.DEFERRED), prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
- static ImportDirective importDirective2(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, prefix, combinators);
+ static ImportDirective importDirective2(String uri, bool isDeferred, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, isDeferred, prefix, combinators);
+
+ static ImportDirective importDirective3(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, false, prefix, combinators);
static IndexExpression indexExpression(Expression array, Expression index) => new IndexExpression.forTarget(array, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
@@ -1630,11 +1630,6 @@
}
class SimpleIdentifierTest extends ParserTestCase {
- void test_inDeclarationContext_argumentDefinition() {
- SimpleIdentifier identifier = AstFactory.argumentDefinitionTest("p").identifier;
- JUnitTestCase.assertFalse(identifier.inDeclarationContext());
- }
-
void test_inDeclarationContext_catch_exception() {
SimpleIdentifier identifier = AstFactory.catchClause("e", []).exceptionParameter;
JUnitTestCase.assertTrue(identifier.inDeclarationContext());
@@ -1822,10 +1817,6 @@
static dartSuite() {
_ut.group('SimpleIdentifierTest', () {
- _ut.test('test_inDeclarationContext_argumentDefinition', () {
- final __test = new SimpleIdentifierTest();
- runJUnitTest(__test, __test.test_inDeclarationContext_argumentDefinition);
- });
_ut.test('test_inDeclarationContext_catch_exception', () {
final __test = new SimpleIdentifierTest();
runJUnitTest(__test, __test.test_inDeclarationContext_catch_exception);
@@ -1984,10 +1975,6 @@
_assertSource("@A.c()", AstFactory.annotation2(AstFactory.identifier3("A"), AstFactory.identifier3("c"), AstFactory.argumentList([])));
}
- void test_visitArgumentDefinitionTest() {
- _assertSource("?a", AstFactory.argumentDefinitionTest("a"));
- }
-
void test_visitArgumentList() {
_assertSource("(a, b)", AstFactory.argumentList([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
}
@@ -2593,35 +2580,39 @@
}
void test_visitImportDirective_combinator() {
- _assertSource("import 'a.dart' show A;", AstFactory.importDirective2("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+ _assertSource("import 'a.dart' show A;", AstFactory.importDirective3("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
}
void test_visitImportDirective_combinators() {
- _assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective2("a.dart", null, [
+ _assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective3("a.dart", null, [
AstFactory.showCombinator([AstFactory.identifier3("A")]),
AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
}
+ void test_visitImportDirective_deferred() {
+ _assertSource("import 'a.dart' deferred as p;", AstFactory.importDirective2("a.dart", true, "p", []));
+ }
+
void test_visitImportDirective_minimal() {
- _assertSource("import 'a.dart';", AstFactory.importDirective2("a.dart", null, []));
+ _assertSource("import 'a.dart';", AstFactory.importDirective3("a.dart", null, []));
}
void test_visitImportDirective_prefix() {
- _assertSource("import 'a.dart' as p;", AstFactory.importDirective2("a.dart", "p", []));
+ _assertSource("import 'a.dart' as p;", AstFactory.importDirective3("a.dart", "p", []));
}
void test_visitImportDirective_prefix_combinator() {
- _assertSource("import 'a.dart' as p show A;", AstFactory.importDirective2("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+ _assertSource("import 'a.dart' as p show A;", AstFactory.importDirective3("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
}
void test_visitImportDirective_prefix_combinators() {
- _assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective2("a.dart", "p", [
+ _assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective3("a.dart", "p", [
AstFactory.showCombinator([AstFactory.identifier3("A")]),
AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
}
void test_visitImportDirective_withMetadata() {
- ImportDirective directive = AstFactory.importDirective2("a.dart", null, []);
+ ImportDirective directive = AstFactory.importDirective3("a.dart", null, []);
directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
_assertSource("@deprecated import 'a.dart';", directive);
}
@@ -3170,10 +3161,6 @@
final __test = new ToSourceVisitorTest();
runJUnitTest(__test, __test.test_visitAnnotation_constructor);
});
- _ut.test('test_visitArgumentDefinitionTest', () {
- final __test = new ToSourceVisitorTest();
- runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
- });
_ut.test('test_visitArgumentList', () {
final __test = new ToSourceVisitorTest();
runJUnitTest(__test, __test.test_visitArgumentList);
@@ -3726,6 +3713,10 @@
final __test = new ToSourceVisitorTest();
runJUnitTest(__test, __test.test_visitImportDirective_combinators);
});
+ _ut.test('test_visitImportDirective_deferred', () {
+ final __test = new ToSourceVisitorTest();
+ runJUnitTest(__test, __test.test_visitImportDirective_deferred);
+ });
_ut.test('test_visitImportDirective_minimal', () {
final __test = new ToSourceVisitorTest();
runJUnitTest(__test, __test.test_visitImportDirective_minimal);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 2c30dc8..485ffd9 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -2963,9 +2963,7 @@
ClassElement classA = ElementFactory.classElement2("A", ["E"]);
InterfaceType typeA = classA.type;
TypeParameterType parameterType = classA.typeParameters[0].type;
- DartType dynamicType = DynamicTypeImpl.instance;
JUnitTestCase.assertFalse(typeA.isSubtypeOf(parameterType));
- JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(parameterType));
}
void test_isSupertypeOf_directSupertype() {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 4e2bb45..a22619a 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3821,6 +3821,18 @@
EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
}
+ void test_missingGet() {
+ CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", " int length {}", " void foo() {}", "}"]), [ParserErrorCode.MISSING_GET]);
+ JUnitTestCase.assertNotNull(unit);
+ ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
+ NodeList<ClassMember> members = classDeclaration.members;
+ EngineTestCase.assertSizeOfList(2, members);
+ EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
+ ClassMember member = members[1];
+ EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, member);
+ JUnitTestCase.assertEquals("foo", (member as MethodDeclaration).name.name);
+ }
+
void test_missingIdentifier_afterAnnotation() {
MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
JUnitTestCase.assertNull(method.documentationComment);
@@ -3882,6 +3894,11 @@
JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
}
+ void test_primaryExpression_argumentDefinitionTest() {
+ Expression expression = ParserTestCase.parse4("parsePrimaryExpression", "?a", [ParserErrorCode.UNEXPECTED_TOKEN]);
+ EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
+ }
+
void test_relationalExpression_missing_LHS() {
IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
@@ -4211,6 +4228,10 @@
final __test = new RecoveryParserTest();
runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
});
+ _ut.test('test_missingGet', () {
+ final __test = new RecoveryParserTest();
+ runJUnitTest(__test, __test.test_missingGet);
+ });
_ut.test('test_missingIdentifier_afterAnnotation', () {
final __test = new RecoveryParserTest();
runJUnitTest(__test, __test.test_missingIdentifier_afterAnnotation);
@@ -4247,6 +4268,10 @@
final __test = new RecoveryParserTest();
runJUnitTest(__test, __test.test_prefixExpression_missing_operand_minus);
});
+ _ut.test('test_primaryExpression_argumentDefinitionTest', () {
+ final __test = new RecoveryParserTest();
+ runJUnitTest(__test, __test.test_primaryExpression_argumentDefinitionTest);
+ });
_ut.test('test_relationalExpression_missing_LHS', () {
final __test = new RecoveryParserTest();
runJUnitTest(__test, __test.test_relationalExpression_missing_LHS);
@@ -4310,19 +4335,6 @@
JUnitTestCase.assertSame(element, toNode.element);
}
- void test_visitArgumentDefinitionTest() {
- String identifier = "p";
- ArgumentDefinitionTest fromNode = AstFactory.argumentDefinitionTest(identifier);
- DartType propagatedType = ElementFactory.classElement2("A", []).type;
- fromNode.propagatedType = propagatedType;
- DartType staticType = ElementFactory.classElement2("B", []).type;
- fromNode.staticType = staticType;
- ArgumentDefinitionTest toNode = AstFactory.argumentDefinitionTest(identifier);
- ResolutionCopier.copyResolutionData(fromNode, toNode);
- JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
- JUnitTestCase.assertSame(staticType, toNode.staticType);
- }
-
void test_visitAsExpression() {
AsExpression fromNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
DartType propagatedType = ElementFactory.classElement2("A", []).type;
@@ -4491,10 +4503,10 @@
}
void test_visitImportDirective() {
- ImportDirective fromNode = AstFactory.importDirective2("dart:uri", null, []);
+ ImportDirective fromNode = AstFactory.importDirective3("dart:uri", null, []);
ImportElement element = new ImportElementImpl(0);
fromNode.element = element;
- ImportDirective toNode = AstFactory.importDirective2("dart:uri", null, []);
+ ImportDirective toNode = AstFactory.importDirective3("dart:uri", null, []);
ResolutionCopier.copyResolutionData(fromNode, toNode);
JUnitTestCase.assertSame(element, toNode.element);
}
@@ -4860,10 +4872,6 @@
final __test = new ResolutionCopierTest();
runJUnitTest(__test, __test.test_visitAnnotation);
});
- _ut.test('test_visitArgumentDefinitionTest', () {
- final __test = new ResolutionCopierTest();
- runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
- });
_ut.test('test_visitAsExpression', () {
final __test = new ResolutionCopierTest();
runJUnitTest(__test, __test.test_visitAsExpression);
@@ -5422,12 +5430,6 @@
JUnitTestCase.assertEquals(lexeme, identifier.name);
}
- void test_parseArgumentDefinitionTest() {
- ArgumentDefinitionTest test = ParserTestCase.parse4("parseArgumentDefinitionTest", "?x", [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
- JUnitTestCase.assertNotNull(test.question);
- JUnitTestCase.assertNotNull(test.identifier);
- }
-
void test_parseArgumentList_empty() {
ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "()", []);
NodeList<Expression> arguments = argumentList.arguments;
@@ -10023,10 +10025,6 @@
final __test = new SimpleParserTest();
runJUnitTest(__test, __test.test_parseAnnotation_n3_a);
});
- _ut.test('test_parseArgumentDefinitionTest', () {
- final __test = new SimpleParserTest();
- runJUnitTest(__test, __test.test_parseArgumentDefinitionTest);
- });
_ut.test('test_parseArgumentList_empty', () {
final __test = new SimpleParserTest();
runJUnitTest(__test, __test.test_parseArgumentList_empty);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 5e6de85..a118fb6 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -803,6 +803,28 @@
verify([source]);
}
+ void test_constInitializedWithNonConstValueFromDeferredClass() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "const B = a.V;"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
+ void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "const B = a.V + 1;"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
void test_constInstanceField() {
Source source = addSource(EngineTestCase.createSource(["class C {", " const int f = 0;", "}"]));
resolve(source);
@@ -1801,17 +1823,6 @@
verify([source]);
}
- void test_importDeferredLibraryWithLoadFunction() {
- addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
- Source source = addSource(EngineTestCase.createSource([
- "library root;",
- "import 'lib1.dart' deferred as lib1;",
- "main() { lib1.f(); }"]));
- resolve(source);
- assertErrors(source, [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
- verify([source]);
- }
-
void test_importInternalLibrary() {
Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
resolve(source);
@@ -2053,6 +2064,45 @@
assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
}
+ void test_invalidAnnotationFromDeferredLibrary() {
+ // See test_invalidAnnotation_notConstantVariable
+ addNamedSource("/lib1.dart", EngineTestCase.createSource([
+ "library lib1;",
+ "class V { const V(); }",
+ "const v = const V();"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "@a.v main () {}"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
+ void test_invalidAnnotationFromDeferredLibrary_constructor() {
+ // See test_invalidAnnotation_notConstantVariable
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "@a.C() main () {}"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
+ void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
+ // See test_invalidAnnotation_notConstantVariable
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "@a.C.name() main () {}"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
void test_invalidConstructorName_notEnclosingClassName_defined() {
Source source = addSource(EngineTestCase.createSource(["class A {", " B() : super();", "}", "class B {}"]));
resolve(source);
@@ -2630,6 +2680,28 @@
verify([source]);
}
+ void test_nonConstantDefaultValueFromDeferredLibrary() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "f({x : a.V}) {}"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
+ void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "f({x : a.V + 1}) {}"]));
+ resolve(source);
+ assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+ verify([source]);
+ }
+
void test_nonConstCaseExpression() {
Source source = addSource(EngineTestCase.createSource([
"f(int p, int q) {",
@@ -3874,6 +3946,14 @@
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_constInitializedWithNonConstValue);
});
+ _ut.test('test_constInitializedWithNonConstValueFromDeferredClass', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass);
+ });
+ _ut.test('test_constInitializedWithNonConstValueFromDeferredClass_nested', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass_nested);
+ });
_ut.test('test_constInitializedWithNonConstValue_missingConstInListLiteral', () {
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInListLiteral);
@@ -4294,10 +4374,6 @@
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_superConstructorInvocation);
});
- _ut.test('test_importDeferredLibraryWithLoadFunction', () {
- final __test = new CompileTimeErrorCodeTest();
- runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
- });
_ut.test('test_importInternalLibrary', () {
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_importInternalLibrary);
@@ -4358,6 +4434,18 @@
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_method);
});
+ _ut.test('test_invalidAnnotationFromDeferredLibrary', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary);
+ });
+ _ut.test('test_invalidAnnotationFromDeferredLibrary_constructor', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_constructor);
+ });
+ _ut.test('test_invalidAnnotationFromDeferredLibrary_namedConstructor', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_namedConstructor);
+ });
_ut.test('test_invalidAnnotation_getter', () {
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_invalidAnnotation_getter);
@@ -4710,6 +4798,14 @@
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_unnamed);
});
+ _ut.test('test_nonConstantDefaultValueFromDeferredLibrary', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary);
+ });
+ _ut.test('test_nonConstantDefaultValueFromDeferredLibrary_nested', () {
+ final __test = new CompileTimeErrorCodeTest();
+ runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary_nested);
+ });
_ut.test('test_nonConstantDefaultValue_function_named', () {
final __test = new CompileTimeErrorCodeTest();
runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
@@ -5288,7 +5384,7 @@
void fail_visitImportDirective_combinators_noPrefix() {
JUnitTestCase.fail("Not yet tested");
// Need to set up the imported library so that the identifier can be resolved
- ImportDirective directive = AstFactory.importDirective2(null, null, [AstFactory.showCombinator2(["A"])]);
+ ImportDirective directive = AstFactory.importDirective3(null, null, [AstFactory.showCombinator2(["A"])]);
_resolveNode(directive, []);
_listener.assertNoErrors();
}
@@ -5298,7 +5394,7 @@
// Need to set up the imported library so that the identifiers can be resolved
String prefixName = "p";
_definingLibrary.imports = <ImportElement> [ElementFactory.importFor(null, ElementFactory.prefix(prefixName), [])];
- ImportDirective directive = AstFactory.importDirective2(null, prefixName, [
+ ImportDirective directive = AstFactory.importDirective3(null, prefixName, [
AstFactory.showCombinator2(["A"]),
AstFactory.hideCombinator2(["B"])]);
_resolveNode(directive, []);
@@ -5468,7 +5564,7 @@
}
void test_visitImportDirective_noCombinators_noPrefix() {
- ImportDirective directive = AstFactory.importDirective2(null, null, []);
+ ImportDirective directive = AstFactory.importDirective3(null, null, []);
directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
_resolveNode(directive, []);
_listener.assertNoErrors();
@@ -5478,7 +5574,7 @@
String prefixName = "p";
ImportElement importElement = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), ElementFactory.prefix(prefixName), []);
_definingLibrary.imports = <ImportElement> [importElement];
- ImportDirective directive = AstFactory.importDirective2(null, prefixName, []);
+ ImportDirective directive = AstFactory.importDirective3(null, prefixName, []);
directive.element = importElement;
_resolveNode(directive, []);
_listener.assertNoErrors();
@@ -6460,6 +6556,115 @@
verify([source]);
}
+ void test_deadCode_statementAfterBreak_inDefaultCase() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f(v) {",
+ " switch(v) {",
+ " case 1:",
+ " default:",
+ " break;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterBreak_inForEachStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f() {",
+ " var list;",
+ " for(var l in list) {",
+ " break;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterBreak_inForStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f() {",
+ " for(;;) {",
+ " break;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterBreak_inSwitchCase() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f(v) {",
+ " switch(v) {",
+ " case 1:",
+ " break;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterBreak_inWhileStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f(v) {",
+ " while(v) {",
+ " break;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterContinue_inForEachStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f() {",
+ " var list;",
+ " for(var l in list) {",
+ " continue;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterContinue_inForStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f() {",
+ " for(;;) {",
+ " continue;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
+ void test_deadCode_statementAfterContinue_inWhileStatement() {
+ Source source = addSource(EngineTestCase.createSource([
+ "f(v) {",
+ " while(v) {",
+ " continue;",
+ " var a;",
+ " }",
+ "}"]));
+ resolve(source);
+ assertErrors(source, [HintCode.DEAD_CODE]);
+ verify([source]);
+ }
+
void test_deadCode_statementAfterReturn_function() {
Source source = addSource(EngineTestCase.createSource([
"f() {",
@@ -6777,6 +6982,17 @@
verify([source]);
}
+ void test_importDeferredLibraryWithLoadFunction() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as lib1;",
+ "main() { lib1.f(); }"]));
+ resolve(source);
+ assertErrors(source, [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+ verify([source]);
+ }
+
void test_invalidAssignment_instanceVariable() {
Source source = addSource(EngineTestCase.createSource([
"class A {",
@@ -7343,6 +7559,38 @@
final __test = new HintCodeTest();
runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_nested);
});
+ _ut.test('test_deadCode_statementAfterBreak_inDefaultCase', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inDefaultCase);
+ });
+ _ut.test('test_deadCode_statementAfterBreak_inForEachStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inForEachStatement);
+ });
+ _ut.test('test_deadCode_statementAfterBreak_inForStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inForStatement);
+ });
+ _ut.test('test_deadCode_statementAfterBreak_inSwitchCase', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inSwitchCase);
+ });
+ _ut.test('test_deadCode_statementAfterBreak_inWhileStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterBreak_inWhileStatement);
+ });
+ _ut.test('test_deadCode_statementAfterContinue_inForEachStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inForEachStatement);
+ });
+ _ut.test('test_deadCode_statementAfterContinue_inForStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inForStatement);
+ });
+ _ut.test('test_deadCode_statementAfterContinue_inWhileStatement', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_deadCode_statementAfterContinue_inWhileStatement);
+ });
_ut.test('test_deadCode_statementAfterReturn_function', () {
final __test = new HintCodeTest();
runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_function);
@@ -7443,6 +7691,10 @@
final __test = new HintCodeTest();
runJUnitTest(__test, __test.test_duplicateImport3);
});
+ _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+ final __test = new HintCodeTest();
+ runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+ });
_ut.test('test_invalidAssignment_instanceVariable', () {
final __test = new HintCodeTest();
runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
@@ -8990,7 +9242,7 @@
Library library = resolver.createLibrary(librarySource);
LibraryElement element = builder.buildLibrary(library);
GatheringErrorListener listener = new GatheringErrorListener();
- listener.addAll(resolver.errorListener);
+ listener.addAll2(resolver.errorListener);
listener.assertErrorsWithCodes(expectedErrorCodes);
return element;
}
@@ -9498,27 +9750,6 @@
verify([source]);
}
- void test_argumentDefinitionTestNonParameter_formalParameter() {
- Source source = addSource(EngineTestCase.createSource(["f(var v) {", " return ?v;", "}"]));
- resolve(source);
- assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
- verify([source]);
- }
-
- void test_argumentDefinitionTestNonParameter_namedParameter() {
- Source source = addSource(EngineTestCase.createSource(["f({var v : 0}) {", " return ?v;", "}"]));
- resolve(source);
- assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
- verify([source]);
- }
-
- void test_argumentDefinitionTestNonParameter_optionalParameter() {
- Source source = addSource(EngineTestCase.createSource(["f([var v]) {", " return ?v;", "}"]));
- resolve(source);
- assertErrors(source, [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
- verify([source]);
- }
-
void test_argumentTypeNotAssignable_classWithCall_Function() {
Source source = addSource(EngineTestCase.createSource([
" caller(Function callee) {",
@@ -10588,17 +10819,6 @@
verify([source]);
}
- void test_importDeferredLibraryWithLoadFunction() {
- addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
- Source source = addSource(EngineTestCase.createSource([
- "library root;",
- "import 'lib1.dart' deferred as lib1;",
- "main() { lib1.f(); }"]));
- resolve(source);
- assertNoErrors(source);
- verify([source]);
- }
-
void test_importDuplicatedLibraryName() {
Source source = addSource(EngineTestCase.createSource([
"library test;",
@@ -12495,6 +12715,19 @@
verify([source]);
}
+ void test_returnOfInvalidType_typeParameter_18468() {
+ // This test verifies that T << Type where T is a type parameter and Type is the type Type from
+ // core, this particular test case comes from issue 18468 which depends on this fact.
+ //
+ // A test cannot be added to TypeParameterTypeImplTest since the types returned out of the
+ // TestTypeProvider don't have a mock 'dart.core' enclosing library element.
+ // See TypeParameterTypeImpl.isMoreSpecificThan().
+ Source source = addSource(EngineTestCase.createSource(["class Foo<T> {", " Type get t => T;", "}"]));
+ resolve(source);
+ assertErrors(source, []);
+ verify([source]);
+ }
+
void test_returnOfInvalidType_void() {
Source source = addSource(EngineTestCase.createSource([
"void f1() {}",
@@ -13295,18 +13528,6 @@
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_ambiguousExport_sameDeclaration);
});
- _ut.test('test_argumentDefinitionTestNonParameter_formalParameter', () {
- final __test = new NonErrorResolverTest();
- runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_formalParameter);
- });
- _ut.test('test_argumentDefinitionTestNonParameter_namedParameter', () {
- final __test = new NonErrorResolverTest();
- runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_namedParameter);
- });
- _ut.test('test_argumentDefinitionTestNonParameter_optionalParameter', () {
- final __test = new NonErrorResolverTest();
- runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter_optionalParameter);
- });
_ut.test('test_argumentTypeNotAssignable_Object_Function', () {
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_argumentTypeNotAssignable_Object_Function);
@@ -13691,10 +13912,6 @@
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_typeParameter);
});
- _ut.test('test_importDeferredLibraryWithLoadFunction', () {
- final __test = new NonErrorResolverTest();
- runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
- });
_ut.test('test_importDuplicatedLibraryName', () {
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
@@ -14331,6 +14548,10 @@
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_returnOfInvalidType_supertype);
});
+ _ut.test('test_returnOfInvalidType_typeParameter_18468', () {
+ final __test = new NonErrorResolverTest();
+ runJUnitTest(__test, __test.test_returnOfInvalidType_typeParameter_18468);
+ });
_ut.test('test_returnOfInvalidType_void', () {
final __test = new NonErrorResolverTest();
runJUnitTest(__test, __test.test_returnOfInvalidType_void);
@@ -14802,6 +15023,17 @@
verify([source]);
}
+ void test_importDeferredLibraryWithLoadFunction() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as lib1;",
+ "main() { lib1.f(); }"]));
+ resolve(source);
+ assertNoErrors(source);
+ verify([source]);
+ }
+
void test_missingReturn_emptyFunctionBody() {
Source source = addSource(EngineTestCase.createSource(["abstract class A {", " int m();", "}"]));
resolve(source);
@@ -15341,6 +15573,10 @@
final __test = new NonHintCodeTest();
runJUnitTest(__test, __test.test_duplicateImport_show);
});
+ _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+ final __test = new NonHintCodeTest();
+ runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+ });
_ut.test('test_missingReturn_emptyFunctionBody', () {
final __test = new NonHintCodeTest();
runJUnitTest(__test, __test.test_missingReturn_emptyFunctionBody);
@@ -17511,13 +17747,6 @@
_listener.assertNoErrors();
}
- void test_visitArgumentDefinitionTest() {
- // ?p
- Expression node = AstFactory.argumentDefinitionTest("p");
- JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
- _listener.assertNoErrors();
- }
-
void test_visitAsExpression() {
// class A { ... this as B ... }
// class B extends A {}
@@ -18447,10 +18676,6 @@
final __test = new StaticTypeAnalyzerTest();
runJUnitTest(__test, __test.test_visitAdjacentStrings);
});
- _ut.test('test_visitArgumentDefinitionTest', () {
- final __test = new StaticTypeAnalyzerTest();
- runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
- });
_ut.test('test_visitAsExpression', () {
final __test = new StaticTypeAnalyzerTest();
runJUnitTest(__test, __test.test_visitAsExpression);
@@ -23019,6 +23244,32 @@
verify([source]);
}
+ void test_typeAnnotationDeferredClass_typeArgumentList() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "class C<E> {}",
+ "C<a.A> c;"]));
+ resolve(source);
+ assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+ verify([source]);
+ }
+
+ void test_typeAnnotationDeferredClass_typeArgumentList2() {
+ addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+ Source source = addSource(EngineTestCase.createSource([
+ "library root;",
+ "import 'lib1.dart' deferred as a;",
+ "class C<E, F> {}",
+ "C<a.A, a.A> c;"]));
+ resolve(source);
+ assertErrors(source, [
+ StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
+ StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+ verify([source]);
+ }
+
void test_typeAnnotationDeferredClass_typeParameter_bound() {
addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
Source source = addSource(EngineTestCase.createSource([
@@ -24074,6 +24325,14 @@
final __test = new StaticWarningCodeTest();
runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_simpleFormalParameter);
});
+ _ut.test('test_typeAnnotationDeferredClass_typeArgumentList', () {
+ final __test = new StaticWarningCodeTest();
+ runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList);
+ });
+ _ut.test('test_typeAnnotationDeferredClass_typeArgumentList2', () {
+ final __test = new StaticWarningCodeTest();
+ runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList2);
+ });
_ut.test('test_typeAnnotationDeferredClass_typeParameter_bound', () {
final __test = new StaticWarningCodeTest();
runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeParameter_bound);
@@ -26523,5 +26782,6 @@
// StaticWarningCodeTest.dartSuite();
// StrictModeTest.dartSuite();
// TypePropagationTest.dartSuite();
+// //AnalysisDeltaTest.dartSuite();
// ChangeSetTest.dartSuite();
}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 995876b..fe7f86b 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -473,14 +473,23 @@
}
/**
+ * Add all of the given errors to this listener.
+ *
+ * @param the errors to be added
+ */
+ void addAll(List<AnalysisError> errors) {
+ for (AnalysisError error in errors) {
+ onError(error);
+ }
+ }
+
+ /**
* Add all of the errors recorded by the given listener to this listener.
*
* @param listener the listener that has recorded the errors to be added
*/
- void addAll(RecordingErrorListener listener) {
- for (AnalysisError error in listener.errors) {
- onError(error);
- }
+ void addAll2(RecordingErrorListener listener) {
+ addAll(listener.errors);
}
/**
diff --git a/pkg/args/CHANGELOG.md b/pkg/args/CHANGELOG.md
index aadaddc..cb8acb9 100644
--- a/pkg/args/CHANGELOG.md
+++ b/pkg/args/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.11.0
+
+* Move handling trailing options from `ArgParser.parse()` into `ArgParser`
+ itself. This lets subcommands have different behavior for how they handle
+ trailing options.
+
## 0.10.0+2
* Usage ignores hidden options when determining column widths.
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index 4b9f857..bdd61a5 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -286,15 +286,32 @@
*/
final Map<String, ArgParser> commands;
- /** Creates a new ArgParser. */
- factory ArgParser() =>
- new ArgParser._(<String, Option>{}, <String, ArgParser>{});
+ /**
+ * Whether or not this parser parses options that appear after non-option
+ * arguments.
+ */
+ final bool allowTrailingOptions;
- ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands) :
+ /**
+ * Creates a new ArgParser.
+ *
+ * If [allowTrailingOptions] is set, the parser will continue parsing even
+ * after it finds an argument that is neither an option nor a command.
+ * This allows options to be specified after regular arguments. Defaults to
+ * `false`.
+ */
+ factory ArgParser({bool allowTrailingOptions}) =>
+ new ArgParser._(<String, Option>{}, <String, ArgParser>{},
+ allowTrailingOptions: allowTrailingOptions);
+
+ ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
+ {bool allowTrailingOptions}) :
this._options = options,
this.options = new UnmodifiableMapView(options),
this._commands = commands,
- this.commands = new UnmodifiableMapView(commands);
+ this.commands = new UnmodifiableMapView(commands),
+ this.allowTrailingOptions = allowTrailingOptions != null ?
+ allowTrailingOptions : false;
/**
* Defines a command.
@@ -366,20 +383,9 @@
/**
* Parses [args], a list of command-line arguments, matches them against the
* flags and options defined by this parser, and returns the result.
- *
- * If [allowTrailingOptions] is set, the parser will continue parsing even
- * after it finds an argument that is neither an option nor a command.
- * This allows options to be specified after regular arguments.
- *
- * [allowTrailingOptions] is false by default, so when a non-option,
- * non-command argument is encountered, it and all remaining arguments,
- * even those that look like options are passed to the innermost command.
*/
- ArgResults parse(List<String> args, {bool allowTrailingOptions}) {
- if (allowTrailingOptions == null) allowTrailingOptions = false;
- return new Parser(null, this, args.toList(), null, null,
- allowTrailingOptions: allowTrailingOptions).parse();
- }
+ ArgResults parse(List<String> args) =>
+ new Parser(null, this, args.toList(), null, null).parse();
/**
* Generates a string displaying usage information for the defined options.
diff --git a/pkg/args/lib/src/parser.dart b/pkg/args/lib/src/parser.dart
index 550fe63..bccce64 100644
--- a/pkg/args/lib/src/parser.dart
+++ b/pkg/args/lib/src/parser.dart
@@ -28,9 +28,6 @@
*/
final Parser parent;
- /** If `true`, parsing will continue after a non-option argument. */
- final bool allowTrailingOptions;
-
/** The grammar being parsed. */
final ArgParser grammar;
@@ -43,8 +40,7 @@
/** The accumulated parsed options. */
final Map<String, dynamic> results = <String, dynamic>{};
- Parser(this.commandName, this.grammar, this.args, this.parent, rest,
- {this.allowTrailingOptions: false}) {
+ Parser(this.commandName, this.grammar, this.args, this.parent, rest) {
if (rest != null) this.rest.addAll(rest);
}
@@ -79,8 +75,7 @@
if (command != null) {
validate(rest.isEmpty, 'Cannot specify arguments before a command.');
var commandName = args.removeAt(0);
- var commandParser = new Parser(commandName, command, args, this, rest,
- allowTrailingOptions: allowTrailingOptions);
+ var commandParser = new Parser(commandName, command, args, this, rest);
commandResults = commandParser.parse();
// All remaining arguments were passed to command so clear them here.
@@ -96,7 +91,7 @@
// This argument is neither option nor command, so stop parsing unless
// the [allowTrailingOptions] option is set.
- if (!allowTrailingOptions) break;
+ if (!grammar.allowTrailingOptions) break;
rest.add(args.removeAt(0));
}
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index ce264e1..a5c1a18 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
name: args
-version: 0.10.0+2
+version: 0.11.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
documentation: http://api.dartlang.org/docs/pkg/args
@@ -10,6 +10,6 @@
dependencies:
collection: ">=0.9.0 <0.10.0"
dev_dependencies:
- unittest: ">=0.9.0 <0.10.0"
+ unittest: ">=0.9.0 <0.11.0"
environment:
sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/args/test/parse_all_test.dart b/pkg/args/test/parse_all_test.dart
deleted file mode 100644
index d404c2f..0000000
--- a/pkg/args/test/parse_all_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library parse_all_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:args/args.dart';
-
-void main() {
- group('ArgParser.parse(allowTrailingOptions: true) '
- 'starting with a non-option', () {
- test('followed by flag', () {
- var parser = new ArgParser()..addFlag('flag');
- var args = ['A', '--flag'];
-
- var resultsAll = parser.parse(args, allowTrailingOptions: true);
- expect(resultsAll['flag'], isTrue);
- expect(resultsAll.rest, equals(['A']));
- });
-
- test('followed by option', () {
- var parser = new ArgParser()..addOption('opt');
- var args = ['A', '--opt'];
-
- expectThrows(parser, args);
- });
-
- test('followed by option and value', () {
- var parser = new ArgParser()..addOption('opt');
- var args = ['A', '--opt', 'V'];
-
- var resultsAll = parser.parse(args, allowTrailingOptions: true);
- expect(resultsAll['opt'], equals('V'));
- expect(resultsAll.rest, equals(['A']));
- });
-
- test('followed by unknown flag', () {
- var parser = new ArgParser();
- var args = ['A', '--xflag'];
-
- expectThrows(parser, args);
- });
-
- test('followed by unknown option and value', () {
- var parser = new ArgParser();
- var args = ['A', '--xopt', 'V'];
-
- expectThrows(parser, args);
- });
-
- test('followed by command', () {
- var parser = new ArgParser()..addCommand('com');
- var args = ['A', 'com'];
-
- expectThrows(parser, args);
- });
- });
-}
-
-void expectThrows(ArgParser parser, List<String> args) =>
- expect(() => parser.parse(args, allowTrailingOptions: true),
- throwsFormatException,
- reason: "with allowTrailingOptions: true");
diff --git a/pkg/args/test/parse_test.dart b/pkg/args/test/parse_test.dart
index 659c08e..56320d6 100644
--- a/pkg/args/test/parse_test.dart
+++ b/pkg/args/test/parse_test.dart
@@ -53,6 +53,15 @@
throwsFormat(parser, ['--verbose=true']);
});
+
+ test('are case-sensitive', () {
+ var parser = new ArgParser();
+ parser.addFlag('verbose');
+ parser.addFlag('Verbose');
+ var results = parser.parse(['--verbose']);
+ expect(results['verbose'], isTrue);
+ expect(results['Verbose'], isFalse);
+ });
});
group('flags negated with "no-"', () {
@@ -295,6 +304,15 @@
// The '?!' means this can only be understood as '--apple b?!c'.
throwsFormat(parser, ['-ab?!c']);
});
+
+ test('are case-sensitive', () {
+ var parser = new ArgParser();
+ parser.addFlag('file', abbr: 'f');
+ parser.addFlag('force', abbr: 'F');
+ var results = parser.parse(['-f']);
+ expect(results['file'], isTrue);
+ expect(results['force'], isFalse);
+ });
});
group('options', () {
@@ -384,6 +402,15 @@
var args = parser.parse(['']);
expect(args['define'], equals(['0']));
});
+
+ test('are case-sensitive', () {
+ var parser = new ArgParser();
+ parser.addOption('verbose', defaultsTo: 'no');
+ parser.addOption('Verbose', defaultsTo: 'no');
+ var results = parser.parse(['--verbose', 'chatty']);
+ expect(results['verbose'], equals('chatty'));
+ expect(results['Verbose'], equals('no'));
+ });
});
group('remaining args', () {
@@ -397,10 +424,10 @@
expect(results['woof'], isTrue);
expect(results['meow'], equals('v'));
expect(results['tweet'], equals('bird'));
- expect(results.rest, orderedEquals(['not', 'option']));
+ expect(results.rest, equals(['not', 'option']));
});
- test('stops parsing at "--"', () {
+ test('consumes "--" and stops', () {
var parser = new ArgParser();
parser.addFlag('woof', defaultsTo: false);
parser.addOption('meow', defaultsTo: 'kitty');
@@ -408,16 +435,16 @@
var results = parser.parse(['--woof', '--', '--meow']);
expect(results['woof'], isTrue);
expect(results['meow'], equals('kitty'));
- expect(results.rest, orderedEquals(['--meow']));
+ expect(results.rest, equals(['--meow']));
});
- test('handles options with case-sensitivity', () {
+ test('leaves "--" if not the first non-option', () {
var parser = new ArgParser();
- parser.addFlag('recurse', defaultsTo: false, abbr:'R');
- var results = parser.parse(['-R']);
- expect(results['recurse'], isTrue);
- expect(results.rest, [ ]);
- throwsFormat(parser, ['-r']);
+ parser.addFlag('woof');
+
+ var results = parser.parse(['--woof', 'stop', '--', 'arg']);
+ expect(results['woof'], isTrue);
+ expect(results.rest, equals(['stop', '--', 'arg']));
});
});
});
diff --git a/pkg/args/test/trailing_options_test.dart b/pkg/args/test/trailing_options_test.dart
new file mode 100644
index 0000000..2ee860c
--- /dev/null
+++ b/pkg/args/test/trailing_options_test.dart
@@ -0,0 +1,100 @@
+// 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 trailing_options_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:args/args.dart';
+
+void main() {
+ test('allowTrailingOptions defaults to false', () {
+ var parser = new ArgParser();
+ expect(parser.allowTrailingOptions, isFalse);
+ });
+
+ group('when trailing options are allowed', () {
+ var parser;
+ setUp(() {
+ parser = new ArgParser(allowTrailingOptions: true);
+ });
+
+ void expectThrows(List<String> args) =>
+ expect(() => parser.parse(args), throwsFormatException,
+ reason: "with allowTrailingOptions: true");
+
+ test('collects non-options in rest', () {
+ parser.addFlag('flag');
+ parser.addOption('opt', abbr: 'o');
+ var results = parser.parse(['a', '--flag', 'b', '-o', 'value', 'c']);
+ expect(results['flag'], isTrue);
+ expect(results['opt'], equals('value'));
+ expect(results.rest, equals(['a', 'b', 'c']));
+ });
+
+ test('stops parsing options at "--"', () {
+ parser.addFlag('flag');
+ parser.addOption('opt', abbr: 'o');
+ var results = parser.parse(['a', '--flag', '--', '-ovalue', 'c']);
+ expect(results['flag'], isTrue);
+ expect(results.rest, equals(['a', '-ovalue', 'c']));
+ });
+
+ test('only consumes first "--"', () {
+ parser.addFlag('flag', abbr: 'f');
+ parser.addOption('opt', abbr: 'o');
+ var results = parser.parse(['a', '--', 'b', '--', 'c']);
+ expect(results.rest, equals(['a', 'b', '--', 'c']));
+ });
+
+ test('parses a trailing flag', () {
+ parser.addFlag('flag');
+ var results = parser.parse(['arg', '--flag']);
+
+ expect(results['flag'], isTrue);
+ expect(results.rest, equals(['arg']));
+ });
+
+ test('throws on a trailing option missing its value', () {
+ parser.addOption('opt');
+ expectThrows(['arg', '--opt']);
+ });
+
+ test('parses a trailing option', () {
+ parser.addOption('opt');
+ var results = parser.parse(['arg', '--opt', 'v']);
+ expect(results['opt'], equals('v'));
+ expect(results.rest, equals(['arg']));
+ });
+
+ test('throws on a trailing unknown flag', () {
+ expectThrows(['arg', '--xflag']);
+ });
+
+ test('throws on a trailing unknown option and value', () {
+ expectThrows(['arg', '--xopt', 'v']);
+ });
+
+ test('throws on a command', () {
+ parser.addCommand('com');
+ expectThrows(['arg', 'com']);
+ });
+ });
+
+ test("uses the innermost command's trailing options behavior", () {
+ var parser = new ArgParser(allowTrailingOptions: true);
+ parser.addFlag('flag', abbr: 'f');
+ var command = parser.addCommand('cmd',
+ new ArgParser(allowTrailingOptions: false));
+ command.addFlag('verbose', abbr: 'v');
+
+ var results = parser.parse(['a', '-f', 'b']);
+ expect(results['flag'], isTrue);
+ expect(results.rest, equals(['a', 'b']));
+
+ results = parser.parse(['cmd', '-f', 'a', '-v', '--unknown']);
+ expect(results['flag'], isTrue); // Not trailing.
+ expect(results.command['verbose'], isFalse);
+ expect(results.command.rest, equals(['a', '-v', '--unknown']));
+ });
+}
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index cbb55fc..e764f1a 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -4,20 +4,21 @@
library barback;
-export 'src/asset.dart';
-export 'src/asset_id.dart';
-export 'src/asset_set.dart';
+export 'src/asset/asset.dart';
+export 'src/asset/asset_id.dart';
+export 'src/asset/asset_set.dart';
export 'src/barback.dart';
-export 'src/barback_settings.dart';
-export 'src/base_transform.dart';
export 'src/build_result.dart';
-export 'src/declaring_transform.dart' hide DeclaringTransformController;
-export 'src/declaring_transformer.dart';
export 'src/errors.dart' hide flattenAggregateExceptions;
-export 'src/lazy_transformer.dart';
export 'src/log.dart';
export 'src/package_provider.dart';
-export 'src/transform.dart' hide TransformController;
-export 'src/transform_logger.dart';
-export 'src/transformer.dart';
-export 'src/transformer_group.dart';
+export 'src/transformer/barback_settings.dart';
+export 'src/transformer/base_transform.dart';
+export 'src/transformer/declaring_transform.dart'
+ hide DeclaringTransformController;
+export 'src/transformer/declaring_transformer.dart';
+export 'src/transformer/lazy_transformer.dart';
+export 'src/transformer/transform.dart' hide TransformController;
+export 'src/transformer/transform_logger.dart';
+export 'src/transformer/transformer.dart';
+export 'src/transformer/transformer_group.dart';
diff --git a/pkg/barback/lib/src/asset.dart b/pkg/barback/lib/src/asset/asset.dart
similarity index 97%
rename from pkg/barback/lib/src/asset.dart
rename to pkg/barback/lib/src/asset/asset.dart
index 5f05059..c0f11ba 100644
--- a/pkg/barback/lib/src/asset.dart
+++ b/pkg/barback/lib/src/asset/asset.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset;
+library barback.asset.asset;
import 'dart:async';
import 'dart:io';
diff --git a/pkg/barback/lib/src/asset_forwarder.dart b/pkg/barback/lib/src/asset/asset_forwarder.dart
similarity index 97%
rename from pkg/barback/lib/src/asset_forwarder.dart
rename to pkg/barback/lib/src/asset/asset_forwarder.dart
index a2440e0..03c493c 100644
--- a/pkg/barback/lib/src/asset_forwarder.dart
+++ b/pkg/barback/lib/src/asset/asset_forwarder.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset_forwarder;
+library barback.asset.asset_forwarder;
import 'dart:async';
diff --git a/pkg/barback/lib/src/asset_id.dart b/pkg/barback/lib/src/asset/asset_id.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_id.dart
rename to pkg/barback/lib/src/asset/asset_id.dart
index e091264..adb2247 100644
--- a/pkg/barback/lib/src/asset_id.dart
+++ b/pkg/barback/lib/src/asset/asset_id.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset_id;
+library barback.asset.asset_id;
import 'package:path/path.dart' as pathos;
diff --git a/pkg/barback/lib/src/asset_node.dart b/pkg/barback/lib/src/asset/asset_node.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_node.dart
rename to pkg/barback/lib/src/asset/asset_node.dart
index c0593e5..45d1b17 100644
--- a/pkg/barback/lib/src/asset_node.dart
+++ b/pkg/barback/lib/src/asset/asset_node.dart
@@ -2,15 +2,15 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset_node;
+library barback.asset.asset_node;
import 'dart:async';
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
import 'asset.dart';
import 'asset_id.dart';
-import 'errors.dart';
-import 'transform_node.dart';
-import 'utils.dart';
/// Describes the current state of an asset as part of a transformation graph.
///
diff --git a/pkg/barback/lib/src/asset_node_set.dart b/pkg/barback/lib/src/asset/asset_node_set.dart
similarity index 94%
rename from pkg/barback/lib/src/asset_node_set.dart
rename to pkg/barback/lib/src/asset/asset_node_set.dart
index be897b9..4474866 100644
--- a/pkg/barback/lib/src/asset_node_set.dart
+++ b/pkg/barback/lib/src/asset/asset_node_set.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset_node_set;
+library barback.asset.asset_node_set;
import 'package:collection/collection.dart';
diff --git a/pkg/barback/lib/src/asset_set.dart b/pkg/barback/lib/src/asset/asset_set.dart
similarity index 98%
rename from pkg/barback/lib/src/asset_set.dart
rename to pkg/barback/lib/src/asset/asset_set.dart
index b17db97..d385ec22 100644
--- a/pkg/barback/lib/src/asset_set.dart
+++ b/pkg/barback/lib/src/asset/asset_set.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.asset_set;
+library barback.asset.asset_set;
import 'dart:collection';
diff --git a/pkg/barback/lib/src/asset/internal_asset.dart b/pkg/barback/lib/src/asset/internal_asset.dart
new file mode 100644
index 0000000..dfacba5
--- /dev/null
+++ b/pkg/barback/lib/src/asset/internal_asset.dart
@@ -0,0 +1,187 @@
+// 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.asset.internal_asset;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:typed_data';
+
+import '../serialize.dart';
+import '../utils.dart';
+import '../utils/file_pool.dart';
+import '../utils/stream_replayer.dart';
+import 'asset.dart';
+import 'asset_id.dart';
+
+/// Serialize an asset to a form that's safe to send across isolates.
+Map serializeAsset(Asset asset) {
+ var id = serializeId(asset.id);
+ if (asset is BinaryAsset) {
+ return {
+ 'type': 'binary',
+ 'id': id,
+ 'contents': asset._contents
+ };
+ } else if (asset is FileAsset) {
+ return {
+ 'type': 'file',
+ 'id': id,
+ 'path': asset._path
+ };
+ } else if (asset is StringAsset) {
+ return {
+ 'type': 'string',
+ 'id': id,
+ 'contents': asset._contents
+ };
+ } else {
+ // [asset] is probably a [StreamAsset], but it's possible that the user has
+ // created a custom subclass, in which case we just serialize the stream
+ // anyway.
+ return {
+ 'type': 'stream',
+ 'id': id,
+ 'stream': serializeStream(asset.read())
+ };
+ }
+}
+
+/// Deserialize an asset from the form returned by [serialize].
+Asset deserializeAsset(Map asset) {
+ var id = deserializeId(asset['id']);
+ switch (asset['type']) {
+ case 'binary': return new BinaryAsset(id, asset['contents']);
+ case 'file': return new FileAsset(id, asset['path']);
+ case 'string': return new StringAsset(id, asset['contents']);
+ case 'stream':
+ return new StreamAsset(id, deserializeStream(asset['stream']));
+ default:
+ throw new FormatException('Unknown asset type "${asset['type']}".');
+ }
+}
+
+/// An asset whose data is stored in a list of bytes.
+class BinaryAsset implements Asset {
+ final AssetId id;
+
+ final Uint8List _contents;
+
+ BinaryAsset(this.id, List<int> contents)
+ : _contents = toUint8List(contents);
+
+ Future<String> readAsString({Encoding encoding}) {
+ if (encoding == null) encoding = UTF8;
+
+ return new Future.value(encoding.decode(_contents));
+ }
+
+ Stream<List<int>> read() => new Future<List<int>>.value(_contents).asStream();
+
+ String toString() {
+ var buffer = new StringBuffer();
+ buffer.write("Bytes [");
+
+ // Don't show the whole list if it's long.
+ if (_contents.length > 11) {
+ for (var i = 0; i < 5; i++) {
+ buffer.write(byteToHex(_contents[i]));
+ buffer.write(" ");
+ }
+
+ buffer.write("...");
+
+ for (var i = _contents.length - 5; i < _contents.length; i++) {
+ buffer.write(" ");
+ buffer.write(byteToHex(_contents[i]));
+ }
+ } else {
+ for (var i = 0; i < _contents.length; i++) {
+ if (i > 0) buffer.write(" ");
+ buffer.write(byteToHex(_contents[i]));
+ }
+ }
+
+ buffer.write("]");
+ return buffer.toString();
+ }
+}
+
+/// An asset backed by a file on the local file system.
+class FileAsset implements Asset {
+ final AssetId id;
+
+ /// Use a [FilePool] to handle reads so we can try to cope with running out
+ /// of file descriptors more gracefully.
+ static final _pool = new FilePool();
+
+ final String _path;
+ FileAsset(this.id, this._path);
+
+ Future<String> readAsString({Encoding encoding}) {
+ if (encoding == null) encoding = UTF8;
+ return _pool.readAsString(_path, encoding);
+ }
+
+ Stream<List<int>> read() => _pool.openRead(_path);
+
+ String toString() => 'File "${_path}"';
+}
+
+/// An asset whose data is stored in a string.
+class StringAsset implements Asset {
+ final AssetId id;
+
+ final String _contents;
+
+ StringAsset(this.id, this._contents);
+
+ Future<String> readAsString({Encoding encoding}) =>
+ new Future.value(_contents);
+
+ Stream<List<int>> read() =>
+ new Future<List<int>>.value(UTF8.encode(_contents)).asStream();
+
+ String toString() {
+ // Don't show the whole string if it's long.
+ var contents = _contents;
+ if (contents.length > 40) {
+ contents = contents.substring(0, 20) + " ... " +
+ contents.substring(contents.length - 20);
+ }
+
+ contents = _escape(contents);
+ return 'String "$contents"';
+ }
+
+ String _escape(String string) {
+ return string
+ .replaceAll("\"", r'\"')
+ .replaceAll("\n", r"\n")
+ .replaceAll("\r", r"\r")
+ .replaceAll("\t", r"\t");
+ }
+}
+
+/// An asset whose data is available from a stream.
+class StreamAsset implements Asset {
+ final AssetId id;
+
+ /// A stream replayer that records and replays the contents of the input
+ /// stream.
+ final StreamReplayer<List<int>> _replayer;
+
+ StreamAsset(this.id, Stream<List<int>> stream)
+ : _replayer = new StreamReplayer(stream);
+
+ Future<String> readAsString({Encoding encoding}) {
+ if (encoding == null) encoding = UTF8;
+ return _replayer.getReplay().toList()
+ .then((chunks) => encoding.decode(flatten(chunks)));
+ }
+
+ Stream<List<int>> read() => _replayer.getReplay();
+
+ String toString() => "Stream";
+}
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index 1027369..e8cbedc 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -6,15 +6,15 @@
import 'dart:async';
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_set.dart';
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
+import 'asset/asset_set.dart';
import 'log.dart';
import 'build_result.dart';
import 'errors.dart';
-import 'package_graph.dart';
+import 'graph/package_graph.dart';
import 'package_provider.dart';
-import 'transformer.dart';
+import 'transformer/transformer.dart';
/// A general-purpose asynchronous build dependency graph manager.
///
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index 5303b9d..290d534 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -6,8 +6,8 @@
import 'package:stack_trace/stack_trace.dart';
-import 'asset_id.dart';
-import 'transformer.dart';
+import 'asset/asset_id.dart';
+import 'transformer/transformer.dart';
import 'utils.dart';
/// Error thrown when an asset with [id] cannot be found.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/graph/asset_cascade.dart
similarity index 96%
rename from pkg/barback/lib/src/asset_cascade.dart
rename to pkg/barback/lib/src/graph/asset_cascade.dart
index 01c0659..ca08785 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/graph/asset_cascade.dart
@@ -2,22 +2,22 @@
// for 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.asset_cascade;
+library barback.graph.asset_cascade;
import 'dart:async';
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'asset_set.dart';
-import 'cancelable_future.dart';
-import 'errors.dart';
-import 'log.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../utils/cancelable_future.dart';
import 'node_status.dart';
import 'node_streams.dart';
import 'package_graph.dart';
import 'phase.dart';
-import 'transformer.dart';
/// The asset cascade for an individual package.
///
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/graph/group_runner.dart
similarity index 93%
rename from pkg/barback/lib/src/group_runner.dart
rename to pkg/barback/lib/src/graph/group_runner.dart
index e17f7fe..ce58eda 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/graph/group_runner.dart
@@ -2,17 +2,17 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.group_runner;
+library barback.graph.group_runner;
import 'dart:async';
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../transformer/transformer_group.dart';
+import '../utils/stream_pool.dart';
import 'asset_cascade.dart';
-import 'asset_node.dart';
-import 'log.dart';
import 'node_status.dart';
import 'phase.dart';
-import 'stream_pool.dart';
-import 'transformer_group.dart';
/// A class that processes all of the phases in a single transformer group.
///
diff --git a/pkg/barback/lib/src/node_status.dart b/pkg/barback/lib/src/graph/node_status.dart
similarity index 98%
rename from pkg/barback/lib/src/node_status.dart
rename to pkg/barback/lib/src/graph/node_status.dart
index 21d26c6..a42e523 100644
--- a/pkg/barback/lib/src/node_status.dart
+++ b/pkg/barback/lib/src/graph/node_status.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.node_status;
+library barback.graph.node_status;
/// The status of a node in barback's package graph.
///
diff --git a/pkg/barback/lib/src/node_streams.dart b/pkg/barback/lib/src/graph/node_streams.dart
similarity index 90%
rename from pkg/barback/lib/src/node_streams.dart
rename to pkg/barback/lib/src/graph/node_streams.dart
index 194314f..8344792 100644
--- a/pkg/barback/lib/src/node_streams.dart
+++ b/pkg/barback/lib/src/graph/node_streams.dart
@@ -2,14 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.node_streams;
+library barback.graph.node_streams;
import 'dart:async';
-import 'asset_node.dart';
-import 'log.dart';
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../utils/stream_pool.dart';
import 'node_status.dart';
-import 'stream_pool.dart';
/// A collection of streams that are common to nodes in barback's package graph.
class NodeStreams {
@@ -39,6 +39,9 @@
var _previousStatus = NodeStatus.RUNNING;
+ /// Whether [this] has been closed.
+ bool get isClosed => onAssetController.isClosed;
+
NodeStreams() {
onAssetPool.add(onAssetController.stream);
onLogPool.add(onLogController.stream);
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/graph/package_graph.dart
similarity index 96%
rename from pkg/barback/lib/src/package_graph.dart
rename to pkg/barback/lib/src/graph/package_graph.dart
index bbb480d..8cd4715 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/graph/package_graph.dart
@@ -2,22 +2,22 @@
// for 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.package_graph;
+library barback.graph.package_graph;
import 'dart:async';
import 'dart:collection';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../build_result.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../package_provider.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
import 'asset_cascade.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'asset_set.dart';
-import 'build_result.dart';
-import 'errors.dart';
-import 'log.dart';
import 'node_status.dart';
-import 'package_provider.dart';
-import 'transformer.dart';
-import 'utils.dart';
/// The collection of [AssetCascade]s for an entire application.
///
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/graph/phase.dart
similarity index 81%
rename from pkg/barback/lib/src/phase.dart
rename to pkg/barback/lib/src/graph/phase.dart
index 103e0e8..70f7e7f 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/graph/phase.dart
@@ -2,25 +2,26 @@
// for 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.phase;
+library barback.graph.phase;
import 'dart:async';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../transformer/transformer_group.dart';
+import '../utils.dart';
+import '../utils/multiset.dart';
import 'asset_cascade.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'errors.dart';
import 'group_runner.dart';
-import 'log.dart';
-import 'multiset.dart';
import 'node_status.dart';
import 'node_streams.dart';
import 'phase_forwarder.dart';
-import 'phase_input.dart';
import 'phase_output.dart';
-import 'transformer.dart';
-import 'transformer_group.dart';
-import 'utils.dart';
+import 'transformer_classifier.dart';
/// One phase in the ordered series of transformations in an [AssetCascade].
///
@@ -44,11 +45,6 @@
/// The index of [this] in its parent cascade or group.
final int _index;
- /// The transformers that can access [inputs].
- ///
- /// Their outputs will be available to the next phase.
- final _transformers = new Set<Transformer>();
-
/// The groups for this phase.
final _groups = new Map<TransformerGroup, GroupRunner>();
@@ -56,7 +52,10 @@
///
/// For the first phase, these will be the source assets. For all other
/// phases, they will be the outputs from the previous phase.
- final _inputs = new Map<AssetId, PhaseInput>();
+ final _inputs = new AssetNodeSet();
+
+ /// The transformer classifiers for this phase.
+ final _classifiers = new Map<Transformer, TransformerClassifier>();
/// The forwarders for this phase.
final _forwarders = new Map<AssetId, PhaseForwarder>();
@@ -68,13 +67,12 @@
/// phase.
///
/// This is used to determine which assets have been passed unmodified through
- /// [_inputs] or [_groups]. Each input asset has a PhaseInput in [_inputs]. If
- /// that input isn't consumed by any transformers, it will be forwarded
- /// through the PhaseInput. However, it's possible that it was consumed by a
- /// group, and so shouldn't be forwarded through the phase as a whole.
+ /// [_classifiers] or [_groups]. It's possible that a given asset was consumed
+ /// by a group and not an individual transformer, and so shouldn't be
+ /// forwarded through the phase as a whole.
///
/// In order to detect whether an output has been forwarded through a group or
- /// a PhaseInput, we must be able to distinguish it from other outputs with
+ /// a classifier, we must be able to distinguish it from other outputs with
/// the same id. To do so, we check if its origin is in [_inputOrigins]. If
/// so, it's been forwarded unmodified.
final _inputOrigins = new Multiset<AssetNode>();
@@ -87,12 +85,19 @@
/// How far along [this] is in processing its assets.
NodeStatus get status {
- var inputStatus = NodeStatus.dirtiest(
- _inputs.values.map((input) => input.status));
+ // Before any transformers are added, the phase should be dirty if and only
+ // if any input is dirty.
+ if (_classifiers.isEmpty && _groups.isEmpty) {
+ return _inputs.any((input) => input.state.isDirty) ?
+ NodeStatus.RUNNING : NodeStatus.IDLE;
+ }
+
+ var classifierStatus = NodeStatus.dirtiest(
+ _classifiers.values.map((classifier) => classifier.status));
var groupStatus = NodeStatus.dirtiest(
_groups.values.map((group) => group.status));
return (previous == null ? NodeStatus.IDLE : previous.status)
- .dirtier(inputStatus)
+ .dirtier(classifierStatus)
.dirtier(groupStatus);
}
@@ -157,12 +162,10 @@
/// removed and re-created. The phase will automatically handle updated assets
/// using the [AssetNode.onStateChange] stream.
void addInput(AssetNode node) {
- if (_inputs.containsKey(node.id)) _inputs[node.id].remove();
-
// Each group is one channel along which an asset may be forwarded, as is
// each transformer.
var forwarder = new PhaseForwarder(
- node, _transformers.length, _groups.length);
+ node, _classifiers.length, _groups.length);
_forwarders[node.id] = forwarder;
forwarder.onAsset.listen(_handleOutputWithoutForwarder);
if (forwarder.output != null) {
@@ -170,20 +173,18 @@
}
_inputOrigins.add(node.origin);
- var input = new PhaseInput(this, node, "$_location.$_index");
- _inputs[node.id] = input;
- input.input.whenRemoved(() {
- _inputOrigins.remove(node.origin);
- _inputs.remove(node.id);
- _forwarders.remove(node.id).remove();
+ _inputs.add(node);
+ node.onStateChange.listen((state) {
+ if (state.isRemoved) {
+ _inputOrigins.remove(node.origin);
+ _forwarders.remove(node.id).remove();
+ }
_streams.changeStatus(status);
});
- input.onAsset.listen(_handleOutput);
- _streams.onLogPool.add(input.onLog);
- input.onStatusChange.listen((_) => _streams.changeStatus(status));
- input.updateTransformers(_transformers);
-
+ for (var classifier in _classifiers.values) {
+ classifier.addInput(node);
+ }
for (var group in _groups.values) {
group.addInput(node);
}
@@ -235,11 +236,23 @@
/// Set this phase's transformers to [transformers].
void updateTransformers(Iterable transformers) {
- var actualTransformers = transformers.where((op) => op is Transformer);
- _transformers.clear();
- _transformers.addAll(actualTransformers);
- for (var input in _inputs.values) {
- input.updateTransformers(actualTransformers);
+ var newTransformers = transformers.where((op) => op is Transformer)
+ .toSet();
+ var oldTransformers = _classifiers.keys.toSet();
+ for (var removed in oldTransformers.difference(newTransformers)) {
+ _classifiers.remove(removed).remove();
+ }
+
+ for (var transformer in newTransformers.difference(oldTransformers)) {
+ var classifier = new TransformerClassifier(
+ this, transformer, "$_location.$_index");
+ _classifiers[transformer] = classifier;
+ classifier.onAsset.listen(_handleOutput);
+ _streams.onLogPool.add(classifier.onLog);
+ classifier.onStatusChange.listen((_) => _streams.changeStatus(status));
+ for (var input in _inputs) {
+ classifier.addInput(input);
+ }
}
var newGroups = transformers.where((op) => op is TransformerGroup)
@@ -255,25 +268,27 @@
runner.onAsset.listen(_handleOutput);
_streams.onLogPool.add(runner.onLog);
runner.onStatusChange.listen((_) => _streams.changeStatus(status));
- for (var input in _inputs.values) {
- runner.addInput(input.input);
+ for (var input in _inputs) {
+ runner.addInput(input);
}
}
for (var forwarder in _forwarders.values) {
- forwarder.updateTransformers(_transformers.length, _groups.length);
+ forwarder.updateTransformers(_classifiers.length, _groups.length);
}
+
+ _streams.changeStatus(status);
}
/// Force all [LazyTransformer]s' transforms in this phase to begin producing
/// concrete assets.
void forceAllTransforms() {
- for (var group in _groups.values) {
- group.forceAllTransforms();
+ for (var classifier in _classifiers.values) {
+ classifier.forceAllTransforms();
}
- for (var input in _inputs.values) {
- input.forceAllTransforms();
+ for (var group in _groups.values) {
+ group.forceAllTransforms();
}
}
@@ -295,8 +310,8 @@
///
/// This will remove all the phase's outputs.
void remove() {
- for (var input in _inputs.values.toList()) {
- input.remove();
+ for (var classifier in _classifiers.values.toList()) {
+ classifier.remove();
}
for (var group in _groups.values) {
group.remove();
diff --git a/pkg/barback/lib/src/phase_forwarder.dart b/pkg/barback/lib/src/graph/phase_forwarder.dart
similarity index 97%
rename from pkg/barback/lib/src/phase_forwarder.dart
rename to pkg/barback/lib/src/graph/phase_forwarder.dart
index bb275a5..e70aff3 100644
--- a/pkg/barback/lib/src/phase_forwarder.dart
+++ b/pkg/barback/lib/src/graph/phase_forwarder.dart
@@ -2,12 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.phase_forwarder;
+library barback.graph.phase_forwarder;
import 'dart:async';
-import 'asset_node.dart';
-import 'asset_node_set.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
/// A class that takes care of forwarding assets within a phase.
///
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/graph/phase_output.dart
similarity index 96%
rename from pkg/barback/lib/src/phase_output.dart
rename to pkg/barback/lib/src/graph/phase_output.dart
index bb5f176..3d6460b 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/graph/phase_output.dart
@@ -2,14 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.phase_output;
+library barback.graph.phase_output;
import 'dart:async';
import 'dart:collection';
-import 'asset_forwarder.dart';
-import 'asset_node.dart';
-import 'errors.dart';
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
import 'phase.dart';
/// A class that handles a single output of a phase.
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/graph/transform_node.dart
similarity index 87%
rename from pkg/barback/lib/src/transform_node.dart
rename to pkg/barback/lib/src/graph/transform_node.dart
index 41437ae..4cdab8e 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/graph/transform_node.dart
@@ -2,24 +2,24 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.transform_node;
+library barback.graph.transform_node;
import 'dart:async';
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'declaring_transform.dart';
-import 'declaring_transformer.dart';
-import 'errors.dart';
-import 'lazy_transformer.dart';
-import 'log.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/declaring_transform.dart';
+import '../transformer/declaring_transformer.dart';
+import '../transformer/lazy_transformer.dart';
+import '../transformer/transform.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
import 'node_status.dart';
import 'node_streams.dart';
import 'phase.dart';
-import 'transform.dart';
-import 'transformer.dart';
-import 'utils.dart';
/// Describes a transform on a set of assets and its relationship to the build
/// dependency graph.
@@ -47,8 +47,7 @@
/// How far along [this] is in processing its assets.
NodeStatus get status {
- if (_state == _State.NOT_PRIMARY || _state == _State.APPLIED ||
- _state == _State.DECLARED) {
+ if (_state == _State.APPLIED || _state == _State.DECLARED) {
return NodeStatus.IDLE;
}
@@ -130,6 +129,7 @@
: transformer = transformer,
primary = primary {
_forced = transformer is! DeclaringTransformer;
+ if (_forced) primary.force();
_primarySubscription = primary.onStateChange.listen((state) {
if (state.isRemoved) {
@@ -146,7 +146,14 @@
_dirty();
});
- _isPrimary();
+ _declareOutputs().then((_) {
+ if (_forced || _canRunDeclaringEagerly) {
+ _apply();
+ } else {
+ _state = _State.DECLARED;
+ _streams.changeStatus(NodeStatus.IDLE);
+ }
+ });
}
/// The [TransformInfo] describing this node.
@@ -186,14 +193,8 @@
///
/// This causes all of the transform's outputs to be marked as dirty as well.
void _dirty() {
- if (_state == _State.NOT_PRIMARY) {
- _emitPassThrough();
- return;
- }
-
- // If we're in the process of running [isPrimary] or [declareOutputs], we
- // already know that [apply] needs to be run so there's nothing we need to
- // mark as dirty.
+ // If we're in the process of running [declareOutputs], we already know that
+ // [apply] needs to be run so there's nothing we need to mark as dirty.
if (_state == _State.DECLARING) return;
if (!_forced && !_canRunDeclaringEagerly) {
@@ -227,41 +228,6 @@
}
}
- /// Runs [transformer.isPrimary] and adjusts [this]'s state according to the
- /// result.
- ///
- /// This will also run [_declareOutputs] and/or [_apply] as appropriate.
- void _isPrimary() {
- syncFuture(() => transformer.isPrimary(primary.id))
- .catchError((error, stackTrace) {
- if (_isRemoved) return false;
-
- // Catch all transformer errors and pipe them to the results stream. This
- // is so a broken transformer doesn't take down the whole graph.
- phase.cascade.reportError(_wrapException(error, stackTrace));
-
- return false;
- }).then((isPrimary) {
- if (_isRemoved) return null;
- if (isPrimary) {
- if (_forced) primary.force();
- return _declareOutputs().then((_) {
- if (_isRemoved) return;
- if (_forced || _canRunDeclaringEagerly) {
- _apply();
- } else {
- _state = _State.DECLARED;
- _streams.changeStatus(NodeStatus.IDLE);
- }
- });
- }
-
- _emitPassThrough();
- _state = _State.NOT_PRIMARY;
- _streams.changeStatus(NodeStatus.IDLE);
- });
- }
-
/// Runs [transform.declareOutputs] and emits the resulting assets as dirty
/// assets.
Future _declareOutputs() {
@@ -517,16 +483,17 @@
/// The enum of states that [TransformNode] can be in.
class _State {
- /// The transform is running [Transformer.isPrimary] followed by
- /// [DeclaringTransformer.declareOutputs] (for a [DeclaringTransformer]).
+ /// The transform is running [DeclaringTransformer.declareOutputs].
///
/// This is the initial state of the transformer, and it will only occur once
- /// since [Transformer.isPrimary] and [DeclaringTransformer.declareOutputs]
- /// are independent of the contents of the primary input. Once the two methods
- /// finish running, this will transition to [NOT_PRIMARY] if the input isn't
- /// primary, [DECLARED] if the transform is deferred, and [APPLYING]
- /// otherwise.
- static final DECLARING = const _State._("computing isPrimary");
+ /// since [DeclaringTransformer.declareOutputs] is independent of the contents
+ /// of the primary input. Once the method finishes running, this will
+ /// transition to [APPLYING] if the transform is non-lazy and the input is
+ /// available, and [DECLARED] otherwise.
+ ///
+ /// Non-declaring transformers will transition out of this state and into
+ /// [APPLYING] immediately.
+ static final DECLARING = const _State._("declaring outputs");
/// The transform is deferred and has run
/// [DeclaringTransformer.declareOutputs] but hasn't yet been forced.
@@ -560,12 +527,6 @@
/// is deferred and [APPLYING] otherwise.
static final APPLIED = const _State._("applied");
- /// The transform has finished running [Transformer.isPrimary], which returned
- /// `false`.
- ///
- /// This will never transition to another state.
- static final NOT_PRIMARY = const _State._("not primary");
-
final String name;
const _State._(this.name);
diff --git a/pkg/barback/lib/src/graph/transformer_classifier.dart b/pkg/barback/lib/src/graph/transformer_classifier.dart
new file mode 100644
index 0000000..6ba2480
--- /dev/null
+++ b/pkg/barback/lib/src/graph/transformer_classifier.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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.graph.transformer_classifier;
+
+import 'dart:async';
+
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'phase.dart';
+import 'transform_node.dart';
+
+/// A class for classifying the primary inputs for a transformer according to
+/// its `classifyPrimary` method.
+///
+/// This is used for non-aggregate transformers; they're modeled as aggregate
+/// transformers that return the primary path if `isPrimary` is true and `null`
+/// if `isPrimary` is `null`.
+class TransformerClassifier {
+ /// The containing [Phase].
+ final Phase _phase;
+
+ /// The [Transformer] to use to classify the inputs.
+ final Transformer transformer;
+
+ /// A string describing the location of [this] in the transformer graph.
+ final String _location;
+
+ /// The individual transforms for each classiciation key.
+ final _transforms = new Map<Object, TransformNode>();
+
+ /// Forwarders used to pass through assets that aren't used by [transformer].
+ final _passThroughForwarders = new Set<AssetForwarder>();
+
+ /// The streams exposed by this classifier.
+ final _streams = new NodeStreams();
+ Stream get onStatusChange => _streams.onStatusChange;
+ Stream<AssetNode> get onAsset => _streams.onAsset;
+ Stream<LogEntry> get onLog => _streams.onLog;
+
+ /// The number of currently-active calls to [transformer.isPrimary].
+ ///
+ /// This is used to determine whether [this] is dirty.
+ var _activeIsPrimaries = 0;
+
+ /// How far along [this] is in processing its assets.
+ NodeStatus get status {
+ if (_activeIsPrimaries > 0) return NodeStatus.RUNNING;
+ return NodeStatus.dirtiest(
+ _transforms.values.map((transform) => transform.status));
+ }
+
+ TransformerClassifier(this._phase, this.transformer, this._location);
+
+ /// Adds a new asset as an input for this transformer.
+ void addInput(AssetNode input) {
+ _activeIsPrimaries++;
+ syncFuture(() => transformer.isPrimary(input.id)).catchError(
+ (error, stackTrace) {
+ if (input.state.isRemoved) return false;
+
+ // Catch all transformer errors and pipe them to the results stream. This
+ // is so a broken transformer doesn't take down the whole graph.
+ var info = new TransformInfo(transformer, input.id);
+ if (error is! AssetNotFoundException) {
+ error = new TransformerException(info, error, stackTrace);
+ } else {
+ error = new MissingInputException(info, error.id);
+ }
+ _phase.cascade.reportError(error);
+
+ return false;
+ }).then((isPrimary) {
+ if (input.state.isRemoved) return;
+ if (!isPrimary) {
+ var forwarder = new AssetForwarder(input);
+ _passThroughForwarders.add(forwarder);
+ forwarder.node.whenRemoved(
+ () => _passThroughForwarders.remove(forwarder));
+ _streams.onAssetController.add(forwarder.node);
+ } else {
+ var transform = new TransformNode(
+ _phase, transformer, input, _location);
+ _transforms[input.id.path] = transform;
+
+ transform.onStatusChange.listen(
+ (_) => _streams.changeStatus(status),
+ onDone: () => _transforms.remove(input.id.path));
+
+ _streams.onAssetPool.add(transform.onAsset);
+ _streams.onLogPool.add(transform.onLog);
+ }
+ }).whenComplete(() {
+ _activeIsPrimaries--;
+ if (!_streams.isClosed) _streams.changeStatus(status);
+ });
+ }
+
+ /// Removes this transformer.
+ ///
+ /// This marks all outputs of the transformer as removed.
+ void remove() {
+ _streams.close();
+ for (var transform in _transforms.values.toList()) {
+ transform.remove();
+ }
+ for (var forwarder in _passThroughForwarders.toList()) {
+ forwarder.close();
+ }
+ }
+
+ /// Force all deferred transforms to begin producing concrete assets.
+ void forceAllTransforms() {
+ for (var transform in _transforms.values) {
+ transform.force();
+ }
+ }
+
+ String toString() => "classifier in $_location for $transformer";
+}
diff --git a/pkg/barback/lib/src/internal_asset.dart b/pkg/barback/lib/src/internal_asset.dart
index 75b4969..ab73901 100644
--- a/pkg/barback/lib/src/internal_asset.dart
+++ b/pkg/barback/lib/src/internal_asset.dart
@@ -1,187 +1,15 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/// This library exists so that pub can retain backwards-compatibility with
+/// versions of barback prior to 0.13.1.
+///
+/// In 0.13.1, `lib/src/internal_asset.dart` was moved to
+/// `lib/src/asset/internal_asset.dart. Pub needs to support all versions of
+/// barback back through 0.13.0, though. In order for this to work, it needs to
+/// be able to import "package:barback/src/internal_asset.dart" on all available
+/// barback versions, hence the existence of this library.
library barback.internal_asset;
-import 'dart:async';
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'asset.dart';
-import 'asset_id.dart';
-import 'file_pool.dart';
-import 'serialize.dart';
-import 'stream_replayer.dart';
-import 'utils.dart';
-
-/// Serialize an asset to a form that's safe to send across isolates.
-Map serializeAsset(Asset asset) {
- var id = serializeId(asset.id);
- if (asset is BinaryAsset) {
- return {
- 'type': 'binary',
- 'id': id,
- 'contents': asset._contents
- };
- } else if (asset is FileAsset) {
- return {
- 'type': 'file',
- 'id': id,
- 'path': asset._path
- };
- } else if (asset is StringAsset) {
- return {
- 'type': 'string',
- 'id': id,
- 'contents': asset._contents
- };
- } else {
- // [asset] is probably a [StreamAsset], but it's possible that the user has
- // created a custom subclass, in which case we just serialize the stream
- // anyway.
- return {
- 'type': 'stream',
- 'id': id,
- 'stream': serializeStream(asset.read())
- };
- }
-}
-
-/// Deserialize an asset from the form returned by [serialize].
-Asset deserializeAsset(Map asset) {
- var id = deserializeId(asset['id']);
- switch (asset['type']) {
- case 'binary': return new BinaryAsset(id, asset['contents']);
- case 'file': return new FileAsset(id, asset['path']);
- case 'string': return new StringAsset(id, asset['contents']);
- case 'stream':
- return new StreamAsset(id, deserializeStream(asset['stream']));
- default:
- throw new FormatException('Unknown asset type "${asset['type']}".');
- }
-}
-
-/// An asset whose data is stored in a list of bytes.
-class BinaryAsset implements Asset {
- final AssetId id;
-
- final Uint8List _contents;
-
- BinaryAsset(this.id, List<int> contents)
- : _contents = toUint8List(contents);
-
- Future<String> readAsString({Encoding encoding}) {
- if (encoding == null) encoding = UTF8;
-
- return new Future.value(encoding.decode(_contents));
- }
-
- Stream<List<int>> read() => new Future<List<int>>.value(_contents).asStream();
-
- String toString() {
- var buffer = new StringBuffer();
- buffer.write("Bytes [");
-
- // Don't show the whole list if it's long.
- if (_contents.length > 11) {
- for (var i = 0; i < 5; i++) {
- buffer.write(byteToHex(_contents[i]));
- buffer.write(" ");
- }
-
- buffer.write("...");
-
- for (var i = _contents.length - 5; i < _contents.length; i++) {
- buffer.write(" ");
- buffer.write(byteToHex(_contents[i]));
- }
- } else {
- for (var i = 0; i < _contents.length; i++) {
- if (i > 0) buffer.write(" ");
- buffer.write(byteToHex(_contents[i]));
- }
- }
-
- buffer.write("]");
- return buffer.toString();
- }
-}
-
-/// An asset backed by a file on the local file system.
-class FileAsset implements Asset {
- final AssetId id;
-
- /// Use a [FilePool] to handle reads so we can try to cope with running out
- /// of file descriptors more gracefully.
- static final _pool = new FilePool();
-
- final String _path;
- FileAsset(this.id, this._path);
-
- Future<String> readAsString({Encoding encoding}) {
- if (encoding == null) encoding = UTF8;
- return _pool.readAsString(_path, encoding);
- }
-
- Stream<List<int>> read() => _pool.openRead(_path);
-
- String toString() => 'File "${_path}"';
-}
-
-/// An asset whose data is stored in a string.
-class StringAsset implements Asset {
- final AssetId id;
-
- final String _contents;
-
- StringAsset(this.id, this._contents);
-
- Future<String> readAsString({Encoding encoding}) =>
- new Future.value(_contents);
-
- Stream<List<int>> read() =>
- new Future<List<int>>.value(UTF8.encode(_contents)).asStream();
-
- String toString() {
- // Don't show the whole string if it's long.
- var contents = _contents;
- if (contents.length > 40) {
- contents = contents.substring(0, 20) + " ... " +
- contents.substring(contents.length - 20);
- }
-
- contents = _escape(contents);
- return 'String "$contents"';
- }
-
- String _escape(String string) {
- return string
- .replaceAll("\"", r'\"')
- .replaceAll("\n", r"\n")
- .replaceAll("\r", r"\r")
- .replaceAll("\t", r"\t");
- }
-}
-
-/// An asset whose data is available from a stream.
-class StreamAsset implements Asset {
- final AssetId id;
-
- /// A stream replayer that records and replays the contents of the input
- /// stream.
- final StreamReplayer<List<int>> _replayer;
-
- StreamAsset(this.id, Stream<List<int>> stream)
- : _replayer = new StreamReplayer(stream);
-
- Future<String> readAsString({Encoding encoding}) {
- if (encoding == null) encoding = UTF8;
- return _replayer.getReplay().toList()
- .then((chunks) => encoding.decode(flatten(chunks)));
- }
-
- Stream<List<int>> read() => _replayer.getReplay();
-
- String toString() => "Stream";
-}
+export 'asset/internal_asset.dart';
diff --git a/pkg/barback/lib/src/log.dart b/pkg/barback/lib/src/log.dart
index 23f425a..691f4db 100644
--- a/pkg/barback/lib/src/log.dart
+++ b/pkg/barback/lib/src/log.dart
@@ -6,7 +6,7 @@
import 'package:source_maps/span.dart';
-import 'asset_id.dart';
+import 'asset/asset_id.dart';
import 'errors.dart';
/// The severity of a logged message.
diff --git a/pkg/barback/lib/src/package_provider.dart b/pkg/barback/lib/src/package_provider.dart
index 349785c..fe440f7 100644
--- a/pkg/barback/lib/src/package_provider.dart
+++ b/pkg/barback/lib/src/package_provider.dart
@@ -6,8 +6,8 @@
import 'dart:async';
-import 'asset.dart';
-import 'asset_id.dart';
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
/// API for locating and accessing packages on disk.
///
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
deleted file mode 100644
index bd47f1a..0000000
--- a/pkg/barback/lib/src/phase_input.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library barback.phase_input;
-
-import 'dart:async';
-
-import 'asset_forwarder.dart';
-import 'asset_node.dart';
-import 'log.dart';
-import 'node_status.dart';
-import 'node_streams.dart';
-import 'phase.dart';
-import 'transform_node.dart';
-import 'transformer.dart';
-
-/// A class for watching a single [AssetNode] and running any transforms that
-/// take that node as a primary input.
-class PhaseInput {
- /// The phase for which this is an input.
- final Phase _phase;
-
- /// A string describing the location of [this] in the transformer graph.
- final String _location;
-
- /// The transforms currently applicable to [input].
- ///
- /// These are the transforms that have been "wired up": they represent a
- /// repeatable transformation of a single concrete set of inputs. "dart2js" is
- /// a transformer. "dart2js on web/main.dart" is a transform.
- final _transforms = new Set<TransformNode>();
-
- /// A forwarder for the input [AssetNode] for this phase.
- ///
- /// This is used to mark the node as removed should the input ever be removed.
- final AssetForwarder _inputForwarder;
-
- /// The asset node for this input.
- AssetNode get input => _inputForwarder.node;
-
- /// The subscription to [input]'s [AssetNode.onStateChange] stream.
- StreamSubscription _inputSubscription;
-
- /// The streams exposed by this input.
- final _streams = new NodeStreams();
- Stream get onStatusChange => _streams.onStatusChange;
- Stream<AssetNode> get onAsset => _streams.onAsset;
- Stream<LogEntry> get onLog => _streams.onLog;
-
- /// How far along [this] is in processing its assets.
- NodeStatus get status {
- var status = input.state.isDirty && !input.isLazy ?
- NodeStatus.MATERIALIZING : NodeStatus.IDLE;
- return status.dirtier(NodeStatus.dirtiest(
- _transforms.map((transform) => transform.status)));
- }
-
- PhaseInput(this._phase, AssetNode input, this._location)
- : _inputForwarder = new AssetForwarder(input) {
- _inputSubscription = input.onStateChange.listen((state) {
- if (state.isRemoved) {
- remove();
- } else {
- _streams.changeStatus(status);
- }
- });
- }
-
- /// Removes this input.
- ///
- /// This marks all outputs of the input as removed.
- void remove() {
- _streams.close();
- _inputSubscription.cancel();
- _inputForwarder.close();
- }
-
- /// Set this input's transformers to [transformers].
- void updateTransformers(Iterable<Transformer> newTransformersIterable) {
- var newTransformers = newTransformersIterable.toSet();
- for (var transform in _transforms.toList()) {
- if (newTransformers.remove(transform.transformer)) continue;
- transform.remove();
- }
-
- // The remaining [newTransformers] are those for which there are no
- // transforms in [_transforms].
- for (var transformer in newTransformers) {
- var transform = new TransformNode(
- _phase, transformer, input, _location);
- _transforms.add(transform);
-
- transform.onStatusChange.listen(
- (_) => _streams.changeStatus(status),
- onDone: () => _transforms.remove(transform));
-
- _streams.onAssetPool.add(transform.onAsset);
- _streams.onLogPool.add(transform.onLog);
- }
- }
-
- /// Force all [LazyTransformer]s' transforms in this input to begin producing
- /// concrete assets.
- void forceAllTransforms() {
- for (var transform in _transforms) {
- transform.force();
- }
- }
-
- String toString() => "phase input in $_location for $input";
-}
diff --git a/pkg/barback/lib/src/serialize.dart b/pkg/barback/lib/src/serialize.dart
index adc365d..1458463 100644
--- a/pkg/barback/lib/src/serialize.dart
+++ b/pkg/barback/lib/src/serialize.dart
@@ -9,7 +9,7 @@
import 'package:stack_trace/stack_trace.dart';
-import 'asset_id.dart';
+import 'asset/asset_id.dart';
import 'utils.dart';
/// Converts [id] into a serializable map.
diff --git a/pkg/barback/lib/src/barback_settings.dart b/pkg/barback/lib/src/transformer/barback_settings.dart
similarity index 97%
rename from pkg/barback/lib/src/barback_settings.dart
rename to pkg/barback/lib/src/transformer/barback_settings.dart
index 80c276e..5b3f46c 100644
--- a/pkg/barback/lib/src/barback_settings.dart
+++ b/pkg/barback/lib/src/transformer/barback_settings.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.barback_settings;
+library barback.transformer.barback_settings;
/// A generic settings object for providing configuration details to
/// [Transformer]s.
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/transformer/base_transform.dart
similarity index 96%
rename from pkg/barback/lib/src/base_transform.dart
rename to pkg/barback/lib/src/transformer/base_transform.dart
index bb0183c..0672047 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/transformer/base_transform.dart
@@ -2,13 +2,13 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.base_transform;
+library barback.transformer.base_transform;
import 'dart:async';
-import 'log.dart';
+import '../graph/transform_node.dart';
+import '../log.dart';
import 'transform_logger.dart';
-import 'transform_node.dart';
/// The base class for the ephemeral transform objects that are passed to
/// transformers.
diff --git a/pkg/barback/lib/src/declaring_transform.dart b/pkg/barback/lib/src/transformer/declaring_transform.dart
similarity index 92%
rename from pkg/barback/lib/src/declaring_transform.dart
rename to pkg/barback/lib/src/transformer/declaring_transform.dart
index 2f8a8bf..e15082f 100644
--- a/pkg/barback/lib/src/declaring_transform.dart
+++ b/pkg/barback/lib/src/transformer/declaring_transform.dart
@@ -2,11 +2,11 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.declaring_transform;
+library barback.transformer.declaring_transform;
-import 'asset_id.dart';
+import '../asset/asset_id.dart';
+import '../graph/transform_node.dart';
import 'base_transform.dart';
-import 'transform_node.dart';
/// A transform for [DeclaringTransform]ers that allows them to declare the ids
/// of the outputs they'll generate without generating the concrete bodies of
diff --git a/pkg/barback/lib/src/declaring_transformer.dart b/pkg/barback/lib/src/transformer/declaring_transformer.dart
similarity index 95%
rename from pkg/barback/lib/src/declaring_transformer.dart
rename to pkg/barback/lib/src/transformer/declaring_transformer.dart
index e3553e7..d9e5adc 100644
--- a/pkg/barback/lib/src/declaring_transformer.dart
+++ b/pkg/barback/lib/src/transformer/declaring_transformer.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.declaring_transformer;
+library barback.transformer.declaring_transformer;
import 'dart:async';
diff --git a/pkg/barback/lib/src/lazy_transformer.dart b/pkg/barback/lib/src/transformer/lazy_transformer.dart
similarity index 93%
rename from pkg/barback/lib/src/lazy_transformer.dart
rename to pkg/barback/lib/src/transformer/lazy_transformer.dart
index 67511f8..657b65b 100644
--- a/pkg/barback/lib/src/lazy_transformer.dart
+++ b/pkg/barback/lib/src/transformer/lazy_transformer.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.lazy_transformer;
+library barback.transformer.lazy_transformer;
import 'declaring_transformer.dart';
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transformer/transform.dart
similarity index 94%
rename from pkg/barback/lib/src/transform.dart
rename to pkg/barback/lib/src/transformer/transform.dart
index 268849d..809cd12 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transformer/transform.dart
@@ -2,18 +2,18 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.transform;
+library barback.transformer.transform;
import 'dart:async';
import 'dart:convert';
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_set.dart';
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
import 'base_transform.dart';
-import 'errors.dart';
-import 'transform_node.dart';
-import 'utils.dart';
/// While a [Transformer] represents a *kind* of transformation, this defines
/// one specific usage of it on a set of files.
diff --git a/pkg/barback/lib/src/transform_logger.dart b/pkg/barback/lib/src/transformer/transform_logger.dart
similarity index 96%
rename from pkg/barback/lib/src/transform_logger.dart
rename to pkg/barback/lib/src/transformer/transform_logger.dart
index 5f43a2d..6524375 100644
--- a/pkg/barback/lib/src/transform_logger.dart
+++ b/pkg/barback/lib/src/transformer/transform_logger.dart
@@ -2,12 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.transform_logger;
+library barback.transformer.transform_logger;
import 'package:source_maps/span.dart';
-import 'asset_id.dart';
-import 'log.dart';
+import '../asset/asset_id.dart';
+import '../log.dart';
typedef void LogFunction(AssetId asset, LogLevel level, String message,
Span span);
diff --git a/pkg/barback/lib/src/transformer.dart b/pkg/barback/lib/src/transformer/transformer.dart
similarity index 97%
rename from pkg/barback/lib/src/transformer.dart
rename to pkg/barback/lib/src/transformer/transformer.dart
index 08a9d85..efacf76 100644
--- a/pkg/barback/lib/src/transformer.dart
+++ b/pkg/barback/lib/src/transformer/transformer.dart
@@ -2,13 +2,13 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.transformer;
+library barback.transformer.transformer;
import 'dart:async';
-import 'asset_id.dart';
+import '../asset/asset_id.dart';
+import '../utils.dart';
import 'transform.dart';
-import 'utils.dart';
/// A [Transformer] represents a processor that takes in one or more input
/// assets and uses them to generate one or more output assets.
diff --git a/pkg/barback/lib/src/transformer_group.dart b/pkg/barback/lib/src/transformer/transformer_group.dart
similarity index 96%
rename from pkg/barback/lib/src/transformer_group.dart
rename to pkg/barback/lib/src/transformer/transformer_group.dart
index 58ffd2a..17a2e57 100644
--- a/pkg/barback/lib/src/transformer_group.dart
+++ b/pkg/barback/lib/src/transformer/transformer_group.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.transformer_group;
+library barback.transformer.transformer_group;
/// A [TransformerGroup] encapsulates a phased collection of transformers.
///
diff --git a/pkg/barback/lib/src/cancelable_future.dart b/pkg/barback/lib/src/utils/cancelable_future.dart
similarity index 97%
rename from pkg/barback/lib/src/cancelable_future.dart
rename to pkg/barback/lib/src/utils/cancelable_future.dart
index 84c19f1..ff723b2 100644
--- a/pkg/barback/lib/src/cancelable_future.dart
+++ b/pkg/barback/lib/src/utils/cancelable_future.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.cancelable_future;
+library barback.utils.cancelable_future;
import 'dart:async';
diff --git a/pkg/barback/lib/src/file_pool.dart b/pkg/barback/lib/src/utils/file_pool.dart
similarity index 97%
rename from pkg/barback/lib/src/file_pool.dart
rename to pkg/barback/lib/src/utils/file_pool.dart
index dab9409..6bea4a4 100644
--- a/pkg/barback/lib/src/file_pool.dart
+++ b/pkg/barback/lib/src/utils/file_pool.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.file_pool;
+library barback.utils.file_pool;
import 'dart:async';
import 'dart:convert';
@@ -10,8 +10,8 @@
import 'package:stack_trace/stack_trace.dart';
+import '../utils.dart';
import 'pool.dart';
-import 'utils.dart';
/// Manages a pool of files that are opened for reading to cope with maximum
/// file descriptor limits.
diff --git a/pkg/barback/lib/src/multiset.dart b/pkg/barback/lib/src/utils/multiset.dart
similarity index 98%
rename from pkg/barback/lib/src/multiset.dart
rename to pkg/barback/lib/src/utils/multiset.dart
index e2d3e30..20d1c57 100644
--- a/pkg/barback/lib/src/multiset.dart
+++ b/pkg/barback/lib/src/utils/multiset.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.multiset;
+library barback.utils.multiset;
import 'dart:collection';
diff --git a/pkg/barback/lib/src/pool.dart b/pkg/barback/lib/src/utils/pool.dart
similarity index 98%
rename from pkg/barback/lib/src/pool.dart
rename to pkg/barback/lib/src/utils/pool.dart
index 4653722..c1c76bc 100644
--- a/pkg/barback/lib/src/pool.dart
+++ b/pkg/barback/lib/src/utils/pool.dart
@@ -2,14 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.pool;
+library barback.utils.pool;
import 'dart:async';
import 'dart:collection';
import 'package:stack_trace/stack_trace.dart';
-import 'utils.dart';
+import '../utils.dart';
// TODO(nweiz): put this somewhere that it can be shared between packages.
/// Manages an abstract pool of resources with a limit on how many may be in use
diff --git a/pkg/barback/lib/src/stream_pool.dart b/pkg/barback/lib/src/utils/stream_pool.dart
similarity index 98%
rename from pkg/barback/lib/src/stream_pool.dart
rename to pkg/barback/lib/src/utils/stream_pool.dart
index da5c715..679672d 100644
--- a/pkg/barback/lib/src/stream_pool.dart
+++ b/pkg/barback/lib/src/utils/stream_pool.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.stream_pool;
+library barback.utils.stream_pool;
import 'dart:async';
diff --git a/pkg/barback/lib/src/stream_replayer.dart b/pkg/barback/lib/src/utils/stream_replayer.dart
similarity index 97%
rename from pkg/barback/lib/src/stream_replayer.dart
rename to pkg/barback/lib/src/utils/stream_replayer.dart
index 66a056a..4a25085 100644
--- a/pkg/barback/lib/src/stream_replayer.dart
+++ b/pkg/barback/lib/src/utils/stream_replayer.dart
@@ -2,12 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library barback.stream_replayer;
+library barback.utils.stream_replayer;
import 'dart:async';
import 'dart:collection';
-import 'utils.dart';
+import '../utils.dart';
/// Records the values and errors that are sent through a stream and allows them
/// to be replayed arbitrarily many times.
diff --git a/pkg/barback/test/asset_test.dart b/pkg/barback/test/asset_test.dart
index 9312fb0..7936c71 100644
--- a/pkg/barback/test/asset_test.dart
+++ b/pkg/barback/test/asset_test.dart
@@ -10,7 +10,7 @@
import 'dart:isolate';
import 'package:barback/barback.dart';
-import 'package:barback/src/internal_asset.dart';
+import 'package:barback/src/asset/internal_asset.dart';
import 'package:path/path.dart' as pathos;
import 'package:unittest/unittest.dart';
diff --git a/pkg/barback/test/cancelable_future_test.dart b/pkg/barback/test/cancelable_future_test.dart
index d5f9ae4..6535894 100644
--- a/pkg/barback/test/cancelable_future_test.dart
+++ b/pkg/barback/test/cancelable_future_test.dart
@@ -6,8 +6,8 @@
import 'dart:async';
-import 'package:barback/src/cancelable_future.dart';
import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
import 'package:unittest/unittest.dart';
import 'utils.dart';
diff --git a/pkg/barback/test/multiset_test.dart b/pkg/barback/test/multiset_test.dart
index ab5e311..7b6f09f 100644
--- a/pkg/barback/test/multiset_test.dart
+++ b/pkg/barback/test/multiset_test.dart
@@ -4,7 +4,7 @@
library barback.test.multiset_test;
-import 'package:barback/src/multiset.dart';
+import 'package:barback/src/utils/multiset.dart';
import 'package:unittest/unittest.dart';
import 'utils.dart';
diff --git a/pkg/barback/test/stream_pool_test.dart b/pkg/barback/test/stream_pool_test.dart
index fafa1f5..ed590f3 100644
--- a/pkg/barback/test/stream_pool_test.dart
+++ b/pkg/barback/test/stream_pool_test.dart
@@ -6,8 +6,8 @@
import 'dart:async';
-import 'package:barback/src/stream_pool.dart';
import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_pool.dart';
import 'package:scheduled_test/scheduled_test.dart';
import 'utils.dart';
diff --git a/pkg/barback/test/stream_replayer_test.dart b/pkg/barback/test/stream_replayer_test.dart
index 9bc8224..802db14 100644
--- a/pkg/barback/test/stream_replayer_test.dart
+++ b/pkg/barback/test/stream_replayer_test.dart
@@ -6,8 +6,8 @@
import 'dart:async';
-import 'package:barback/src/stream_replayer.dart';
import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_replayer.dart';
import 'package:unittest/unittest.dart';
import 'utils.dart';
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 50ad727..4fa3d3f 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -8,8 +8,8 @@
import 'dart:convert' show Encoding;
import 'package:barback/barback.dart';
-import 'package:barback/src/cancelable_future.dart';
import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
import 'package:path/path.dart' as pathos;
import 'package:scheduled_test/scheduled_test.dart';
import 'package:stack_trace/stack_trace.dart';
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 295ff3f..81ddfd9 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,12 +1,12 @@
name: csslib
-version: 0.9.2+1
+version: 0.9.3-dev
author: Polymer.dart Team <web-ui-dev@dartlang.org>
description: A library for parsing CSS.
homepage: https://www.dartlang.org
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
- args: '>=0.9.0 <0.11.0'
+ args: '>=0.9.0 <0.12.0'
logging: '>=0.9.0 <0.10.0'
path: '>=0.9.0 <2.0.0'
source_maps: '>=0.9.0 <0.10.0'
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index fbf80eb..4fc679f 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -98,11 +98,15 @@
void inserted() {}
@deprecated
void enteredView() {}
+ @deprecated
+ void attached() {}
/** Invoked when this component is removed from the DOM tree. */
void removed() {}
@deprecated
void leftView() {}
+ @deprecated
+ void detached() {}
/** Invoked when any attribute of the component is modified. */
void attributeChanged(String name, String oldValue, String newValue) =>
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index c23cd7d..6b50777 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -53,8 +53,8 @@
introFileName: introFileName, out: out,
excludeLibraries: excludeLibraries,
includeDependentPackages: includeDependentPackages,
- startPage: startPage, pubScript: pubScript, dartBinary: dartBinary,
- indentJSON: indentJSON);
+ startPage: startPage, pubScriptValue: pubScript,
+ dartBinaryValue: dartBinary, indentJSON: indentJSON);
viewer.addBackViewerCode();
if (compile || serve) {
result.then((success) {
@@ -64,6 +64,8 @@
});
}
} else if (compile || serve) {
+ gen.pubScript = pubScript;
+ gen.dartBinary = dartBinary;
viewer.createViewer(serve);
}
return result;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 9778b51..aba0551 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -41,12 +41,10 @@
List<String> _excluded;
/// The path of the pub script.
-String get pubScript => _pubScript;
-String _pubScript;
+String pubScript;
/// The path of Dart binary.
-String get dartBinary => _dartBinary;
-String _dartBinary;
+String dartBinary;
/// Docgen constructor initializes the link resolver for markdown parsing.
/// Also initializes the command line arguments.
@@ -62,11 +60,11 @@
bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
bool parseSdk: false, String introFileName: '',
out: DEFAULT_OUTPUT_DIRECTORY, List<String> excludeLibraries: const [], bool
- includeDependentPackages: false, String startPage, String dartBinary,
- String pubScript, bool indentJSON: false}) {
+ includeDependentPackages: false, String startPage, String dartBinaryValue,
+ String pubScriptValue, bool indentJSON: false}) {
_excluded = excludeLibraries;
- _pubScript = pubScript;
- _dartBinary = dartBinary;
+ dartBinary = dartBinaryValue;
+ pubScript = pubScriptValue;
logger.onRecord.listen((record) => print(record.message));
@@ -384,13 +382,13 @@
List<String> _allDependentPackageDirs(String packageDirectory) {
var packageName = packageNameFor(packageDirectory);
if (packageName == '') return [];
- var dependentsJson = Process.runSync(_pubScript, ['list-package-dirs'],
+ var dependentsJson = Process.runSync(pubScript, ['list-package-dirs'],
workingDirectory: packageDirectory, runInShell: true);
if (dependentsJson.exitCode != 0) {
print(dependentsJson.stderr);
}
var dependents = JSON.decode(dependentsJson.stdout)['packages'];
- return dependents.values.toList();
+ return dependents != null ? dependents.values.toList() : [];
}
/// For all the libraries, return a list of the libraries that are part of
diff --git a/pkg/docgen/lib/src/library_helpers.dart b/pkg/docgen/lib/src/library_helpers.dart
index 05d6f4b..78db9e9 100644
--- a/pkg/docgen/lib/src/library_helpers.dart
+++ b/pkg/docgen/lib/src/library_helpers.dart
@@ -29,9 +29,6 @@
}
void set includePrivateMembers(bool value) {
- if (_includePrivate != null) {
- throw new StateError('includePrivate has already been set');
- }
if (value == null) throw new ArgumentError('includePrivate cannot be null');
_includePrivate = value;
}
diff --git a/pkg/docgen/lib/src/models/annotation.dart b/pkg/docgen/lib/src/models/annotation.dart
index 86cd274..f7a537c 100644
--- a/pkg/docgen/lib/src/models/annotation.dart
+++ b/pkg/docgen/lib/src/models/annotation.dart
@@ -4,53 +4,111 @@
library docgen.models.annotation;
-import '../exports/mirrors_util.dart' as dart2js_util;
import '../exports/source_mirrors.dart';
+import '../exports/dart2js_mirrors.dart' show ResolvedNode;
+
import '../library_helpers.dart';
import 'library.dart';
import 'mirror_based.dart';
+import 'dart:mirrors';
+import '../../../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+
/// Holds the name of the annotation, and its parameters.
class Annotation extends MirrorBased<ClassMirror> {
/// The class of this annotation.
- final ClassMirror mirror;
+ DeclarationMirror mirror;
+ Send node;
final Library owningLibrary;
- final List<String> parameters;
+ List<String> parameters;
- Annotation(InstanceMirror originalMirror, this.owningLibrary)
- : mirror = originalMirror.type,
- parameters = _createParamaters(originalMirror);
+ Annotation(ResolvedNode resolvedNode, this.owningLibrary) {
+ parameters = [];
+ getMirrorForResolvedNode(resolvedNode, (m, n) { mirror = m; node = n;},
+ (String param) => parameters.add(param));
+ }
+
+ String getMirrorForResolvedNode(ResolvedNode node, callbackFunc,
+ paramCallbackFunc) {
+ ResolvedNodeMirrorFinder finder = new ResolvedNodeMirrorFinder(node,
+ callbackFunc, paramCallbackFunc);
+ finder.unparse(node.node);
+ return finder.result;
+ }
Map toMap() => {
- 'name': getDocgenObject(mirror, owningLibrary).docName,
+ 'name': owningLibrary.packagePrefix +
+ getDocgenObject(mirror, owningLibrary).docName,
'parameters': parameters
};
}
-List<String> _createParamaters(InstanceMirror originalMirror) {
- var curMirror = originalMirror.type;
- Map<Symbol, DeclarationMirror> allDeclarations =
- new Map.from(curMirror.declarations);
- // This method assumes that our users aren't creating deep inheritance
- // chains of custom annotation inheritance. If this is not the case,
- // re-write this section for performance.
- while (curMirror.superclass != null &&
- curMirror.superclass.simpleName.toString() != 'Object') {
- allDeclarations.addAll(curMirror.superclass.declarations);
- curMirror = curMirror.superclass;
+class ResolvedNodeMirrorFinder extends Unparser {
+ final ResolvedNode resolvedNode;
+ final Function annotationMirrorCallback;
+ final Function parameterValueCallback;
+ int recursionLevel;
+
+ ResolvedNodeMirrorFinder(this.resolvedNode, this.annotationMirrorCallback,
+ this.parameterValueCallback) : recursionLevel = 0;
+
+ visitSend(Send node) {
+ if (recursionLevel == 0) {
+ var m = resolvedNode.resolvedMirror(node.selector);
+ annotationMirrorCallback(m, node);
+ } else {
+ Operator op = node.selector.asOperator();
+ String opString = op != null ? op.source : null;
+ bool spacesNeeded =
+ identical(opString, 'is') || identical(opString, 'as');
+ if (node.isPrefix) visit(node.selector);
+ unparseSendReceiver(node, spacesNeeded: spacesNeeded);
+ if (!node.isPrefix && !node.isIndex) visit(node.selector);
+ if (spacesNeeded) sb.write(' ');
+ // Also add a space for sequences like x + +1 and y - -y.
+ // TODO(ahe): remove case for '+' when we drop the support for it.
+ if (node.argumentsNode != null && (identical(opString, '-')
+ || identical(opString, '+'))) {
+ var beginToken = node.argumentsNode.getBeginToken();
+ if (beginToken != null &&
+ identical(beginToken.stringValue, opString)) {
+ sb.write(' ');
+ }
+ }
+ }
+ recursionLevel++;
+ visit(node.argumentsNode);
+ recursionLevel--;
}
- // TODO(efortuna): Some originalMirrors, such as the
- // Dart2JsMapConstantMirror and Dart2JsListConstantMirror don't have a
- // reflectee field, but we want the value of the parameter from them.
- // Gross workaround is to assemble the object manually.
- // See issue 18346.
- return dart2js_util.variablesOf(allDeclarations)
- .where((e) => e.isFinal &&
- originalMirror.getField(e.simpleName).hasReflectee)
- .map((e) => originalMirror.getField(e.simpleName).reflectee)
- .where((e) => e != null)
- .toList();
+ unparseNodeListFrom(NodeList node, var from) {
+ if (from.isEmpty) return;
+
+ visit(from.head);
+
+ for (var link = from.tail; !link.isEmpty; link = link.tail) {
+ if (recursionLevel >= 2) {
+ parameterValueCallback(sb.toString());
+ sb.clear();
+ }
+ visit(link.head);
+ }
+ if (recursionLevel >= 2) {
+ parameterValueCallback(sb.toString());
+ sb.clear();
+ }
+ }
+
+ visitNodeList(NodeList node) {
+ addToken(node.beginToken);
+ if (recursionLevel == 1) sb.clear();
+ if (node.nodes != null) {
+ recursionLevel++;
+ unparseNodeListFrom(node, node.nodes);
+ recursionLevel--;
+ }
+ if (node.endToken != null) add(node.endToken.value);
+ }
}
diff --git a/pkg/docgen/lib/src/models/model_helpers.dart b/pkg/docgen/lib/src/models/model_helpers.dart
index fa56731..48babc9 100644
--- a/pkg/docgen/lib/src/models/model_helpers.dart
+++ b/pkg/docgen/lib/src/models/model_helpers.dart
@@ -78,16 +78,15 @@
/// 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);
+ for (dart2js_mirrors.ResolvedNode node in
+ dart2js_mirrors.BackDoor.metadataSyntaxOf(mirror)) {
+ var docgenAnnotation = new Annotation(node, owningLibrary);
if (!_SKIPPED_ANNOTATIONS.contains(dart2js_util.qualifiedNameOf(
docgenAnnotation.mirror))) {
annotations.add(docgenAnnotation);
}
- });
+ }
return annotations;
}
@@ -157,6 +156,15 @@
// Determine the classes, variables and methods that are exported for a
// specific dependency.
void _populateExports(LibraryDependencyMirror export, bool showExport) {
+ var transitiveExports = calcExportedItems(export.targetLibrary);
+ exports['classes'].addAll(transitiveExports['classes']);
+ exports['methods'].addAll(transitiveExports['methods']);
+ exports['variables'].addAll(transitiveExports['variables']);
+ // If there is a show in the export, add only the show items to the
+ // library. Ex: "export foo show bar"
+ // Otherwise, add all items, and then remove the hidden ones.
+ // Ex: "export foo hide bar"
+
if (!showExport) {
// Add all items, and then remove the hidden ones.
// Ex: "export foo hide bar"
@@ -199,10 +207,6 @@
Iterable<LibraryDependencyMirror> exportList =
library.libraryDependencies.where((lib) => lib.isExport);
for (LibraryDependencyMirror export in exportList) {
- // If there is a show in the export, add only the show items to the
- // library. Ex: "export foo show bar"
- // Otherwise, add all items, and then remove the hidden ones.
- // Ex: "export foo hide bar"
_populateExports(export,
export.combinators.any((combinator) => combinator.isShow));
}
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index e6913dd..63a90a5 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -3,7 +3,7 @@
description: A documentation generator for the Dart repository.
homepage: https://www.dartlang.org/
dependencies:
- args: '>=0.9.0 <0.11.0'
+ args: '>=0.9.0 <0.12.0'
logging: '>=0.9.0 <0.10.0'
markdown: 0.7.0
path: '>=0.9.0 <2.0.0'
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
new file mode 100644
index 0000000..d9fa7ee
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
@@ -0,0 +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 test_lib2;
+
+export 'test_lib2_foo.dart';
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
new file mode 100644
index 0000000..1a07d2b
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_lib2_bar;
+
+class Bar {
+
+}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
new file mode 100644
index 0000000..1b3d037
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_lib2_foo;
+
+export 'test_lib2_bar.dart';
+
+class Foo {
+
+}
+
+main() {
+ print('hello world');
+}
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
index 3ff966d..ceda276 100644
--- a/pkg/docgen/test/multi_library_test.dart
+++ b/pkg/docgen/test/multi_library_test.dart
@@ -89,5 +89,18 @@
});
});
+
+ test('multiple exported libraries.', () {
+ var lib_file = p.toUri(p.join(getMultiLibraryCodePath(), 'lib',
+ 'test_lib2.dart'));
+ return getMirrorSystem([lib_file], false)
+ .then((mirrorSystem) {
+ var library = new Library(mirrorSystem.libraries[lib_file]);
+
+ // Test that libraries do recursive exports correctly.
+ expect(true, library.classes.keys.contains('Bar'));
+ });
+
+ });
});
}
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index 7bd8d07..d6fdd44 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,5 +1,14 @@
+## 0.11.0+1
+
+* Fix a bug in handling errors in decoding XMLHttpRequest responses for
+ `BrowserClient`.
+
## 0.11.0
+* The package no longer depends on `dart:io`. The `BrowserClient` class in
+ `package:http/browser_client.dart` can now be used to make requests on the
+ browser.
+
* Change `MultipartFile.contentType` from `dart:io`'s `ContentType` type to
`http_parser`'s `MediaType` type.
diff --git a/pkg/http/README.md b/pkg/http/README.md
index 81ca286..72466a9 100644
--- a/pkg/http/README.md
+++ b/pkg/http/README.md
@@ -3,15 +3,14 @@
A composable, Future-based library for making HTTP requests.
This package contains a set of high-level functions and classes that make it
-easy to consume HTTP resources.
-
-**NOTE:** This package currently only works for
-server-side or command-line Dart applications. In other words, if the app
-imports `dart:io`, it can use this package.
+easy to consume HTTP resources. It's platform-independent, and can be used on
+both the command-line and the browser. Currently the global utility functions
+are unsupported on the browser; see "Using on the Browser" below.
## Using
-The easiest way to use this library is via the top-level functions. They allow
+The easiest way to use this library is via the top-level functions, although
+they currently only work on platforms where `dart:io` is available. They allow
you to make individual HTTP requests with minimal hassle:
```dart
@@ -74,6 +73,25 @@
}
```
+## Using on the Browser
+
+The HTTP library can be used on the browser via the [BrowserClient][] class in
+`package:http/browser_client.dart`. This client translates requests into
+XMLHttpRequests. For example:
+
+```dart
+import 'package:http/browser_client.dart';
+import 'package:http/http.dart' as http;
+
+var client = new BrowserClient();
+var url = "/whatsit/create";
+client.post(url, body: {"name": "doodle", "color": "blue"})
+ .then((response) {
+ print("Response status: ${response.statusCode}");
+ print("Response body: ${response.body}");
+});
+```
+
## Filing issues
Please file issues for the http package at [http://dartbug.com/new][bugs].
diff --git a/pkg/http/lib/browser_client.dart b/pkg/http/lib/browser_client.dart
new file mode 100644
index 0000000..911c842
--- /dev/null
+++ b/pkg/http/lib/browser_client.dart
@@ -0,0 +1,97 @@
+// 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 http.browser_client;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'src/base_client.dart';
+import 'src/base_request.dart';
+import 'src/byte_stream.dart';
+import 'src/exception.dart';
+import 'src/streamed_response.dart';
+
+// TODO(nweiz): Move this under src/, re-export from lib/http.dart, and use this
+// automatically from [new Client] once we can create an HttpRequest using
+// mirrors on dart2js (issue 18541) and dart2js doesn't crash on pkg/collection
+// (issue 18535).
+
+/// A `dart:html`-based HTTP client that runs in the browser and is backed by
+/// XMLHttpRequests.
+///
+/// This client inherits some of the limitations of XMLHttpRequest. It ignores
+/// the [BaseRequest.contentLength], [BaseRequest.persistentConnection],
+/// [BaseRequest.followRedirects], and [BaseRequest.maxRedirects] fields. It is
+/// also unable to stream requests or responses; a request will only be sent and
+/// a response will only be returned once all the data is available.
+class BrowserClient extends BaseClient {
+ /// The currently active XHRs.
+ ///
+ /// These are aborted if the client is closed.
+ final _xhrs = new Set<HttpRequest>();
+
+ /// Creates a new HTTP client.
+ BrowserClient();
+
+ /// Sends an HTTP request and asynchronously returns the response.
+ Future<StreamedResponse> send(BaseRequest request) {
+ return request.finalize().toBytes().then((bytes) {
+ var xhr = new HttpRequest();
+ _xhrs.add(xhr);
+ xhr.open(request.method, request.url.toString(), async: true);
+ xhr.responseType = 'blob';
+ request.headers.forEach(xhr.setRequestHeader);
+
+ var completer = new Completer();
+ xhr.onLoad.first.then((_) {
+ // TODO(nweiz): Set the response type to "arraybuffer" when issue 18542
+ // is fixed.
+ var blob = xhr.response == null ? new Blob([]) : xhr.response;
+ var reader = new FileReader();
+
+ reader.onLoad.first.then((_) {
+ var body = reader.result;
+ completer.complete(new StreamedResponse(
+ new ByteStream.fromBytes(body),
+ xhr.status,
+ contentLength: body.length,
+ request: request,
+ headers: xhr.responseHeaders,
+ reasonPhrase: xhr.statusText));
+ });
+
+ reader.onError.first.then((error) {
+ completer.completeError(
+ new ClientException(error.toString(), request.url),
+ new Chain.current());
+ });
+
+ reader.readAsArrayBuffer(blob);
+ });
+
+ xhr.onError.first.then((_) {
+ // Unfortunately, the underlying XMLHttpRequest API doesn't expose any
+ // specific information about the error itself.
+ completer.completeError(
+ new ClientException("XMLHttpRequest error.", request.url),
+ new Chain.current());
+ });
+
+ xhr.send(bytes);
+ return completer.future.whenComplete(() => _xhrs.remove(xhr));
+ });
+ }
+
+ /// Closes the client.
+ ///
+ /// This terminates all active requests.
+ void close() {
+ for (var xhr in _xhrs) {
+ xhr.abort();
+ }
+ }
+}
diff --git a/pkg/http/lib/src/byte_stream.dart b/pkg/http/lib/src/byte_stream.dart
index d4e7f70..f3546c7 100644
--- a/pkg/http/lib/src/byte_stream.dart
+++ b/pkg/http/lib/src/byte_stream.dart
@@ -23,7 +23,8 @@
/// Collects the data of this stream in a [Uint8List].
Future<Uint8List> toBytes() {
var completer = new Completer();
- var sink = new ByteConversionSink.withCallback(completer.complete);
+ var sink = new ByteConversionSink.withCallback((bytes) =>
+ completer.complete(new Uint8List.fromList(bytes)));
listen(sink.add, onError: completer.completeError, onDone: sink.close,
cancelOnError: true);
return completer.future;
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index 68c9067..e29a9e0 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -10,9 +10,10 @@
import 'base_client.dart';
import 'base_request.dart';
+import 'io.dart' as io;
import 'io_client.dart';
-import 'streamed_response.dart';
import 'response.dart';
+import 'streamed_response.dart';
/// The interface for HTTP clients that take care of maintaining persistent
/// connections across multiple requests to the same server. If you only need to
@@ -24,9 +25,15 @@
/// another instance of [Client] and add functionality on top of that. This
/// allows all classes implementing [Client] to be mutually composable.
abstract class Client {
- /// Creates a new Client using the default implementation. This implementation
- /// uses an underlying `dart:io` [HttpClient] to make requests.
- factory Client() => new IOClient();
+ /// Creates a new client.
+ ///
+ /// Currently this will create an [IOClient] if `dart:io` is available and
+ /// throw an [UnsupportedError] otherwise. In the future, it will create a
+ /// [BrowserClient] if `dart:html` is available.
+ factory Client() {
+ io.assertSupported("IOClient");
+ return new IOClient();
+ }
/// Sends an HTTP HEAD request with the given headers to the given URL, which
/// can be a [Uri] or a [String].
diff --git a/pkg/http/lib/src/io.dart b/pkg/http/lib/src/io.dart
new file mode 100644
index 0000000..1730706
--- /dev/null
+++ b/pkg/http/lib/src/io.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 http.io;
+
+@MirrorsUsed(targets: const ['dart.io.HttpClient', 'dart.io.HttpException',
+ 'dart.io.File'])
+import 'dart:mirrors';
+
+/// Whether `dart:io` is supported on this platform.
+bool get supported => _library != null;
+
+/// The `dart:io` library mirror, or `null` if it couldn't be loaded.
+final _library = _getLibrary();
+
+/// The `dart:io` HttpClient class mirror.
+final ClassMirror _httpClient =
+ _library.declarations[const Symbol('HttpClient')];
+
+/// The `dart:io` HttpException class mirror.
+final ClassMirror _httpException =
+ _library.declarations[const Symbol('HttpException')];
+
+/// The `dart:io` File class mirror.
+final ClassMirror _file = _library.declarations[const Symbol('File')];
+
+/// Asserts that the [name]d `dart:io` feature is supported on this platform.
+///
+/// If `dart:io` doesn't work on this platform, this throws an
+/// [UnsupportedError].
+void assertSupported(String name) {
+ if (supported) return;
+ throw new UnsupportedError("$name isn't supported on this platform.");
+}
+
+/// Creates a new `dart:io` HttpClient instance.
+newHttpClient() => _httpClient.newInstance(const Symbol(''), []).reflectee;
+
+/// Creates a new `dart:io` File instance with the given [path].
+newFile(String path) => _file.newInstance(const Symbol(''), [path]).reflectee;
+
+/// Returns whether [error] is a `dart:io` HttpException.
+bool isHttpException(error) => reflect(error).type.isSubtypeOf(_httpException);
+
+/// Tries to load `dart:io` and returns `null` if it fails.
+LibraryMirror _getLibrary() {
+ try {
+ return currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+ } catch (_) {
+ // TODO(nweiz): narrow the catch clause when issue 18532 is fixed.
+ return null;
+ }
+}
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index b5e4815..9fd81ac 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -5,22 +5,25 @@
library io_client;
import 'dart:async';
-import 'dart:io';
import 'package:stack_trace/stack_trace.dart';
import 'base_client.dart';
import 'base_request.dart';
import 'exception.dart';
+import 'io.dart' as io;
import 'streamed_response.dart';
/// A `dart:io`-based HTTP client. This is the default client.
class IOClient extends BaseClient {
/// The underlying `dart:io` HTTP client.
- HttpClient _inner;
+ var _inner;
/// Creates a new HTTP client.
- IOClient() : _inner = new HttpClient();
+ IOClient() {
+ io.assertSupported("IOClient");
+ _inner = io.newHttpClient();
+ }
/// Sends an HTTP request and asynchronously returns the response.
Future<StreamedResponse> send(BaseRequest request) {
@@ -50,7 +53,7 @@
return new StreamedResponse(
response.handleError((error) =>
throw new ClientException(error.message, error.uri),
- test: (error) => error is HttpException),
+ test: (error) => io.isHttpException(error)),
response.statusCode,
contentLength: contentLength,
request: request,
@@ -59,7 +62,7 @@
persistentConnection: response.persistentConnection,
reasonPhrase: response.reasonPhrase);
}).catchError((error) {
- if (error is! HttpException) throw error;
+ if (!io.isHttpException(error)) throw error;
throw new ClientException(error.message, error.uri);
});
}
diff --git a/pkg/http/lib/src/multipart_file.dart b/pkg/http/lib/src/multipart_file.dart
index 220c286..07758b9 100644
--- a/pkg/http/lib/src/multipart_file.dart
+++ b/pkg/http/lib/src/multipart_file.dart
@@ -5,7 +5,6 @@
library multipart_file;
import 'dart:async';
-import 'dart:io';
import 'dart:convert';
import 'package:http_parser/http_parser.dart';
@@ -13,6 +12,7 @@
import 'package:stack_trace/stack_trace.dart';
import 'byte_stream.dart';
+import 'io.dart' as io;
import 'utils.dart';
/// A file to be uploaded as part of a [MultipartRequest]. This doesn't need to
@@ -86,10 +86,13 @@
/// [filename] defaults to the basename of [filePath]. [contentType] currently
/// defaults to `application/octet-stream`, but in the future may be inferred
/// from [filename].
+ ///
+ /// This can only be used in an environment that supports "dart:io".
static Future<MultipartFile> fromPath(String field, String filePath,
{String filename, MediaType contentType}) {
+ io.assertSupported("MultipartFile.fromPath");
if (filename == null) filename = path.basename(filePath);
- var file = new File(filePath);
+ var file = io.newFile(filePath);
return Chain.track(file.length()).then((length) {
var stream = new ByteStream(Chain.track(file.openRead()));
return new MultipartFile(field, stream, length,
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index f3cf0c3..b02477e 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
name: http
-version: 0.11.0-dev
+version: 0.11.0+1
author: "Dart Team <misc@dartlang.org>"
homepage: https://pub.dartlang.org/packages/http
description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/html/client_test.dart b/pkg/http/test/html/client_test.dart
new file mode 100644
index 0000000..90e7507
--- /dev/null
+++ b/pkg/http/test/html/client_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library client_test;
+
+import 'package:http/http.dart' as http;
+import 'package:http/browser_client.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+ test('#send a StreamedRequest', () {
+ var client = new BrowserClient();
+ var request = new http.StreamedRequest("POST", echoUrl);
+
+ expect(client.send(request).then((response) {
+ return response.stream.bytesToString();
+ }).whenComplete(client.close), completion(equals('{"hello": "world"}')));
+
+ request.sink.add('{"hello": "world"}'.codeUnits);
+ request.sink.close();
+ });
+
+ test('#send with an invalid URL', () {
+ var client = new BrowserClient();
+ var url = Uri.parse('http://http.invalid');
+ var request = new http.StreamedRequest("POST", url);
+
+ expect(client.send(request),
+ throwsClientException("XMLHttpRequest error."));
+
+ request.sink.add('{"hello": "world"}'.codeUnits);
+ request.sink.close();
+ });
+}
diff --git a/pkg/http/test/html/streamed_request_test.dart b/pkg/http/test/html/streamed_request_test.dart
new file mode 100644
index 0000000..e75d130
--- /dev/null
+++ b/pkg/http/test/html/streamed_request_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.html.streamed_request_test;
+
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:http/browser_client.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+ group('contentLength', () {
+ test("works when it's set", () {
+ var request = new http.StreamedRequest('POST', echoUrl);
+ request.contentLength = 10;
+ request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+ request.sink.close();
+
+ return new BrowserClient().send(request).then((response) {
+ expect(response.stream.toBytes(),
+ completion(equals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])));
+ });
+ });
+
+ test("works when it's not set", () {
+ var request = new http.StreamedRequest('POST', echoUrl);
+ request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+ request.sink.close();
+
+ return new BrowserClient().send(request).then((response) {
+ expect(response.stream.toBytes(),
+ completion(equals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])));
+ });
+ });
+ });
+}
\ No newline at end of file
diff --git a/pkg/http/test/html/utils.dart b/pkg/http/test/html/utils.dart
new file mode 100644
index 0000000..5803ec2
--- /dev/null
+++ b/pkg/http/test/html/utils.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.html_utils;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+
+import 'package:http/http.dart';
+import 'package:http/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+export '../utils.dart';
+
+/// The test server's echo URL.
+Uri get echoUrl => Uri.parse(
+ '${window.location.protocol}//${window.location.host}/echo');
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/io/client_test.dart
similarity index 95%
rename from pkg/http/test/client_test.dart
rename to pkg/http/test/io/client_test.dart
index 6f397fa..b9cc5fa 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/io/client_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library client_test;
+library http.test.io.client_test;
import 'dart:io';
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/io/http_test.dart
similarity index 98%
rename from pkg/http/test/http_test.dart
rename to pkg/http/test/io/http_test.dart
index 69bc43d..9ba5924 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/io/http_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library http_test;
+library http.test.io.http_test;
import 'package:http/http.dart' as http;
import 'package:unittest/unittest.dart';
diff --git a/pkg/http/test/io/multipart_test.dart b/pkg/http/test/io/multipart_test.dart
new file mode 100644
index 0000000..e3df378
--- /dev/null
+++ b/pkg/http/test/io/multipart_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.multipart_test;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+ var tempDir;
+ setUp(() {
+ tempDir = Directory.systemTemp.createTempSync('http_test_');
+ });
+
+ tearDown(() => tempDir.deleteSync(recursive: true));
+
+ test('with a file from disk', () {
+ expect(new Future.sync(() {
+ var filePath = path.join(tempDir.path, 'test-file');
+ new File(filePath).writeAsStringSync('hello');
+ return http.MultipartFile.fromPath('file', filePath);
+ }).then((file) {
+ var request = new http.MultipartRequest('POST', dummyUrl);
+ request.files.add(file);
+
+ expect(request, bodyMatches('''
+ --{{boundary}}
+ content-type: application/octet-stream
+ content-disposition: form-data; name="file"; filename="test-file"
+
+ hello
+ --{{boundary}}--
+ '''));
+ }), completes);
+ });
+}
diff --git a/pkg/http/test/io/request_test.dart b/pkg/http/test/io/request_test.dart
new file mode 100644
index 0000000..0259571
--- /dev/null
+++ b/pkg/http/test/io/request_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.request_test;
+
+import 'package:http/http.dart' as http;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+ test('.send', () {
+ expect(startServer().then((_) {
+
+ var request = new http.Request('POST', serverUrl);
+ request.body = "hello";
+ request.headers['User-Agent'] = 'Dart';
+
+ expect(request.send().then((response) {
+ expect(response.statusCode, equals(200));
+ return response.stream.bytesToString();
+ }).whenComplete(stopServer), completion(parse(equals({
+ 'method': 'POST',
+ 'path': '/',
+ 'headers': {
+ 'content-type': ['text/plain; charset=utf-8'],
+ 'accept-encoding': ['gzip'],
+ 'user-agent': ['Dart'],
+ 'content-length': ['5']
+ },
+ 'body': 'hello'
+ }))));
+ }), completes);
+ });
+
+ test('#followRedirects', () {
+ expect(startServer().then((_) {
+ var request = new http.Request('POST', serverUrl.resolve('/redirect'))
+ ..followRedirects = false;
+ var future = request.send().then((response) {
+ expect(response.statusCode, equals(302));
+ });
+ expect(future.catchError((_) {}).then((_) => stopServer()), completes);
+ expect(future, completes);
+ }), completes);
+ });
+
+ test('#maxRedirects', () {
+ expect(startServer().then((_) {
+ var request = new http.Request('POST', serverUrl.resolve('/loop?1'))
+ ..maxRedirects = 2;
+ var future = request.send().catchError((error) {
+ expect(error, isRedirectLimitExceededException);
+ expect(error.redirects.length, equals(2));
+ });
+ expect(future.catchError((_) {}).then((_) => stopServer()), completes);
+ expect(future, completes);
+ }), completes);
+ });
+}
diff --git a/pkg/http/test/io/streamed_request_test.dart b/pkg/http/test/io/streamed_request_test.dart
new file mode 100644
index 0000000..ef823f9
--- /dev/null
+++ b/pkg/http/test/io/streamed_request_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io.streamed_request_test;
+
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+ group('contentLength', () {
+ 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);
+ });
+ });
+
+ // Regression test.
+ test('.send() with a response with no content length', () {
+ return startServer().then((_) {
+ var request = new http.StreamedRequest(
+ 'GET', serverUrl.resolve('/no-content-length'));
+ request.sink.close();
+ return request.send();
+ }).then((response) {
+ expect(UTF8.decodeStream(response.stream), completion(equals('body')));
+ }).whenComplete(stopServer);
+ });
+
+}
\ No newline at end of file
diff --git a/pkg/http/test/io/utils.dart b/pkg/http/test/io/utils.dart
new file mode 100644
index 0000000..53d1121
--- /dev/null
+++ b/pkg/http/test/io/utils.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.test.io_utils;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart';
+import 'package:http/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+export '../utils.dart';
+
+/// The current server instance.
+HttpServer _server;
+
+/// The URL for the current server instance.
+Uri get serverUrl => Uri.parse('http://localhost:${_server.port}');
+
+/// Starts a new HTTP server.
+Future startServer() {
+ return HttpServer.bind("localhost", 0).then((s) {
+ _server = s;
+ s.listen((request) {
+ var path = request.uri.path;
+ var response = request.response;
+
+ if (path == '/error') {
+ response.statusCode = 400;
+ response.contentLength = 0;
+ response.close();
+ return;
+ }
+
+ if (path == '/loop') {
+ var n = int.parse(request.uri.query);
+ response.statusCode = 302;
+ response.headers.set('location',
+ serverUrl.resolve('/loop?${n + 1}').toString());
+ response.contentLength = 0;
+ response.close();
+ return;
+ }
+
+ if (path == '/redirect') {
+ response.statusCode = 302;
+ response.headers.set('location', serverUrl.resolve('/').toString());
+ response.contentLength = 0;
+ response.close();
+ return;
+ }
+
+ if (path == '/no-content-length') {
+ response.statusCode = 200;
+ response.contentLength = -1;
+ response.write('body');
+ response.close();
+ return;
+ }
+
+ new ByteStream(request).toBytes().then((requestBodyBytes) {
+ var outputEncoding;
+ var encodingName = request.uri.queryParameters['response-encoding'];
+ if (encodingName != null) {
+ outputEncoding = requiredEncodingForCharset(encodingName);
+ } else {
+ outputEncoding = ASCII;
+ }
+
+ response.headers.contentType =
+ new ContentType(
+ "application", "json", charset: outputEncoding.name);
+ response.headers.set('single', 'value');
+
+ var requestBody;
+ if (requestBodyBytes.isEmpty) {
+ requestBody = null;
+ } else if (request.headers.contentType != null &&
+ request.headers.contentType.charset != null) {
+ var encoding = requiredEncodingForCharset(
+ request.headers.contentType.charset);
+ requestBody = encoding.decode(requestBodyBytes);
+ } else {
+ requestBody = requestBodyBytes;
+ }
+
+ var content = {
+ 'method': request.method,
+ 'path': request.uri.path,
+ 'headers': {}
+ };
+ if (requestBody != null) content['body'] = requestBody;
+ request.headers.forEach((name, values) {
+ // These headers are automatically generated by dart:io, so we don't
+ // want to test them here.
+ if (name == 'cookie' || name == 'host') return;
+
+ content['headers'][name] = values;
+ });
+
+ var body = JSON.encode(content);
+ response.contentLength = body.length;
+ response.write(body);
+ response.close();
+ });
+ });
+ });
+}
+
+/// Stops the current HTTP server.
+void stopServer() {
+ if (_server != null) {
+ _server.close();
+ _server = null;
+ }
+}
+
+/// A matcher for functions that throw HttpException.
+Matcher get throwsClientException =>
+ throwsA(new isInstanceOf<ClientException>());
+
+/// A matcher for RedirectLimitExceededExceptions.
+const isRedirectLimitExceededException =
+ const _RedirectLimitExceededException();
+
+/// A matcher for functions that throw RedirectLimitExceededException.
+const Matcher throwsRedirectLimitExceededException =
+ const Throws(isRedirectLimitExceededException);
+
+class _RedirectLimitExceededException extends TypeMatcher {
+ const _RedirectLimitExceededException() :
+ super("RedirectLimitExceededException");
+
+ bool matches(item, Map matchState) =>
+ item is RedirectException && item.message == "Redirect limit exceeded";
+}
+
+/// A matcher for SocketExceptions.
+const isSocketException = const _SocketException();
+
+/// A matcher for functions that throw SocketException.
+const Matcher throwsSocketException =
+ const Throws(isSocketException);
+
+class _SocketException extends TypeMatcher {
+ const _SocketException() : super("SocketException");
+ bool matches(item, Map matchState) => item is SocketException;
+}
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
index a3f0f8e..e2494d5 100644
--- a/pkg/http/test/multipart_test.dart
+++ b/pkg/http/test/multipart_test.dart
@@ -5,50 +5,13 @@
library multipart_test;
import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
-import 'package:path/path.dart' as path;
import 'package:unittest/unittest.dart';
import 'utils.dart';
-/// A matcher that validates the body of a multipart request after finalization.
-/// The string "{{boundary}}" in [pattern] will be replaced by the boundary
-/// string for the request, and LF newlines will be replaced with CRLF.
-/// Indentation will be normalized.
-Matcher bodyMatches(String pattern) => new _BodyMatches(pattern);
-
-class _BodyMatches extends Matcher {
- final String _pattern;
-
- _BodyMatches(this._pattern);
-
- bool matches(item, Map matchState) {
- if (item is! http.MultipartRequest) return false;
-
- var future = item.finalize().toBytes().then((bodyBytes) {
- var body = UTF8.decode(bodyBytes);
- var contentType = new MediaType.parse(item.headers['content-type']);
- var boundary = contentType.parameters['boundary'];
- var expected = cleanUpLiteral(_pattern)
- .replaceAll("\n", "\r\n")
- .replaceAll("{{boundary}}", boundary);
-
- expect(body, equals(expected));
- expect(item.contentLength, equals(bodyBytes.length));
- });
-
- return completes.matches(future, matchState);
- }
-
- Description describe(Description description) {
- return description.add('has a body that matches "$_pattern"');
- }
-}
-
void main() {
test('empty', () {
var request = new http.MultipartRequest('POST', dummyUrl);
@@ -269,33 +232,4 @@
--{{boundary}}--
'''));
});
-
- group('in a temp directory', () {
- var tempDir;
- setUp(() {
- tempDir = Directory.systemTemp.createTempSync('http_test_');
- });
-
- tearDown(() => tempDir.deleteSync(recursive: true));
-
- test('with a file from disk', () {
- expect(new Future.sync(() {
- var filePath = path.join(tempDir.path, 'test-file');
- new File(filePath).writeAsStringSync('hello');
- return http.MultipartFile.fromPath('file', filePath);
- }).then((file) {
- var request = new http.MultipartRequest('POST', dummyUrl);
- request.files.add(file);
-
- expect(request, bodyMatches('''
- --{{boundary}}
- content-type: application/octet-stream
- content-disposition: form-data; name="file"; filename="test-file"
-
- hello
- --{{boundary}}--
- '''));
- }), completes);
- });
- });
}
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 08e2ef9..2875928 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -5,7 +5,6 @@
library request_test;
import 'dart:convert';
-import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:unittest/unittest.dart';
@@ -13,30 +12,6 @@
import 'utils.dart';
void main() {
- test('.send', () {
- expect(startServer().then((_) {
-
- var request = new http.Request('POST', serverUrl);
- request.body = "hello";
- request.headers['User-Agent'] = 'Dart';
-
- expect(request.send().then((response) {
- expect(response.statusCode, equals(200));
- return response.stream.bytesToString();
- }).whenComplete(stopServer), completion(parse(equals({
- 'method': 'POST',
- 'path': '/',
- 'headers': {
- 'content-type': ['text/plain; charset=utf-8'],
- 'accept-encoding': ['gzip'],
- 'user-agent': ['Dart'],
- 'content-length': ['5']
- },
- 'body': 'hello'
- }))));
- }), completes);
- });
-
group('#contentLength', () {
test('is computed from bodyBytes', () {
var request = new http.Request('POST', dummyUrl);
@@ -74,8 +49,7 @@
test('is based on the content-type charset if it exists', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
- 'text/plain; charset=iso-8859-1';
+ request.headers['Content-Type'] = 'text/plain; charset=iso-8859-1';
expect(request.encoding.name, equals(LATIN1.name));
});
@@ -83,17 +57,16 @@
() {
var request = new http.Request('POST', dummyUrl);
request.encoding = LATIN1;
- request.headers[HttpHeaders.CONTENT_TYPE] =
- 'text/plain; charset=utf-8';
+ request.headers['Content-Type'] = 'text/plain; charset=utf-8';
expect(request.encoding.name, equals(UTF8.name));
- request.headers.remove(HttpHeaders.CONTENT_TYPE);
+ request.headers.remove('Content-Type');
expect(request.encoding.name, equals(LATIN1.name));
});
test('throws an error if the content-type charset is unknown', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'text/plain; charset=not-a-real-charset';
expect(() => request.encoding, throwsFormatException);
});
@@ -159,19 +132,19 @@
test("can't be read with the wrong content-type", () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+ request.headers['Content-Type'] = 'text/plain';
expect(() => request.bodyFields, throwsStateError);
});
test("can't be set with the wrong content-type", () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+ request.headers['Content-Type'] = 'text/plain';
expect(() => request.bodyFields = {}, throwsStateError);
});
test('defaults to empty', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/x-www-form-urlencoded';
expect(request.bodyFields, isEmpty);
});
@@ -184,7 +157,7 @@
test('changes when body changes', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/x-www-form-urlencoded';
request.body = 'key%201=value&key+2=other%2bvalue';
expect(request.bodyFields,
@@ -193,7 +166,7 @@
test('is encoded according to the given encoding', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/x-www-form-urlencoded';
request.encoding = LATIN1;
request.bodyFields = {"föø": "bãr"};
@@ -202,7 +175,7 @@
test('is decoded according to the given encoding', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/x-www-form-urlencoded';
request.encoding = LATIN1;
request.body = 'f%F6%F8=b%E3r';
@@ -210,65 +183,16 @@
});
});
- test('#followRedirects', () {
- print("This test is known to be flaky, please ignore "
- "(debug prints below added by sgjesse@)");
- print("#followRedirects test starting server...");
- expect(startServer().then((_) {
- print("#followRedirects test server running");
-
- var request = new http.Request('POST', serverUrl.resolve('/redirect'))
- ..followRedirects = false;
- var future = request.send().then((response) {
- print("#followRedirects test response received");
- expect(response.statusCode, equals(302));
- });
- expect(future.catchError((_) {}).then((_) {
- print("#followRedirects test stopping server...");
- stopServer();
- print("#followRedirects test server stopped");
- }), completes);
-
- expect(future, completes);
- print("#followRedirects test started");
- }), completes);
- });
-
- test('#maxRedirects', () {
- print("This test is known to be flaky, please ignore "
- "(debug prints below added by sgjesse@)");
- print("#maxRedirects test starting server...");
- expect(startServer().then((_) {
- print("#maxRedirects test server running");
-
- var request = new http.Request('POST', serverUrl.resolve('/loop?1'))
- ..maxRedirects = 2;
- var future = request.send().catchError((error) {
- print("#maxRedirects test exception received");
- expect(error, isRedirectLimitExceededException);
- expect(error.redirects.length, equals(2));
- });
- expect(future.catchError((_) {}).then((_) {
- print("#maxRedirects test stopping server...");
- stopServer();
- print("#maxRedirects test server stopped");
- }), completes);
-
- expect(future, completes);
- print("#maxRedirects test started");
- }), completes);
- });
-
group('content-type header', () {
test('defaults to empty', () {
var request = new http.Request('POST', dummyUrl);
- expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+ expect(request.headers['Content-Type'], isNull);
});
test('defaults to empty if only encoding is set', () {
var request = new http.Request('POST', dummyUrl);
request.encoding = LATIN1;
- expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+ expect(request.headers['Content-Type'], isNull);
});
test('name is case insensitive', () {
@@ -282,7 +206,7 @@
'bodyFields is set', () {
var request = new http.Request('POST', dummyUrl);
request.bodyFields = {'hello': 'world'};
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/x-www-form-urlencoded; charset=utf-8'));
});
@@ -291,7 +215,7 @@
var request = new http.Request('POST', dummyUrl);
request.encoding = LATIN1;
request.bodyFields = {'hello': 'world'};
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/x-www-form-urlencoded; charset=iso-8859-1'));
});
@@ -300,50 +224,50 @@
var request = new http.Request('POST', dummyUrl);
request.encoding = LATIN1;
request.body = 'hello, world';
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('text/plain; charset=iso-8859-1'));
});
test('is modified to include utf-8 if body is set', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+ request.headers['Content-Type'] = 'application/json';
request.body = '{"hello": "world"}';
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/json; charset=utf-8'));
});
test('is modified to include the given encoding if encoding is set', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+ request.headers['Content-Type'] = 'application/json';
request.encoding = LATIN1;
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/json; charset=iso-8859-1'));
});
test('has its charset overridden by an explicit encoding', () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/json; charset=utf-8';
request.encoding = LATIN1;
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/json; charset=iso-8859-1'));
});
test("doen't have its charset overridden by setting bodyFields", () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/x-www-form-urlencoded; charset=iso-8859-1';
request.bodyFields = {'hello': 'world'};
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/x-www-form-urlencoded; charset=iso-8859-1'));
});
test("doen't have its charset overridden by setting body", () {
var request = new http.Request('POST', dummyUrl);
- request.headers[HttpHeaders.CONTENT_TYPE] =
+ request.headers['Content-Type'] =
'application/json; charset=iso-8859-1';
request.body = '{"hello": "world"}';
- expect(request.headers[HttpHeaders.CONTENT_TYPE],
+ expect(request.headers['Content-Type'],
equals('application/json; charset=iso-8859-1'));
});
});
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index c9e3689..afe8e09 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -23,52 +23,10 @@
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);
});
});
-
- // Regression test.
- test('.send() with a response with no content length', () {
- return startServer().then((_) {
- var request = new http.StreamedRequest(
- 'GET', serverUrl.resolve('/no-content-length'));
- request.sink.close();
- return request.send();
- }).then((response) {
- expect(UTF8.decodeStream(response.stream), completion(equals('body')));
- }).whenComplete(stopServer);
- });
-
}
\ No newline at end of file
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 051cbd4..f89a0c5 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -4,121 +4,15 @@
library test_utils;
-import 'dart:async';
import 'dart:convert';
-import 'dart:io';
-import 'package:http/http.dart';
-import 'package:http/src/utils.dart';
+import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart';
import 'package:unittest/unittest.dart';
-/// The current server instance.
-HttpServer _server;
-
-/// The URL for the current server instance.
-Uri get serverUrl => Uri.parse('http://localhost:${_server.port}');
-
/// A dummy URL for constructing requests that won't be sent.
Uri get dummyUrl => Uri.parse('http://dartlang.org/');
-/// Starts a new HTTP server.
-Future startServer() {
- return HttpServer.bind("localhost", 0).then((s) {
- _server = s;
- s.listen((request) {
- var path = request.uri.path;
- var response = request.response;
-
- if (path == '/error') {
- response.statusCode = 400;
- response.contentLength = 0;
- response.close();
- return;
- }
-
- if (path == '/loop') {
- var n = int.parse(request.uri.query);
- response.statusCode = 302;
- response.headers.set('location',
- serverUrl.resolve('/loop?${n + 1}').toString());
- response.contentLength = 0;
- response.close();
- return;
- }
-
- if (path == '/redirect') {
- response.statusCode = 302;
- response.headers.set('location', serverUrl.resolve('/').toString());
- response.contentLength = 0;
- response.close();
- return;
- }
-
- if (path == '/no-content-length') {
- response.statusCode = 200;
- response.contentLength = -1;
- response.write('body');
- response.close();
- return;
- }
-
- new ByteStream(request).toBytes().then((requestBodyBytes) {
- var outputEncoding;
- var encodingName = request.uri.queryParameters['response-encoding'];
- if (encodingName != null) {
- outputEncoding = requiredEncodingForCharset(encodingName);
- } else {
- outputEncoding = ASCII;
- }
-
- response.headers.contentType =
- new ContentType(
- "application", "json", charset: outputEncoding.name);
- response.headers.set('single', 'value');
-
- var requestBody;
- if (requestBodyBytes.isEmpty) {
- requestBody = null;
- } else if (request.headers.contentType != null &&
- request.headers.contentType.charset != null) {
- var encoding = requiredEncodingForCharset(
- request.headers.contentType.charset);
- requestBody = encoding.decode(requestBodyBytes);
- } else {
- requestBody = requestBodyBytes;
- }
-
- var content = {
- 'method': request.method,
- 'path': request.uri.path,
- 'headers': {}
- };
- if (requestBody != null) content['body'] = requestBody;
- request.headers.forEach((name, values) {
- // These headers are automatically generated by dart:io, so we don't
- // want to test them here.
- if (name == 'cookie' || name == 'host') return;
-
- content['headers'][name] = values;
- });
-
- var body = JSON.encode(content);
- response.contentLength = body.length;
- response.write(body);
- response.close();
- });
- });
- });
-}
-
-/// Stops the current HTTP server.
-void stopServer() {
- if (_server != null) {
- _server.close();
- _server = null;
- }
-}
-
/// Removes eight spaces of leading indentation from a multiline string.
///
/// Note that this is very sensitive to how the literals are styled. They should
@@ -174,34 +68,51 @@
}
}
-/// A matcher for functions that throw HttpException.
-Matcher get throwsClientException =>
- throwsA(new isInstanceOf<ClientException>());
+/// A matcher that validates the body of a multipart request after finalization.
+/// The string "{{boundary}}" in [pattern] will be replaced by the boundary
+/// string for the request, and LF newlines will be replaced with CRLF.
+/// Indentation will be normalized.
+Matcher bodyMatches(String pattern) => new _BodyMatches(pattern);
-/// A matcher for RedirectLimitExceededExceptions.
-const isRedirectLimitExceededException =
- const _RedirectLimitExceededException();
+class _BodyMatches extends Matcher {
+ final String _pattern;
-/// A matcher for functions that throw RedirectLimitExceededException.
-const Matcher throwsRedirectLimitExceededException =
- const Throws(isRedirectLimitExceededException);
+ _BodyMatches(this._pattern);
-class _RedirectLimitExceededException extends TypeMatcher {
- const _RedirectLimitExceededException() :
- super("RedirectLimitExceededException");
+ bool matches(item, Map matchState) {
+ if (item is! http.MultipartRequest) return false;
- bool matches(item, Map matchState) =>
- item is RedirectException && item.message == "Redirect limit exceeded";
+ var future = item.finalize().toBytes().then((bodyBytes) {
+ var body = UTF8.decode(bodyBytes);
+ var contentType = new MediaType.parse(item.headers['content-type']);
+ var boundary = contentType.parameters['boundary'];
+ var expected = cleanUpLiteral(_pattern)
+ .replaceAll("\n", "\r\n")
+ .replaceAll("{{boundary}}", boundary);
+
+ expect(body, equals(expected));
+ expect(item.contentLength, equals(bodyBytes.length));
+ });
+
+ return completes.matches(future, matchState);
+ }
+
+ Description describe(Description description) {
+ return description.add('has a body that matches "$_pattern"');
+ }
}
-/// A matcher for SocketExceptions.
-const isSocketException = const _SocketException();
+/// A matcher that matches a [http.ClientException] with the given [message].
+///
+/// [message] can be a String or a [Matcher].
+Matcher isClientException(message) => predicate((error) {
+ expect(error, new isInstanceOf<http.ClientException>());
+ expect(error.message, message);
+ return true;
+});
-/// A matcher for functions that throw SocketException.
-const Matcher throwsSocketException =
- const Throws(isSocketException);
-
-class _SocketException extends TypeMatcher {
- const _SocketException() : super("SocketException");
- bool matches(item, Map matchState) => item is SocketException;
-}
+/// A matcher that matches function or future that throws a
+/// [http.ClientException] with the given [message].
+///
+/// [message] can be a String or a [Matcher].
+Matcher throwsClientException(message) => throwsA(isClientException(message));
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 248eeb8..864bb32 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -95,20 +95,20 @@
new NumberFormat._forPattern(locale, (x) => newPattern);
/** Create a number format that prints as DECIMAL_PATTERN. */
- NumberFormat.decimalPattern([String locale]) :
- this._forPattern(locale, (x) => x.DECIMAL_PATTERN);
+ NumberFormat.decimalPattern([String locale]) : this._forPattern(locale,
+ (x) => x.DECIMAL_PATTERN);
/** Create a number format that prints as PERCENT_PATTERN. */
- NumberFormat.percentPattern([String locale]) :
- this._forPattern(locale, (x) => x.PERCENT_PATTERN);
+ NumberFormat.percentPattern([String locale]) : this._forPattern(locale,
+ (x) => x.PERCENT_PATTERN);
/** Create a number format that prints as SCIENTIFIC_PATTERN. */
- NumberFormat.scientificPattern([String locale]) :
- this._forPattern(locale, (x) => x.SCIENTIFIC_PATTERN);
+ NumberFormat.scientificPattern([String locale]) : this._forPattern(locale,
+ (x) => x.SCIENTIFIC_PATTERN);
/** Create a number format that prints as CURRENCY_PATTERN. */
NumberFormat.currencyPattern([String locale, String currency]) :
- this._forPattern(locale, (x) => x.CURRENCY_PATTERN, currency);
+ this._forPattern(locale, (x) => x.CURRENCY_PATTERN, currency);
/**
* Create a number format that prints in a pattern we get from
@@ -163,6 +163,12 @@
}
/**
+ * Parse the number represented by the string. If it's not
+ * parseable, throws a [FormatException].
+ */
+ num parse(String text) => new _NumberParser(this, text).value;
+
+ /**
* Format the main part of the number in the form dictated by the pattern.
*/
void _formatNumber(num number) {
@@ -185,8 +191,8 @@
var mantissa = number / pow(10.0, exponent);
var minIntDigits = minimumIntegerDigits;
- if (maximumIntegerDigits > 1 &&
- maximumIntegerDigits > minimumIntegerDigits) {
+ if (maximumIntegerDigits > 1 && maximumIntegerDigits > minimumIntegerDigits)
+ {
// A repeating range is defined; adjust to it as follows.
// If repeat == 3, we have 6,5,4=>3; 3,2,1=>0; 0,-1,-2=>-3;
// -3,-4,-5=>-6, etc. This takes into account that the
@@ -258,11 +264,11 @@
// with zeros. Check for Javascript by seeing if an integer is double.
var paddingDigits = '';
if (1 is double && intValue > _maxInt) {
- var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
- var divisor = pow(10, howManyDigitsTooBig).round();
- paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
+ var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
+ var divisor = pow(10, howManyDigitsTooBig).round();
+ paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
- intValue = (intValue / divisor).truncate();
+ intValue = (intValue / divisor).truncate();
}
var integerDigits = "${intValue}${paddingDigits}".codeUnits;
var digitLength = integerDigits.length;
@@ -288,8 +294,8 @@
void _formatFractionPart(String fractionPart) {
var fractionCodes = fractionPart.codeUnits;
var fractionLength = fractionPart.length;
- while(fractionCodes[fractionLength - 1] == _zero &&
- fractionLength > minimumFractionDigits + 1) {
+ while (fractionCodes[fractionLength - 1] == _zero &&
+ fractionLength > minimumFractionDigits + 1) {
fractionLength--;
}
for (var i = 1; i < fractionLength; i++) {
@@ -316,9 +322,9 @@
* required characters into [_buffer] easily.
*/
void _add(String x) { _buffer.write(x);}
- void _addCharCode(int x) { _buffer.writeCharCode(x); }
- void _addZero() { _buffer.write(symbols.ZERO_DIGIT); }
- void _addDigit(int x) { _buffer.writeCharCode(_localeZero + x - _zero); }
+ void _addCharCode(int x) { _buffer.writeCharCode(x);}
+ void _addZero() { _buffer.write(symbols.ZERO_DIGIT);}
+ void _addDigit(int x) { _buffer.writeCharCode(_localeZero + x - _zero);}
/** Print padding up to [numberOfDigits] above what's included in [basic]. */
void _pad(int numberOfDigits, [String basic = '']) {
@@ -371,8 +377,7 @@
if (newPattern == null) return;
// Make spaces non-breaking
_pattern = newPattern.replaceAll(' ', '\u00a0');
- var parser =
- new _NumberFormatParser(this, newPattern, currencyName);
+ var parser = new _NumberFormatParser(this, newPattern, currencyName);
parser.parse();
}
@@ -380,6 +385,259 @@
}
/**
+ * A one-time object for parsing a particular numeric string. One-time here
+ * means an instance can only parse one string. This is implemented by
+ * transforming from a locale-specific format to one that the system can parse,
+ * then calls the system parsing methods on it.
+ */
+class _NumberParser {
+
+ /** The format for which we are parsing. */
+ final NumberFormat format;
+
+ /** The text we are parsing. */
+ final String text;
+
+ /** What we use to iterate over the input text. */
+ final _Stream input;
+
+ /**
+ * The result of parsing [text] according to [format]. Automatically
+ * populated in the constructor.
+ */
+ num value;
+
+ /** The symbols used by our format. */
+ NumberSymbols get symbols => format.symbols;
+
+ /** Where we accumulate the normalized representation of the number. */
+ final StringBuffer _normalized = new StringBuffer();
+
+ /**
+ * Did we see something that indicates this is, or at least might be,
+ * a positive number.
+ */
+ bool gotPositive = false;
+
+ /**
+ * Did we see something that indicates this is, or at least might be,
+ * a negative number.
+ */
+ bool gotNegative = false;
+ /**
+ * Did we see the required positive suffix at the end. Should
+ * match [gotPositive].
+ */
+ bool gotPositiveSuffix = false;
+ /**
+ * Did we see the required negative suffix at the end. Should
+ * match [gotNegative].
+ */
+ bool gotNegativeSuffix = false;
+
+ /** Should we stop parsing before hitting the end of the string. */
+ bool done = false;
+
+ /** Have we already skipped over any required prefixes. */
+ bool prefixesSkipped = false;
+
+ /** If the number is percent or permill, what do we divide by at the end. */
+ int scale = 1;
+
+ String get _positivePrefix => format._positivePrefix;
+ String get _negativePrefix => format._negativePrefix;
+ String get _positiveSuffix => format._positiveSuffix;
+ String get _negativeSuffix => format._negativeSuffix;
+ int get _zero => format._zero;
+ int get _localeZero => format._localeZero;
+
+ /**
+ * Create a new [_NumberParser] on which we can call parse().
+ */
+ _NumberParser(this.format, text) : this.text = text,
+ this.input = new _Stream(text) {
+ value = parse();
+ }
+
+ /**
+ * The strings we might replace with functions that return the replacement
+ * values. They are functions because we might need to check something
+ * in the context. Note that the ordering is important here. For example,
+ * [symbols.PERCENT] might be " %", and we must handle that before we
+ * look at an individual space.
+ */
+ Map<String, Function> get replacements => _replacements == null ?
+ _replacements = _initializeReplacements() : _replacements;
+
+ var _replacements;
+
+ Map _initializeReplacements() => {
+ symbols.DECIMAL_SEP: () => '.',
+ symbols.EXP_SYMBOL: () => 'E',
+ symbols.GROUP_SEP: handleSpace,
+ symbols.PERCENT: () {
+ scale = 100;
+ return '';
+ },
+ symbols.PERMILL: () {
+ scale = 100;
+ return '';
+ },
+ ' ' : handleSpace,
+ '\u00a0' : handleSpace,
+ '+': () => '+',
+ '-': () => '-',
+ };
+
+ invalidFormat() =>
+ throw new FormatException("Invalid number: ${input.contents}");
+
+ /**
+ * Replace a space in the number with the normalized form. If space is not
+ * a significant character (normally grouping) then it's just invalid. If it
+ * is the grouping character, then it's only valid if it's followed by a
+ * digit. e.g. '$12 345.00'
+ */
+ handleSpace() =>
+ groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit ? '' : invalidFormat();
+
+ /**
+ * Determine if a space is a valid character in the number. See [handleSpace].
+ */
+ bool get groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit {
+ if (symbols.GROUP_SEP != '\u00a0' || symbols.GROUP_SEP != ' ') return true;
+ var peeked = input.peek(symbols.GROUP_SEP.length + 1);
+ return asDigit(peeked[peeked.length - 1]) != null;
+ }
+
+ /**
+ * Turn [char] into a number representing a digit, or null if it doesn't
+ * represent a digit in this locale.
+ */
+ int asDigit(String char) {
+ var charCode = char.codeUnitAt(0);
+ var digitValue = charCode - _localeZero;
+ if (digitValue >= 0 && digitValue < 10) {
+ return digitValue;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Check to see if the input begins with either the positive or negative
+ * prefixes. Set the [gotPositive] and [gotNegative] variables accordingly.
+ */
+ void checkPrefixes({bool skip: false}) {
+ bool checkPrefix(String prefix, skip) {
+ var matched = prefix.isNotEmpty && input.startsWith(prefix);
+ if (skip && matched) input.read(prefix.length);
+ return matched;
+ }
+
+ // TODO(alanknight): There's a faint possibility of a bug here where
+ // a positive prefix is followed by a negative prefix that's also a valid
+ // part of the number, but that seems very unlikely.
+ if (checkPrefix(_positivePrefix, skip)) gotPositive = true;
+ if (checkPrefix(_negativePrefix, skip)) gotNegative = true;
+
+ // Copied from Closure. It doesn't seem to be necessary to pass the test
+ // suite, so I'm not sure it's really needed.
+ if (gotPositive && gotNegative) {
+ if (_positivePrefix.length > _negativePrefix.length) {
+ gotNegative = false;
+ } else if (_negativePrefix.length > _positivePrefix.length) {
+ gotPositive = false;
+ }
+ }
+ }
+
+ /**
+ * If the rest of our input is either the positive or negative suffix,
+ * set [gotPositiveSuffix] or [gotNegativeSuffix] accordingly.
+ */
+ void checkSuffixes() {
+ var remainder = input.rest();
+ if (remainder == _positiveSuffix) gotPositiveSuffix = true;
+ if (remainder == _negativeSuffix) gotNegativeSuffix = true;
+ }
+
+ /**
+ * We've encountered a character that's not a digit. Go through our
+ * replacement rules looking for how to handle it. If we see something
+ * that's not a digit and doesn't have a replacement, then we're done
+ * and the number is probably invalid.
+ */
+ void processNonDigit() {
+ for (var key in replacements.keys) {
+ if (input.startsWith(key)) {
+ _normalized.write(replacements[key]());
+ input.read(key.length);
+ return;
+ }
+ }
+ // It might just be a prefix that we haven't skipped. We don't want to
+ // skip them initially because they might also be semantically meaningful,
+ // e.g. leading %. So we allow them through the loop, but only once.
+ if (input.index == 0 && !prefixesSkipped) {
+ prefixesSkipped = true;
+ checkPrefixes(skip: true);
+ } else {
+ done = true;
+ }
+ }
+
+ /**
+ * Parse [text] and return the resulting number. Throws [FormatException]
+ * if we can't parse it.
+ */
+ num parse() {
+ if (text == symbols.NAN) return double.NAN;
+ if (text == "$_positivePrefix${symbols.INFINITY}$_positiveSuffix") {
+ return double.INFINITY;
+ }
+ if (text == "$_negativePrefix${symbols.INFINITY}$_negativeSuffix") {
+ return double.NEGATIVE_INFINITY;
+ }
+
+ checkPrefixes();
+ var basicNumber = parseNumber(input);
+
+ if (gotPositive && !gotPositiveSuffix) invalidNumber();
+ if (gotNegative && !gotNegativeSuffix) invalidNumber();
+ if (!input.atEnd()) invalidNumber();
+
+ return gotNegative ? -basicNumber : basicNumber;
+ }
+
+ /** The number is invalid, throw a [FormatException]. */
+ void invalidNumber() =>
+ throw new FormatException("Invalid Number: ${input.contents}");
+
+ /**
+ * Parse the number portion of the input, i.e. not any prefixes or suffixes,
+ * and assuming NaN and Infinity are already handled.
+ */
+ num parseNumber(_Stream input) {
+ while (!done && !input.atEnd()) {
+ int digit = asDigit(input.peek());
+ if (digit != null) {
+ _normalized.writeCharCode(_zero + digit);
+ input.next();
+ } else {
+ processNonDigit();
+ }
+ checkSuffixes();
+ }
+
+ var normalizedText = _normalized.toString();
+ var parsed = int.parse(normalizedText, onError: (message) => null);
+ if (parsed == null) parsed = double.parse(normalizedText);
+ return parsed / scale;
+ }
+}
+
+/**
* Private class that parses the numeric formatting pattern and sets the
* variables in [format] to appropriate values. Instances of this are
* transient and store parsing state in instance variables, so can only be used
@@ -417,8 +675,8 @@
* [input] pattern.
*/
_NumberFormatParser(this.format, input, this.currencyName) :
- pattern = _iterator(input) {
- pattern.moveNext();
+ pattern = _iterator(input) {
+ pattern.moveNext();
}
/** The [NumberSymbols] for the locale in which our [format] prints. */
@@ -573,8 +831,8 @@
var effectiveDecimalPos = decimalPos >= 0 ? decimalPos : totalDigits;
format.minimumIntegerDigits = effectiveDecimalPos - digitLeftCount;
if (format._useExponentialNotation) {
- format.maximumIntegerDigits =
- digitLeftCount + format.minimumIntegerDigits;
+ format.maximumIntegerDigits = digitLeftCount +
+ format.minimumIntegerDigits;
// In exponential display, we need to at least show something.
if (format.maximumFractionDigits == 0 &&
@@ -610,8 +868,8 @@
break;
case _PATTERN_ZERO_DIGIT:
if (digitRightCount > 0) {
- throw new FormatException('Unexpected "0" in pattern "'
- + pattern.input + '"');
+ throw new FormatException('Unexpected "0" in pattern "' +
+ pattern.input + '"');
}
zeroDigitCount++;
if (groupingCount >= 0 && decimalPos < 0) {
@@ -656,8 +914,7 @@
if ((digitLeftCount + zeroDigitCount) < 1 ||
format.minimumExponentDigits < 1) {
- throw new FormatException(
- 'Malformed exponential pattern "$pattern"');
+ throw new FormatException('Malformed exponential pattern "$pattern"');
}
return false;
default:
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/date_format_helpers.dart
index 5508586..d8adde1 100644
--- a/pkg/intl/lib/src/date_format_helpers.dart
+++ b/pkg/intl/lib/src/date_format_helpers.dart
@@ -85,6 +85,11 @@
* dates from strings simpler. It is general enough to operate on either
* lists or strings.
*/
+// TODO(alanknight): With the improvements to the collection libraries
+// since this was written we might be able to get rid of it entirely
+// in favor of e.g. aString.split('') giving us an iterable of one-character
+// strings, or else make the implementation trivial. And consider renaming,
+// as _Stream is now just confusing with the system Streams.
class _Stream {
var contents;
int index = 0;
@@ -106,6 +111,15 @@
}
/**
+ * Does the input start with the given string, if we start from the
+ * current position.
+ */
+ bool startsWith(String pattern) {
+ if (contents is String) return contents.startsWith(pattern, index);
+ return pattern == peek(pattern.length);
+ }
+
+ /**
* Return the next [howMany] items, or as many as there are remaining.
* Does not modify the stream position.
*/
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 064933d..3401971 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -15,7 +15,7 @@
/**
* Tests the Numeric formatting library in dart.
*/
-var testNumbers = {
+var testNumbersWeCanReadBack = {
"0.001": 0.001,
"0.01": 0.01,
"0.1": 0.1,
@@ -32,7 +32,23 @@
"NaN": double.NAN,
"∞": double.INFINITY,
"-∞": double.NEGATIVE_INFINITY,
- "3.142": PI};
+};
+
+/** Test numbers that we can't parse because we lose precision in formatting.*/
+var testNumbersWeCannotReadBack = {
+ "3.142" : PI,
+ };
+
+/** Test numbers that won't work in Javascript because they're too big. */
+var testNumbersOnlyForTheVM = {
+ "10,000,000,000,000,000,000,000,000,000,000" :
+ 10000000000000000000000000000000,
+};
+
+get allTestNumbers =>
+ new Map.from(testNumbersWeCanReadBack)
+ ..addAll(testNumbersWeCannotReadBack)
+ ..addAll(inJavaScript() ? {} : testNumbersOnlyForTheVM);
var testExponential = const {
"1E-3" : 0.001,
@@ -51,14 +67,11 @@
];
}
+// Pay no attention to the hint. This is here deliberately to have different
+// behavior in the Dart VM versus Javascript so we can distinguish the two.
inJavaScript() => 1 is double;
main() {
- if (!inJavaScript()) {
- testNumbers["10,000,000,000,000,000,000,000,000,000,000"] =
- 10000000000000000000000000000000;
- }
-
// For data from a list of locales, run each locale's data as a separate
// test so we can see exactly which ones pass or fail.
var mainList = numberTestData;
@@ -75,15 +88,26 @@
var formatted = format.format(123);
var expected = (list..moveNext()).current;
expect(formatted, expected);
+ var readBack = format.parse(formatted);
+ expect(readBack, 123);
}
});
}
test('Simple set of numbers', () {
var number = new NumberFormat();
- for (var x in testNumbers.keys) {
- var formatted = number.format(testNumbers[x]);
+ for (var x in allTestNumbers.keys) {
+ var formatted = number.format(allTestNumbers[x]);
expect(formatted, x);
+ if (!testNumbersWeCannotReadBack.containsKey(x)) {
+ var readBack = number.parse(formatted);
+ // Even among ones we can read back, we can't test NaN for equality.
+ if (allTestNumbers[x].isNaN) {
+ expect(readBack.isNaN, isTrue);
+ } else {
+ expect(readBack, allTestNumbers[x]);
+ }
+ }
}
});
@@ -92,6 +116,8 @@
for (var x in testExponential.keys) {
var formatted = number.format(testExponential[x]);
expect(formatted, x);
+ var readBack = number.parse(formatted);
+ expect(testExponential[x], readBack);
}
});
@@ -100,15 +126,21 @@
var usConvention = new NumberFormat.currencyPattern('en_US', '€');
var formatted = usConvention.format(amount);
expect(formatted, '€1,000,000.32');
+ var readBack = usConvention.parse(formatted);
+ expect(readBack, amount);
var swissConvention = new NumberFormat.currencyPattern('de_CH', r'$');
formatted = swissConvention.format(amount);
var nbsp = new String.fromCharCode(0xa0);
expect(formatted, r"$" + nbsp + "1'000'000.32");
+ readBack = swissConvention.parse(formatted);
+ expect(readBack, amount);
/// Verify we can leave off the currency and it gets filled in.
var plainSwiss = new NumberFormat.currencyPattern('de_CH');
formatted = plainSwiss.format(amount);
expect(formatted, r"CHF" + nbsp + "1'000'000.32");
+ readBack = plainSwiss.parse(formatted);
+ expect(readBack, amount);
// Verify that we can pass null in order to specify the currency symbol
// but use the default locale.
@@ -116,5 +148,15 @@
formatted = defaultLocale.format(amount);
// We don't know what the exact format will be, but it should have Smurfs.
expect(formatted.contains('Smurfs'), isTrue);
+ readBack = defaultLocale.parse(formatted);
+ expect(readBack, amount);
+ });
+
+ test('Unparseable', () {
+ var format = new NumberFormat.currencyPattern();
+ expect(() => format.parse("abcdefg"), throwsFormatException);
+ expect(() => format.parse(""), throwsFormatException);
+ expect(() => format.parse("1.0zzz"), throwsFormatException);
+ expect(() => format.parse("-∞+1"), throwsFormatException);
});
}
diff --git a/pkg/oauth2/CHANGELOG.md b/pkg/oauth2/CHANGELOG.md
index da65ce6..fc869c9 100644
--- a/pkg/oauth2/CHANGELOG.md
+++ b/pkg/oauth2/CHANGELOG.md
@@ -2,6 +2,9 @@
* Update the `http` dependency.
+* Since `http` 0.11.0 now works in non-`dart:io` contexts, `oauth2` does as
+ well.
+
# 0.9.2
* Expand the dependency on the HTTP package to include 0.10.x.
diff --git a/pkg/oauth2/README.md b/pkg/oauth2/README.md
index 72aff2a..52b724c 100644
--- a/pkg/oauth2/README.md
+++ b/pkg/oauth2/README.md
@@ -1,6 +1,6 @@
A client library for authenticating with a remote service via OAuth2 on
behalf of a user, and making authorized HTTP requests with the user's OAuth2
-credentials. Currently this only works where `dart:io` is available.
+credentials.
OAuth2 allows a client (the program using this library) to access and
manipulate a resource that's owned by a resource owner (the end user) and
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index 2e61c58..7a1311e 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -1,15 +1,15 @@
name: oauth2
-version: 0.9.3-dev
+version: 0.9.3
author: Dart Team <misc@dartlang.org>
homepage: http://www.dartlang.org
description: >
A client library for authenticating with a remote service via OAuth2 on
behalf of a user, and making authorized HTTP requests with the user's
- OAuth2 credentials. Currently only works with dart:io.
+ OAuth2 credentials.
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
- http: '>=0.11.0-dev <0.12.0'
+ http: '>=0.11.0 <0.12.0'
http_parser: '>=0.0.0 <0.1.0'
dev_dependencies:
unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 0101b9b..d0ea50e 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -18,6 +18,9 @@
scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
polymer/test/build/script_compactor_test: Pass, Slow
+[ $compiler == dart2js && $browser ]
+polymer/test/attr_mustache_test: CompileTimeError # Issue 18667
+
[ $runtime == vm && $mode == debug]
analysis_server/test/analysis_server_test: Pass, Timeout
analysis_server/test/domain_context_test: Pass, Timeout
@@ -112,11 +115,6 @@
source_maps/test/vlq_test: RuntimeError # A VLQ test checks for large numbers that
# overflow in JS (numbers slightly larger than
# 32 bits where we do bitwise operations).
-[ $runtime == jsshell ]
-# Bug in Spidermonkey's Uint8ClampedArray on x64 (non-Win FF is x64, Win is x86)
-# See https://bugzilla.mozilla.org/show_bug.cgi?id=940972
-# Likely to get patched only on some versions of Firefox.
-typed_data/test/typed_buffers_test: RuntimeError
[ $runtime == opera && $compiler == dart2js ]
intl/test/find_default_locale_browser_test: Fail
@@ -138,7 +136,7 @@
[ $runtime == ie10 ]
typed_data/test/typed_buffers_test/none: Fail # Issue 17607 (I put this here explicitly, since this is not the same as on ie9)
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
# Unexplained errors only occuring on Safari.
typed_data/test/typed_buffers_test: RuntimeError
@@ -205,13 +203,7 @@
analyzer/test/services/formatter_test: Fail, OK # Uses dart:io.
barback/test/*: Fail, OK # Uses dart:io.
code_transformers/test/*: Skip # Uses dart:io.
-http/test/client_test: Fail, OK # Uses dart:io.
-http/test/http_test: Fail, OK # Uses dart:io.
-http/test/mock_client_test: Fail, OK # Uses dart:io.
-http/test/multipart_test: Fail, OK # Uses dart:io.
-http/test/request_test: Fail, OK # Uses dart:io.
-http/test/response_test: Fail, OK # Uses dart:io.
-http/test/streamed_request_test: Fail, OK # Uses dart:io.
+http/test/io/*: Fail, OK # Uses dart:io.
http_parser/test/web_socket_test: Fail, OK # Uses dart:io
http_server/test/*: Fail, OK # Uses dart:io.
intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
@@ -221,10 +213,6 @@
intl/test/message_extraction/failed_extraction_test: Fail, OK # Users dart:io
intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
intl/test/message_extraction/really_fail_extraction_test: Fail, OK # Users dart:io
-oauth2/test/authorization_code_grant_test: Fail, OK # Uses dart:io.
-oauth2/test/client_test: Fail, OK # Uses dart:io.
-oauth2/test/credentials_test: Fail, OK # Uses dart:io.
-oauth2/test/handle_access_token_response_test: Fail, OK # Uses dart:io.
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.
@@ -314,8 +302,9 @@
polymer_expressions/test/globals_test: Skip
polymer_expressions/test/bindings_test: Skip
third_party/html5lib/test/browser/browser_test: Skip
+http/test/html/*: Skip
-[ $runtime == safari || $ie ]
+[ $runtime == safari || $runtime == safarimobilesim || $ie ]
polymer_expressions/test/globals_test: Fail # Issue 16568
polymer_expressions/test/bindings_test: Fail # Issue 16568
@@ -339,7 +328,7 @@
[ $runtime == vm && ($system == windows || $system == linux) ]
watcher/test/*/mac_os_test: Skip
-[ $runtime == safari || $runtime == chrome || $runtime == ff || $ie ]
+[ $runtime == safari || $runtime == safarimobilesim || $runtime == chrome || $runtime == ff || $ie ]
# Various issues due to limited browser testing in Angular.
third_party/angular_tests/*: Skip
@@ -355,3 +344,18 @@
[ $runtime == ie9 ]
polymer: Pass, Fail, Timeout # Issue 16717
+
+# No typed_data on IE9.
+http/test/html/client_test: Fail
+http/test/html/streamed_request_test: Skip
+http/test/mock_client_test: Fail
+http/test/multipart_test: Fail
+http/test/request_test: Fail
+http/test/response_test: Fail
+oauth2/test/authorization_code_grant_test: Fail
+oauth2/test/client_test: Fail
+oauth2/test/credentials_test: Fail
+oauth2/test/handle_access_token_response_test: Fail
+
+[ $runtime == drt ]
+http/test/html/client_test: Skip # Issue 18566
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index d3715c8..836631d 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -15,7 +15,6 @@
samples/third_party/angular_todo: Fail # angular needs to be updated
[ $use_public_packages ]
-pkg/oauth2: PubGetError # Uses -dev version of pkg/http.
samples/third_party/angular_todo: Pass, Slow
[ $use_public_packages && $builder_tag == russian ]
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index e4cb472..339bd87 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
name: polymer
-version: 0.10.0-pre.10
+version: 0.10.0-pre.11.dev
author: Polymer.dart Authors <web-ui-dev@dartlang.org>
description: >
Polymer.dart is a new type of library for the web, built on top of Web
@@ -8,7 +8,7 @@
homepage: https://www.dartlang.org/polymer-dart/
dependencies:
analyzer: '>=0.13.0 <0.14.0'
- args: '>=0.10.0 <0.11.0'
+ args: '>=0.10.0 <0.12.0'
barback: '>=0.9.0 <0.14.0'
browser: '>=0.10.0 <0.11.0'
code_transformers: '>=0.1.0 <0.2.0'
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 4066bfa..82fdb50 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
name: scheduled_test
-version: 0.11.0+1
+version: 0.11.0+2
author: Dart Team <misc@dartlang.org>
homepage: http://www.dartlang.org
description: >
@@ -10,7 +10,7 @@
read like synchronous, linear code, despite executing asynchronously.
dependencies:
- http: '>=0.9.0 <0.11.0'
+ http: '>=0.9.0 <0.12.0'
path: '>=0.9.0 <2.0.0'
shelf: '>=0.4.0 <0.6.0'
stack_trace: '>=0.9.1 <0.10.0'
diff --git a/pkg/shelf/lib/src/message.dart b/pkg/shelf/lib/src/message.dart
index 1b2e966..1522e13 100644
--- a/pkg/shelf/lib/src/message.dart
+++ b/pkg/shelf/lib/src/message.dart
@@ -5,14 +5,13 @@
library shelf.message;
import 'dart:async';
-import 'dart:collection';
import 'dart:convert';
-// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
-import 'package:collection/wrappers.dart' as pc;
import 'package:http_parser/http_parser.dart';
import 'package:stack_trace/stack_trace.dart';
+import 'shelf_unmodifiable_map.dart';
+
/// Represents logic shared between [Request] and [Response].
abstract class Message {
/// The HTTP headers.
@@ -43,9 +42,10 @@
/// If [headers] is `null`, it is treated as empty.
Message(this._body, {Map<String, String> headers,
Map<String, Object> context})
- : this.headers = _getIgnoreCaseMapView(headers),
- this.context = new pc.UnmodifiableMapView(
- context == null ? const {} : new Map.from(context));
+ : this.headers = new ShelfUnmodifiableMap<String>(headers,
+ ignoreKeyCase: true),
+ this.context = new ShelfUnmodifiableMap<Object>(context,
+ ignoreKeyCase: false);
/// The contents of the content-length field in [headers].
///
@@ -112,18 +112,8 @@
if (encoding == null) encoding = UTF8;
return Chain.track(encoding.decodeStream(read()));
}
-}
-/// Creates on an unmodifiable map of [headers] with case-insensitive access.
-Map<String, String> _getIgnoreCaseMapView(Map<String, String> headers) {
- if (headers == null) return const {};
- // TODO(kevmoo) generalize this model with a 'canonical map' to align with
- // similiar implementation in http pkg [BaseRequest].
- var map = new LinkedHashMap<String, String>(
- equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
- hashCode: (key) => key.toLowerCase().hashCode);
-
- map.addAll(headers);
-
- return new pc.UnmodifiableMapView<String, String>(map);
+ /// Creates a new [Message] by copying existing values and applying specified
+ /// changes.
+ Message change({Map<String, String> headers, Map<String, Object> context});
}
diff --git a/pkg/shelf/lib/src/request.dart b/pkg/shelf/lib/src/request.dart
index f7e011d..192a782 100644
--- a/pkg/shelf/lib/src/request.dart
+++ b/pkg/shelf/lib/src/request.dart
@@ -9,6 +9,7 @@
import 'package:http_parser/http_parser.dart';
import 'message.dart';
+import 'util.dart';
/// Represents an HTTP request to be processed by a Shelf application.
class Request extends Message {
@@ -81,8 +82,7 @@
headers: headers, context: context) {
if (method.isEmpty) throw new ArgumentError('method cannot be empty.');
- // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
- if (requestedUri.scheme.isEmpty) {
+ if (!requestedUri.isAbsolute) {
throw new ArgumentError('requstedUri must be an absolute URI.');
}
@@ -107,6 +107,27 @@
throw new ArgumentError('scriptName and url cannot both be empty.');
}
}
+
+ /// Creates a new [Request] by copying existing values and applying specified
+ /// changes.
+ ///
+ /// New key-value pairs in [context] and [headers] will be added to the copied
+ /// [Request].
+ ///
+ /// If [context] or [headers] includes a key that already exists, the
+ /// key-value pair will replace the corresponding entry in the copied
+ /// [Request].
+ ///
+ /// All other context and header values from the [Request] will be included
+ /// in the copied [Request] unchanged.
+ Request change({Map<String, String> headers, Map<String, Object> context}) {
+ headers = updateMap(this.headers, headers);
+ context = updateMap(this.context, context);
+
+ return new Request(this.method, this.requestedUri,
+ protocolVersion: this.protocolVersion, headers: headers, url: this.url,
+ scriptName: this.scriptName, body: this.read(), context: context);
+ }
}
/// Computes `url` from the provided [Request] constructor arguments.
@@ -123,7 +144,6 @@
}
if (url != null && scriptName != null) {
- // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
if (url.scheme.isNotEmpty) throw new ArgumentError('url must be relative.');
return url;
}
diff --git a/pkg/shelf/lib/src/response.dart b/pkg/shelf/lib/src/response.dart
index e59b0c5..c36c551 100644
--- a/pkg/shelf/lib/src/response.dart
+++ b/pkg/shelf/lib/src/response.dart
@@ -10,6 +10,7 @@
import 'package:http_parser/http_parser.dart';
import 'message.dart';
+import 'util.dart';
/// The response returned by a [Handler].
class Response extends Message {
@@ -53,7 +54,7 @@
/// If [encoding] is passed, the "encoding" field of the Content-Type header
/// in [headers] will be set appropriately. If there is no existing
/// Content-Type header, it will be set to "application/octet-stream".
- Response.ok(body, {Map<String, String> headers, Encoding encoding,
+ Response.ok(body, {Map<String, String> headers, Encoding encoding,
Map<String, Object> context})
: this(200, body: body, headers: headers, encoding: encoding,
context: context);
@@ -118,7 +119,7 @@
/// Constructs a helper constructor for redirect responses.
Response._redirect(int statusCode, location, body,
- Map<String, String> headers, Encoding encoding,
+ Map<String, String> headers, Encoding encoding,
{ Map<String, Object> context })
: this(statusCode,
body: body,
@@ -133,7 +134,7 @@
/// information used to determine whether the requested resource has changed
/// since the last request. It indicates that the resource has not changed and
/// the old value should be used.
- Response.notModified({Map<String, String> headers,
+ Response.notModified({Map<String, String> headers,
Map<String, Object> context})
: this(304, headers: _addHeader(
headers, 'date', formatHttpDate(new DateTime.now())),
@@ -169,7 +170,7 @@
/// If [encoding] is passed, the "encoding" field of the Content-Type header
/// in [headers] will be set appropriately. If there is no existing
/// Content-Type header, it will be set to "application/octet-stream".
- Response.notFound(body, {Map<String, String> headers, Encoding encoding,
+ Response.notFound(body, {Map<String, String> headers, Encoding encoding,
Map<String, Object> context})
: this(404, body: body, headers: headers,
context: context);
@@ -215,6 +216,26 @@
throw new ArgumentError("Invalid status code: $statusCode.");
}
}
+
+ /// Creates a new [Response] by copying existing values and applying specified
+ /// changes.
+ ///
+ /// New key-value pairs in [context] and [headers] will be added to the copied
+ /// [Response].
+ ///
+ /// If [context] or [headers] includes a key that already exists, the
+ /// key-value pair will replace the corresponding entry in the copied
+ /// [Response].
+ ///
+ /// All other context and header values from the [Response] will be included
+ /// in the copied [Response] unchanged.
+ Response change({Map<String, String> headers, Map<String, Object> context}) {
+ headers = updateMap(this.headers, headers);
+ context = updateMap(this.context, context);
+
+ return new Response(this.statusCode, body: this.read(), headers: headers,
+ context: context);
+ }
}
/// Converts [body] to a byte stream.
diff --git a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
new file mode 100644
index 0000000..34775f0
--- /dev/null
+++ b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.shelf_unmodifiable_map;
+
+import 'dart:collection';
+
+// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
+import 'package:collection/wrappers.dart' as pc;
+
+/// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping
+/// itself.
+class ShelfUnmodifiableMap<V> extends pc.UnmodifiableMapView<String, V> {
+ /// If [source] is a [ShelfUnmodifiableMap] with matching [ignoreKeyCase],
+ /// then [source] is returned.
+ ///
+ /// If [source] is `null` it is treated like an empty map.
+ ///
+ /// If [ignoreKeyCase] is `true`, the keys will have case-insensitive access.
+ ///
+ /// [source] is copied to a new [Map] to ensure changes to the paramater value
+ /// after constructions are not reflected.
+ factory ShelfUnmodifiableMap(Map<String, V> source,
+ {bool ignoreKeyCase: false}) {
+ if (source is ShelfUnmodifiableMap<V>) {
+ return source;
+ }
+
+ if (source == null || source.isEmpty) {
+ return const _EmptyShelfUnmodifiableMap();
+ }
+
+ if (ignoreKeyCase) {
+ // TODO(kevmoo) generalize this model with a 'canonical map' to align with
+ // similiar implementation in http pkg [BaseRequest].
+ var map = new LinkedHashMap<String, V>(
+ equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
+ hashCode: (key) => key.toLowerCase().hashCode);
+
+ map.addAll(source);
+
+ source = map;
+ } else {
+ source = new Map<String, V>.from(source);
+ }
+
+ return new ShelfUnmodifiableMap<V>._(source);
+ }
+
+ ShelfUnmodifiableMap._(Map<String, V> source) : super(source);
+}
+
+/// An const empty implementation of [ShelfUnmodifiableMap].
+class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V>
+ implements ShelfUnmodifiableMap<V> {
+ const _EmptyShelfUnmodifiableMap() : super(const {});
+}
diff --git a/pkg/shelf/lib/src/util.dart b/pkg/shelf/lib/src/util.dart
index 43f7238..bb4847c 100644
--- a/pkg/shelf/lib/src/util.dart
+++ b/pkg/shelf/lib/src/util.dart
@@ -23,3 +23,17 @@
return callback();
}
}
+
+/// Returns a [Map] with the values from [original] and the values from
+/// [updates].
+///
+/// For keys that are the same between [original] and [updates], the value in
+/// [updates] is used.
+///
+/// If [updates] is `null` or empty, [original] is returned unchanged.
+Map updateMap(Map original, Map updates) {
+ if (updates == null || updates.isEmpty) return original;
+
+ return new Map.from(original)
+ ..addAll(updates);
+}
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index ee83ade..bd09077 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -12,6 +12,6 @@
path: '>=1.0.0 <2.0.0'
stack_trace: '>=0.9.2 <0.10.0'
dev_dependencies:
- http: '>=0.9.2 <0.11.0'
+ http: '>=0.9.2 <0.12.0'
scheduled_test: '>=0.10.0 <0.12.0'
unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/shelf/test/message_change_test.dart b/pkg/shelf/test/message_change_test.dart
new file mode 100644
index 0000000..f77edd1
--- /dev/null
+++ b/pkg/shelf/test/message_change_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.message_change_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/src/message.dart';
+
+import 'test_util.dart';
+
+void main() {
+ group('Request', () {
+ _testChange(({headers, context}) {
+ return new Request('GET', LOCALHOST_URI, headers: headers,
+ context: context);
+ });
+ });
+
+ group('Response', () {
+ _testChange(({headers, context}) {
+ return new Response.ok(null, headers: headers,
+ context: context);
+ });
+ });
+}
+
+/// Shared test method used by [Request] and [Response] tests to validate
+/// the behavior of `change` with different `headers` and `context` values.
+void _testChange(Message factory({Map<String, String> headers,
+ Map<String, Object> context})) {
+ test('with empty headers returns indentical instance', () {
+ var request = factory(headers: {'header1': 'header value 1'});
+ var copy = request.change(headers: {});
+
+ expect(copy.headers, same(request.headers));
+ });
+
+ test('with empty context returns identical instance', () {
+ var request = factory(context: {'context1': 'context value 1'});
+ var copy = request.change(context: {});
+
+ expect(copy.context, same(request.context));
+ });
+
+ test('new header values are added', () {
+ var request = factory(headers: {'test':'test value'});
+ var copy = request.change(headers: {'test2': 'test2 value'});
+
+ expect(copy.headers, {'test':'test value', 'test2':'test2 value'});
+ });
+
+ test('existing header values are overwritten', () {
+ var request = factory(headers: {'test':'test value'});
+ var copy = request.change(headers: {'test': 'new test value'});
+
+ expect(copy.headers, {'test':'new test value'});
+ });
+
+ test('new context values are added', () {
+ var request = factory(context: {'test':'test value'});
+ var copy = request.change(context: {'test2': 'test2 value'});
+
+ expect(copy.context, {'test':'test value', 'test2':'test2 value'});
+ });
+
+ test('existing context values are overwritten', () {
+ var request = factory(context: {'test':'test value'});
+ var copy = request.change(context: {'test': 'new test value'});
+
+ expect(copy.context, {'test':'new test value'});
+ });
+}
diff --git a/pkg/shelf/test/message_test.dart b/pkg/shelf/test/message_test.dart
index 1db286ba..d393388 100644
--- a/pkg/shelf/test/message_test.dart
+++ b/pkg/shelf/test/message_test.dart
@@ -10,10 +10,16 @@
import 'package:shelf/src/message.dart';
import 'package:unittest/unittest.dart';
+import 'test_util.dart';
+
class _TestMessage extends Message {
_TestMessage(Map<String, String> headers, Map<String, Object> context,
Stream<List<int>> body)
: super(body, headers: headers, context: context);
+
+ Message change({Map<String, String> headers, Map<String, Object> context}) {
+ throw new UnimplementedError();
+ }
}
Message _createMessage({Map<String, String> headers,
@@ -76,10 +82,10 @@
var request = _createMessage(body: controller.stream);
expect(request.readAsString(), completion(equals("hello, world")));
- controller.add([104, 101, 108, 108, 111, 44]);
+ controller.add(HELLO_BYTES);
return new Future(() {
controller
- ..add([32, 119, 111, 114, 108, 100])
+ ..add(WORLD_BYTES)
..close();
});
});
@@ -114,14 +120,14 @@
var controller = new StreamController();
var request = _createMessage(body: controller.stream);
expect(request.read().toList(), completion(equals([
- [104, 101, 108, 108, 111, 44],
- [32, 119, 111, 114, 108, 100]
+ HELLO_BYTES,
+ WORLD_BYTES
])));
- controller.add([104, 101, 108, 108, 111, 44]);
+ controller.add(HELLO_BYTES);
return new Future(() {
controller
- ..add([32, 119, 111, 114, 108, 100])
+ ..add(WORLD_BYTES)
..close();
});
});
diff --git a/pkg/shelf/test/request_test.dart b/pkg/shelf/test/request_test.dart
index 72a87a6..c48a4f7 100644
--- a/pkg/shelf/test/request_test.dart
+++ b/pkg/shelf/test/request_test.dart
@@ -136,44 +136,35 @@
});
});
- group("readAsString", () {
- test("supports a null body", () {
- var request = _request();
- expect(request.readAsString(), completion(equals("")));
- });
-
- test("supports a Stream<List<int>> body", () {
+ group('change', () {
+ test('with no arguments returns instance with equal values', () {
var controller = new StreamController();
- var request = _request({}, controller.stream);
- expect(request.readAsString(), completion(equals("hello, world")));
- controller.add([104, 101, 108, 108, 111, 44]);
+ var uri = Uri.parse('https://test.example.com/static/file.html');
+
+ var request = new Request('GET', uri,
+ protocolVersion: '2.0',
+ headers: {'header1': 'header value 1'},
+ url: Uri.parse('/file.html'),
+ scriptName: '/static',
+ body: controller.stream,
+ context: {'context1': 'context value 1'});
+
+ var copy = request.change();
+
+ expect(copy.method, request.method);
+ expect(copy.requestedUri, request.requestedUri);
+ expect(copy.protocolVersion, request.protocolVersion);
+ expect(copy.headers, same(request.headers));
+ expect(copy.url, request.url);
+ expect(copy.scriptName, request.scriptName);
+ expect(copy.context, same(request.context));
+ expect(copy.readAsString(), completion('hello, world'));
+
+ controller.add(HELLO_BYTES);
return new Future(() {
controller
- ..add([32, 119, 111, 114, 108, 100])
- ..close();
- });
- });
- });
-
- group("read", () {
- test("supports a null body", () {
- var request = _request();
- expect(request.read().toList(), completion(isEmpty));
- });
-
- test("supports a Stream<List<int>> body", () {
- var controller = new StreamController();
- var request = _request({}, controller.stream);
- expect(request.read().toList(), completion(equals([
- [104, 101, 108, 108, 111, 44],
- [32, 119, 111, 114, 108, 100]
- ])));
-
- controller.add([104, 101, 108, 108, 111, 44]);
- return new Future(() {
- controller
- ..add([32, 119, 111, 114, 108, 100])
+ ..add(WORLD_BYTES)
..close();
});
});
diff --git a/pkg/shelf/test/response_test.dart b/pkg/shelf/test/response_test.dart
index 9ee47c5..86652c78 100644
--- a/pkg/shelf/test/response_test.dart
+++ b/pkg/shelf/test/response_test.dart
@@ -7,62 +7,23 @@
import 'dart:async';
import 'dart:convert';
-import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf.dart' hide Request;
import 'package:unittest/unittest.dart';
+import 'test_util.dart';
+
void main() {
- group("readAsString", () {
- test("supports a null body", () {
- var response = new Response(200);
- expect(response.readAsString(), completion(equals("")));
- });
-
- test("supports a String body", () {
+ group("supports a String body", () {
+ test("readAsString", () {
var response = new Response.ok("hello, world");
expect(response.readAsString(), completion(equals("hello, world")));
});
- test("supports a Stream<List<int>> body", () {
- var controller = new StreamController();
- var response = new Response.ok(controller.stream);
- expect(response.readAsString(), completion(equals("hello, world")));
+ test("read", () {
+ var helloWorldBytes = new List.from(HELLO_BYTES)..addAll(WORLD_BYTES);
- controller.add([104, 101, 108, 108, 111, 44]);
- return new Future(() {
- controller
- ..add([32, 119, 111, 114, 108, 100])
- ..close();
- });
- });
- });
-
- group("read", () {
- test("supports a null body", () {
- var response = new Response(200);
- expect(response.read().toList(), completion(isEmpty));
- });
-
- test("supports a String body", () {
var response = new Response.ok("hello, world");
- expect(response.read().toList(), completion(equals([[
- 104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100
- ]])));
- });
-
- test("supports a Stream<List<int>> body", () {
- var controller = new StreamController();
- var response = new Response.ok(controller.stream);
- expect(response.read().toList(), completion(equals([
- [104, 101, 108, 108, 111, 44],
- [32, 119, 111, 114, 108, 100]
- ])));
-
- controller.add([104, 101, 108, 108, 111, 44]);
- return new Future(() {
- controller
- ..add([32, 119, 111, 114, 108, 100])
- ..close();
- });
+ expect(response.read().toList(), completion(equals([helloWorldBytes])));
});
});
@@ -157,4 +118,29 @@
}).lastModified, equals(DateTime.parse("1994-11-06 08:49:37z")));
});
});
+
+ group('change', () {
+ test('with no arguments returns instance with equal values', () {
+ var controller = new StreamController();
+
+ var request = new Response(345, body: 'hèllo, world', encoding: LATIN1,
+ headers: {'header1': 'header value 1'},
+ context: {'context1': 'context value 1'});
+
+ var copy = request.change();
+
+ expect(copy.statusCode, request.statusCode);
+ expect(copy.readAsString(), completion('hèllo, world'));
+ expect(copy.headers, same(request.headers));
+ expect(copy.encoding, request.encoding);
+ expect(copy.context, same(request.context));
+
+ controller.add(HELLO_BYTES);
+ return new Future(() {
+ controller
+ ..add(WORLD_BYTES)
+ ..close();
+ });
+ });
+ });
}
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
index 67cc708..bdece66 100644
--- a/pkg/shelf/test/shelf_io_test.dart
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -75,7 +75,7 @@
});
test('Request is populated correctly', () {
- var path = '/foo/bar?qs=value#anchor';
+ var path = '/foo/bar?qs=value';
_scheduleServer((request) {
expect(request.contentLength, 0);
diff --git a/pkg/shelf/test/test_util.dart b/pkg/shelf/test/test_util.dart
index 10afe99..281989b 100644
--- a/pkg/shelf/test/test_util.dart
+++ b/pkg/shelf/test/test_util.dart
@@ -9,6 +9,12 @@
import 'package:shelf/shelf.dart';
import 'package:shelf/src/util.dart';
+// "hello,"
+const HELLO_BYTES = const [104, 101, 108, 108, 111, 44];
+
+// " world"
+const WORLD_BYTES = const [32, 119, 111, 114, 108, 100];
+
/// A simple, synchronous handler for [Request].
///
/// By default, replies with a status code 200, empty headers, and
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 435eee5..1d728ca 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
name: smoke
-version: 0.1.0-pre.3
+version: 0.1.0-pre.4
author: Polymer.dart Authors <web-ui-dev@dartlang.org>
homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
description: >
@@ -9,6 +9,7 @@
dependencies:
barback: ">=0.9.0 <0.14.0"
logging: ">=0.9.0 <0.10.0"
+ analyzer: ">=0.13.0 <0.14.0"
# TODO(sigmund): once we have some easier way to do global app-level
# transformers, we might want to remove this transformer here and only apply it
# in apps that need it.
@@ -18,5 +19,6 @@
dev_dependencies:
unittest: ">=0.10.0 <0.11.0"
path: ">=1.0.0 <2.0.0"
+ code_transformers: ">=0.1.3 <0.2.0"
environment:
sdk: ">=1.3.0-dev.7.9 <2.0.0"
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 709f97d..c2de7d0 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -133,7 +133,8 @@
}
-SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) {
+SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd,
+ bool is_listening) {
ASSERT(fd >= 0);
HashMap::Entry* entry = socket_map_.Lookup(
GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true);
@@ -142,7 +143,11 @@
if (sd == NULL) {
// If there is no data in the hash map for this file descriptor a
// new SocketData for the file descriptor is inserted.
- sd = new SocketData(fd);
+ if (is_listening) {
+ sd = new ListeningSocketData(fd);
+ } else {
+ sd = new SocketData(fd);
+ }
entry->value = sd;
}
ASSERT(fd == sd->fd());
@@ -192,36 +197,41 @@
} else if (msg[i].id == kShutdownId) {
shutdown_ = true;
} else {
- SocketData* sd = GetSocketData(msg[i].id);
+ SocketData* sd = GetSocketData(
+ msg[i].id, (msg[i].data & (1 << kListeningSocket)) != 0);
if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+ ASSERT(!sd->IsListeningSocket());
// Close the socket for reading.
VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
} else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+ ASSERT(!sd->IsListeningSocket());
// Close the socket for writing.
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
// next message.
- RemoveFromEpollInstance(epoll_fd_, sd);
- intptr_t fd = sd->fd();
- sd->Close();
- socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
- delete sd;
+ if (sd->RemovePort(msg[i].dart_port)) {
+ RemoveFromEpollInstance(epoll_fd_, sd);
+ intptr_t fd = sd->fd();
+ sd->Close();
+ socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
+ delete sd;
+ }
DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
} else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
int count = msg[i].data & ((1 << kReturnTokenCommand) - 1);
- for (int i = 0; i < count; i++) {
- if (sd->ReturnToken()) {
- AddToEpollInstance(epoll_fd_, sd);
- }
+ if (sd->ReturnToken(msg[i].dart_port, count)) {
+ AddToEpollInstance(epoll_fd_, sd);
}
} else {
// Setup events to wait for.
- sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
- AddToEpollInstance(epoll_fd_, sd);
+ if (sd->AddPort(msg[i].dart_port)) {
+ sd->SetMask(msg[i].data);
+ AddToEpollInstance(epoll_fd_, sd);
+ }
}
}
}
@@ -282,11 +292,11 @@
SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
intptr_t event_mask = GetPollEvents(events[i].events, sd);
if (event_mask != 0) {
+ Dart_Port port = sd->port();
if (sd->TakeToken()) {
// Took last token, remove from epoll.
RemoveFromEpollInstance(epoll_fd_, sd);
}
- Dart_Port port = sd->port();
ASSERT(port != 0);
DartUtils::PostInt32(port, event_mask);
}
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index f6f3f9a..1a8d968 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -28,13 +28,75 @@
int64_t data;
};
+template<typename T>
+class CircularLinkedList {
+ public:
+ CircularLinkedList() : head_(NULL) {}
+ // Returns true if the list was empty.
+ bool Add(T t) {
+ Entry* e = new Entry(t);
+ if (head_ == NULL) {
+ // Empty list, make e head, and point to itself.
+ e->next_ = e;
+ e->prev_ = e;
+ head_ = e;
+ return true;
+ } else {
+ // Insert e as the last element in the list.
+ e->prev_ = head_->prev_;
+ e->next_ = head_;
+ e->prev_->next_ = e;
+ head_->prev_ = e;
+ return false;
+ }
+ }
+
+ void RemoveHead() {
+ Entry* e = head_;
+ if (e->next_ == e) {
+ head_ = NULL;
+ } else {
+ e->prev_->next_ = e->next_;
+ e->next_->prev_ = e->prev_;
+ head_ = e->next_;
+ }
+ delete e;
+ }
+
+ T head() const { return head_->t; }
+
+ bool HasHead() {
+ return head_ != NULL;
+ }
+
+ void Rotate() {
+ head_ = head_->next_;
+ }
+
+ private:
+ struct Entry {
+ explicit Entry(const T& t) : t(t) {}
+ const T t;
+ Entry* next_;
+ Entry* prev_;
+ };
+
+ Entry* head_;
+};
+
+
+class ListeningSocketData;
class SocketData {
public:
- explicit SocketData(intptr_t fd) : fd_(fd), port_(0), mask_(0), tokens_(16) {
+ explicit SocketData(intptr_t fd)
+ : fd_(fd), port_(0), mask_(0), tokens_(16) {
ASSERT(fd_ != -1);
}
+ virtual ~SocketData() {
+ }
+
intptr_t GetPollEvents();
void Close() {
@@ -44,32 +106,46 @@
fd_ = -1;
}
- void SetPortAndMask(Dart_Port port, intptr_t mask) {
+ void SetMask(intptr_t mask) {
ASSERT(fd_ != -1);
- port_ = port;
mask_ = mask;
}
intptr_t fd() { return fd_; }
- Dart_Port port() { return port_; }
+ virtual Dart_Port port() { return port_; }
- bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; }
+ virtual bool IsListeningSocket() const { return false; }
+
+ virtual bool AddPort(Dart_Port port) {
+ ASSERT(port_ == 0);
+ port_ = port;
+ return true;
+ }
+
+ virtual bool RemovePort(Dart_Port port) {
+ ASSERT(port_ == 0 || port_ == port);
+ return true;
+ }
// Returns true if the last token was taken.
- bool TakeToken() {
+ virtual bool TakeToken() {
ASSERT(tokens_ > 0);
tokens_--;
return tokens_ == 0;
}
// Returns true if the tokens was 0 before adding.
- bool ReturnToken() {
+ virtual bool ReturnToken(Dart_Port port, int count) {
+ ASSERT(port_ == port);
ASSERT(tokens_ >= 0);
- tokens_++;
- return tokens_ == 1;
+ bool was_empty = tokens_ == 0;
+ tokens_ += count;
+ return was_empty;
}
- private:
+ bool HasTokens() const { return tokens_ > 0; }
+
+ protected:
intptr_t fd_;
Dart_Port port_;
intptr_t mask_;
@@ -77,6 +153,108 @@
};
+class ListeningSocketData : public SocketData {
+ private:
+ static const int kTokenCount = 4;
+
+ static bool SamePortValue(void* key1, void* key2) {
+ return reinterpret_cast<Dart_Port>(key1) ==
+ reinterpret_cast<Dart_Port>(key2);
+ }
+
+ static uint32_t GetHashmapHashFromPort(Dart_Port port) {
+ return static_cast<uint32_t>(port & 0xFFFFFFFF);
+ }
+
+ static void* GetHashmapKeyFromPort(Dart_Port port) {
+ return reinterpret_cast<void*>(port);
+ }
+
+ public:
+ explicit ListeningSocketData(intptr_t fd)
+ : SocketData(fd),
+ tokens_map_(&SamePortValue, 4) {}
+
+ bool IsListeningSocket() const { return true; }
+
+ bool AddPort(Dart_Port port) {
+ HashMap::Entry* entry = tokens_map_.Lookup(
+ GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), true);
+ entry->value = reinterpret_cast<void*>(kTokenCount);
+ return live_ports_.Add(port);
+ }
+
+ virtual bool RemovePort(Dart_Port port) {
+ HashMap::Entry* entry = tokens_map_.Lookup(
+ GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+ ASSERT(entry != NULL);
+ intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+ if (tokens == 0) {
+ while (idle_ports_.head() != port) {
+ idle_ports_.Rotate();
+ }
+ idle_ports_.RemoveHead();
+ } else {
+ while (live_ports_.head() != port) {
+ live_ports_.Rotate();
+ }
+ live_ports_.RemoveHead();
+ }
+ tokens_map_.Remove(
+ GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
+ return !live_ports_.HasHead();
+ }
+
+ bool TakeToken() {
+ ASSERT(live_ports_.HasHead());
+ Dart_Port port = live_ports_.head();
+ HashMap::Entry* entry = tokens_map_.Lookup(
+ GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+ ASSERT(entry != NULL);
+ intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+ tokens--;
+ entry->value = reinterpret_cast<void*>(tokens);
+ if (tokens == 0) {
+ live_ports_.RemoveHead();
+ idle_ports_.Add(port);
+ if (!live_ports_.HasHead()) {
+ return true;
+ }
+ } else {
+ live_ports_.Rotate();
+ }
+ return false;
+ }
+
+ Dart_Port port() { return live_ports_.head(); }
+
+ bool ReturnToken(Dart_Port port, int count) {
+ HashMap::Entry* entry = tokens_map_.Lookup(
+ GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
+ ASSERT(entry != NULL);
+ intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+ tokens += count;
+ entry->value = reinterpret_cast<void*>(tokens);
+ if (tokens == count) {
+ // Return to live_ports_.
+ while (idle_ports_.head() != port) {
+ idle_ports_.Rotate();
+ }
+ idle_ports_.RemoveHead();
+ bool was_empty = !live_ports_.HasHead();
+ live_ports_.Add(port);
+ return was_empty;
+ }
+ return false;
+ }
+
+ private:
+ CircularLinkedList<Dart_Port> live_ports_;
+ CircularLinkedList<Dart_Port> idle_ports_;
+ HashMap tokens_map_;
+};
+
+
class EventHandlerImplementation {
public:
EventHandlerImplementation();
@@ -84,7 +262,7 @@
// Gets the socket data structure for a given file
// descriptor. Creates a new one if one is not found.
- SocketData* GetSocketData(intptr_t fd);
+ SocketData* GetSocketData(intptr_t fd, bool is_listening);
void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
void Start(EventHandler* handler);
void Shutdown();
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index d32fb1e..fbc5623 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -73,6 +73,11 @@
}
+OverlappedBuffer* OverlappedBuffer::AllocateConnectBuffer() {
+ return AllocateBuffer(0, kConnect);
+}
+
+
void OverlappedBuffer::DisposeBuffer(OverlappedBuffer* buffer) {
delete buffer;
}
@@ -327,12 +332,30 @@
}
+static void HandleClosed(Handle* handle) {
+ if (!handle->IsClosing()) {
+ int event_mask = 1 << kCloseEvent;
+ DartUtils::PostInt32(handle->port(), event_mask);
+ }
+}
+
+
+static void HandleError(Handle* handle) {
+ handle->set_last_error(WSAGetLastError());
+ handle->MarkError();
+ if (!handle->IsClosing()) {
+ int event_mask = 1 << kErrorEvent;
+ DartUtils::PostInt32(handle->port(), event_mask);
+ }
+}
+
+
void Handle::HandleIssueError() {
DWORD error = GetLastError();
if (error == ERROR_BROKEN_PIPE) {
- event_handler_->HandleClosed(this);
+ HandleClosed(this);
} else {
- event_handler_->HandleError(this);
+ HandleError(this);
}
SetLastError(error);
}
@@ -395,9 +418,9 @@
void SocketHandle::HandleIssueError() {
int error = WSAGetLastError();
if (error == WSAECONNRESET) {
- event_handler_->HandleClosed(this);
+ HandleClosed(this);
} else {
- event_handler_->HandleError(this);
+ HandleError(this);
}
WSASetLastError(error);
}
@@ -474,6 +497,7 @@
if (rc == NO_ERROR) {
// Insert the accepted socket into the list.
ClientSocket* client_socket = new ClientSocket(buffer->client(), 0);
+ client_socket->mark_connected();
client_socket->CreateCompletionPort(completion_port);
if (accepted_head_ == NULL) {
accepted_head_ = client_socket;
@@ -496,6 +520,17 @@
}
+static void DeleteIfClosed(Handle* handle) {
+ if (handle->IsClosed()) {
+ Dart_Port port = handle->port();
+ delete handle;
+ if (port != ILLEGAL_PORT) {
+ DartUtils::PostInt32(port, 1 << kDestroyedEvent);
+ }
+ }
+}
+
+
void ListenSocket::DoClose() {
closesocket(socket());
handle_ = INVALID_HANDLE_VALUE;
@@ -504,6 +539,7 @@
ClientSocket *client = Accept();
if (client != NULL) {
client->Close();
+ DeleteIfClosed(client);
} else {
break;
}
@@ -527,7 +563,7 @@
if (!IsClosing()) {
while (pending_accept_count() < 5) {
if (!IssueAccept()) {
- event_handler_->HandleError(this);
+ HandleError(this);
}
}
}
@@ -811,14 +847,17 @@
void ClientSocket::IssueDisconnect() {
- Dart_Port p = port();
OverlappedBuffer* buffer = OverlappedBuffer::AllocateDisconnectBuffer();
BOOL ok = DisconnectEx_(
socket(), buffer->GetCleanOverlapped(), TF_REUSE_SOCKET, 0);
- if (!ok && WSAGetLastError() != WSA_IO_PENDING) {
+ // DisconnectEx works like other OverlappedIO APIs, where we can get either an
+ // immediate success or delayed operation by WSA_IO_PENDING being set.
+ if (ok || WSAGetLastError() != WSA_IO_PENDING) {
DisconnectComplete(buffer);
}
+ Dart_Port p = port();
if (p != ILLEGAL_PORT) DartUtils::PostInt32(p, 1 << kDestroyedEvent);
+ port_ = ILLEGAL_PORT;
}
@@ -828,8 +867,26 @@
if (data_ready_ != NULL) {
OverlappedBuffer::DisposeBuffer(data_ready_);
}
- // When disconnect is complete get rid of the object.
- delete this;
+ closed_ = true;
+}
+
+
+void ClientSocket::ConnectComplete(OverlappedBuffer* buffer) {
+ OverlappedBuffer::DisposeBuffer(buffer);
+ // Update socket to support full socket API, after ConnectEx completed.
+ setsockopt(socket(), SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
+ connected_ = true;
+ Dart_Port p = port();
+ if (p != ILLEGAL_PORT) {
+ // If the port is set, we already listen for this socket in Dart.
+ // Handle the cases here.
+ if (!IsClosedRead()) {
+ IssueRead();
+ }
+ if (!IsClosedWrite()) {
+ DartUtils::PostInt32(p, 1 << kOutEvent);
+ }
+ }
}
@@ -845,7 +902,7 @@
bool ClientSocket::IsClosed() {
- return false;
+ return closed_;
}
@@ -928,16 +985,8 @@
}
-static void DeleteIfClosed(Handle* handle) {
- if (handle->IsClosed()) {
- Dart_Port port = handle->port();
- delete handle;
- DartUtils::PostInt32(port, 1 << kDestroyedEvent);
- }
-}
-
-
void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) {
+ ASSERT(this != NULL);
if (msg->id == kTimeoutId) {
// Change of timeout request. Just set the new timeout and port as the
// completion thread will use the new timeout value for its next wait.
@@ -974,10 +1023,6 @@
}
}
}
-
- if ((msg->data & (1 << kCloseCommand)) != 0) {
- listen_socket->Close();
- }
} else {
handle->EnsureInitialized(this);
@@ -990,9 +1035,12 @@
// Issue a read.
if ((msg->data & (1 << kInEvent)) != 0) {
- handle->SetPortAndMask(msg->dart_port, msg->data);
if (handle->is_datagram_socket()) {
handle->IssueRecvFrom();
+ } else if (handle->is_client_socket()) {
+ if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
+ handle->IssueRead();
+ }
} else {
handle->IssueRead();
}
@@ -1002,10 +1050,14 @@
// are no pending writes, meaning any writes are already complete,
// post an out event immediately.
if ((msg->data & (1 << kOutEvent)) != 0) {
- handle->SetPortAndMask(msg->dart_port, msg->data);
if (!handle->HasPendingWrite()) {
- int event_mask = (1 << kOutEvent);
- DartUtils::PostInt32(handle->port(), event_mask);
+ if (handle->is_client_socket()) {
+ if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
+ DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
+ }
+ } else {
+ DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
+ }
}
}
@@ -1046,24 +1098,6 @@
}
-void EventHandlerImplementation::HandleClosed(Handle* handle) {
- if (!handle->IsClosing()) {
- int event_mask = 1 << kCloseEvent;
- DartUtils::PostInt32(handle->port(), event_mask);
- }
-}
-
-
-void EventHandlerImplementation::HandleError(Handle* handle) {
- handle->set_last_error(WSAGetLastError());
- handle->MarkError();
- if (!handle->IsClosing()) {
- int event_mask = 1 << kErrorEvent;
- DartUtils::PostInt32(handle->port(), event_mask);
- }
-}
-
-
void EventHandlerImplementation::HandleRead(Handle* handle,
int bytes,
OverlappedBuffer* buffer) {
@@ -1114,6 +1148,8 @@
if (bytes >= 0) {
if (!handle->IsError() && !handle->IsClosing()) {
int event_mask = 1 << kOutEvent;
+ ASSERT(!handle->is_client_socket() ||
+ reinterpret_cast<ClientSocket*>(handle)->is_connected());
if ((handle->mask() & event_mask) != 0) {
DartUtils::PostInt32(handle->port(), event_mask);
}
@@ -1131,8 +1167,23 @@
int bytes,
OverlappedBuffer* buffer) {
client_socket->DisconnectComplete(buffer);
+ DeleteIfClosed(client_socket);
}
+
+void EventHandlerImplementation::HandleConnect(
+ ClientSocket* client_socket,
+ int bytes,
+ OverlappedBuffer* buffer) {
+ if (bytes < 0) {
+ HandleError(client_socket);
+ OverlappedBuffer::DisposeBuffer(buffer);
+ } else {
+ client_socket->ConnectComplete(buffer);
+ }
+}
+
+
void EventHandlerImplementation::HandleTimeout() {
if (!timeout_queue_.HasTimeout()) return;
DartUtils::PostNull(timeout_queue_.CurrentPort());
@@ -1171,6 +1222,11 @@
HandleDisconnect(client_socket, bytes, buffer);
break;
}
+ case OverlappedBuffer::kConnect: {
+ ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key);
+ HandleConnect(client_socket, bytes, buffer);
+ break;
+ }
default:
UNREACHABLE();
}
@@ -1235,6 +1291,7 @@
&key,
&overlapped,
static_cast<DWORD>(millis));
+
if (!ok && overlapped == NULL) {
if (GetLastError() == ERROR_ABANDONED_WAIT_0) {
// The completion port should never be closed.
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index 90e505a..e1f96f7 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -41,7 +41,9 @@
// socket for the client.
class OverlappedBuffer {
public:
- enum Operation { kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect };
+ enum Operation {
+ kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect, kConnect
+ };
static OverlappedBuffer* AllocateAcceptBuffer(int buffer_size);
static OverlappedBuffer* AllocateReadBuffer(int buffer_size);
@@ -49,6 +51,7 @@
static OverlappedBuffer* AllocateWriteBuffer(int buffer_size);
static OverlappedBuffer* AllocateSendToBuffer(int buffer_size);
static OverlappedBuffer* AllocateDisconnectBuffer();
+ static OverlappedBuffer* AllocateConnectBuffer();
static void DisposeBuffer(OverlappedBuffer* buffer);
// Find the IO buffer from the OVERLAPPED address.
@@ -221,7 +224,6 @@
HANDLE handle() { return handle_; }
Dart_Port port() { return port_; }
- EventHandlerImplementation* event_handler() { return event_handler_; }
void Lock();
void Unlock();
@@ -415,14 +417,18 @@
public:
explicit ClientSocket(SOCKET s) : SocketHandle(s),
DisconnectEx_(NULL),
- next_(NULL) {
+ next_(NULL),
+ connected_(false),
+ closed_(false) {
LoadDisconnectEx();
type_ = kClientSocket;
}
ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port),
DisconnectEx_(NULL),
- next_(NULL) {
+ next_(NULL),
+ connected_(false),
+ closed_(false) {
LoadDisconnectEx();
type_ = kClientSocket;
}
@@ -432,6 +438,7 @@
ASSERT(!HasPendingRead());
ASSERT(!HasPendingWrite());
ASSERT(next_ == NULL);
+ ASSERT(closed_ == true);
};
void Shutdown(int how);
@@ -442,6 +449,8 @@
void IssueDisconnect();
void DisconnectComplete(OverlappedBuffer* buffer);
+ void ConnectComplete(OverlappedBuffer* buffer);
+
virtual void EnsureInitialized(
EventHandlerImplementation* event_handler);
virtual void DoClose();
@@ -450,11 +459,18 @@
ClientSocket* next() { return next_; }
void set_next(ClientSocket* next) { next_ = next; }
+ void mark_connected() {
+ connected_ = true;
+ }
+ bool is_connected() const { return connected_; }
+
private:
bool LoadDisconnectEx();
LPFN_DISCONNECTEX DisconnectEx_;
ClientSocket* next_;
+ bool connected_;
+ bool closed_;
};
@@ -495,14 +511,15 @@
void HandleInterrupt(InterruptMessage* msg);
void HandleTimeout();
void HandleAccept(ListenSocket* listen_socket, OverlappedBuffer* buffer);
- void HandleClosed(Handle* handle);
- void HandleError(Handle* handle);
void HandleRead(Handle* handle, int bytes, OverlappedBuffer* buffer);
void HandleRecvFrom(Handle* handle, int bytes, OverlappedBuffer* buffer);
void HandleWrite(Handle* handle, int bytes, OverlappedBuffer* buffer);
void HandleDisconnect(ClientSocket* client_socket,
int bytes,
OverlappedBuffer* buffer);
+ void HandleConnect(ClientSocket* client_socket,
+ int bytes,
+ OverlappedBuffer* buffer);
void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped);
HANDLE completion_port() { return completion_port_; }
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index bd8d498..5f90f22 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -82,6 +82,7 @@
V(Socket_SetOption, 4) \
V(Socket_JoinMulticast, 4) \
V(Socket_LeaveMulticast, 4) \
+ V(Socket_GetSocketId, 1) \
V(Socket_SetSocketId, 2) \
V(Stdin_ReadByte, 1) \
V(Stdin_GetEchoMode, 0) \
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 1e7c2ad..c13aa98 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -636,14 +636,15 @@
static Mutex* signal_mutex = new Mutex();
static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
static const int kSignals[kSignalsCount] = {
SIGHUP,
SIGINT,
SIGTERM,
SIGUSR1,
SIGUSR2,
- SIGWINCH
+ SIGWINCH,
+ SIGQUIT // Allow VMService to listen on SIGQUIT.
};
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 221541a..ef0927a 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -632,14 +632,15 @@
static Mutex* signal_mutex = new Mutex();
static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
static const int kSignals[kSignalsCount] = {
SIGHUP,
SIGINT,
SIGTERM,
SIGUSR1,
SIGUSR2,
- SIGWINCH
+ SIGWINCH,
+ SIGQUIT // Allow VMService to listen on SIGQUIT.
};
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 6e8ed46..e84b115 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -678,14 +678,15 @@
static Mutex* signal_mutex = new Mutex();
static SignalInfo* signal_handlers = NULL;
-static const int kSignalsCount = 6;
+static const int kSignalsCount = 7;
static const int kSignals[kSignalsCount] = {
SIGHUP,
SIGINT,
SIGTERM,
SIGUSR1,
SIGUSR2,
- SIGWINCH
+ SIGWINCH,
+ SIGQUIT // Allow VMService to listen on SIGQUIT.
};
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 0f5f8ac..970bb65 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -139,6 +139,10 @@
throw new SignalException(
"Listening for signal $signal is not supported");
}
+ return _watchSignalInternal(signal);
+ }
+
+ static Stream<ProcessSignal> _watchSignalInternal(ProcessSignal signal) {
if (_signalControllers[signal._signalNumber] == null) {
_signalControllers[signal._signalNumber] = new _SignalController(signal);
}
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index cf3b37d..1b61951 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -349,6 +349,13 @@
}
+void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) {
+ intptr_t id =
+ Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
+ Dart_SetReturnValue(args, Dart_NewInteger(id));
+}
+
+
void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
intptr_t id =
DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 59faecf..7445562 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -390,6 +390,9 @@
static const int PROTOCOL_IPV4 = 1 << 0;
static const int PROTOCOL_IPV6 = 1 << 1;
+ static const int NORMAL_TOKEN_BATCH_SIZE = 8;
+ static const int LISTENING_TOKEN_BATCH_SIZE = 2;
+
// Socket close state
bool isClosed = false;
bool isClosing = false;
@@ -481,40 +484,53 @@
static Future<_NativeSocket> connect(host, int port) {
return new Future.value(host)
.then((host) {
- if (host is _InternetAddress) return host;
+ if (host is _InternetAddress) return [host];
return lookup(host)
.then((list) {
if (list.length == 0) {
throw createError(response, "Failed host lookup: '$host'");
}
- return list[0];
+ return list;
});
})
- .then((address) {
- var socket = new _NativeSocket.normal();
- socket.address = address;
- var result = socket.nativeCreateConnect(
- address._in_addr, port);
- if (result is OSError) {
- throw createError(result, "Connection failed", address, port);
- } else {
- socket.port; // Query the local port, for error messages.
- var completer = new Completer();
- // Setup handlers for receiving the first write event which
- // indicate that the socket is fully connected.
- socket.setHandlers(
- write: () {
- socket.setListening(read: false, write: false);
- completer.complete(socket);
- },
- error: (e) {
- socket.close();
- completer.completeError(e);
- }
- );
- socket.setListening(read: false, write: true);
- return completer.future;
+ .then((addresses) {
+ assert(addresses is List);
+ var completer = new Completer();
+ var it = addresses.iterator;
+ void run(error) {
+ if (!it.moveNext()) {
+ assert(error != null);
+ completer.completeError(error);
+ return;
+ }
+ var address = it.current;
+ var socket = new _NativeSocket.normal();
+ socket.address = address;
+ var result = socket.nativeCreateConnect(address._in_addr, port);
+ if (result is OSError) {
+ // Keep first error, if present.
+ run(error != null ? error :
+ createError(result, "Connection failed", address, port));
+ } else {
+ socket.port; // Query the local port, for error messages.
+ // Setup handlers for receiving the first write event which
+ // indicate that the socket is fully connected.
+ socket.setHandlers(
+ write: () {
+ socket.setListening(read: false, write: false);
+ completer.complete(socket);
+ },
+ error: (e) {
+ socket.close();
+ // Keep first error, if present.
+ run(error != null ? error : e);
+ }
+ );
+ socket.setListening(read: false, write: true);
+ }
}
+ run(null);
+ return completer.future;
});
}
@@ -699,7 +715,7 @@
assert(available > 0);
available--;
tokens++;
- returnTokens();
+ returnTokens(LISTENING_TOKEN_BATCH_SIZE);
var socket = new _NativeSocket.normal();
if (nativeAccept(socket) != true) return null;
socket.localPort = localPort;
@@ -811,6 +827,7 @@
var handler = eventHandlers[i];
if (i == DESTROYED_EVENT) {
+ assert(isClosing);
assert(!isClosed);
isClosed = true;
closeCompleter.complete();
@@ -832,14 +849,14 @@
}
if (!isListening) {
tokens++;
- returnTokens();
+ returnTokens(NORMAL_TOKEN_BATCH_SIZE);
}
}
- void returnTokens() {
+ void returnTokens(int tokenBatchSize) {
if (eventPort != null && !isClosing && !isClosed) {
- if (tokens == 8) {
- // Return in batches of 8.
+ // Return in batches.
+ if (tokens == tokenBatchSize) {
assert(tokens < (1 << FIRST_COMMAND));
sendToEventHandler((1 << RETURN_TOKEN_COMMAND) | tokens);
tokens = 0;
@@ -860,7 +877,7 @@
sendWriteEvents = write;
if (read) issueReadEvent();
if (write) issueWriteEvent();
- if (eventPort == null) {
+ if (eventPort == null && !isClosing) {
int flags = typeFlags & TYPE_TYPE_MASK;
if (!isClosedRead) flags |= 1 << READ_EVENT;
if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
@@ -923,6 +940,7 @@
}
void connectToEventHandler() {
+ assert(!isClosed);
if (eventPort == null) {
eventPort = new RawReceivePort(multiplex);
_SocketsObservatory.add(this);
@@ -1053,6 +1071,7 @@
nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
int nativeGetPort() native "Socket_GetPort";
List nativeGetRemotePeer() native "Socket_GetRemotePeer";
+ int nativeGetSocketId() native "Socket_GetSocketId";
OSError nativeGetError() native "Socket_GetError";
nativeGetOption(int option, int protocol) native "Socket_GetOption";
bool nativeSetOption(int option, int protocol, value)
@@ -1070,6 +1089,7 @@
implements RawServerSocket {
final _NativeSocket _socket;
StreamController<RawSocket> _controller;
+ ReceivePort _referencePort;
static Future<_RawServerSocket> bind(address,
int port,
@@ -1110,7 +1130,12 @@
_controller.addError(e);
_controller.close();
}),
- destroyed: _controller.close);
+ destroyed: () {
+ _controller.close();
+ if (_referencePort != null) {
+ _referencePort.close();
+ }
+ });
return _controller.stream.listen(
onData,
onError: onError,
@@ -1147,6 +1172,44 @@
_resume();
}
}
+
+ RawServerSocketReference get reference {
+ if (_referencePort == null) {
+ _referencePort = new ReceivePort();
+ _referencePort.listen((sendPort) {
+ sendPort.send(
+ [_socket.nativeGetSocketId(),
+ _socket.address,
+ _socket.localPort]);
+ });
+ }
+ return new _RawServerSocketReference(_referencePort.sendPort);
+ }
+}
+
+
+class _RawServerSocketReference implements RawServerSocketReference {
+ final SendPort _sendPort;
+
+ _RawServerSocketReference(this._sendPort);
+
+ Future<RawServerSocket> create() {
+ var port = new ReceivePort();
+ _sendPort.send(port.sendPort);
+ return port.first.then((args) {
+ port.close();
+ var native = new _NativeSocket.listen();
+ native.nativeSetSocketId(args[0]);
+ native.address = args[1];
+ native.localPort = args[2];
+ return new _RawServerSocket(native);
+ });
+ }
+
+ int get hashCode => _sendPort.hashCode;
+
+ bool operator==(Object other)
+ => other is _RawServerSocketReference && _sendPort == other._sendPort;
}
@@ -1307,6 +1370,18 @@
}
}
+
+class _ServerSocketReference implements ServerSocketReference {
+ final RawServerSocketReference _rawReference;
+
+ _ServerSocketReference(this._rawReference);
+
+ Future<ServerSocket> create() {
+ return _rawReference.create().then((raw) => new _ServerSocket(raw));
+ }
+}
+
+
class _ServerSocket extends Stream<Socket>
implements ServerSocket {
final _socket;
@@ -1337,6 +1412,10 @@
InternetAddress get address => _socket.address;
Future close() => _socket.close().then((_) => this);
+
+ ServerSocketReference get reference {
+ return new _ServerSocketReference(_socket.reference);
+ }
}
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index debff6b..5ec7f1f 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -46,8 +46,11 @@
}
+static Mutex* init_mutex = new Mutex();
+static bool socket_initialized = false;
+
bool Socket::Initialize() {
- static bool socket_initialized = false;
+ MutexLocker lock(init_mutex);
if (socket_initialized) return true;
int err;
WSADATA winsock_data;
@@ -152,19 +155,73 @@
intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
- ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
- SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
+ ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket());
+ ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd);
SOCKET s = handle->socket();
- SocketAddress::SetAddrPort(&addr, port);
- int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(&addr));
- if (status == SOCKET_ERROR) {
- DWORD rc = WSAGetLastError();
- ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
- client_socket->Close();
+
+ RawAddr bind_addr;
+ memset(&bind_addr, 0, sizeof(bind_addr));
+ bind_addr.ss.ss_family = addr.ss.ss_family;
+ if (addr.ss.ss_family == AF_INET) {
+ bind_addr.in.sin_addr.s_addr = INADDR_ANY;
+ } else {
+ bind_addr.in6.sin6_addr = in6addr_any;
+ }
+ int status = bind(
+ s, &bind_addr.addr, SocketAddress::GetAddrLength(&bind_addr));
+ if (status != NO_ERROR) {
+ int rc = WSAGetLastError();
+ delete handle;
+ closesocket(s);
SetLastError(rc);
return -1;
}
- return fd;
+
+ SocketAddress::SetAddrPort(&addr, port);
+
+ LPFN_CONNECTEX connectEx = NULL;
+ GUID guid_connect_ex = WSAID_CONNECTEX;
+ DWORD bytes;
+ status = WSAIoctl(s,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ &guid_connect_ex,
+ sizeof(guid_connect_ex),
+ &connectEx,
+ sizeof(connectEx),
+ &bytes,
+ NULL,
+ NULL);
+ DWORD rc;
+ if (status != SOCKET_ERROR) {
+ handle->EnsureInitialized(EventHandler::delegate());
+
+ OverlappedBuffer* overlapped = OverlappedBuffer::AllocateConnectBuffer();
+
+ status = connectEx(s,
+ &addr.addr,
+ SocketAddress::GetAddrLength(&addr),
+ NULL,
+ 0,
+ NULL,
+ overlapped->GetCleanOverlapped());
+
+
+ if (status == TRUE) {
+ handle->ConnectComplete(overlapped);
+ return fd;
+ } else if (WSAGetLastError() == ERROR_IO_PENDING) {
+ return fd;
+ }
+ rc = WSAGetLastError();
+ // Cleanup in case of error.
+ OverlappedBuffer::DisposeBuffer(overlapped);
+ } else {
+ rc = WSAGetLastError();
+ }
+ handle->Close();
+ delete handle;
+ SetLastError(rc);
+ return -1;
}
@@ -219,15 +276,11 @@
}
-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/vmservice/client/build.sh b/runtime/bin/vmservice/client/build.sh
new file mode 100755
index 0000000..2084b46
--- /dev/null
+++ b/runtime/bin/vmservice/client/build.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# This script copies the build outputs produced by `pub build` to
+# the deployed directory.
+
+if [ ! -d "deployed" ]; then
+ echo "Run this script from the client directory"
+ exit
+fi
+
+# Fixup polymer breakage
+pushd lib/src
+find . -name "*.html" -exec ../../dotdot.sh {} \;
+popd
+
+# Build JS
+pub build
+
+# Undo polymer breakage fix
+pushd lib/src
+find . -name "*.html" -exec ../../notdotdot.sh {} \;
+popd
+
+# Deploy
+./deploy.sh
+
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 5a88805..dee1033 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -17,6 +17,11 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<style>
+ nav {
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+ }
nav ul {
display: inline-table;
position: relative;
@@ -24,7 +29,7 @@
padding-left: 0;
margin-left: 0;
width: 100%;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background-color: #0489c3;
@@ -32,12 +37,21 @@
nav ul:after {
content: ""; clear: both; display: block;
}
+ .vertical-spacer {
+ height: 40px;
+ background-color: #0489c3;
+ }
</style>
<nav>
<ul>
<content></content>
</ul>
</nav>
+ <div class="vertical-spacer">
+ </div>
+ <template if="{{ pad }}">
+ <br>
+ </template>
</template>
</polymer-element>
@@ -64,7 +78,7 @@
margin: 0;
padding: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -107,7 +121,7 @@
padding: 0;
margin-left: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -171,10 +185,10 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ hashLinkWorkaround }}" 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('allocationprofile') }}" anchor="allocation 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>
@@ -205,7 +219,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ msg['breakpoints'].isEmpty }}">
@@ -276,13 +290,24 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+ <style>
+ .errorBox {
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ padding: 10px;
+ font-family: consolas, courier, monospace;
+ font-size: 1em;
+ line-height: 1.2em;
+ white-space: pre;
+ }
+ </style>
<span>
- <template if="{{ isUnexpected(ref.serviceType) }}">
- unexpected reference type <{{ ref.serviceType }}>
+ <template if="{{ isError(ref.serviceType) }}">
+ <pre class="errorBox">{{ ref.message }}</pre>
</template>
- <template if="{{ isError(ref.serviceType) }}">
- <pre>{{ ref.message }}</pre>
+ <template if="{{ isUnexpected(ref.serviceType) }}">
+ unexpected reference type <{{ ref.serviceType }}>
</template>
<template if="{{ isNull(ref.serviceType) }}">
@@ -378,7 +403,7 @@
white-space: pre-line;
}
.historyExpr a:hover {
- background-color: #e1f5fe
+ background-color: #fff3e3;
}
.historyValue {
display: block;
@@ -426,6 +451,32 @@
</polymer-element>
+<polymer-element name="eval-link">
+ <template>
+ <style>
+ .idle {
+ color: #0489c3;
+ cursor: pointer;
+ }
+ .busy {
+ color: #aaa;
+ cursor: wait;
+ }
+ </style>
+
+ <template if="{{ busy }}">
+ <span class="busy">[evaluate]</span>
+ </template>
+ <template if="{{ !busy }}">
+ <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+ </template>
+ <template if="{{ result != null }}">
+ = <instance-ref ref="{{ result }}"></instance-ref>
+ </template>
+
+ </template>
+
+</polymer-element>
<polymer-element name="field-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -459,10 +510,16 @@
</polymer-element>
<polymer-element name="library-ref" extends="service-ref">
<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ nameIsEmpty }}">
+ <a href="{{ url }}">unnamed</a>
+ </template>
+ <template if="{{ !nameIsEmpty }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
-</polymer-element><polymer-element name="script-ref" extends="service-ref">
+</polymer-element>
+<polymer-element name="script-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
@@ -544,6 +601,12 @@
<div class="memberValue">{{ cls.vmName }}</div>
</div>
</template>
+ <div class="memberItem">
+ <div class="memberName">retained size<br>(all instances)</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
</div>
</div>
@@ -557,7 +620,7 @@
<div class="content">
<template if="{{ cls['fields'].isNotEmpty }}">
fields ({{ cls['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in cls['fields'] }}">
<div class="memberItem">
@@ -572,12 +635,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ cls['functions'].isNotEmpty }}">
functions ({{ cls['functions'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['functions'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ function in cls['functions'] }}">
<div class="memberItem">
@@ -588,7 +651,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
@@ -606,7 +669,12 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<template if="{{ code.isDartCode }}">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ code.isOptimized }}">
+ <a href="{{ url }}">*{{ name }}</a>
+ </template>
+ <template if="{{ !code.isOptimized }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<template if="{{ !code.isDartCode }}">
<span>{{ name }}</span>
@@ -669,14 +737,25 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="content">
- <h1>Code for {{ code.name }}</h1>
+ <template if="{{ code.isDartCode && code.isOptimized }}">
+ <h1>Optimized code for {{ code.name }}</h1>
+ </template>
+ <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+ <h1>Code for {{ code.name }}</h1>
+ </template>
<div class="memberList">
<div class="memberItem">
- <div class="memberName">kind</div>
+ <div class="memberName">Kind</div>
<div class="memberValue">{{code.kind}}</div>
</div>
+ <template if="{{ code.isDartCode }}">
+ <div class="memberItem">
+ <div class="memberName">Optimized</div>
+ <div class="memberValue">{{code.isOptimized}}</div>
+ </div>
+ </template>
<div class="memberItem">
- <div class="memberName">function</div>
+ <div class="memberName">Function</div>
<div class="memberValue">
<function-ref ref="{{code.function}}">
</function-ref>
@@ -781,39 +860,14 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ error.kind }}</h1>
- <div class="well">{{ error.message }}</div>
+ <div class="content-centered">
+ <h1>{{ error.kind }}</h1>
+ <br>
+ <div class="well">{{ error.message }}</div>
</div>
</template>
</polymer-element>
-<polymer-element name="eval-link">
- <template>
- <style>
- .idle {
- color: #0489c3;
- cursor: pointer;
- }
- .busy {
- color: #aaa;
- cursor: wait;
- }
- </style>
-
- <template if="{{ busy }}">
- <span class="busy">[evaluate]</span>
- </template>
- <template if="{{ !busy }}">
- <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
- </template>
- <template if="{{ result != null }}">
- = <instance-ref ref="{{ result }}"></instance-ref>
- </template>
-
- </template>
-
-</polymer-element>
<polymer-element name="field-view" extends="observatory-element">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -827,7 +881,7 @@
<template if="{{ field['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
@@ -957,7 +1011,7 @@
<template if="{{ function['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
@@ -1059,19 +1113,27 @@
.hover {
position: fixed;
z-index: 999;
+ height: 16px;
width: 100%;
background: #ffffff;
}
+ .spacer {
+ height: 16px;
+ background-color: red;
+ }
</style>
- <nav-bar>
+ <nav-bar pad="{{ false }}">
<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-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="hover">
<p style="text-align:center">{{ status }}</p>
</div>
+ <div class="spacer">
+ <!-- Make sure no data is covered by hover bar initially -->
+ </div>
<div class="flex-row">
<canvas id="fragmentation" width="1px" height="1px"></canvas>
</div>
@@ -1242,82 +1304,101 @@
<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.mainPort }}</div>
- </div>
- <br>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+ <div class="content-centered">
+ <div class="flex-row">
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ isolate.rootLib }}"></library-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.mainPort }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
</div>
</div>
- </div>
- </div>
+
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div> <!-- flex row -->
+ </div> <!-- content -->
<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>
+ libraries ({{ isolate.libraries.length }})
+ <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ lib in isolate.libraries }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <library-ref ref="{{ lib }}"></library-ref>
+ </div>
+ </div>
+ </template>
</div>
- <div class="memberItem">
- <div class="memberName">old heap</div>
- <div class="memberValue">
- {{ isolate.oldHeapUsed | formatSize }}
- of
- {{ isolate.oldHeapCapacity | formatSize }}
- </div>
- </div>
- </div>
-
- <br>
-
- <div class="memberList">
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
- </div>
- </div>
- </div>
+ </curly-block>
</div>
<hr>
@@ -1386,6 +1467,12 @@
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
</div>
+ <div class="memberItem">
+ <div class="memberName">retained size</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
<template if="{{ instance['type_class'] != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
@@ -1421,7 +1508,7 @@
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<div class="memberItem">
@@ -1434,12 +1521,12 @@
</div>
</template>
</div>
- </curly-block>
+ </curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<div class="memberItem">
@@ -1448,12 +1535,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['elements'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<div class="memberItem">
@@ -1465,7 +1552,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
@@ -1508,18 +1595,8 @@
<div class="memberList">
<div class="memberItem">
<div class="memberName">url</div>
- <div class="memberValue">{{ library['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>
@@ -1532,11 +1609,27 @@
<hr>
<div class="content">
- <template if="{{ library['scripts'].isNotEmpty }}">
- scripts ({{ library['scripts'].length }})
- <curly-block>
+ <template if="{{ library.imports.isNotEmpty }}">
+ imports ({{ library.imports.length }})
+ <curly-block expand="{{ library.imports.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ script in library['scripts'] }}">
+ <template repeat="{{ imp in library.imports }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <library-ref ref="{{ imp }}"></library-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ <br>
+ </template>
+
+ <template if="{{ library.scripts.isNotEmpty }}">
+ scripts ({{ library.scripts.length }})
+ <curly-block expand="{{ library.scripts.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ script in library.scripts }}">
<div class="memberItem">
<div class="memberValue">
<script-ref ref="{{ script }}"></script-ref>
@@ -1545,13 +1638,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['classes'].isNotEmpty }}">
- classes ({{ library['classes'].length }})
- <curly-block>
+ <template if="{{ library.classes.isNotEmpty }}">
+ classes ({{ library.classes.length }})
+ <curly-block expand="{{ library.classes.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ cls in library['classes'] }}">
+ <template repeat="{{ cls in library.classes }}">
<div class="memberItem">
<div class="memberValue">
<class-ref ref="{{ cls }}"></class-ref>
@@ -1560,13 +1654,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['variables'].isNotEmpty }}">
- variables ({{ library['variables'].length }})
- <curly-block>
+ <template if="{{ library.variables.isNotEmpty }}">
+ variables ({{ library.variables.length }})
+ <curly-block expand="{{ library.variables.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ field in library['variables'] }}">
+ <template repeat="{{ field in library.variables }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field }}"></field-ref>
@@ -1580,13 +1675,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['functions'].isNotEmpty }}">
- functions ({{ library['functions'].length }})
- <curly-block>
+ <template if="{{ library.functions.isNotEmpty }}">
+ functions ({{ library.functions.length }})
+ <curly-block expand="{{ library.functions.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ function in library['functions'] }}">
+ <template repeat="{{ function in library.functions }}">
<div class="memberItem">
<div class="memberValue">
<function-ref ref="{{ function }}"></function-ref>
@@ -1595,6 +1691,7 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
</div>
@@ -1698,7 +1795,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<style>
@@ -1837,7 +1934,7 @@
<tbody>
<tr template="" repeat="{{row in tree.rows }}" style="{{}}">
<td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
- <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+ <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
<div style="position: relative;display: inline">
{{row.columns[0]}}
</div>
@@ -1911,7 +2008,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
<nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -1960,12 +2057,14 @@
<thead>
<tr>
<th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
</tr>
</thead>
<tbody>
@@ -1977,6 +2076,8 @@
<td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
<td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
<td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+ <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+ <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
</tr>
</tbody>
</table>
@@ -1990,7 +2091,6 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ script.isolate }}">
</isolate-nav-menu>
- <library-nav-menu library="{{ script.library }}"></library-nav-menu>
<nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
<li>
<input type="checkbox" checked="{{ showCoverage }}">
@@ -2047,7 +2147,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ trace['members'].isEmpty }}">
@@ -2134,10 +2234,13 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ exception.kind }}</h1>
- <div class="well">{{ exception.message }}</div>
+ <div class="content-centered">
+ <h1>{{ exception.kind }}</h1>
+ <br>
+ <div class="well">{{ exception.message }}</div>
+ <template if="{{ exception.response != '' }}">
<div class="well">{{ exception.response }}</div>
+ </template>
</div>
</template>
@@ -2148,8 +2251,9 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
+ <div class="content-centered">
<h1>{{ error.kind }}</h1>
+ <br>
<div class="well">{{ error.message }}</div>
</div>
</template>
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 d873c4b..959e609 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
init()
$=I.p
var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
function map(b){b={x:b}
delete b.x
return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
HT:{
"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
"^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+ks:function(a){var z,y,x,w
z=a[init.dispatchPropertyName]
if(z==null)if($.Bv==null){H.XD()
z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,57 +167,54 @@
if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
if(w==null){y=Object.getPrototypeOf(a)
if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+else return C.vB}return w},
+e1:function(a){var z,y,x,w
z=$.Au
if(z==null)return
y=z
for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},
+Xr:function(a){var z,y,x
z=J.e1(a)
if(z==null)return
y=$.Au
x=z+1
if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
+return y[x]},
+Nq:function(a,b){var z,y,x
z=J.e1(a)
if(z==null)return
y=$.Au
x=z+2
if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
Gv:{
"^":"a;",
n:function(a,b){return a===b},
giO:function(a){return H.eQ(a)},
bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(a),null)},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,74,[]],
"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
bu:function(a){return String(a)},
giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
+$isa2:true},
Jh:{
-"^":"Null/Gv;",
+"^":"Gv;",
n:function(a,b){return null==b},
bu:function(a){return"null"},
giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
Ue1:{
"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.CS}},
+giO:function(a){return 0}},
FP:{
"^":"Ue1;"},
is:{
"^":"Ue1;"},
Q:{
-"^":"List/Gv;",
+"^":"Gv;",
h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
a.push(b)},
KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -233,11 +230,12 @@
for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
return!0}return!1},
ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
FV:function(a,b){var z
for(z=J.GP(b);z.G();)this.h(a,z.gl())},
V1:function(a){this.sB(a,0)},
aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
zV:function(a,b){var z,y,x,w
z=a.length
y=Array(z)
@@ -310,9 +308,9 @@
if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
a[b]=c},
-$isList:true,
-$isList:true,
-$asWO:null,
+$isQ:true,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null,
@@ -326,11 +324,11 @@
$isnM:true},
iY:{
"^":"nM;"},
-Jt:{
+Ib:{
"^":"nM;",
-$isJt:true},
+$isIb:true},
P:{
-"^":"num/Gv;",
+"^":"Gv;",
iM:function(a,b){var z
if(typeof b!=="number")throw H.b(P.u(b))
if(a<b)return-1
@@ -405,27 +403,25 @@
return a<=b},
F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
-gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$islf:true,
+static:{"^":"SAz,yc"}},
+imn:{
+"^":"P;",
+$isCP:true,
+$islf:true,
+$isKN:true},
Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
+"^":"P;",
+$isCP:true,
+$islf:true},
x1:{
-"^":"bU;"},
+"^":"imn;"},
VP:{
"^":"x1;"},
qa:{
"^":"VP;"},
O:{
-"^":"String/Gv;",
+"^":"Gv;",
j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b<0)throw H.b(P.N(b))
if(b>=a.length)throw H.b(P.N(b))
@@ -522,28 +518,27 @@
y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
y^=y>>11
return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
gB:function(a){return a.length},
t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
for(z=a.length;b>0;b=y){y=b-1
if(y>=z)H.vh(P.N(y))
x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
"^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+ox:function(){--init.globalState.Xz.GL},
+oT:function(a,b){var z,y,x,w,v,u
z={}
z.a=b
b=b
@@ -551,14 +546,14 @@
if(b==null){b=[]
z.a=b
y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
y.i6(a)
init.globalState=y
if(init.globalState.EF===!0)return
y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
+x=P.L5(null,null,null,P.KN,H.yo)
+w=P.Ls(null,null,null,P.KN)
v=new H.yo(0,null,!1)
u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
w.h(0,0)
@@ -570,21 +565,21 @@
if(x)u.vV(0,new H.PK(z,a))
else{y=H.KT(y,[y,y]).BD(a)
if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},
+yl:function(){var z=init.currentScript
if(z!=null)return String(z.src)
if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
if(typeof version=="function"&&typeof system=="function")return thisFilename()
if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
z=new Error().stack
if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
if(y!=null)return y[1]
y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
z=H.Hh(b.data)
y=J.U6(z)
@@ -597,8 +592,8 @@
s=y.t(z,"startPaused")
r=H.Hh(y.t(z,"replyTo"))
y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
+q=P.L5(null,null,null,P.KN,H.yo)
+p=P.Ls(null,null,null,P.KN)
o=new H.yo(0,null,!1)
n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
p.h(0,0)
@@ -636,15 +631,15 @@
y.toString
self.postMessage(q)}else P.JS(y.t(z,"msg"))
break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
+ZF:function(a){var z,y,x,w
if(init.globalState.EF===!0){y=init.globalState.vd
x=H.Gy(P.EF(["command","log","msg",a],null,null))
y.toString
self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},
+Ws:function(a,b,c,d,e,f){var z,y,x,w
z=init.globalState.N0
y=z.jO
$.te=$.te+("_"+y)
@@ -655,24 +650,24 @@
J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
x=new H.Vg(a,b,c,d)
if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+Gy:function(a){var z
if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
z.il=new H.fP(null)
return z.h7(a)}else{z=new H.NO(new H.X1())
z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+return z.h7(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},
+VO:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
+ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
PK:{
-"^":"Tp:126;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b",
+$0:function(){this.b.$1(this.a.a)},
$isEH:true},
JO:{
-"^":"Tp:126;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
$isEH:true},
f0:{
"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -686,8 +681,8 @@
this.ji=y
this.vu=z&&!x
this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
+this.XC=P.L5(null,null,null,P.KN,null)
if(this.EF===!0){z=new H.JH()
this.vd=z
w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -784,10 +779,10 @@
init.globalState.i2.Rz(0,this.jO)
z=this.Jp
if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,125],
+this.Jp=null}},"$0","gQb",0,0,21],
$isaX:true},
NY:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
$0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
$isEH:true},
cC:{
@@ -816,23 +811,23 @@
w.toString
self.postMessage(v)}}},
RA:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
$0:[function(){if(!this.a.xB())return
P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
$isEH:true},
IY:{
"^":"a;F1*,i3,G1*",
VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+return}J.nG(this.F1,this.i3)},
$isIY:true},
JH:{
"^":"a;"},
jl:{
-"^":"Tp:126;a,b,c,d,e,f",
+"^":"Tp:22;a,b,c,d,e,f",
$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
$isEH:true},
Vg:{
-"^":"Tp:125;a,b,c,d",
+"^":"Tp:21;a,b,c,d",
$0:[function(){var z,y,x
if(this.d!==!0)this.a.$1(this.c)
else{z=this.a
@@ -870,7 +865,7 @@
$isbC:true,
$ishq:true},
Ua:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
$0:[function(){var z,y
z=this.b.JE
if(!z.gP0()){if(this.c){y=this.a
@@ -886,8 +881,8 @@
n:function(a,b){if(b==null)return!1
return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.c1(this.hQ,16)
+y=J.c1(this.Jz,8)
x=this.bv
if(typeof x!=="number")return H.s(x)
return(z^y^x)>>>0},
@@ -927,7 +922,7 @@
yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
throw H.b("Capability not serializable: "+a.bu(0))}},
II:{
-"^":"Xb;RZ",
+"^":"lY;RZ",
Vf:function(a){var z,y,x,w,v,u
z=J.U6(a)
y=z.t(a,1)
@@ -965,7 +960,7 @@
I8:function(a){var z
if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$iszM)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)
@@ -999,9 +994,9 @@
DE:function(a){return H.vh(P.SY(null))},
yf:function(a){return H.vh(P.SY(null))}},
OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},
$isEH:true},
Tf:{
"^":"BB;",
@@ -1030,7 +1025,7 @@
x[w]=v}return x},
DE:function(a){return H.vh(P.SY(null))},
yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
"^":"a;",
QS:function(a){if(H.ZR(a))return a
this.RZ=P.Py(null,null,null,null,null)
@@ -1093,12 +1088,12 @@
z.Qa(a,b)
return z}}},
FA:{
-"^":"Tp:125;a,b",
+"^":"Tp:21;a,b",
$0:[function(){this.a.p9=null
this.b.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
Av:{
-"^":"Tp:125;c,d",
+"^":"Tp:21;c,d",
$0:[function(){this.c.p9=null
H.ox()
this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1125,23 +1120,23 @@
$isku:true,
$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
"^":"",
-wV:[function(a,b){var z
+wV:function(a,b){var z
if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
if(typeof a==="string")return a
if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
else if(!1===a)return"false"
else if(a==null)return"null"
z=J.AG(a)
if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
+eQ:function(a){var z=a.$identityHash
if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
+BU:function(a,b,c){var z,y,x,w,v,u
if(c==null)c=H.Rm()
if(typeof a!=="string")H.vh(P.u(a))
z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1167,48 +1162,48 @@
if(!(v<u))break
y.j(w,0)
if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+IH:function(a,b){var z,y
if(typeof a!=="string")H.vh(P.u(a))
if(b==null)b=H.Rm()
if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
z=parseFloat(a)
if(isNaN(z)){y=J.rr(a)
if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
+return b.$1(a)}return z},
+lh:function(a){var z,y
z=C.AS(J.x(a))
if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
+a5:function(a){return"Instance of '"+H.lh(a)+"'"},
+RF:function(a){var z,y,x,w,v,u
z=a.length
for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
else{u=w+500
u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
y=new H.a7(a,a.length,0,null)
y.$builtinTypeInfo=[H.Kp(a,0)]
for(;y.G();){x=y.lo
if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
if(x<=65535)z.push(x)
else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
+eT:function(a){var z,y
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},
+Lw:function(a){var z
if(typeof a!=="number")return H.s(a)
if(0<=a){if(a<=65535)return String.fromCharCode(a)
if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1222,14 +1217,14 @@
if(x.E(a,0)||x.C(a,100)){w=new Date(y)
if(h)w.setUTCFullYear(a)
else w.setFullYear(a)
-return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},
+VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},
+aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},
+zo:function(a,b,c){var z,y,x
z={}
z.a=0
y=[]
@@ -1237,8 +1232,8 @@
if(b!=null){z.a=b.length
C.Nm.FV(y,b)}z.b=""
if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
z={}
if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
if(y==null)return H.zo(a,b,c)
@@ -1258,33 +1253,24 @@
C.Nm.FV(r,b)
y=a["$"+q]
if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
+return y.apply(a,r)},
+Pq:function(){var z={x:0}
delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return z},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
if(a==null)a=new P.LK()
z=new Error()
z.dartException=a
if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
+return z},
Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:function(a){throw H.b(a)},
+Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=new H.Am(a)
if(a==null)return
if(typeof a!=="object")return a
@@ -1322,29 +1308,29 @@
return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
z=a.length
for(y=0;y<z;y=w){x=y+1
w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
+b.u(0,a[y],a[x])}return b},
ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
if(z.n(c,0))return H.zd(b,new H.dr(a))
else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
+tR:function(a,b){var z
if(a==null)return
z=a.$identity
if(!!z)return z
z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=b[0]
z.$stubName
y=z.$callName
@@ -1373,36 +1359,36 @@
n=o.$callName
if(n!=null){m=d?o:H.SD(a,o,t)
w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.eZ
switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+SD:function(a,b,c){var z,y,x,w,v,u
if(c)return H.wg(a,b)
z=b.$stubName
y=b.length
x=a[z]
w=b==null?x==null:b===x
if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
+if(y===0){w=$.mJ
if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
v=$.OK
$.OK=J.WB(v,1)
return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
w="return function("+u+"){return this."
-v=$.bf
+v=$.mJ
if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
w=$.OK
$.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
z=H.eZ
y=H.yS
switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1414,8 +1400,8 @@
case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
default:return function(e,f,g,h){return function(){h=[g(this)]
Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+wg:function(a,b){var z,y,x,w,v,u,t,s
z=H.oN()
y=$.P4
if(y==null){y=H.B3("receiver")
@@ -1432,40 +1418,40 @@
y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
t=$.OK
$.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},
+qm:function(a,b,c,d,e,f){b.fixed$length=init
c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
if(a!=null)z=typeof a==="object"&&J.x(a)[b]
else z=!0
if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.SE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.tD(a,b,c,null)},
+Og:function(a,b){var z=a.name
if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},
+N7:function(){return C.KZ},
+uV:function(a){return new H.cu(a,null)},
+VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},
+oX:function(a){if(a==null)return
+return a.$builtinTypeInfo},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+ip:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
else if(typeof a=="function")return a.builtin$cls
else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
if(a==null)return""
z=P.p9("")
for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1473,34 +1459,35 @@
v=a[y]
if(v!=null)w=!1
u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
else if(typeof a=="function"){a=H.ml(a,null,b)
if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
if(a==null)return!1
z=H.oX(a)
y=J.x(a)
if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
if(a==null||b==null)return!0
z=a.length
for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+XY:function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
if(b==null)return!0
z=H.oX(a)
a=J.x(a)
if(z!=null){y=z.slice()
y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
if(a===b)return!0
if(a==null||b==null)return!0
if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1517,8 +1504,8 @@
if(!y&&t==null||!w)return!0
y=y?a.slice(1):null
w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
if(b==null&&a==null)return!0
if(b==null)return c
if(a==null)return!1
@@ -1527,8 +1514,8 @@
if(c){if(z<y)return!1}else if(z!==y)return!1
for(x=0;x<y;++x){w=a[x]
v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
if(b==null)return!0
if(a==null)return!1
z=Object.getOwnPropertyNames(b)
@@ -1538,8 +1525,8 @@
if(!Object.hasOwnProperty.call(a,w))return!1
v=b[w]
u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
if(!("func" in a))return!1
if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
y=b.ret
@@ -1560,13 +1547,13 @@
n=w[m]
if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+ml:function(a,b,c){return a.apply(b,c)},
+kj:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+wzi:function(a){return H.eQ(a)},
+iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
z=$.NF.$1(a)
y=$.nw[z]
if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1591,20 +1578,20 @@
if(v==="*")throw H.b(P.SY(z))
if(init.leafTags[z]===true){u=H.Va(x)
Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},
+Lc:function(a,b){var z,y
z=Object.getPrototypeOf(a)
y=J.Qu(b,z,null,null)
Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+VF:function(a,b,c){var z=b.prototype
if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
$.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t
$.nw=Object.create(null)
$.vv=Object.create(null)
H.kO()
@@ -1620,8 +1607,8 @@
z["~"+w]=t
z["-"+w]=t
z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},
+kO:function(){var z,y,x,w,v,u,t
z=C.MA()
z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1632,9 +1619,9 @@
t=z.prototypeForTag
$.NF=new H.dC(v)
$.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
z=H.VM([],[P.Od])
y=b.length
x=a.length
@@ -1643,25 +1630,25 @@
z.push(new H.tQ(v,b,a))
u=v+x
if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},
+m2:function(a,b,c){var z,y
if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
else{z=J.x(b)
if(!!z.$isVR){z=C.xB.yn(a,c)
y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w,v
if(typeof b==="string")if(b==="")if(a==="")return c
else{z=P.p9("")
y=a.length
z.KF(c)
for(x=0;x<y;++x){w=a[x]
w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
else if(!!J.x(b).$isVR){v=b.gl9()
v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
+return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
Zd:{
"^":"a;"},
xQ:{
@@ -1697,12 +1684,12 @@
$isyN:true},
LD:{
"^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
+$1:function(a){return J.de(a,this.b)},
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
jJ:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
$isEH:true},
XR:{
"^":"mW;Y3",
@@ -1820,7 +1807,7 @@
z={}
if(this.NE==null){y=this.hG
this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+x=P.Fl(P.qU,P.KN)
for(w=this.Rv,v=0;v<y;++v){u=w+v
x.u(0,this.XL(u),u)}z.a=0
y=x.gvc()
@@ -1836,36 +1823,35 @@
H.VM(y,y["<>"])
return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
+static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
z=a.$reflectionInfo
if(z==null)return
z.fixed$length=init
z=z
y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a,b,c",
+$1:function(a){var z,y,x
z=this.b.NE
y=this.a.a++
x=this.c.t(0,a)
if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
$isEH:true},
Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+"^":"Tp:77;a,b,c",
+$2:function(a,b){var z=this.a
z.b=z.b+"$"+H.d(a)
this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
$isEH:true},
u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Tp:77;a,b",
+$2:function(a,b){var z=this.b
if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
$isEH:true},
Zr:{
"^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1884,7 +1870,7 @@
x=this.EP
if(x!==-1)y.receiver=z[x+1]
return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
z=a.match(/\\\$[a-zA-Z]+\\\$/g)
if(z==null)z=[]
@@ -1893,8 +1879,8 @@
w=z.indexOf("\\$expr\\$")
v=z.indexOf("\\$method\\$")
u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
+try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
W0:{
"^":"Ge;K9,Ga",
bu:function(a){var z=this.Ga
@@ -1922,9 +1908,9 @@
bu:function(a){var z=this.K9
return C.xB.gl0(z)?"Error":"Error: "+z}},
Am:{
-"^":"Tp:115;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
$isEH:true},
XO:{
"^":"a;lA,ui",
@@ -1937,30 +1923,31 @@
this.ui=z
return z}},
dr:{
-"^":"Tp:126;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a.$0()},
$isEH:true},
TL:{
-"^":"Tp:126;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b,c",
+$0:function(){return this.b.$1(this.c)},
$isEH:true},
KX:{
-"^":"Tp:126;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
$isEH:true},
uZ:{
-"^":"Tp:126;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
$isEH:true},
OQ:{
-"^":"Tp:126;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
$isEH:true},
Tp:{
"^":"a;",
bu:function(a){return"Closure"},
$isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
Bp:{
"^":"Tp;",
$isBp:true},
@@ -1976,15 +1963,15 @@
else y=typeof z!=="object"?J.v1(z):H.eQ(z)
return J.UN(y,H.eQ(this.jm))},
$isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
+static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.mJ=z}return z},B3:function(a){var z,y,x,w,v
z=new H.v("self","target","receiver","name")
y=Object.getOwnPropertyNames(z)
y.fixed$length=init
x=y
for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
+if(z[v]===a)return v}}}},
qq:{
"^":"a;Jy"},
va:{
@@ -2038,11 +2025,11 @@
for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
if(w)x+=", "
x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"Jl",Dz:function(a){var z,y,x
a=a
z=[]
for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
hJ:{
"^":"q1;",
bu:function(a){return"dynamic"},
@@ -2077,12 +2064,10 @@
static:{WE:function(a){return new H.oQ(a)}}},
cu:{
"^":"a;LU<,ke",
-bu:function(a){var z,y,x
+bu:function(a){var z,y
z=this.ke
if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
this.ke=y
return y},
giO:function(a){return J.v1(this.LU)},
@@ -2090,32 +2075,32 @@
return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
$iscu:true,
$isuq:true},
-QT:{
+bB:{
"^":"a;XP<,oc>,kU>"},
dC:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a(a)},
$isEH:true},
wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Tp:78;b",
+$2:function(a,b){return this.b(a,b)},
$isEH:true},
VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Tp:8;c",
+$1:function(a){return this.c(a)},
$isEH:true},
VR:{
-"^":"a;Ej,Ii,Ua",
+"^":"a;zO,Ej,Ii,Ua",
gl9:function(){var z=this.Ii
if(z!=null)return z
z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
this.Ii=z
return z},
gAT:function(){var z=this.Ua
if(z!=null)return z
z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
this.Ua=z
return z},
ej:function(a){var z
@@ -2152,14 +2137,14 @@
R4:function(a,b){return this.wL(a,b,0)},
$isVR:true,
$isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
z=b?"m":""
y=c?"":"i"
x=d?"g":""
w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
if(w instanceof RegExp)return w
v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
AX:{
"^":"a;zO,QK",
t:function(a,b){var z=this.QK
@@ -2202,11 +2187,11 @@
N.Jx("").To("Google Charts API loaded")
z=J.UQ(J.UQ($.cM(),"google"),"visualization")
$.NR=z
-return z},"$1","vN",2,0,115,116,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,117,[],118,[]],
-ap:[function(a,b){var z
+return z},"$1","vN",2,0,16,17,[]],
+G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
+ap:function(a,b){var z
for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],119,[]],
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
av:[function(a){var z,y,x
z=J.Wx(a)
if(z.C(a,1000))return z.bu(a)
@@ -2214,8 +2199,8 @@
a=z.Z(a,1000)
x=G.ap(y,3)
for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,120,121,[]],
-P0:[function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
+P0:function(a){var z,y,x,w
if(a==null)return"-"
z=J.LL(J.vX(a,1000))
y=C.jn.cU(z,3600000)
@@ -2225,14 +2210,14 @@
w=C.jn.cU(z,1000)
z=C.jn.Y(z,1000)
if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,122,[]],
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
Xz:[function(a){var z=J.Wx(a)
if(z.C(a,1024))return H.d(a)+"B"
else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,120,123,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
+mG:function(a){var z,y,x,w
if(a==null)return"-"
z=J.LL(J.vX(a,1000))
y=C.jn.cU(z,3600000)
@@ -2242,15 +2227,15 @@
P.p9("")
if(y!==0)return""+y+"h "+x+"m "+w+"s"
if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,122,[]],
+return""+w+"s"},
mL:{
-"^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
+"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
+gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
+gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
Da:function(){var z,y
z=this.Z6
z.sec(this)
@@ -2261,9 +2246,9 @@
z=z.gLi()
H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
+this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
+this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
US:function(){this.Da()},
hq:function(){this.Da()}},
ig:{
@@ -2282,8 +2267,8 @@
this.vR.V7("draw",[a.gYb(),z])}},
dZ:{
"^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",307,308],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
+gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
kI:function(){var z=C.PP.aM(window)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
if(window.location.hash==="")window.location.hash="#/vm"
@@ -2302,23 +2287,25 @@
this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
static:{"^":"K3D"}},
Qe:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
$isEH:true},
GH:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z,y
z=this.a
y=z.ec
y.AJ=F.Wi(y,C.mE,y.AJ,a)
z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
$isEH:true},
Y2:{
-"^":["Pi;eT>,yt<-317,wd>-318,oH<-319",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",307,308],
+"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",307],
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
+grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
goE:function(a){return this.z3},
soE:function(a,b){var z=this.z3
this.z3=b
@@ -2328,9 +2315,10 @@
this.o8()}}},
r8:function(){this.soE(0,!this.z3)
return this.z3},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
$isY2:true},
XN:{
-"^":["Pi;zU>-318,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
rT:function(a){var z,y
z=this.zU
y=J.w1(z)
@@ -2357,7 +2345,7 @@
w.UZ(z,v,v+y)}},
Kt:{
"^":"a;ph>,xy",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,124,121,[]]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
Ni:{
"^":"a;UQ>",
$isNi:true},
@@ -2368,7 +2356,7 @@
gxp:function(){return this.pT},
np:function(a){H.rd(this.tW,new G.Nu(this))
F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
+gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
lb:function(){C.Nm.sB(this.zU,0)
C.Nm.sB(this.tW,0)},
aJ:function(a,b){var z=this.zU
@@ -2379,55 +2367,55 @@
z=this.zU
if(a>>>0!==a||a>=z.length)return H.e(z,a)
z=J.U8(z[a])
-if(b>>>0!==b||b>=7)return H.e(z,b)
+if(b>>>0!==b||b>=9)return H.e(z,b)
y=z[b]
-return this.oH[b].xy.$1(y)},"$2","gls",4,0,321,322,[],323,[],"getFormattedValue",307],
+return this.oH[b].xy.$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
Qs:[function(a){var z,y
if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
return z[a].ph+"\u2003"}z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
z=z[a]
y=this.jV?"\u25bc":"\u25b2"
-return z.ph+y},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
+return z.ph+y},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
TK:[function(a,b){var z=this.zU
if(a>>>0!==a||a>=z.length)return H.e(z,a)
z=J.U8(z[a])
-if(b>>>0!==b||b>=7)return H.e(z,b)
-return z[b]},"$2","gyY",4,0,324,322,[],323,[],"getValue",307]},
+if(b>>>0!==b||b>=9)return H.e(z,b)
+return z[b]},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w,v,u
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x,w,v,u
z=this.a
y=z.zU
if(a>>>0!==a||a>=y.length)return H.e(y,a)
x=J.U8(y[a])
w=z.pT
-if(w>>>0!==w||w>=7)return H.e(x,w)
+if(w>>>0!==w||w>=9)return H.e(x,w)
v=x[w]
if(b>>>0!==b||b>=y.length)return H.e(y,b)
y=J.U8(y[b])
w=z.pT
-if(w>>>0!==w||w>=7)return H.e(y,w)
+if(w>>>0!==w||w>=9)return H.e(y,w)
u=y[w]
if(z.jV)return J.oE(u,v)
-else return J.oE(v,u)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+else return J.oE(v,u)},
+$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
"^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/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/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
$.uP=!1
-F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
"^":"",
pz:{
-"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"msg",307,330],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.jy]},
+"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.PT]},
static:{t4:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -2435,19 +2423,19 @@
a.X0=w
C.J0.ZL(a)
C.J0.oX(a)
-return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[333],
+return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[107],
pv:{
"^":"uL+Pi;",
$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
"^":"",
Tg:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.tSc]},
static:{rt:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -2456,20 +2444,21 @@
a.X0=w
C.oq.ZL(a)
C.oq.oX(a)
-return a},null,null,0,0,126,"new ClassRefElement$created"]}},
-"+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,22,"new ClassRefElement$created"]}},
+"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
"^":"",
Jc:{
-"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.aQx]},
static:{zg:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -2477,22 +2466,22 @@
a.X0=w
C.ka.ZL(a)
C.ka.oX(a)
-return a},null,null,0,0,126,"new ClassViewElement$created"]}},
-"+ClassViewElement":[338],
+return a},null,null,0,0,22,"new ClassViewElement$created"]}},
+"+ClassViewElement":[114],
Dsd:{
"^":"uL+Pi;",
$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
"^":"",
CN:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,339,"code",308],
-aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,115,242,[],"refChanged"],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
"@":function(){return[C.H3]},
static:{On:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -2501,80 +2490,80 @@
a.X0=w
C.IK.ZL(a)
C.IK.oX(a)
-return a},null,null,0,0,126,"new CodeRefElement$created"]}},
-"+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,22,"new CodeRefElement$created"]}},
+"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
"^":"",
Be:{
-"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,339,"code",307,330],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
+"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Xx
if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
m2:[function(a,b){var z,y,x
z=J.Vs(b).MW.getAttribute("data-jump-target")
if(z==="")return
y=H.BU(z,null,null)
x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
if(x==null)return
-return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
YI:[function(a,b,c,d){var z=this.m2(a,d)
if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
ZC:[function(a,b,c,d){var z=this.m2(a,d)
if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
"@":function(){return[C.xW]},
static:{Fe:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
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.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[345],
+C.YD.ZL(a)
+C.YD.oX(a)
+return a},null,null,0,0,22,"new CodeViewElement$created"]}},
+"+CodeViewElement":[122],
tuj:{
"^":"uL+Pi;",
$isd3:true},
hf:{
-"^":"Tp:341;",
-$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+"^":"Tp:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
$isEH:true},
-"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
"^":"",
i6:{
-"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
+"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
+gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
+gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
+this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
this.SS(a)
-this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
SS:[function(a){var z,y
z=a.Uy
y=a.zh
if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
"@":function(){return[C.Gu]},
-static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.zh="glyphicon glyphicon-chevron-down"
@@ -2585,47 +2574,52 @@
a.X0=w
C.j8.ZL(a)
C.j8.oX(a)
-return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[351],
+return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[129],
Vct:{
"^":"uL+Pi;",
$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
"^":"",
lw:{
-"^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
+"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
+gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,115,30,[],"callback",307],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
+git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+rL:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
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)},"$0","goJ",0,0,125,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Pl
if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
"@":function(){return[C.DKS]},
static:{fR:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.GV=!1
-a.Hu=!1
+a.Pl=!1
a.nx=null
+a.oM=!1
a.SO=z
a.B7=y
a.X0=w
C.O0.ZL(a)
C.O0.oX(a)
-return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[353],
+return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[131],
LP:{
"^":"xc+Pi;",
$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2637,21 +2631,21 @@
if(y==null)return"registerElement" in document
return J.de(J.UQ(y,"ready"),!0)},
wJ:{
-"^":"Tp:126;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:22;",
+$0:function(){if(B.G9())return P.Ab(null,null)
var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
+return z.gtH(z)},
$isEH:true}}],["dart._internal","dart:_internal",,H,{
"^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x
+return b},
+mx:function(a,b,c){var z,y,x
for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
z=P.p9("")
try{$.RM().push(a)
@@ -2659,24 +2653,24 @@
z.We(a,", ")
z.KF(c)}finally{x=$.RM()
if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","FQ",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+rd:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
+K0:function(a,b,c){var z=J.Wx(b)
if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
+qG:function(a,b,c,d,e){var z,y,x,w
H.K0(a,b,c)
z=J.xH(c,b)
if(J.de(z,0))return
if(J.u6(e,0))throw H.b(P.u(e))
y=J.x(d)
-if(!!y.$isList){x=e
+if(!!y.$iszM){x=e
w=d}else{w=y.eR(d,e).tt(0,!1)
x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},
+IC:function(a,b,c){var z,y,x,w,v,u
z=J.Wx(b)
if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
y=J.x(c)
@@ -2692,37 +2686,37 @@
H.qG(a,z,w,a,b)
for(z=y.gA(c);z.G();b=u){v=z.gl()
u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},
+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())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},
+tb:function(a,b,c,d,e){var z,y,x,w,v
z=J.Wx(b)
if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
if(c>=a.length)return-1
if(c<0)c=0
for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,117,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
if(typeof c!=="number")return c.C()
if(c<0)return-1
z=a.length
if(c>=z)c=z-1
for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,117,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,117,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v,u
for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
v=z
while(!0){u=J.Wx(v)
if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,117,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},
+d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
z=J.Wx(a0)
y=J.Ts(J.WB(z.W(a0,b),1),6)
x=J.Qc(b)
@@ -2822,7 +2816,7 @@
k=e}else{t.u(a,i,t.t(a,j))
d=x.W(j,1)
t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,117,[],144,[],145,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
aL:{
"^":"mW;",
gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2866,7 +2860,7 @@
w.vM+=typeof u==="string"?u:H.d(u)
if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
es:function(a,b,c){var z,y,x
z=this.gB(this)
if(typeof z!=="number")return H.s(z)
@@ -3102,15 +3096,15 @@
YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
w2Y:{
"^":"ar+Tv;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -3131,99 +3125,95 @@
bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
$isGD:true,
$iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
z=J.U6(a)
if(z.gl0(a)!==!0){y=$.bw().Ej
if(typeof a!=="string")H.vh(P.u(a))
y=y.test(a)}else y=!0
if(y)return a
if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
"^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
+TS:function(a){return J.GL(a)},
+YC:function(a){if(a==null)return
+return new H.GD(a)},
vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
+jO:function(a){var z,y
z=$.Sl().t(0,a)
y=J.x(a)
if(y.n(a,"dynamic"))return $.P8()
if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
+return H.tT(H.YC(z==null?a:z),a)},
+tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=$.tY
if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
+$.tY=z}y=z[b]
+if(y!=null)return y
z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
+x=z.u8(b,"<")
+if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
+y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
+$.tY[b]=y
+return y}v=init.allClasses[b]
+if(v==null){u=init.functionAliases[b]
+if(u!=null){y=new H.ng(b,null,a)
+y.CM=new H.Ar(init.metadata[u],null,null,null,y)
+$.tY[b]=y
+return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
+if(t==null){s=null
+r=null}else{s=t["^"]
+z=J.x(s)
+if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
+s=z.t(s,0)}else r=null
+if(typeof s!=="string")s=""}z=J.uH(s,";")
if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
+q=J.uH(z[0],"+")
+if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
+else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+o=v.prototype["<>"]
+if(o==null||o.length===0)y=p
+else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
+y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
+return y},
+Vv:function(a){var z,y,x
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
+Fk:function(a){var z,y,x
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},
+EK:function(a,b){var z,y,x,w
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
+if(b.Fb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},
+vE:function(a,b){var z,y,x,w,v
z=P.L5(null,null,null,null,null)
z.FV(0,b)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
if(x.ghB()){w=x.gIf().fN
v=J.U6(w)
if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},
+MJ:function(a,b){var z,y,x,w
z=[]
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
x.G()
w=x.lo
for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
+return w},
+w2:function(a,b){var z,y,x
z=J.U6(a)
y=0
while(!0){x=z.gB(a)
if(typeof x!=="number")return H.s(x)
if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
+Jf:function(a,b){var z,y,x,w,v,u,t
z={}
z.a=null
for(y=a;y!=null;){x=J.x(y)
@@ -3233,27 +3223,27 @@
else{x=z.a
if(x==null)w=H.Ko(b,null)
else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
+u=z.a.gNy()
return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
else{z=new H.rh(z)
if(typeof b==="number"){t=z.$1(b)
if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
+return P.re(C.yQ)},
+fb:function(a,b){if(a==null)return b
+return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
+pj:function(a){var z,y,x,w
z=a["@"]
if(z!=null)return z()
if(typeof a!="function")return C.xD
if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
y.fixed$length=init
return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
+jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
+if(!!z.$iszM){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
@@ -3261,18 +3251,18 @@
s=x[v]
v=t}else s=null
r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
+if(r!=null)d.push(r)}},
+Mk:function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[P.qU])
+return z.Fr(a,b)},
+BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},
+Y6:function(a){var z,y
z=J.x(a)
if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
y=z.t(a,0)
z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
+return z.n(y,"*")||z.n(y,"+")},
Sn:{
"^":"a;L5,F1>",
gvU:function(){var z,y,x,w
@@ -3280,11 +3270,11 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
this.L5=z
return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
+static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
y=init.libraries
if(y==null)return z
for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3298,10 +3288,10 @@
o=v.t(w,6)
n=v.t(w,7)
m=q==null?C.xD:q()
-J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
nI:{
-"^":"Tp:126;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return H.VM([],[P.D4])},
$isEH:true},
jU:{
"^":"a;",
@@ -3311,12 +3301,12 @@
Lj:{
"^":"jU;MA",
gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
+gcZ:function(){var z=$.Cm().gvU().Fb
return z.gUQ(z).XG(0,new H.mb())},
$isQF:true},
mb:{
-"^":"Tp:355;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
+"^":"Tp:132;",
+$1:function(a){return a.gGD()},
$isEH:true},
amu:{
"^":"jU;If<",
@@ -3356,7 +3346,7 @@
$isNL:true,
$isQF:true},
Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
gOO:function(){return"LibraryMirror"},
gUx:function(a){return this.If},
gEO:function(){return this.gm8()},
@@ -3367,11 +3357,11 @@
for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
if(!!J.x(x).$isMs){x=x.gJi()
if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
this.P8=z
return z},
rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,[],null,null))
if(!J.x(z).$isRS)return H.vn(z.IB(this))
if(z.glT())return H.vn(z.IB(this))
@@ -3379,7 +3369,7 @@
if(y==null)throw H.b(P.SY(null))
return H.vn(y())},
F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
y=!!J.x(z).$isZk
if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
if(z!=null)x=y&&z.hB
@@ -3405,7 +3395,7 @@
if(r==null||!!s.$getterStub)break c$0
q=J.rY(r).nC(r,"new ")
if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
+r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
y.push(p)
p.jE=this}++v}this.SD=y
return y},
@@ -3421,17 +3411,17 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
this.mX=z
return z},
gF4:function(){var z=this.T1
if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
this.T1=z
return z},
gM1:function(){var z=this.fX
if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
this.fX=z
return z},
gcc:function(){var z,y,x
@@ -3439,7 +3429,7 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z,y
@@ -3449,19 +3439,19 @@
y=P.L5(null,null,null,null,null)
y.FV(0,z)
z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
+this.gQn().Fb.aN(0,z)
+this.gF4().Fb.aN(0,z)
+this.gM1().Fb.aN(0,z)
+this.gcc().Fb.aN(0,z)
+z=H.VM(new P.Oh(y),[P.wv,P.QF])
this.uA=z
return z},
gYK:function(){var z,y
z=this.Db
if(z!=null)return z
y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+this.gQH().Fb.aN(0,new H.oP(y))
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
gc9:function(){var z=this.xO
@@ -3477,16 +3467,16 @@
"^":"amu+M2;",
$isQF:true},
IB:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
oP:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
YX:{
-"^":"Tp:126;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a},
$isEH:true},
BI:{
"^":"Un;AY<,XW,BB,i1,If",
@@ -3521,7 +3511,9 @@
$isQF:true},
iu:{
"^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
+gt5:function(a){var z=this.Ax
+if(z==null)return P.re(C.Qf)
+return H.jO(H.dJ(z))},
F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
CI:function(a,b){return this.F2(a,b,null)},
Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3615,12 +3607,12 @@
$isvr:true,
$isQF:true},
vo:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z,y
+"^":"Tp:134;a",
+$2:function(a,b){var z,y
z=J.GL(a)
y=this.a
if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
$isEH:true},
bl:{
"^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3654,7 +3646,7 @@
return z},
gEz:function(){var z=this.b0
if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
this.b0=z
return z},
gcc:function(){var z,y,x
@@ -3662,12 +3654,12 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z=this.uA
if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
this.uA=z
return z},
gYK:function(){var z,y
@@ -3677,7 +3669,7 @@
y.FV(0,this.gQH())
y.FV(0,this.gEz())
J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
rN:function(a){return this.NK.rN(a)},
@@ -3708,40 +3700,37 @@
$isX9:true,
$isNL:true},
tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a",
+$1:function(a){var z,y,x
z=H.BU(a,null,new H.Oo())
y=this.a
if(J.de(z,-1))y.push(H.jO(J.rr(a)))
else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
$isEH:true},
Oo:{
-"^":"Tp:115;",
-$1:[function(a){return-1},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return-1},
$isEH:true},
Tc:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b.$1(a)},
$isEH:true},
Ax:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){this.a.u(0,a.gIf(),a)
+return a},
$isEH:true},
Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
gEz:function(){var z=this.b0
if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
this.b0=z
return z},
ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
+z=this.aB.prototype
y=H.kU(z)
x=H.VM([],[H.Zk])
for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3750,18 +3739,18 @@
if(u==null)continue
t=z[v]
if(t.$reflectable==2)continue
-s=H.Sd(u,t,!1,!1)
+s=H.S5(u,t,!1,!1)
x.push(s)
s.jE=a}y=H.kU(init.statics[this.Cr])
for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
if(H.Y6(r))continue
-q=this.gXP().gae()[r]
+q=this.gXP().ae[r]
if("$reflectable" in q){p=q.$reflectionName
if(p==null)continue
o=C.xB.nC(p,"new ")
if(o){n=C.xB.yn(p,4)
p=H.ys(n,"$",".")}}else continue
-s=H.Sd(p,q,!o,o)
+s=H.S5(p,q,!o,o)
x.push(s)
s.jE=a}return x},
gEO:function(){var z=this.qu
@@ -3787,12 +3776,12 @@
return z},
ghp:function(){var z=this.FU
if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
this.FU=z
return z},
gF4:function(){var z=this.T1
if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
this.T1=z
return z},
gcc:function(){var z,y,x
@@ -3800,12 +3789,12 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z=this.uA
if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
this.uA=z
return z},
gYK:function(){var z,y
@@ -3813,41 +3802,41 @@
if(z!=null)return z
y=P.L5(null,null,null,P.wv,P.NL)
z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
+this.gQH().Fb.aN(0,z)
+this.gEz().Fb.aN(0,z)
J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
+y=this.gF4().Fb.t(0,a)
return y!=null&&y.gFo()},
rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
if(z!=null&&z.gFo()){y=z.gcK()
if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
+else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
+w=this.ghp().Fb.t(0,a)
if(w!=null&&w.gFo()){x=w.gdl().$getter
if(x==null)throw H.b(P.SY(null))
return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
gXP:function(){var z,y
z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
+if(z==null){z=$.vK()
z=z.gUQ(z)
y=new H.MH(null,J.GP(z.l6),z.T6)
y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
+z=this.jE
if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
gc9:function(){var z=this.xO
if(z!=null)return z
z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
+if(z==null){z=H.pj(this.aB.prototype)
this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
this.xO=z
return z},
@@ -3867,7 +3856,7 @@
this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
this.qN=z}}}return J.de(z,this)?null:this.qN},
F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
+z=this.ghp().Fb.t(0,a)
y=z==null
if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3889,7 +3878,7 @@
z=this.UF
if(z!=null)return z
y=[]
-x=this.gaB().prototype["<>"]
+x=this.aB.prototype["<>"]
if(x==null)return y
for(w=0;w<x.length;++w){z=x[w]
v=init.metadata[z]
@@ -3908,17 +3897,17 @@
"^":"EE+M2;",
$isQF:true},
Ei:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
Ci:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){this.b.u(0,a.gIf(),a)
+return a},
$isEH:true},
t0:{
-"^":"Tp:360;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:136;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
XJ:{
"^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3957,10 +3946,10 @@
v.$builtinTypeInfo=[H.Kp(y,0)]
for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
if(a>=123&&a<=126)return a-117
if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
+return 0}}},
Sz:{
"^":"iu;Ax,xq",
gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3976,7 +3965,7 @@
H.eZ(y)
t=$.bx().t(0,w.gRA(y))
if(t==null)H.Hz(t)
-s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
+s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
y.constructor[z]=s
return s},
bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
@@ -4003,8 +3992,8 @@
v=H.zh(z)
if(v!=null){u=v.AM
if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
+if(this.xV)this.wM=this.jE
else this.wM=t.gdw()
s=v.Mo
for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4029,7 +4018,7 @@
$isRS:true,
$isNL:true,
$isQF:true,
-static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
+static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
z=a.split(":")
if(0>=z.length)return H.e(z,0)
a=z[0]
@@ -4056,8 +4045,8 @@
$isNL:true,
$isQF:true},
wt:{
-"^":"Tp:361;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
ng:{
"^":"amu;Cr<,CM,If",
@@ -4112,19 +4101,22 @@
y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
this.zM=z
return z},
+Hu:function(a){var z=init.mangledGlobalNames[a]
+if(z!=null)return z
+return a},
bu:function(a){var z,y,x,w,v,u
z=this.o3
if(z!=null)return z
z=this.d9
if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
w=""}if("opt" in z){x+=w+"["
for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
+else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
z=x+"'"
this.o3=z
return z},
@@ -4136,170 +4128,151 @@
$isX9:true,
$isNL:true},
rh:{
-"^":"Tp:362;a",
-$1:[function(a){var z,y,x
+"^":"Tp:138;a",
+$1:function(a){var z,y,x
z=init.metadata[a]
y=this.a
x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
+return J.UQ(y.a.gw8(),x)},
$isEH:true},
iW:{
-"^":"Tp:120;b",
-$1:[function(a){var z,y
+"^":"Tp:18;b",
+$1:function(a){var z,y
z=this.b.$1(a)
y=J.x(z)
if(!!y.$iscw)return H.d(z.Nz)
if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
else if(y.n(z,$.oj()))return"void"
else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
+return z.gCr()},
$isEH:true},
ye:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
O1:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
"^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
+hY:function(a,b){var z,y,x,w,v,u,t
z=H.kU(a)
-y=P.Fl(J.O,J.O)
+y=P.Fl(P.qU,P.qU)
for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
u=a[v]
y.u(0,v,u)
if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","BH",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
+YK:function(a){var z=P.Fl(P.qU,P.qU)
a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+return z},
+kU:function(a){var z=H.VM(function(b,c){var y=[]
for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
z.fixed$length=init
-return z},"$1","DF",2,0,null,158,[]],
+return z},
Xh:{
-"^":"Tp:364;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
+"^":"Tp:139;a",
+$2:function(a,b){this.a.u(0,b,a)},
$isEH:true}}],["dart.async","dart:async",,P,{
"^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},
ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
+VH:function(a,b){var z=H.N7()
z=H.KT(z,[z,z]).BD(a)
if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
+else return b.cR(a)},
e4:function(a,b){var z=P.Dt(b)
P.rT(C.ny,new P.ZC(a,z))
return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
for(;z!=null;){J.cG(z)
z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
BG:[function(){var z
try{P.Cx()}catch(z){H.Ru(z)
$.ej().$1(P.qZ())
$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,125],
-IA:[function(a){var z,y
+throw z}},"$0","qZ",0,0,21],
+IA:function(a){var z,y
z=$.k8
if(z==null){z=new P.OM(a,null)
$.k8=z
$.S6=z
$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
+$.k8=y}},
+rb:function(a){var z
if(J.de($.X3,C.NU)){$.X3.wr(a)
return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+z.wr(z.xi(a,!0))},
bK:function(a,b,c,d){var z
if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
if(a==null)return
try{z=a.$0()
if(!!J.x(z).$isb8)return z
return}catch(w){v=H.Ru(w)
y=v
x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,125],
-FE:[function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},
+YE:[function(a){},"$1","bZ",2,0,26,27,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
+dL:[function(){},"$0","v3",0,0,21],
+FE:function(a,b,c){var z,y,x,w
try{b.$1(a.$0())}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
rT:function(a,b){var z
if(J.de($.X3,C.NU))return $.X3.uN(a,b)
z=$.X3
return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+jL:function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},
+PJ:function(a){var z=$.X3
$.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,179,180,[],181,[],166,[],171,[],172,[]],
+return z},
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,32,33,[],34,[],35,[],30,[],31,[]],
T8:[function(a,b,c,d){var z,y
if(J.de($.X3,c))return d.$0()
z=P.PJ(c)
try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
V7:[function(a,b,c,d,e){var z,y
if(J.de($.X3,c))return d.$1(e)
z=P.PJ(c)
try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
Qx:[function(a,b,c,d,e,f){var z,y
if(J.de($.X3,c))return d.$2(e,f)
z=P.PJ(c)
try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
+CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
+$.oK=P.jt()
z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,50],
C6:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
$0:[function(){H.ox()
this.a.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
@@ -4326,9 +4299,9 @@
gHj:function(){var z=this.Ae
if(typeof z!=="number")return z.i()
return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
+static:{"^":"E2b,RG,cP"}},
WVu:{
"^":"a;iE@,SJ@",
gRW:function(){return!1},
@@ -4352,9 +4325,9 @@
q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
return new P.lj("Cannot add new events while doing an addStream")},
h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
cO:function(a){var z,y
z=this.Gv
if((z&4)!==0)return this.Ip
@@ -4406,19 +4379,19 @@
else this.Ip.OH(null)}},
tK:{
"^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Rg(0,this.b)},
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
OR:{
"^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.V8(this.b,this.c)},
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
Bg:{
"^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Qj()},
$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
DL:{
"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
Iv:function(a){var z,y
@@ -4434,25 +4407,25 @@
"^":"a;",
$isb8:true},
ZC:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){var z,y,x,w
try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
$isEH:true},
-Ia:{
+Pf0:{
"^":"a;"},
Zf:{
-"^":"Ia;MM",
+"^":"Pf0;MM",
oo:[function(a,b){var z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
w0:[function(a,b){var z
if(a==null)throw H.b(P.u("Error must not be null"))
z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,141,29,30,[],31,[]]},
vs:{
"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
gcg:function(){return this.Gv>=4},
@@ -4509,7 +4482,7 @@
P.HZ(this,z)},
K5:[function(a,b){var z=this.L3()
this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
OH:function(a){var z
if(a==null);else{z=J.x(a)
if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4530,15 +4503,15 @@
z.L7(a,b)
return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
do{z=b.gBQ()
b.sBQ(null)
P.HZ(a,b)
if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
z={}
z.e=a
for(y=a;!0;){x={}
@@ -4576,44 +4549,44 @@
v=x.c
b.E6(J.w8(v),v.gI4())}z.e=b
y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=q}}}},
da:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
pV:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
$isEH:true},
U7:{
-"^":"Tp:367;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Tp:143;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
$isEH:true},
rH:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
$isEH:true},
cX:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
$isEH:true},
ZL:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
$isEH:true},
rq:{
-"^":"Tp:348;b,d,e,f",
-$0:[function(){var z,y,x,w
+"^":"Tp:126;b,d,e,f",
+$0:function(){var z,y,x,w
try{this.b.c=this.f.FI(this.d.gO1(),this.e)
return!0}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
$isEH:true},
RW:{
-"^":"Tp:125;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:21;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=this.c.e.gcG()
r=this.UI
y=r.gyK()
@@ -4645,11 +4618,11 @@
r.b=!1
return}this.b.b=!0}else{r=this.b
r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
$isEH:true},
RT:{
-"^":"Tp:125;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:21;c,b,Gq,Rm,w3",
+$0:function(){var z,y,x,w,v,u
z={}
z.a=null
try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4665,31 +4638,32 @@
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))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
$isEH:true},
jZ:{
-"^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:16;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
$isEH:true},
FZ:{
-"^":"Tp:367;a,mG",
+"^":"Tp:143;a,mG",
$2:[function(a,b){var z,y
z=this.a
if(!J.x(z.a).$isvs){y=P.Dt(null)
z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
$isEH:true},
OM:{
"^":"a;FR>,aw@",
Ki:function(a){return this.FR.$0()}},
qh:{
"^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
tg:function(a,b){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
return y},
aN:function(a,b){var z,y
z={}
@@ -4699,25 +4673,25 @@
return y},
Vr:function(a,b){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
return y},
gB:function(a){var z,y
z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
z.a=0
this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
return y},
gl0:function(a){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
return y},
br:function(a){var z,y
z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
+y=P.Dt([P.zM,H.ip(this,"qh",0)])
this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
return y},
qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4748,41 +4722,41 @@
z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
return y},
$isqh:true},
-YJ:{
+Sd:{
"^":"Tp;a,b,c,d",
$1:[function(a){var z,y
z=this.a
y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
jv:{
-"^":"Tp:126;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return J.de(this.f,this.e)},
$isEH:true},
-LB:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+bi:{
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
$isEH:true},
-DO:{
-"^":"Tp:126;bK",
+YJ:{
+"^":"Tp:22;bK",
$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
$isEH:true},
lz:{
"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Rl:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
$isEH:true},
Jb:{
-"^":"Tp:115;",
-$1:[function(a){},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){},
$isEH:true},
M4:{
-"^":"Tp:126;UI",
+"^":"Tp:22;UI",
$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
$isEH:true},
Jp:{
@@ -4790,64 +4764,64 @@
$1:[function(a){var z,y
z=this.a
y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
h7:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
$isEH:true},
pr:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
$isEH:true},
eN:{
-"^":"Tp:126;bK",
+"^":"Tp:22;bK",
$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
$isEH:true},
B5:{
-"^":"Tp:115;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
PI:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
$isEH:true},
j4:{
-"^":"Tp:115;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
i9:{
-"^":"Tp:126;c",
+"^":"Tp:22;c",
$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
$isEH:true},
VV:{
"^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
Dy:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
$isEH:true},
lU:{
"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
OC:{
-"^":"Tp:126;d",
+"^":"Tp:22;d",
$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
$isEH:true},
UH:{
"^":"Tp;a,b",
$1:[function(a){var z=this.a
z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Z5:{
-"^":"Tp:126;a,c",
+"^":"Tp:22;a,c",
$0:[function(){var z=this.a
if(z.b){this.c.rX(z.a)
return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4856,11 +4830,11 @@
"^":"Tp;a,b,c",
$1:[function(a){var z=this.a
if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
ii:{
-"^":"Tp:126;a,d",
+"^":"Tp:22;a,d",
$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
$isEH:true},
MO:{
@@ -4893,8 +4867,8 @@
yU:{
"^":"KA;Y8<",
tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,125],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,125]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,21],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
nP:{
"^":"a;"},
KA:{
@@ -4946,8 +4920,8 @@
this.Gv=z
if(z<32)this.SY()
else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
tA:function(){},
w6:function(a){var z,y
z=this.Ri
@@ -4994,10 +4968,10 @@
z=(this.Gv&4294967263)>>>0
this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
$isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
Vo:{
-"^":"Tp:125;a,b,c",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,b,c",
+$0:function(){var z,y,x,w,v,u
z=this.a
y=z.Gv
if((y&8)!==0&&(y&16)===0)return
@@ -5007,19 +4981,20 @@
else{x=z.o7
w=H.N7()
w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+v=z.o7
+u=this.b
+if(w)y.z8(v,u,this.c)
+else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
$isEH:true},
qB:{
-"^":"Tp:125;a",
-$0:[function(){var z,y
+"^":"Tp:21;a",
+$0:function(){var z,y
z=this.a
y=z.Gv
if((y&16)===0)return
z.Gv=(y|42)>>>0
z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
$isEH:true},
aN:{
"^":"qh;",
@@ -5057,7 +5032,7 @@
return}P.rb(new P.CR(this,a))
this.Gv=1}},
CR:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){var z,y
z=this.a
y=z.Gv
@@ -5082,16 +5057,16 @@
this.N6=null
this.zR=null}},
v1y:{
-"^":"Tp:126;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
$isEH:true},
uR:{
-"^":"Tp:371;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Tp:146;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
$isEH:true},
-Q0:{
-"^":"Tp:126;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+vm:{
+"^":"Tp:22;a,b",
+$0:function(){return this.a.rX(this.b)},
$isEH:true},
YR:{
"^":"qh;",
@@ -5119,16 +5094,16 @@
P.KA.prototype.V8.call(this,a,b)},
uO:[function(){var z=this.Ee
if(z==null)return
-z.yy(0)},"$0","gp4",0,0,125],
+z.yy(0)},"$0","gp4",0,0,21],
LP:[function(){var z=this.Ee
if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,125],
+z.QE(0)},"$0","gZ9",0,0,21],
tA:function(){var z=this.Ee
if(z!=null){this.Ee=null
z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,125],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,21],
S8:function(a,b,c,d){var z,y
z=this.gOa()
y=this.gRE()
@@ -5157,6 +5132,15 @@
x=new H.XO(w,null)
b.V8(y,x)
return}J.QM(b,z)}},
+aW:{
+"^":"YR;pK,Sb",
+GW:function(a){return this.pK.$1(a)},
+Ml:function(a,b){var z,y,x,w,v
+try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
+J.QM(b,z)}}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+b.V8(y,x)}}},
Zz:{
"^":"YR;Em,Sb",
Ml:function(a,b){var z
@@ -5199,52 +5183,45 @@
Id:{
"^":"a;oh",
gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
+c1:function(a,b,c){var z=this.oh
+for(;z.gWY().gE2()==null;)z=z.geT(z)
+return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.oh
+for(;z.gWY().gcP()==null;)z=z.geT(z)
+return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.oh
+for(;z.gWY().gJl()==null;)z=z.geT(z)
+return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.oh
+for(;z.gWY().gpU()==null;)z=z.geT(z)
+return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.oh
+for(;z.gWY().gFh()==null;)z=z.geT(z)
+return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z=this.oh
+for(;z.gWY().gXp()==null;)z=z.geT(z)
+return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.oh
+for(;z.gWY().gfb()==null;)z=z.geT(z)
+return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;z.gWY().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gWY().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.oh
+for(;z.gWY().gZq()==null;)z=z.geT(z)
+return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
RB:function(a,b,c){var z,y
z=this.oh
for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
+y=z.gWY()
y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
+ld:function(a,b,c){var z,y
z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
+for(;z.gWY().giq()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
WH:{
"^":"a;",
fC:function(a){return this.gC5()===a.gC5()},
@@ -5277,28 +5254,28 @@
if(b)return new P.dv(this,z)
else return new P.ph(this,z)}},
TF:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
K5:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
$isEH:true},
Cg:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
$isEH:true},
Hs:{
-"^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
$isEH:true},
dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
$isEH:true},
ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
$isEH:true},
uo:{
"^":"WH;eT>,WY<,R1",
@@ -5321,24 +5298,24 @@
uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
pK:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
$isEH:true},
eM:{
-"^":"Tp:126;c,d",
-$0:[function(){var z,y
+"^":"Tp:22;c,d",
+$0:function(){var z,y
z=this.c
P.JS("Uncaught Error: "+H.d(z))
y=this.d
if(y==null&&!!J.x(z).$isGe)y=z.gI4()
if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
+throw H.b(z)},
$isEH:true},
-Uez:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+rF:{
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true},
-AHi:{
+nU:{
"^":"a;",
gE2:function(){return P.xP()},
hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5386,12 +5363,12 @@
"^":"",
EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:[function(){var z=Object.create(null)
+jB:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
+return z},
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
Py:function(a,b,c,d,e){var z
if(a==null){z=new P.k6(0,null,null,null,null)
z.$builtinTypeInfo=[d,e]
@@ -5399,15 +5376,15 @@
return P.MP(a,b,c,d,e)},
UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
+FO:function(a){var z,y
if($.xb().tg(0,a))return"(...)"
$.xb().h(0,a)
z=[]
try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
y.We(z,", ")
y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+return y.vM},
+Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q
z=a.gA(a)
y=0
x=0
@@ -5439,10 +5416,10 @@
if(q==null){y+=5
q="..."}}if(q!=null)b.push(q)
b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w
+vW:function(a){var z,y,x,w
z={}
for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
y=P.p9("")
@@ -5452,7 +5429,7 @@
J.kH(a,new P.LG(z,y))
y.KF("}")}finally{z=$.tw()
if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
+z.pop()}return y.gvM()},
k6:{
"^":"a;X5,vv,OX,OB,wV",
gB:function(a){return this.X5},
@@ -5555,23 +5532,23 @@
for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
return-1},
$isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},a0:function(){var z=Object.create(null)
P.cW(z,"<non-identifier-key>",z)
delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
oi:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
$isEH:true},
ce:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
$isEH:true},
DJ:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
PL:{
@@ -5604,9 +5581,9 @@
static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
jG:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
$isEH:true},
fG:{
"^":"mW;Fb",
@@ -5749,21 +5726,21 @@
bu:function(a){return P.vW(this)},
$isFo:true,
$isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Qs:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
a1:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
$isEH:true},
ou:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
$isEH:true},
S9:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
db:{
@@ -6035,10 +6012,10 @@
$isyN:true,
$isQV:true,
$asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+static:{T2:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
+return z}}},
ef:{
"^":"a;Gc<,DG@,zQ@"},
zQ:{
@@ -6073,8 +6050,9 @@
$asQV:null},
mW:{
"^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
tg:function(a,b){var z
for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
return!1},
@@ -6124,8 +6102,8 @@
$asQV:null},
ar:{
"^":"a+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -6164,7 +6142,8 @@
z.We(a,b)
return z.vM},
ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
eR:function(a,b){return H.q9(a,b,null,null)},
tt:function(a,b){var z,y,x
if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6232,7 +6211,7 @@
if(J.de(y,0))return
if(e<0)throw H.b(P.u(e))
z=J.x(d)
-if(!!z.$isList){x=e
+if(!!z.$iszM){x=e
w=d}else{w=z.eR(d,e).tt(0,!1)
x=0}if(typeof y!=="number")return H.s(y)
z=J.U6(w)
@@ -6281,7 +6260,7 @@
this.Mh(a,b,c)},
Mh:function(a,b,c){var z,y
z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
+if(!!z.$iszM){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())}},
@@ -6292,20 +6271,49 @@
z.KF("[")
z.We(a,", ")
z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true},
+Bk:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a){return this.Fb.x4(a)},
+di:function(a){return this.Fb.di(a)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(){var z=this.Fb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:function(a){return P.vW(this.Fb)},
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true},
+Oh:{
+"^":"Bk+KPM;Fb",
+$isZ0:true},
LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
if(!z.a)this.b.KF(", ")
z.a=!1
z=this.b
z.KF(a)
z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
+z.KF(b)},
$isEH:true},
Sw:{
"^":"mW;v5,av,eZ,qT",
@@ -6348,7 +6356,7 @@
h:function(a,b){this.NZ(0,b)},
FV:function(a,b){var z,y,x,w,v,u,t,s,r
z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
+if(!!z.$iszM){y=z.gB(b)
x=this.gB(this)
if(typeof y!=="number")return H.s(y)
z=x+y
@@ -6458,11 +6466,11 @@
$asQV:null,
static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
z.Eo(a,b)
-return z},ua:[function(a){var z
+return z},ua:function(a){var z
if(typeof a!=="number")return a.O()
a=(a<<2>>>0)-1
for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
+if(z===0)return a}}}},
o0:{
"^":"a;Lz,pP,qT,Dc,fD",
gl:function(){return this.fD},
@@ -6590,23 +6598,23 @@
y=new P.An(c)
return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
An:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
$isEH:true},
bF:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
BW:{
-"^":"Tp:375;a,b,c",
-$1:[function(a){var z,y,x,w
+"^":"Tp:149;a,b,c",
+$1:function(a){var z,y,x,w
for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
if(z!==y.bb)throw H.b(P.a4(y))
w=a.T8
if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
+a=a.Bb}return!1},
$isEH:true},
S6B:{
"^":"a;",
@@ -6667,23 +6675,23 @@
Wb:function(a){return a},
$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
"^":"",
-VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+VQ:function(a,b){var z=new P.JC()
+return z.$2(null,new P.f1(z).$1(a))},
+BS:function(a,b){var z,y,x,w
x=a
if(typeof x!=="string")throw H.b(P.u(a))
z=null
try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return b},
$isEH:true},
f1:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;a",
+$1:function(a){var z,y,x,w,v,u,t
if(a==null||typeof a!="object")return a
if(Object.getPrototypeOf(a)===Array.prototype){z=a
for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6692,7 +6700,7 @@
for(y=this.a,x=0;x<w.length;++x){u=w[x]
v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},"$1",null,2,0,null,21,[],"call"],
+return v},
$isEH:true},
Uk:{
"^":"a;"},
@@ -6700,7 +6708,7 @@
"^":"a;"},
Zi:{
"^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
Ud:{
"^":"Ge;Ct,FN",
bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6719,13 +6727,13 @@
KP:function(a){return this.Co(a,null)},
gZE:function(){return C.cb},
gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
-dI:{
+$asUk:function(){return[P.a,P.qU]}},
+ze:{
"^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+$aszF:function(){return[P.a,P.qU]}},
Cf:{
"^":"zF;N5",
-$aszF:function(){return[J.O,P.a]}},
+$aszF:function(){return[P.qU,P.a]}},
Sh:{
"^":"a;iY,Vy,bV",
Wt:function(a){return this.iY.$1(a)},
@@ -6800,7 +6808,7 @@
this.aK(a)
z.KF("\"")
return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
+if(!!z.$iszM){this.WD(a)
y=this.Vy
y.KF("[")
if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6824,26 +6832,26 @@
Ei:function(a){var z=this.bV
if(0>=z.length)return H.e(z,0)
z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,dH,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
b=P.BC()
z=P.p9("")
P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
+return z.vM}}},
z0:{
"^":"Zi;lH",
goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
"^":"zF;",
WJ:function(a){var z,y,x
z=J.U6(a)
y=J.vX(z.gB(a),3)
if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
+y=H.VM(Array(y),[P.KN])
x=new P.Rw(0,0,y)
if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
+$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
Rw:{
"^":"a;WF,ZP,EN",
Lb:function(a,b){var z,y,x,w,v
@@ -6914,9 +6922,9 @@
z[u]=128|v&63}}return w},
static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
"^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
+hl:function(a){var z,y,x,w,v
if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
if(typeof a==="string"){z=new P.Rn("")
z.vM="\""
@@ -6933,11 +6941,11 @@
else{w=H.Lw(v)
w=z.vM+=w}}y=w+"\""
z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
O8:function(a,b,c){var z,y,x
z=J.Qi(a,c)
if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6948,22 +6956,22 @@
if(b)return z
z.fixed$length=init
return z},
-JS:[function(a){var z,y
+JS:function(a){var z,y
z=H.d(a)
y=$.oK
if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
+else y.$1(z)},
HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,a.gfN(a),b)},
$isEH:true},
CL:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:134;a",
+$2:function(a,b){var z=this.a
if(z.b>0)z.a.KF(", ")
z.a.KF(J.GL(a))
z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
$isEH:true},
p4:{
"^":"a;OF",
@@ -6971,7 +6979,8 @@
a2:{
"^":"a;",
bu:function(a){return this?"true":"false"},
-$isbool:true},
+$isa2:true},
+"+bool":0,
Tx:{
"^":"a;"},
iP:{
@@ -6996,8 +7005,8 @@
EK:function(){H.o2(this)},
RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
$isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
if(z!=null){y=new P.MF()
x=z.QK
if(1>=x.length)return H.e(x,1)
@@ -7030,28 +7039,32 @@
if(typeof l!=="number")return H.s(l)
s=J.xH(s,n*l)}k=!0}else k=!1
j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
z=Math.abs(a)
y=a<0?"-":""
if(z>=1000)return""+a
if(z>=100)return y+"0"+H.d(z)
if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
MF:{
-"^":"Tp:377;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:150;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
$isEH:true},
Rq:{
-"^":"Tp:378;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:151;",
+$1:function(a){if(a==null)return 0
+return H.IH(a,null)},
$isEH:true},
+CP:{
+"^":"lf;",
+$isCP:true},
+"+double":0,
a6:{
"^":"a;Fq<",
g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7080,20 +7093,20 @@
v=new P.P7().$1(C.CD.JV(y,1000000))
return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
$isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,vd,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,vd,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
P7:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Tp:18;",
+$1:function(a){if(a>=100000)return H.d(a)
if(a>=10000)return"0"+H.d(a)
if(a>=1000)return"00"+H.d(a)
if(a>=100)return"000"+H.d(a)
if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
$isEH:true},
DW:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:18;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
$isEH:true},
Ge:{
"^":"a;",
@@ -7196,31 +7209,51 @@
EH:{
"^":"a;",
$isEH:true},
+KN:{
+"^":"lf;",
+$isKN:true},
+"+int":0,
QV:{
"^":"a;",
$isQV:true,
$asQV:null},
AC:{
"^":"a;"},
+zM:{
+"^":"a;",
+$iszM:true,
+$aszM:null,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+"+List":0,
Z0:{
"^":"a;",
$isZ0:true},
L9:{
"^":"a;",
bu:function(a){return"null"}},
+"+Null":0,
+lf:{
+"^":"a;",
+$islf:true},
+"+num":0,
a:{
"^":";",
n:function(a,b){return this===b},
giO:function(a){return H.eQ(this)},
bu:function(a){return H.a5(this)},
T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
$isa:true},
Od:{
"^":"a;",
$isOd:true},
MN:{
"^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
WU:{
"^":"a;Qk,SU,Oq,Wn",
gl:function(){return this.Wn},
@@ -7228,14 +7261,11 @@
z=this.Oq
this.SU=z
y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
if((u&64512)===56320){this.Oq=v+1
this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
return!0}}this.Oq=v
@@ -7288,7 +7318,7 @@
if(z&&!0)return""
z=!z
if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
return y},
Ky:function(a,b){if(a==="")return"/"+H.d(b)
return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7323,13 +7353,20 @@
z.KF(y)}y=this.Ka
if(""!==y){z.KF("#")
z.KF(y)}return z.vM},
-n:function(a,b){var z,y
+n:function(a,b){var z,y,x
if(b==null)return!1
z=J.x(b)
if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=this.Fi
+x=b.Fi
+if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+if(z==null?y==null:z===y){z=this.tP
+y=b.tP
+if(z==null?y==null:z===y){z=this.Ka
+y=b.Ka
+y=z==null?y==null:z===y
+z=y}else z=!1}else z=!1}else z=!1
else z=!1
else z=!1
else z=!1
@@ -7341,7 +7378,7 @@
else this.HC=e
this.r0=this.x6(c,d)},
$isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
x=new P.hP()
w=new P.Uo(a1)
v=J.U6(a1)
@@ -7398,17 +7435,17 @@
a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
x=J.Wx(i)
a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
+return z},L7:function(a){var z,y
if(a.length===0)return a
if(C.xB.j(a,0)===91){z=a.length-1
if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
P.eg(C.xB.Nj(a,1,z))
return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
z=new P.hb()
if(a==null)return""
y=a.length
@@ -7422,7 +7459,7 @@
if(u>=8)return H.e(C.mK,u)
u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
z={}
y=a==null
if(y&&!0)return""
@@ -7431,7 +7468,8 @@
x=P.p9("")
z.a=!0
C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},UJ:function(a){if(a==null)return""
+return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z={}
y=J.U6(a).u8(a,"%")
z.a=y
@@ -7470,11 +7508,11 @@
r=m}else{z.a=t
r=t}}if(z.b==null)return a
if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
+return J.AG(z.b)},q5:function(a){var z,y
z=new P.Mx()
y=a.split(".")
if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
z=new P.kZ()
y=new P.JT(a,z)
if(J.q8(a)<2)z.$1("address is too short")
@@ -7494,26 +7532,26 @@
if(t>=J.q8(s))H.vh(P.N(t))
if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
+J.wT(x,-1)
+u=!0}else J.wT(x,y.$2(w,t))
w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
q=J.de(w,J.q8(a))
p=J.de(J.MQ(x),-1)
if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
+if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
+s=J.c1(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.Eh(J.UQ(v,2),8)
+J.wT(x,(s|r)>>>0)
+r=J.c1(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)
+J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
s=new H.kV(x,new P.d9(x))
s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
z=new P.rI()
y=P.p9("")
x=c.gZE().WJ(b)
@@ -7526,173 +7564,173 @@
y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
y.vM+=u}else{u=H.Lw(37)
y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
+z.$2(v,y)}}return y.vM}}},
hP:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=a>>>4
if(z>=8)return H.e(C.aa,z)
z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
Uo:{
-"^":"Tp:381;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:153;a",
+$1:function(a){a=J.aK(this.a,"]",a)
if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
+return a+1},
$isEH:true},
hb:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=a>>>4
if(z>=8)return H.e(C.HE,z)
z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
Kd:{
-"^":"Tp:115;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
$isEH:true},
yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
if(!z.a)this.b.KF("&")
z.a=!1
z=this.b
z.KF(P.jW(C.kg,a,C.xM,!0))
b.gl0(b)
z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},
$isEH:true},
Gs:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(!(48<=a&&a<=57))z=65<=a&&a<=70
else z=!0
-return z},"$1",null,2,0,null,382,[],"call"],
+return z},
$isEH:true},
pm:{
-"^":"Tp:380;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
+"^":"Tp:152;",
+$1:function(a){return 97<=a&&a<=102},
$isEH:true},
Tw:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=C.jn.GG(a,4)
if(z>=8)return H.e(C.kg,z)
z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
wm:{
-"^":"Tp:381;b,c,d",
-$1:[function(a){var z,y
+"^":"Tp:153;b,c,d",
+$1:function(a){var z,y
z=this.b
-y=C.xB.j(z,a)
+y=J.lE(z,a)
if(this.d.$1(y)===!0)return y-32
else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
+else return y},
$isEH:true},
FB:{
-"^":"Tp:381;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
+"^":"Tp:153;e",
+$1:function(a){var z,y,x,w,v
+for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
+if(48<=v&&v<=57)x=x*16+v-48
+else{v|=32
+if(97<=v&&v<=102)x=x*16+v-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
$isEH:true},
Lk:{
-"^":"Tp:125;a,f",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,f",
+$0:function(){var z,y,x,w,v
z=this.a
y=z.b
x=z.c
w=this.f
v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
+if(y==null)z.b=P.p9(J.Nj(w,x,v))
+else y.KF(J.Nj(w,x,v))},
$isEH:true},
XZ:{
-"^":"Tp:384;",
-$2:[function(a,b){var z=J.v1(a)
+"^":"Tp:154;",
+$2:function(a,b){var z=J.v1(a)
if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
+return b*31+z&1073741823},
$isEH:true},
Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
$isEH:true},
C9:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y
z=H.BU(a,null,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,385,[],"call"],
+return z},"$1",null,2,0,null,155,[],"call"],
$isEH:true},
kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
$isEH:true},
JT:{
-"^":"Tp:386;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:156;a,b",
+$2:function(a,b){var z,y
if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
z=H.BU(C.xB.Nj(this.a,a,b),16,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
+return z},
$isEH:true},
d9:{
-"^":"Tp:115;c",
-$1:[function(a){var z=J.x(a)
+"^":"Tp:16;c",
+$1:function(a){var z=J.x(a)
if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},
$isEH:true},
rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Tp:75;",
+$2:function(a,b){var z=J.Wx(a)
b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
$isEH:true}}],["dart.dom.html","dart:html",,W,{
"^":"",
UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,61,7,[]],
+r3:function(a,b){return document.createElement(a)},
+Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
z=W.zU
y=H.VM(new P.Zf(P.Dt(z)),[z])
x=new XMLHttpRequest()
C.W3.eo(x,"GET",a,!0)
z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
z=C.MD.aM(x)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
ED:function(a){var z,y
z=document.createElement("input",null)
if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+C0:function(a,b){a=536870911&a+b
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
if(a==null)return
if("setInterval" in a){z=W.P1(a)
if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},
+qr:function(a){return a},
+Pd:function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},
+YT:function(a,b){return new W.vZ(a,b)},
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
z=J.Xr(d)
if(z==null)throw H.b(P.u(d))
y=z.prototype
@@ -7714,19 +7752,19 @@
Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
q={prototype:s}
if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},
+aF:function(a){if(J.de($.X3,C.NU))return a
if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},
qE:{
"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
zw:{
"^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$iszM:true,
+$aszM:function(){return[W.nX]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.nX]},
@@ -7793,7 +7831,7 @@
Kb:function(a,b){return a.getElementById(b)},
ek:function(a,b,c){return a.importNode(b,c)},
gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
gLm:function(a){return C.i3.aM(a)},
gVY:function(a){return C.DK.aM(a)},
Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7801,7 +7839,7 @@
pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
$isYN:true,
"%":"Document|HTMLDocument|XMLDocument"},
-Aj:{
+hN:{
"^":"KV;",
gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
return a._docChildren},
@@ -7840,6 +7878,9 @@
Ja:function(a,b){return a.querySelector(b)},
pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
gDD:function(a){return new W.I4(a)},
+sDD:function(a,b){var z=this.gDD(a)
+z.V1(0)
+z.FV(z,b)},
gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
i4:function(a){},
@@ -7863,7 +7904,7 @@
PN:function(a,b){return a.getAttribute(b)},
Zi:function(a){return a.getBoundingClientRect()},
gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
gLm:function(a){return C.i3.f0(a)},
gVY:function(a){return C.DK.f0(a)},
gE8:function(a){return C.W2.f0(a)},
@@ -7916,8 +7957,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -7969,7 +8010,7 @@
"^":"qE;mH:href=,t5:type%",
$isQj:true,
"%":"HTMLLinkElement"},
-U4:{
+ZD:{
"^":"Gv;cC:hash%,mH:href=",
VD:function(a){return a.reload()},
bu:function(a){return a.toString()},
@@ -8018,7 +8059,7 @@
tH:{
"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
"%":"MIDIInput;MIDIPort"},
-Wp:{
+Aj:{
"^":"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},
@@ -8029,7 +8070,7 @@
z=W.qc(a.target)
y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+$isAj:true,
"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
H9:{
"^":"Gv;",
@@ -8087,8 +8128,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -8138,7 +8179,7 @@
$islp:true,
"%":"HTMLSelectElement"},
I0:{
-"^":"Aj;",
+"^":"hN;",
Kb:function(a,b){return a.getElementById(b)},
$isI0:true,
"%":"ShadowRoot"},
@@ -8228,7 +8269,7 @@
X6:function(a,b,c){return this.xc(a,b,c,null)},
bu:function(a){return a.toString()},
gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
gLm:function(a){return C.i3.aM(a)},
gVY:function(a){return C.DK.aM(a)},
$isu9:true,
@@ -8267,7 +8308,7 @@
$istn:true,
$astn:function(){return[null]},
"%":"ClientRect|DOMRect"},
-SC:{
+Wp:{
"^":"qE;",
$isD0:true,
"%":"HTMLFrameSetElement"},
@@ -8284,8 +8325,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -8304,8 +8345,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]},
@@ -8324,8 +8365,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]},
@@ -8368,7 +8409,7 @@
if(z==null)throw H.b(P.w("No elements"))
return z},
$asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
+$aszM:function(){return[W.cv]},
$asQV:function(){return[W.cv]}},
wz:{
"^":"ar;Sn,Sc",
@@ -8382,14 +8423,15 @@
np:function(a){return this.GT(a,null)},
grZ:function(a){return C.t5.grZ(this.Sn)},
gDD:function(a){return W.or(this.Sc)},
+sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
+gVl:function(a){return C.T1.Uh(this)},
gLm:function(a){return C.i3.Uh(this)},
gVY:function(a){return C.DK.Uh(this)},
nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null,
@@ -8397,8 +8439,14 @@
z.nJ(a,b)
return z}}},
B1:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
+$isEH:true},
+BH:{
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
+J.H2(a,z)
+return z},
$isEH:true},
nX:{
"^":"Gv;"},
@@ -8415,28 +8463,28 @@
static:{"^":"fD"}},
RAp:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
Gb:{
"^":"RAp+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
Kx:{
-"^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
-$isEH:true},
-Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
$isEH:true},
iO:{
-"^":"Tp:115;b,c",
+"^":"Tp:75;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
+$isEH:true},
+bU:{
+"^":"Tp:16;b,c",
$1:[function(a){var z,y,x
z=this.c
y=z.status
@@ -8445,11 +8493,11 @@
x=this.b
if(y){y=x.MM
if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(b!=null)this.a[a]=b},
$isEH:true},
e7:{
"^":"ar;NL",
@@ -8496,61 +8544,61 @@
return z[b]},
$ise7:true,
$asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
$asQV:function(){return[W.KV]}},
nNL:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
ma:{
"^":"nNL+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
yoo:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
ecX:{
"^":"yoo+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
zLC:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]}},
w1p:{
"^":"zLC+Gm;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]}},
dxW:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]}},
kEI:{
"^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]}},
@@ -8566,23 +8614,23 @@
b.$2(y,this.t(0,y))}},
gvc:function(){var z,y,x,w
z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
y.push(J.O6(z[w]))}}return y},
gUQ:function(a){var z,y,x,w
z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
y.push(J.Vm(z[w]))}}return y},
gl0:function(a){return this.gB(this)===0},
gor:function(a){return this.gB(this)!==0},
$isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
$isEH:true},
i7:{
"^":"tJ;MW",
@@ -8598,7 +8646,7 @@
FJ:function(a){return a.namespaceURI==null}},
nF:{
"^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,P.qU)
this.Kd.aN(0,new W.Si(z))
return z},
p5:function(a){var z,y
@@ -8614,38 +8662,38 @@
z.yJ(a)
return z}}},
FK:{
-"^":"Tp:115;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Si:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a.FV(0,a.lF())},
$isEH:true},
vf:{
-"^":"Tp:115;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.OS(this.a)},
$isEH:true},
Iw:{
-"^":"Tp:115;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return a.O4(this.a,this.b)},
$isEH:true},
Fc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.V1(a,this.a)},
$isEH:true},
hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){return this.a.$1(b)===!0||a===!0},
$isEH:true},
I4:{
"^":"As;MW",
lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+z=P.Ls(null,null,null,P.qU)
for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
if(x.length!==0)z.h(0,x)}return z},
p5:function(a){P.F(a,!0,null)
J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+e0:{
"^":"a;Ph",
zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
aM:function(a){return this.zc(a,!1)},
@@ -8667,13 +8715,13 @@
return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
$isqh:true},
ie:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
$isEH:true},
Ea:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
pu:{
"^":"qh;DI,Sg,Ph",
@@ -8691,13 +8739,13 @@
yI:function(a){return this.KR(a,null,null,null)},
$isqh:true},
i2:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
$isEH:true},
b0:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Ov:{
"^":"MO;VP,uv,Ph,u7,Sg",
@@ -8728,10 +8776,10 @@
cO:[function(a){var z,y
for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,125],
+this.aV.cO(0)},"$0","gJK",0,0,21],
KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
RX:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
bO:{
@@ -8753,8 +8801,8 @@
YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -8762,7 +8810,7 @@
"^":"ar;xa",
gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
+h:function(a,b){J.wT(this.xa,b)},
Rz:function(a,b){return J.V1(this.xa,b)},
V1:function(a){J.U2(this.xa)},
t:function(a,b){var z=this.xa
@@ -8798,11 +8846,11 @@
return!1},
gl:function(){return this.QZ}},
vZ:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z=H.Va(this.b)
Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,62,[],"call"],
$isEH:true},
dW:{
"^":"a;Ui",
@@ -8814,8 +8862,8 @@
On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
$isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:function(a){if(a===window)return a
+else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
"^":"",
hF:{
"^":"Gv;",
@@ -8870,7 +8918,7 @@
ca:{
"^":"d5;x=,y=",
"%":"SVGFEPointLightElement"},
-zu:{
+zt:{
"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
"%":"SVGFESpecularLightingElement"},
eW:{
@@ -8903,7 +8951,7 @@
Ac:{
"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGPatternElement"},
-MU:{
+jr:{
"^":"Yz;fg:height=,R:width=,x=,y=",
"%":"SVGRectElement"},
nd:{
@@ -8921,7 +8969,7 @@
J.r4(z.h2.NL)
z.FV(0,b)},
gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
gLm:function(a){return C.i3.f0(a)},
gVY:function(a){return C.DK.f0(a)},
gE8:function(a){return C.W2.f0(a)},
@@ -8951,7 +8999,7 @@
"^":"As;LO",
lF:function(){var z,y,x,w
z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+y=P.Ls(null,null,null,P.qU)
if(z==null)return y
for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
if(w.length!==0)y.h(0,w)}return y},
@@ -8966,16 +9014,16 @@
$ishq:true,
static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
"^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
R4:[function(a,b,c,d){var z
if(b===!0){z=[c]
C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
+Dm:function(a,b,c){var z
if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},
wY:[function(a){var z
if(a==null)return
else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -8984,10 +9032,10 @@
else if(!!z.$isiP)return H.o2(a)
else if(!!z.$isE4)return a.eh
else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,115,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
+hE:function(a,b,c){var z=P.Om(a,b)
if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
dU:[function(a){var z
if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
else{if(a instanceof Object){z=J.x(a)
@@ -8995,13 +9043,13 @@
if(z)return a
else if(a instanceof Date)return P.Wu(a.getTime(),!1)
else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
+ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
E4:{
"^":"a;eh",
t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9029,9 +9077,9 @@
C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
x=z.bind.apply(z,y)
String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","Ij",2,0,null,248,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
Gn:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y,x,w,v
z=this.a
if(z.x4(a))return z.t(0,a)
@@ -9042,7 +9090,7 @@
x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
z.u(0,a,v)
C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
$isEH:true},
r7:{
"^":"E4;eh"},
@@ -9081,47 +9129,47 @@
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
GT:function(a,b){this.V7("sort",[b])},
np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
+static:{BE:function(a,b,c){var z=J.Wx(a)
if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
Wk:{
"^":"E4+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
DV:{
-"^":"Tp:115;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Tp:16;",
+$1:function(a){var z=P.xZ(a,!1)
P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
$isEH:true},
Hp:{
-"^":"Tp:115;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return new this.a(a)},
$isEH:true},
Nz:{
-"^":"Tp:115;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.r7(a)},
$isEH:true},
Jd:{
-"^":"Tp:115;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
$isEH:true},
QS:{
-"^":"Tp:115;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.E4(a)},
$isEH:true}}],["dart.math","dart:math",,P,{
"^":"",
-VC:[function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){var z
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){var z
if(typeof a!=="number")throw H.b(P.u(a))
if(typeof b!=="number")throw H.b(P.u(b))
if(a>b)return b
@@ -9130,15 +9178,15 @@
if(a===0)z=b===0?1/b<0:b<0
else z=!1
if(z||isNaN(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
if(typeof b!=="number")throw H.b(P.u(b))
if(a>b)return a
if(a<b)return b
if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
if(C.ON.gG0(b))return b
return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],199,[]],
+return a},
mg:{
"^":"a;",
j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9240,14 +9288,20 @@
$ishL:true},
HDe:{
"^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
if(b==null)return!1
z=J.x(b)
if(!z.$istn)return!1
@@ -9256,20 +9310,26 @@
if(y==null?x==null:y===x){y=this.G6
x=z.gG6(b)
if(y==null?x==null:y===x){x=this.Bb
+w=this.R
if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
z=J.v1(this.gBb(this))
y=this.G6
x=J.v1(y)
w=this.Bb
+v=this.R
if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
+if(typeof u!=="number")return H.s(u)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
z.$builtinTypeInfo=this.$builtinTypeInfo
return z}},
@@ -9286,14 +9346,14 @@
else y=d
return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
"^":"",
-re:[function(a){var z,y
+re:function(a){var z,y
z=J.x(a)
if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
y=P.o1(a)
if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","vG",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
+return y.gJi()},
+o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},
QF:{
"^":"a;",
$isQF:true},
@@ -9343,7 +9403,7 @@
WS4:{
"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
"^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
Gj:{
"^":"mAS;EV"},
mAS:{
@@ -9373,7 +9433,6 @@
Rz:function(a,b){return this.EV.Rz(0,b)},
gUQ:function(a){var z=this.EV
return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
"^":"",
UI:function(a){a.toString
@@ -9384,7 +9443,6 @@
return a},
WZ:{
"^":"Gv;",
-gbx:function(a){return C.PT},
$isWZ:true,
"%":"ArrayBuffer"},
pF:{
@@ -9400,12 +9458,10 @@
"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
df:{
"^":"pF;",
-gbx:function(a){return C.T1},
$isHY:true,
"%":"DataView"},
Hg:{
"^":"Dg;",
-gbx:function(a){return C.hN},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9414,16 +9470,15 @@
a[b]=c},
D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
$isHY:true,
"%":"Float32Array"},
fS:{
"^":"Dg;",
-gbx:function(a){return C.lk},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9432,16 +9487,15 @@
a[b]=c},
D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
$isHY:true,
"%":"Float64Array"},
PS:{
"^":"Pg;",
-gbx:function(a){return C.jV},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9450,16 +9504,15 @@
a[b]=c},
D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int16Array"},
dE:{
"^":"Pg;",
-gbx:function(a){return C.Im},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9468,16 +9521,15 @@
a[b]=c},
D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int32Array"},
-IJ:{
+Eb:{
"^":"Pg;",
-gbx:function(a){return C.la},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9486,16 +9538,15 @@
a[b]=c},
D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int8Array"},
us:{
"^":"Pg;",
-gbx:function(a){return C.iG},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9504,16 +9555,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Uint16Array"},
qe:{
"^":"Pg;",
-gbx:function(a){return C.Vh},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9522,16 +9572,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Uint32Array"},
eE:{
"^":"Pg;",
-gbx:function(a){return C.nG},
gB:function(a){return a.length},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9541,16 +9590,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"CanvasPixelArray|Uint8ClampedArray"},
V6:{
"^":"Pg;",
-gbx:function(a){return C.eY},
gB:function(a){return a.length},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9560,11 +9608,11 @@
a[b]=c},
D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":";Uint8Array"},
b0B:{
@@ -9589,18 +9637,18 @@
return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
$isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
Ui:{
"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
Ip:{
"^":"Ui+SU7;"},
Pg:{
@@ -9609,36 +9657,36 @@
return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
$isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
ObS:{
"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
nA:{
"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
"^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
return}if(typeof window=="object")return
if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
"^":"",
Ir:{
-"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"error",307,330],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
+"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
"@":function(){return[C.uW]},
static:{hG:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9646,29 +9694,29 @@
a.X0=w
C.OD.ZL(a)
C.OD.oX(a)
-return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[392],
+return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[159],
D13:{
"^":"uL+Pi;",
$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
"^":"",
-rm:{
-"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
+bf:{
+"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
+gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
+gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
+gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
z=this.ct(a,C.eh,a.Ab,z)
a.Ab=z
if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
kk:[function(a,b,c,d){var z,y,x
J.zJ(b)
z=a.a3
@@ -9677,15 +9725,15 @@
x=R.Jk(y)
J.kW(x,"expr",z)
J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
"@":function(){return[C.Qz]},
static:{Rp:[function(a){var z,y,x,w,v
z=R.Jk([])
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.Ab="1-line"
@@ -9695,39 +9743,39 @@
a.X0=v
C.Gh.ZL(a)
C.Gh.oX(a)
-return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[400],
+return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[167],
WZq:{
"^":"uL+Pi;",
$isd3:true},
YW:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
"^":"",
Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
+"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,115,30,[],"callback",307],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",307,330],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",307],
-gyG:[function(a){return a.oy},null,null,1,0,310,"result",307,330],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,311,30,[],"result",307],
-hT:[function(a,b,c,d){var z=a.TS
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
+gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
+gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+wB:[function(a,b,c,d){var z=a.TS
if(z===!0)return
if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
"@":function(){return[C.Vn]},
static:{fL:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.TS=!1
@@ -9739,35 +9787,35 @@
a.X0=w
C.UF.ZL(a)
C.UF.oX(a)
-return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[401],
+return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[169],
Nr:{
"^":"xc+Pi;",
$isd3:true},
Kz:{
-"^":"Tp:311;a-85",
+"^":"Tp:86;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
$isEH:true},
-"+ Kz":[346],
+"+ Kz":[124],
Ou:{
-"^":"Tp:126;b-85",
+"^":"Tp:22;b-29",
$0:[function(){var z,y
z=this.b
y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ Ou":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ Ou":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
"^":"",
UL:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.E6]},
static:{zY:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -9776,19 +9824,19 @@
a.X0=w
C.MC.ZL(a)
C.MC.oX(a)
-return a},null,null,0,0,126,"new FieldRefElement$created"]}},
-"+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,22,"new FieldRefElement$created"]}},
+"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
"^":"",
jM:{
-"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"field",307,330],
-st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,105,27,[],"field",82],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
+static:{Sy:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9796,18 +9844,18 @@
a.X0=w
C.LT.ZL(a)
C.LT.oX(a)
-return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[402],
+return a},null,null,0,0,22,"new FieldViewElement$created"]}},
+"+FieldViewElement":[170],
pva:{
"^":"uL+Pi;",
$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
"^":"",
qW:{
-"^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
-aZ:[function(a,b){var z,y,x
-Q.xI.prototype.aZ.call(this,a,b)
+"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+P9:[function(a,b){var z,y,x
+Q.xI.prototype.P9.call(this,a,b)
this.ct(a,C.D2,0,1)
this.ct(a,C.mP,0,1)
z=a.tY
@@ -9819,18 +9867,18 @@
a.qe=this.ct(a,C.D2,a.qe,x)
if(y){y=J.U6(z)
y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
+gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
+gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
"@":function(){return[C.o3]},
static:{Wz:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.lh=!0
@@ -9843,20 +9891,20 @@
a.X0=w
C.Xo.ZL(a)
C.Xo.oX(a)
-return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[403],
+return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[171],
rs:{
"^":"xI+Pi;",
$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
"^":"",
mk:{
-"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",307],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",307,330],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",307],
+"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
+gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
+gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
FW:[function(a,b){var z,y,x
z=b!=null
y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9865,7 +9913,7 @@
z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
x=z?J.UQ(b,"owner"):null
if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
ql:[function(a,b){var z,y
this.ct(a,C.AO,0,1)
this.ct(a,C.fy,0,1)
@@ -9898,13 +9946,13 @@
case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
break
default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.nu]},
static:{N0:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9912,43 +9960,43 @@
a.X0=w
C.h4.ZL(a)
C.h4.oX(a)
-return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[405],
+return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[174],
cda:{
"^":"uL+Pi;",
$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
"^":"",
Qb:{
"^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
uc:{
"^":"a;Yu<,tL"},
pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
-gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,331,30,[],"fragmentation",307],
+"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
+gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
a.hi=z
J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
LV:[function(a,b){var z,y,x
for(z=J.GP(b),y=0;z.G();){x=z.gl()
if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
tn:[function(a,b,c,d){var z,y
z=a.UL
y=J.uH(c,"@")
if(0>=y.length)return H.e(y,0)
J.kW(z,b,y[0])
J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
an:[function(a,b,c){var z,y,x,w,v,u,t
for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
x=J.U6(y)
@@ -9963,16 +10011,16 @@
J.kW(t,w,x[0])
J.kW(a.rM,w,u)
J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
Ic:[function(a,b){var z,y,x
z=O.x6(a.An,b)
y=z.mS
x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
+z=J.vX(a.dW,J.eY(a.An))
y=J.Ts(O.x6(a.An,b).mS,4)
x=J.Wx(y)
w=x.Z(y,z)
@@ -9997,7 +10045,7 @@
break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
r=J.UQ(a.Oh,"unit_size_bytes")
if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
U8:[function(a,b){var z,y,x,w,v,u
z=J.RE(b)
y=this.WE(a,z.gD7(b))
@@ -10008,9 +10056,9 @@
v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
My:[function(a){var z,y,x,w
z=a.Oh
if(z==null||a.hi==null)return
@@ -10026,9 +10074,9 @@
if(typeof w!=="number")return H.s(w)
w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
a.An=w
-J.No(a.hi,J.YD(w))
+J.No(a.hi,J.eY(w))
J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,125,"_updateFragmentationData"],
+this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
z=J.UQ(a.Oh,"pages")
y=J.U6(z)
@@ -10064,20 +10112,20 @@
J.wp(n.gRn(o),y,x.g(y,4),l)
v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.eY(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
pA:[function(a,b){var z=a.Oh
if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
"@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
z=P.Fl(null,null)
y=P.Fl(null,null)
x=P.Fl(null,null)
w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
+v=P.Py(null,null,null,P.qU,W.I0)
+u=P.qU
t=W.cv
t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
a.rM=z
@@ -10088,41 +10136,41 @@
a.X0=t
C.pJ.ZL(a)
C.pJ.oX(a)
-return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[420],
+return a},null,null,0,0,22,"new HeapMapElement$created"]}},
+"+HeapMapElement":[189],
waa:{
"^":"uL+Pi;",
$isd3:true},
WQ:{
-"^":"Tp:126;a-85,b-317",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29,b-93",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ WQ":[346],
+"+ WQ":[124],
aG:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ aG":[346],
+"+ aG":[124],
aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ aO":[346],
+"+ aO":[124],
oc:{
-"^":"Tp:126;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
"^":"",
jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
-gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
+"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
+gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
i4:[function(a){var z,y
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10135,10 +10183,10 @@
z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
a.CO=z
z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,125,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
+this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
a.nc.lb()
for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
if(this.K1(a,y))continue
@@ -10149,81 +10197,85 @@
t=this.VI(a,y,4)
s=this.VI(a,y,5)
r=this.VI(a,y,6)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
+q=this.VI(a,y,7)
+p=this.VI(a,y,8)
+J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
a.GQ.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(q)
-J.qK(a.GQ,["Used",z.t(q,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.GQ,["External",z.t(q,"external")])
+o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
+z=J.U6(o)
+J.qK(a.GQ,["Used",z.t(o,"used")])
+J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.GQ,["External",z.t(o,"external")])
a.Oc.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(q)
-J.qK(a.Oc,["Used",z.t(q,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.Oc,["External",z.t(q,"external")])
-this.uB(a)},"$0","gYs",0,0,125,"_updateChartData"],
+o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
+z=J.U6(o)
+J.qK(a.Oc,["Used",z.t(o,"used")])
+J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.Oc,["External",z.t(o,"external")])
+this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
uB:[function(a){var z=a.J0
if(z==null)return
z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,125,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
AE:[function(a,b,c,d){var z,y
if(!!J.x(d).$isqk){z=a.nc.gxp()
y=d.cellIndex
if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
K1:[function(a,b){var z,y,x
z=J.U6(b)
y=z.t(b,"new")
x=z.t(b,"old")
for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
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)
-return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
-case 2:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),6),J.UQ(z.t(b,"old"),6))
-case 3:return J.UQ(J.UQ(b,"old"),7)
-case 4:return J.UQ(J.UQ(b,"old"),6)
-case 5:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
-case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
+case 1:return J.UQ(J.UQ(b,"new"),7)
+case 2:return J.UQ(J.UQ(b,"new"),6)
+case 3:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+case 4:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+case 5:return J.UQ(J.UQ(b,"old"),7)
+case 6:return J.UQ(J.UQ(b,"old"),6)
+case 7:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+case 8:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
pA:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
cQ:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
eJ:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
pM:[function(a,b){var z,y,x,w
try{this.hZ(a)}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
Ar:[function(a,b){var z,y,x
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
x=J.UQ(J.UQ(z,"heaps"),y)
z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
uW:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
Q0:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
a.GQ=z
z.Gl("string","Type")
@@ -10233,14 +10285,14 @@
z.Gl("string","Type")
a.Oc.Gl("number","Size")
z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator",G.AF()),new G.Kt("Accumulator",G.Vj()),new G.Kt("Accumulator (Old space)",G.AF()),new G.Kt("Accumulator (Old space)",G.Vj()),new G.Kt("Current",G.AF()),new G.Kt("Current",G.Vj())],z,[],0,!0,null,null))
+z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
a.nc=z
-z.sxp(1)},null,null,0,0,126,"created"],
+z.sxp(1)},null,null,0,0,22,"created"],
"@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10249,65 +10301,65 @@
C.Vc.ZL(a)
C.Vc.oX(a)
C.Vc.Dd(a)
-return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[431],
+return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[200],
V4:{
"^":"uL+Pi;",
$isd3:true},
nx:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ nx":[346],
+"+ nx":[124],
jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ jm":[346],
+"+ jm":[124],
AN:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ AN":[346],
+"+ AN":[124],
Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ Ao":[346],
+"+ Ao":[124],
xj:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ xj":[346],
+"+ xj":[124],
VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ VB":[346]}],["html_common","dart:html_common",,P,{
+"+ VB":[124]}],["html_common","dart:html_common",,P,{
"^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
z=[]
y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
+f9:function(a){var z,y
z=J.x(a)
if(!!z.$isSg){y=z.gRn(a)
if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
dg:function(){var z=$.L4
if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
$.L4=z}return z},
@@ -10315,34 +10367,34 @@
if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
$.PN=z}return z},
aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:52;b,c",
+$1:function(a){var z,y,x
z=this.b
y=z.length
for(x=0;x<y;++x)if(z[x]===a)return x
z.push(a)
this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
$isEH:true},
rG:{
-"^":"Tp:361;d",
-$1:[function(a){var z=this.d
+"^":"Tp:137;d",
+$1:function(a){var z=this.d
if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
$isEH:true},
yh:{
-"^":"Tp:432;e",
-$2:[function(a,b){var z=this.e
+"^":"Tp:201;e",
+$2:function(a,b){var z=this.e
if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
$isEH:true},
wO:{
-"^":"Tp:126;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){},
$isEH:true},
Tm:{
-"^":"Tp:115;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+"^":"Tp:16;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
z={}
if(a==null)return a
if(typeof a==="boolean")return a
@@ -10364,7 +10416,7 @@
z.a=w
this.bK.$2(x,w)
y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+return z.a}if(!!y.$iszM){v=y.gB(a)
x=this.f.$1(a)
w=this.UI.$1(x)
if(w!=null){if(!0===w){w=new Array(v)
@@ -10374,37 +10426,37 @@
u=0
for(;u<v;++u){z=this.$1(y.t(a,u))
if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
$isEH:true},
ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
$isEH:true},
CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Tp:52;a,b",
+$1:function(a){var z,y,x,w
z=this.a
y=z.length
for(x=0;x<y;++x){w=z[x]
if(w==null?a==null:w===a)return x}z.push(a)
this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
$isEH:true},
YL:{
-"^":"Tp:361;c",
-$1:[function(a){var z=this.c
+"^":"Tp:137;c",
+$1:function(a){var z=this.c
if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
$isEH:true},
KC:{
-"^":"Tp:432;d",
-$2:[function(a,b){var z=this.d
+"^":"Tp:201;d",
+$2:function(a,b){var z=this.d
if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
$isEH:true},
xL:{
-"^":"Tp:115;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
if(a==null)return a
if(typeof a==="boolean")return a
if(typeof a==="number")return a
@@ -10428,11 +10480,11 @@
u=J.w1(y)
t=0
for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
$isEH:true},
-qS:{
+la:{
"^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isla:true,
$isSg:true},
As:{
"^":"a;",
@@ -10451,9 +10503,11 @@
aN:function(a,b){this.lF().aN(0,b)},
zV:function(a,b){return this.lF().zV(0,b)},
ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
ev:function(a,b){var z=this.lF()
return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
Vr:function(a,b){return this.lF().Vr(0,b)},
gl0:function(a){return this.lF().X5===0},
gor:function(a){return this.lF().X5!==0},
@@ -10482,24 +10536,24 @@
this.p5(z)
return y},
$isz5:true,
-$asz5:function(){return[J.O]},
+$asz5:function(){return[P.qU]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.O]}},
+$asQV:function(){return[P.qU]}},
GE:{
-"^":"Tp:115;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.h(0,this.a)},
$isEH:true},
rl:{
-"^":"Tp:115;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.FV(0,this.a)},
$isEH:true},
uQ:{
-"^":"Tp:115;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a.V1(0)},
$isEH:true},
D7:{
-"^":"ar;qt,h2",
+"^":"ar;ndS,h2",
gzT:function(){var z=this.h2
return P.F(z.ev(z,new P.hT()),!0,W.cv)},
aN:function(a,b){H.bQ(this.gzT(),b)},
@@ -10536,36 +10590,36 @@
gA:function(a){var z=this.gzT()
return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
hT:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
$isEH:true},
GS:{
-"^":"Tp:115;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.QC(a)},
$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
"^":"",
pR:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
gD5:[function(a){var z=a.tY
if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired. Consider refreshing the page."
else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,126,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
vQ:[function(a,b,c){var z,y
z=a.tY
if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
else{y=J.w1(z)
y.u(z,"fields",null)
y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
"@":function(){return[C.VW]},
static:{lu:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -10574,31 +10628,32 @@
a.X0=w
C.cp.ZL(a)
C.cp.oX(a)
-return a},null,null,0,0,126,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[336],
+return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[110],
Js:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y
z=J.U6(a)
if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
a.szz(z.t(a,"valueAsString"))}z=this.a
y=J.RE(z)
y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
"^":"",
hx:{
-"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"instance",307,330],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.qlk]},
+"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.be]},
static:{Co:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10606,15 +10661,15 @@
a.X0=w
C.pU.ZL(a)
C.pU.oX(a)
-return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[436],
+return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[206],
V9:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
"^":"",
Se:{
-"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
+"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
C4:function(a){var z,y,x,w,v,u,t,s,r
z=this.B1
y=J.UQ(z,"threshold")
@@ -10627,6 +10682,7 @@
if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
w.h(x,X.SJ(z,t,s,this))}},
o8:function(){},
+Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
mW:function(a,b,c,d){var z,y
z=this.H
this.Vh=H.d(z.gAv())
@@ -10646,29 +10702,30 @@
static:{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,[],"\u2192",!1,null,null)
+z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
+z.k7(d)
z.mW(a,b,c,d)
return z}}},
E7:{
-"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",307],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",307,308],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",307],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",307,308],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",307],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",307,308],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
+gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
+gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
+gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
+gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
+gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
+gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
+gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
+gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
pM:[function(a,b){var z,y,x,w
z=a.pD
if(z==null)return
@@ -10691,27 +10748,27 @@
a.ik=this.ct(a,C.aH,a.ik,z)
J.QP(a.pD).N3(a.pD)
J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
i4:[function(a){var z=R.Jk([])
a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,125,"_update"],
+this.EX(a)},"$0","gBn",0,0,21,"_update"],
EX:[function(a){var z,y,x,w,v
z=J.QP(a.pD).gBC()
if(z==null)return
try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
y=v
x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
YF:[function(a,b,c,d){var z,y,x,w,v,u
w=J.RE(b)
if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10722,12 +10779,12 @@
w.qU(v-1)}catch(u){w=H.Ru(u)
y=w
x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
"@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.eH=""
@@ -10744,27 +10801,27 @@
a.X0=w
C.kS.ZL(a)
C.kS.oX(a)
-return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[441],
+return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[211],
V10:{
"^":"uL+Pi;",
$isd3:true},
SV:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
$isEH:true},
-"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
"^":"",
oO:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.j6]},
static:{Zgg:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -10773,18 +10830,18 @@
a.X0=w
C.LN.ZL(a)
C.LN.oX(a)
-return a},null,null,0,0,126,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
"^":"",
Stq:{
-"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,306,"isolate",307,330],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
"@":function(){return[C.aM]},
static:{N5:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10792,14 +10849,14 @@
a.X0=w
C.Qt.ZL(a)
C.Qt.oX(a)
-return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[443],
+return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[214],
V11:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
"^":"",
Lr:{
-"^":"a;hO,Pl",
+"^":"a;hO,YT",
eC:function(a){var z,y,x,w,v,u,t,s,r,q
z=this.hO.Yb
if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10838,36 +10895,36 @@
y.$builtinTypeInfo=[null]
z.V7("addRow",[y])}},
W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
+if(this.YT==null){z=P.L5(null,null,null,null,null)
y=new G.qu(null,z)
y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
+this.YT=y
z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
+this.YT.bG.u(0,"connectSteps",!1)
+this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
qkb:{
-"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
xo:[function(a){var z
Z.uL.prototype.xo.call(this,a)
z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
"@":function(){return[C.NG]},
static:{uD:[function(a){var z,y,x,w,v
z=P.zV(J.UQ($.NR,"DataTable"),null)
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.e6=new L.Lr(new G.ig(z),null)
@@ -10876,27 +10933,27 @@
a.X0=v
C.Xe.ZL(a)
C.Xe.oX(a)
-return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[446],
+return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[217],
V12:{
"^":"uL+Pi;",
$isd3:true},
BQ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y,x
z=this.a
y=J.RE(z)
y.ge6(z).eC(a)
x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
$isEH:true},
-"+ BQ":[346],
+"+ BQ":[124],
IT:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
"^":"",
fM:{
"^":"a;Fv,lp",
@@ -10915,7 +10972,7 @@
x.vM+=q
this.KN(t,v)
q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof " "!=="number")return H.s(" ")
+x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof " "!=="number")return H.s(" ")
r=b*" "
s=typeof r==="string"
x.vM+=s?r:H.d(r)
@@ -10942,7 +10999,7 @@
x.vM=s+"{\n"
this.KN(v,w)
s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof " "!=="number")return H.s(" ")
+x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof " "!=="number")return H.s(" ")
t=b*" "
u=typeof t==="string"
s=x.vM+=u?t:H.d(t)
@@ -10955,12 +11012,12 @@
u=x.vM+=typeof v==="string"?v:H.d(v)
x.vM=u+"\n"}}z.Rz(0,a)}},
vj:{
-"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
+"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
-gdQ:[function(a){return a.X7},null,null,1,0,312,"mapAsString",307,308],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",307],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
+gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
oC:[function(a,b){var z,y,x
z=P.p9("")
y=P.Ls(null,null,null,null)
@@ -10970,12 +11027,12 @@
new Z.fM(z,y).KN(x,0)
z.KF("}\n")
z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
"@":function(){return[C.KH]},
static:{mA:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10983,19 +11040,19 @@
a.X0=w
C.Yt.ZL(a)
C.Yt.oX(a)
-return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[448],
+return a},null,null,0,0,22,"new JsonViewElement$created"]}},
+"+JsonViewElement":[219],
V13:{
"^":"uL+Pi;",
$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
"^":"",
LU:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.uy]},
static:{rA:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -11004,20 +11061,20 @@
a.X0=w
C.Z3.ZL(a)
C.Z3.oX(a)
-return a},null,null,0,0,126,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
"^":"",
KL:{
-"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.Oyb]},
static:{Ro:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -11025,8 +11082,8 @@
a.X0=w
C.MG.ZL(a)
C.MG.oX(a)
-return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[449],
+return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[223],
V14:{
"^":"uL+Pi;",
$isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -11063,7 +11120,7 @@
J4:function(a){return this.dL(a,null,null)},
ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
j2:function(a){return this.xH(a,null,null)},
WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
hh:function(a){return this.WB(a,null,null)},
@@ -11079,17 +11136,17 @@
$isTJ:true,
static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
dG:{
-"^":"Tp:126;a",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:22;a",
+$0:function(){var z,y,x,w,v
z=this.a
if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
y=C.xB.cn(z,".")
if(y===-1)x=z!==""?N.Jx(""):null
else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
$isEH:true},
qV:{
"^":"a;oc>,P>",
@@ -11113,34 +11170,39 @@
giO:function(a){return this.P},
bu:function(a){return this.oc},
$isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
HV:{
"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
$isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
"^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
+E2:function(){N.Jx("").sOR(C.IF)
N.Jx("").gSZ().yI(new F.em())
N.Jx("").To("Starting Observatory")
var z=H.VM(new P.Zf(P.Dt(null)),[null])
N.Jx("").To("Loading Google Charts API")
J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},
em:{
-"^":"Tp:451;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
+"^":"Tp:225;",
+$1:[function(a){var z
+if(J.de(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
+else z=!1}else z=!1
+if(z)return
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
$isEH:true},
Lb:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,17,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
"^":"",
jh:{
"^":"a;T9,Ym",
-static:{"^":"n4I,ziq,pjg,nq,xa"}},
-tzK:{
+static:{"^":"LB,en,pjg,nq,xa"}},
+WO:{
"^":"a;"},
jA:{
"^":"a;oc>"},
@@ -11150,34 +11212,40 @@
"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
"^":"",
F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
"@":function(){return[C.nW]},
static:{aD:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Mz=!0
a.SO=z
a.B7=y
a.X0=w
C.kD.ZL(a)
C.kD.oX(a)
-return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[452],
+return a},null,null,0,0,22,"new NavBarElement$created"]}},
+"+NavBarElement":[226],
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
aQ:{
-"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.u7]},
static:{AJ:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.KU="#"
@@ -11188,22 +11256,22 @@
a.X0=w
C.SU.ZL(a)
C.SU.oX(a)
-return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[453],
-V15:{
+return a},null,null,0,0,22,"new NavMenuElement$created"]}},
+"+NavMenuElement":[227],
+V16:{
"^":"uL+Pi;",
$isd3:true},
Qa:{
-"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
+"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
"@":function(){return[C.qT]},
static:{JR:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.KU="#"
@@ -11213,31 +11281,31 @@
a.X0=w
C.nn.ZL(a)
C.nn.oX(a)
-return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[454],
-V16:{
+return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[228],
+V17:{
"^":"uL+Pi;",
$isd3:true},
Ww:{
-"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,126,"callback",307,330],
+"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
+gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
+gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
Ty:[function(a,b,c,d){var z=a.SB
if(z===!0)return
a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
"@":function(){return[C.XG]},
static:{zN:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SB=!1
@@ -11247,20 +11315,20 @@
a.X0=w
C.J7.ZL(a)
C.J7.oX(a)
-return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[455],
-V17:{
+return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[229],
+V18:{
"^":"uL+Pi;",
$isd3:true},
tz:{
-"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.hr]},
static:{J8:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11269,22 +11337,27 @@
a.X0=w
C.lx.ZL(a)
C.lx.oX(a)
-return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[456],
-V18:{
+return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[230],
+V19:{
"^":"uL+Pi;",
$isd3:true},
Mv:{
-"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
-"@":function(){return[C.zaS]},
+"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+gu6:[function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},null,null,1,0,87,"hashLinkWorkaround",82],
+su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
+"@":function(){return[C.oD]},
static:{Du:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11293,22 +11366,22 @@
a.X0=w
C.RR.ZL(a)
C.RR.oX(a)
-return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[457],
-V19:{
+return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[232],
+V20:{
"^":"uL+Pi;",
$isd3:true},
-oM:{
-"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"library",307,330],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+Zt:{
+"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.KI]},
static:{IV:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11317,22 +11390,22 @@
a.X0=w
C.ct.ZL(a)
C.ct.oX(a)
-return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[458],
-V20:{
+return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[233],
+V21:{
"^":"uL+Pi;",
$isd3:true},
iL:{
-"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-"@":function(){return[C.qJ]},
+"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"@":function(){return[C.iF]},
static:{lT:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11341,35 +11414,35 @@
a.X0=w
C.ae.ZL(a)
C.ae.oX(a)
-return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[459],
-V21:{
+return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[234],
+V22:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
"^":"",
F1i:{
-"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
+guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
z.Lw()
z.PI()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
z.Lw()
z.SC()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,126,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
"@":function(){return[C.kR]},
static:{fv:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.k5=!1
@@ -11379,43 +11452,43 @@
C.k0.ZL(a)
C.k0.oX(a)
C.k0.ZB(a)
-return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[463],
-V22:{
+return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[238],
+V23:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
"^":"",
uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
at:[function(a,b){var z,y,x
z=J.U6(b)
y=J.UQ(z.t(b,"script"),"user_name")
x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
"@":function(){return[C.Br]},
static:{Hx:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -11423,8 +11496,8 @@
a.X0=w
C.Pf.ZL(a)
C.Pf.oX(a)
-return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
"^":"",
Pi:{
"^":"a;",
@@ -11433,8 +11506,8 @@
z=P.bK(this.gl1(a),z,!0,null)
a.AP=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,125],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,125],
+k0:[function(a){},"$0","gqw",0,0,21],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
BN:[function(a){var z,y,x
z=a.fn
a.fn=null
@@ -11442,7 +11515,7 @@
x=H.VM(new P.Yp(z),[T.yj])
if(y.Gv>=4)H.vh(y.q7())
y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,348],
+return!0}return!1},"$0","gDx",0,0,126],
gnz:function(a){var z,y
z=a.AP
if(z!=null){y=z.iE
@@ -11466,7 +11539,7 @@
"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
kb:function(a){return this.rk.$1(a)},
gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,126,"value",307],
+gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
wE:function(a){var z,y,x,w,v
if(this.YX)return
this.YX=!0
@@ -11479,14 +11552,14 @@
x.push(w)}this.Ow()},
TF:[function(a){if(this.B6)return
this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
Ow:[function(){var z,y
this.B6=!1
z=this.b9
if(z.length===0)return
y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,125],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
cO:function(a){var z,y
z=this.b9
if(z.length===0)return
@@ -11494,15 +11567,15 @@
C.Nm.sB(z,0)
C.Nm.sB(this.kK,0)
this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,126],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,126],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
$isJ3:true},
E5:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
$isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
"^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
+Y3:function(){var z,y,x,w,v,u,t,s,r,q
if($.Td)return
if($.tW==null)return
$.Td=!0
@@ -11524,45 +11597,45 @@
for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
q=J.U6(r)
w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
+$.Td=!1},
+Ht:function(){var z={}
z.a=!1
z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
o5:{
-"^":"Tp:470;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:247;a",
+$2:function(a,b){var z=this.a
if(z.a)return
z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
+a.RK(b,new O.b5(z))},
$isEH:true},
b5:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
$0:[function(){this.a.a=!1
O.Y3()},"$0",null,0,0,null,"call"],
$isEH:true},
zI:{
-"^":"Tp:182;b",
+"^":"Tp:36;b",
$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
$isEH:true},
Zb:{
-"^":"Tp:126;c,d,e,f",
+"^":"Tp:22;c,d,e,f",
$0:[function(){this.c.$2(this.d,this.e)
return this.f.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
id:{
-"^":"Tp:471;UI",
+"^":"Tp:248;UI",
$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
$isEH:true},
iV:{
-"^":"Tp:115;bK,Gq,Rm,w3",
+"^":"Tp:16;bK,Gq,Rm,w3",
$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
"^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
z=J.WB(J.xH(f,e),1)
y=J.WB(J.xH(c,b),1)
if(typeof z!=="number")return H.s(z)
@@ -11597,8 +11670,8 @@
if(typeof n!=="number")return n.g()
n=P.J(o+1,n+1)
if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+m[t]=n}}return x},
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
z=a.length
y=z-1
if(0>=z)return H.e(a,0)
@@ -11632,11 +11705,11 @@
v=p
y=w}else{u.push(2)
v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
+rB:function(a,b,c){var z,y,x
for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+return c},
+xU:function(a,b,c){var z,y,x,w,v,u
z=J.U6(a)
y=z.gB(a)
x=J.U6(b)
@@ -11646,8 +11719,8 @@
u=z.t(a,y)
w=J.xH(w,1)
u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.Wx(c)
y=J.Wx(f)
x=P.J(z.W(c,b),y.W(f,e))
@@ -11667,7 +11740,7 @@
if(typeof f!=="number")return H.s(f)
z=J.U6(d)
for(;e<f;e=r){r=e+1
-J.bi(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
+J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
t=[]
y=new P.Yp(t)
y.$builtinTypeInfo=[null]
@@ -11682,7 +11755,7 @@
y.$builtinTypeInfo=[null]
s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
n=J.WB(n,1)
-J.bi(s.Il,z.t(d,o));++o
+J.wT(s.Il,z.t(d,o));++o
break
case 2:if(s==null){t=[]
y=new P.Yp(t)
@@ -11693,10 +11766,10 @@
case 3:if(s==null){t=[]
y=new P.Yp(t)
y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
+s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.RE(b)
y=z.gWA(b)
z=z.gvH(b)
@@ -11735,12 +11808,12 @@
q.jr=J.WB(q.jr,m)
if(typeof m!=="number")return H.s(m)
s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
z=H.VM([],[G.DA])
for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
+return z},
+u2:function(a,b){var z,y,x,w,v,u
if(b.length===1)return b
z=[]
for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11749,7 +11822,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},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
DA:{
"^":"a;WA>,ok,Il<,jr,dM",
gvH:function(a){return this.jr},
@@ -11780,15 +11853,15 @@
vly:{
"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
"^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
+Wi:function(a,b,c,d){var z=J.RE(a)
if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+return d},
d3:{
"^":"a;",
$isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+X6:{
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y,x,w,v
z=this.b
y=z.wv.rN(a).gAx()
if(!J.de(b,y)){x=this.a
@@ -11797,14 +11870,14 @@
x.a=v
x=v}else x=w
x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
"^":"",
xh:{
"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",307],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",307],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
"^":"",
wn:{
"^":"er;b3,xg,ao,AP,fn",
@@ -11812,7 +11885,7 @@
if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
this.xg=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
sB:[function(a,b){var z,y,x,w,v,u
z=this.ao
y=z.length
@@ -11840,10 +11913,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,361,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
t:[function(a,b){var z=this.ao
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
u:[function(a,b,c){var z,y,x,w
z=this.ao
if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11855,12 +11928,12 @@
w=new P.Yp(x)
w.$builtinTypeInfo=[null]
this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
Mh:function(a,b,c){var z,y,x
z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
y=J.q8(c)
z=this.xg
if(z!=null){x=z.iE
@@ -11921,7 +11994,7 @@
oF:function(a,b,c){var z,y,x,w
if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
y=J.q8(c)
z=this.ao
x=z.length
@@ -11975,7 +12048,7 @@
if(x){x=H.VM(new P.Yp(y),[G.DA])
if(z.Gv>=4)H.vh(z.q7())
z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,348],
+return!0}return!1},"$0","gL6",0,0,126],
$iswn:true,
static:{uX:function(a,b){var z=H.VM([],[b])
return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11983,8 +12056,8 @@
"^":"ar+Pi;",
$isd3:true},
Bj:{
-"^":"Tp:126;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){this.a.xg=null},
$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
"^":"",
HA:{
@@ -11996,18 +12069,18 @@
$isHA:true},
qC:{
"^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",307],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,472,"length",307],
+return z.gB(z)},null,null,1,0,249,"length",82],
gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
+return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
u:[function(a,b,c){var z,y,x,w,v
z=this.Zp
y=z.gB(z)
@@ -12016,9 +12089,8 @@
w=this.AP
if(w!=null){v=w.iE
w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",307],
+if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
FV:function(a,b){J.kH(b,new V.zT(this))},
Rz:function(a,b){var z,y,x,w,v
z=this.Zp
@@ -12050,68 +12122,68 @@
return y}}},
zT:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
"^":"",
-Wa:[function(a,b){var z=J.x(a)
+Wa:function(a,b){var z=J.x(a)
if(!!z.$isqI)return J.de(a.oc,b)
if(!!z.$isHA){z=J.x(b)
if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},
+yf:function(a,b){var z,y,x,w
if(a==null)return
x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$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)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=J.zH(z)
try{if(L.TH(y,b)){x=z.rN(b).gAx()
return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+return},
+ir:function(a,b,c){var z,y,x,w
if(a==null)return!1
x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&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)
+y=J.zH(z)
try{if(L.dR(y,b)){x=c
z.tu(b,2,[x],C.CM)
H.vn(x)
return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
+return!1},
+TH:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb
if(z.x4(b))return!0
if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
+a=L.pY(a)}return!1},
+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
+for(;!J.de(a,$.aA());){y=a.gYK().Fb
if(!!J.x(y.t(0,b)).$isRY)return!0
if(y.x4(z))return!0
if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
+a=L.pY(a)}return!1},
+M6:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
+a=L.pY(a)}return!1},
+pY:function(a){var z,y
try{z=a.gAY()
return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},
+cB:function(a){a=J.JA(a,$.c3(),"")
if(a==="")return!0
if(0>=a.length)return H.e(a,0)
if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
WR:{
"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
E4:function(a){return this.cT.$1(a)},
@@ -12124,7 +12196,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,126,"value",307],
+return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
sP:[function(a,b){var z,y,x,w
z=this.BK
y=z.length
@@ -12140,16 +12212,16 @@
if(w>=z.length)return H.e(z,w)
if(L.ir(x,z[w],b)){z=this.kN
if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,474,243,[],"value",307],
+z[y]=b}},null,null,3,0,251,66,[],"value",82],
k0:[function(a){O.Pi.prototype.k0.call(this,this)
this.ov()
-this.XI()},"$0","gqw",0,0,125],
+this.XI()},"$0","gqw",0,0,21],
ni:[function(a){var z,y
for(z=0;y=this.cs,z<y.length;++z){y=y[z]
if(y!=null){y.ed()
y=this.cs
if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,125],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
Zy:function(a){var z,y,x,w,v,u
if(a==null)a=this.BK.length
z=this.BK
@@ -12235,24 +12307,24 @@
z.d4(a,b,c)
return z}}},
qL:{
-"^":"Tp:115;",
-$1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return},
$isEH:true},
Px:{
-"^":"Tp:475;a,b,c",
+"^":"Tp:253;a,b,c",
$1:[function(a){var z,y
for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
$isEH:true},
C4:{
-"^":"Tp:476;d,e,f",
+"^":"Tp:254;d,e,f",
$1:[function(a){var z,y
for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
$isEH:true},
Md:{
-"^":"Tp:126;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
$isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
"^":"",
Jk:[function(a){var z,y,x
@@ -12263,46 +12335,46 @@
return y}if(!!z.$isQV){z=z.ez(a,R.np())
x=Q.uX(null,null)
x.FV(0,z)
-return x}return a},"$1","np",2,0,115,30,[]],
+return x}return a},"$1","np",2,0,16,27,[]],
km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
"^":"",
-JX:[function(){var z,y
+JX:function(){var z,y
z=document.createElement("style",null)
J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
y=document.querySelector("head")
y.insertBefore(z,y.firstChild)
A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},
+B2:function(){var z,y,x
for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.pP(x.lo).h(0,"polymer-veiled")}},"$0","r8",0,0,null],
-yV:[function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
+yV:function(a){var z,y
z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
+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
+for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
if(y.gFo()||y.gq4())continue
x=J.x(y)
if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
else w=!0
if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},
+yX:function(a,b){var z,y
+do{z=a.gYK().Fb.t(0,b)
y=J.x(z)
if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
+return},
+bc:function(a,b){var z,y
z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
+y=a.gYK().Fb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},
+YG:function(a,b,c){var z,y,x
z=$.cM()
if(z==null||a==null)return
if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12310,8 +12382,8 @@
if(y==null)return
x=J.UQ(y,"ShadowCSS")
if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v,u
if(a==null)return""
w=J.RE(a)
z=w.gmH(a)
@@ -12329,67 +12401,68 @@
if(!!J.x(w).$isNh){y=w
x=new H.XO(u,null)
$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","NI",2,0,null,272,[]],
-Ad:[function(a,b){var z
+return""}else throw u}},
+Ad:function(a,b){var z
if(b==null)b=C.Tu
$.Ej().u(0,a,b)
z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+if(z!=null)J.Or(z)},
+xv:function(a){A.om(a,new A.Mq())},
+om:function(a,b){var z
if(a==null)return
b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
+lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},
+z9:function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
+return $.od().t(0,a)},
+HR:function(a,b,c){var z,y,x
z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
+y=A.Rk(z.gt5(z),b)
if(y!=null){x=y.gMP()
x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
+Rk:function(a,b){var z
+do{z=a.gYK().Fb.t(0,b)
if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","Uy",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+a=a.gAY()}while(a!=null)},
+ZI:function(a,b){var z,y
if(a==null)return
z=document.createElement("style",null)
J.c9(z,J.nJ(a))
y=a.getAttribute("element")
if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
+b.appendChild(z)},
+pX:function(){var z=window
C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},
+al:function(a,b){var z,y,x
z=J.x(b)
y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
z=J.RE(y)
if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
+z=H.vn(a)
+return z.gt5(z)}return y},
+h5:function(a){if(a==null)return C.Qf
if(typeof a==="number"&&Math.floor(a)===a)return C.yw
if(typeof a==="number")return C.O4
if(typeof a==="boolean")return C.HL
if(typeof a==="string")return C.Db
if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},
+Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
z.Gr(A.PB())
return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
+return $.X3},
ei:[function(){var z=document
W.wi(window,z,"polymer-element",C.Bm,null)
A.Jv()
A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,125],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
+$.ax().ml(new A.rD())},"$0","PB",0,0,21],
+Jv:function(){var z,y,x,w,v,u,t
+for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
try{A.pw(z)}catch(v){u=H.Ru(v)
y=u
x=new H.XO(v,null)
@@ -12399,11 +12472,11 @@
t=y
if(t==null)H.vh(P.u("Error must not be null"))
if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},
+GA:function(a,b,c,d){var z,y,x,w,v,u
if(c==null)c=P.Ls(null,null,null,W.YN)
if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
y=$.oK
if(y==null)H.qw(z)
else y.$1(z)
@@ -12417,8 +12490,8 @@
x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
v=$.oK
if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},
+pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
z=$.RQ()
z.toString
y=P.hK(a)
@@ -12440,17 +12513,19 @@
s=y.tP}w=z.ku
v=z.gJf(z)
u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
+y=$.UG().Fb
o=y.t(0,p)
n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+r=p.Fi
+q=z.Fi
+if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
else z=!1
else z=!1
else z=!1
if(z){z=p.r0
m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
+return}z=o.gYK().Fb
z=z.gUQ(z)
y=new A.Fn()
r=new H.U5(z,y)
@@ -12459,7 +12534,7 @@
y=new H.SO(z,y)
y.$builtinTypeInfo=[H.Kp(r,0)]
for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
+z=o.gYK().Fb
z=z.gUQ(z)
y=new A.e3()
r=new H.U5(z,y)
@@ -12473,8 +12548,8 @@
j=l.gYj()
$.Ej().u(0,q,j)
i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},
+ZB:function(a,b){var z,y,x
for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
break}if(!y)return
if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12487,10 +12562,10 @@
z=$.oK
if(z==null)H.qw(x)
else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
+return}a.CI(b.gIf(),C.xD)},
Zj:{
-"^":"Tp:115;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
XP:{
"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12526,7 +12601,7 @@
A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
A.YG(this.gZf(a),y,z)
w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
+v=w.gYK().Fb.t(0,C.c8)
if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
this.Ba(a,y)
A.yV(a.RT)},
@@ -12534,7 +12609,7 @@
$.p2().u(0,b,a)
if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
return!0}return!1},
Ba:function(a,b){var z,y,x,w
for(z=a,y=null;z!=null;){x=J.RE(z)
@@ -12555,7 +12630,7 @@
y=y!=null&&y.x4(w)}else y=!1
if(y)continue
v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
+u=A.yX(b,v)
if(u==null){window
y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
if(typeof console!="undefined")console.warn(y)
@@ -12563,7 +12638,7 @@
if(y==null){y=P.Fl(null,null)
a.Q7=y}y.u(0,v,u)}}},
Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
+z=P.L5(null,null,null,P.qU,P.a)
a.xX=z
y=a.aa
if(y!=null)z.FV(0,J.Ng(y))
@@ -12611,14 +12686,14 @@
q1:function(a,b){var z,y,x,w
if(J.de(b,$.H8()))return
this.q1(a,b.gAY())
-for(z=b.gYK().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
+for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
x=y.gIf().fN
w=J.rY(x)
if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
x=w.Nj(x,0,J.xH(w.gB(x),7))
a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
+qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
b.aN(0,new A.MX(z))
return z},
du:function(a){a.RT=a.getAttribute("name")
@@ -12629,48 +12704,48 @@
C.zb.du(a)
return a}}},
q6:{
-"^":"Tp:126;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return[]},
$isEH:true},
CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
$isEH:true},
LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x
z=J.rY(a)
if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
$isEH:true},
ZG:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
$isEH:true},
Oc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.Kf(a,this.a)},
$isEH:true},
MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
$isEH:true},
-w13:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
+w12:{
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+return z},
$isEH:true},
r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,b,a)},
$isEH:true},
yL:{
"^":"ndx;",
$isyL:true},
zs:{
-"^":["a;KM:X0=-328",function(){return[C.Nw]}],
+"^":["a;KM:X0=-102",function(){return[C.Nw]}],
Pa:function(a){var z
if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
else z=!0
@@ -12735,7 +12810,7 @@
x=y.rN(z.gIf()).gAx()
w=Z.Zh(c,x,A.al(x,z))
if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,255],
B2:function(a,b){var z=J.ak(a.dZ)
if(z==null)return
return z.t(0,b)},
@@ -12787,14 +12862,14 @@
J.AA(M.Ky(a))
y=this.gIW(a)
for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,125],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
BT:function(a,b){var z
if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
z=a.oq
if(z!=null){z.TP(0)
a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
+A.om(this.gIW(a),new A.TV())},
oW:function(a){return this.BT(a,null)},
Xl:function(a){var z,y,x,w,v
z=J.xR(a.dZ)
@@ -12807,7 +12882,7 @@
x=P.L5(null,null,null,P.wv,A.bS)
for(w=J.GP(b);w.G();){v=w.gl()
if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
+J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
rJ:function(a,b,c,d){var z,y,x,w,v
z=J.xR(a.dZ)
if(z==null)return
@@ -12824,7 +12899,7 @@
w.Bd=x.Al(P.v3())
x=H.d(J.GL(b))+"__array"
v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
a.Sa=v}v.u(0,x,w)}},
l5:function(a,b){var z=a.Sa.Rz(0,b)
if(z==null)return!1
@@ -12861,7 +12936,7 @@
u=J.UQ($.QX(),v)
t=w.t(0,u!=null?u:v)
if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
ea:function(a,b,c,d){var z,y
z=$.SS()
y=z.Im(C.R5)
@@ -12877,31 +12952,31 @@
$isD0:true,
$isKV:true},
WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+"^":"Tp:75;a",
+$2:function(a,b){var z=J.Vs(this.a)
if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
$isEH:true},
Xi:{
-"^":"Tp:126;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b",
+$0:function(){return this.b},
$isEH:true},
TV:{
-"^":"Tp:115;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},
$isEH:true},
Mq:{
-"^":"Tp:115;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
$isEH:true},
Oa:{
-"^":"Tp:126;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return new A.bS(this.a.jL,null)},
$isEH:true},
n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;b,c,d,e",
+$2:function(a,b){var z,y,x
z=this.e
if(z!=null&&z.x4(a))J.Jr(this.b,a)
z=this.d
@@ -12910,14 +12985,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])}},"$2",null,4,0,null,12,[],483,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
$isEH:true},
xf:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
L6:{
-"^":"Tp:300;a,b",
+"^":"Tp:75;a,b",
$2:[function(a,b){var z,y,x
z=$.SS()
if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12926,10 +13001,10 @@
if(x!=null)y=x
z=J.f5(b).t(0,y)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
$isEH:true},
Rs:{
-"^":"Tp:115;c,d,e",
+"^":"Tp:16;c,d,e",
$1:[function(a){var z,y,x,w,v,u
z=this.e
y=A.z9(z)
@@ -12941,25 +13016,26 @@
u=L.Sk(v,C.xB.yn(w,1),null)
w=u.gP(u)}else v=y
u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,316,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
$isEH:true},
uJ:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
$isEH:true},
hm:{
-"^":"Tp:115;",
-$1:[function(a){var z,y,x
+"^":"Tp:16;",
+$1:[function(a){var z,y,x,w
z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-x.h(0,"polymer-unveil")
-x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,116,[],"call"],
+w=J.w1(x)
+w.h(x,"polymer-unveil")
+w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Ji:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"$1",null,2,0,null,116,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Bf:{
"^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -12974,15 +13050,15 @@
if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
z=this.dY
if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,485,265,[]],
+return}}},"$1","giz",2,0,261,252,[]],
bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
oX:function(a){this.Pa(a)},
static:{G7:function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -12992,7 +13068,7 @@
C.Iv.oX(a)
return a}}},
jpR:{
-"^":["qE+zs;KM:X0=-328",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
$iszs:true,
$isTU:true,
$isd3:true,
@@ -13014,105 +13090,104 @@
if(z!=null){z.ed()
this.ih=null}},
tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,125]},
+this.Ws()}},"$0","gv6",0,0,21]},
V3:{
"^":"a;ns",
$isV3:true},
rD:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){var z=$.mC().MM
if(z.Gv!==0)H.vh(P.w("Future already completed"))
z.OH(null)
-return},"$1",null,2,0,null,116,[],"call"],
+return},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Fn:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isRS},
$isEH:true},
e3:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isMs},
$isEH:true},
pM:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
$isEH:true},
Mh:{
"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
"^":"",
-Zh:[function(a,b,c){var z,y,x
+Zh:function(a,b,c){var z,y,x
z=J.UQ($.CT(),J.Ba(c))
if(z!=null)return z.$2(a,b)
try{y=C.xr.kV(J.JA(a,"'","\""))
return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
+return a}},
W6:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,null,null)
z.u(0,C.AZ,new Z.Lf())
z.u(0,C.ok,new Z.fT())
z.u(0,C.N4,new Z.pp())
z.u(0,C.Kc,new Z.nl())
z.u(0,C.PC,new Z.ik())
z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return z},
$isEH:true},
Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
pp:{
-"^":"Tp:300;",
+"^":"Tp:75;",
$2:[function(a,b){var z,y
try{z=P.Gl(a)
return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],487,[],"call"],
+return b}},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
mf:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a},
$isEH:true},
LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
HK:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b},
$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
"^":"",
ul:[function(a){var z=J.x(a)
if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,121,[]],
+return z},"$1","qP",2,0,54,70,[]],
PX:[function(a){var z=J.x(a)
if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,121,[]],
+return z},"$1","Fx",2,0,54,70,[]],
o8:{
-"^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.de(this.a.t(0,a),!0)},
$isEH:true},
ex:{
-"^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
$isEH:true},
e9:{
"^":"T4p;",
op:[function(a,b,c){var z,y,x
-if(a==null)return
z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
y=new U.tc()
y=new T.FX(y,z,null,null)
@@ -13124,23 +13199,23 @@
if(M.wR(c)){z=J.x(b)
z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,263],
CE:function(a){return new T.uK(this)}},
Xy:{
-"^":"Tp:300;a,b,c",
+"^":"Tp:75;a,b,c",
$2:[function(a,b){var z
if(!J.x(a).$isz6){z=this.a.nF
a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
$isEH:true},
uK:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z
if(!!J.x(a).$isz6)z=a
else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
$isEH:true},
mY:{
"^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13149,12 +13224,12 @@
z=this.Y7
if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,115,121,[]],
-gP:[function(a){return this.Y7},null,null,1,0,126,"value",307],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
+gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
sP:[function(a,b){var z,y,x
try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,115,121,[],"value",307],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
yB:function(a,b,c){var z,y,x,w
y=this.Cu
y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13167,14 +13242,14 @@
z.yB(a,b,c)
return z}}},
GX:{
-"^":"Tp:115;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
mB:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z=P.L5(null,null,null,null,null)
z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,325,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
$isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
"^":"",
XF:{
@@ -13187,14 +13262,14 @@
bX:{
"^":"Tp;a,b",
$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,325,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
"^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},
+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)
@@ -13222,79 +13297,79 @@
if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
if(s)J.kW(p,u,b)
else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,121,[]],
+H.vn(b)}},
+ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},
+Uf:{
+"^":"Tp:75;",
+$2:function(a,b){return J.WB(a,b)},
+$isEH:true},
wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.xH(a,b)},
$isEH:true},
zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.vX(a,b)},
$isEH:true},
W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.FW(a,b)},
$isEH:true},
MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.de(a,b)},
$isEH:true},
YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return!J.de(a,b)},
$isEH:true},
DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.z8(a,b)},
$isEH:true},
lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.J5(a,b)},
$isEH:true},
Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.u6(a,b)},
$isEH:true},
Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.Bl(a,b)},
$isEH:true},
w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0||b===!0},
$isEH:true},
w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0&&b===!0},
$isEH:true},
w5:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
+"^":"Tp:75;",
+$2:function(a,b){var z=H.Og(P.a)
z=H.KT(z,[z]).BD(b)
if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,117,[],128,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},
+$isEH:true},
+w7:{
+"^":"Tp:16;",
+$1:function(a){return a},
$isEH:true},
w10:{
-"^":"Tp:115;",
-$1:[function(a){return a},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Z7(a)},
$isEH:true},
w11:{
-"^":"Tp:115;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-w12:{
-"^":"Tp:115;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a!==!0},
$isEH:true},
c4:{
-"^":"Tp:126;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
$isEH:true},
z6:{
"^":"a;eT>,k8<,bq,G9",
@@ -13308,7 +13383,8 @@
else{z=this.bq.Zp
if(z.x4(b))return K.ci(z.t(0,b))
else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
+z=this.gCH()
+x=Z.y1(z.gt5(z),y)
z=J.x(x)
if(!z.$isRY)w=!!z.$isRS&&x.glT()
else w=!0
@@ -13316,17 +13392,19 @@
else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
if(z!=null)return K.ci(z.t(0,b))
else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
+tI:function(a){var z,y
if(J.de(a,"this"))return
else{z=this.bq
if(z.Zp.x4(a))return z
else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
+tg:function(a,b){var z,y
if(this.bq.Zp.x4(b))return!0
else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
if(z!=null)return z.tg(0,b)
return!1},
$isz6:true},
@@ -13375,13 +13453,13 @@
return x},
ZR:function(a){var z,y,x,w,v
z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+if(y!=null)H.bQ(y,new K.Os(v))
return v},
ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
o0:function(a){var z,y
@@ -13392,7 +13470,7 @@
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))
+x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(x)
y.sbO(x)
return x},
@@ -13416,16 +13494,16 @@
y.sbO(x)
return x}},
Os:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
a.sbO(z)
-return z},"$1",null,2,0,null,117,[],"call"],
+return z},
$isEH:true},
B8:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+return z},
$isEH:true},
Wh:{
"^":"Ay;KL,bO,tj,Lv,k6",
@@ -13453,11 +13531,11 @@
$iskB:true,
$ishw:true},
ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},
$isEH:true},
-qR:{
+jV:{
"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
RR:function(a,b){return b.YV(this)},
$asAy:function(){return[U.wk]},
@@ -13479,12 +13557,12 @@
$isw6:true,
$ishw:true},
Qv:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
Xm:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
mv:{
"^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13520,8 +13598,8 @@
$isuk:true,
$ishw:true},
uA:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
vl:{
"^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13541,12 +13619,12 @@
$isx9:true,
$ishw:true},
Li:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
WK:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
iT:{
"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13556,18 +13634,18 @@
return}y=this.Jn.gLv()
x=J.U6(z)
this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
RR:function(a,b){return b.CU(this)},
$asAy:function(){return[U.zX]},
$iszX:true,
$ishw:true},
-tE:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+ja:{
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
ey:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
$isEH:true},
fa:{
"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13591,16 +13669,16 @@
$isJy:true,
$ishw:true},
WW:{
-"^":"Tp:115;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
$isEH:true},
vQ:{
-"^":"Tp:476;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:254;a,b,c",
+$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
a9:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
VA:{
"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13618,15 +13696,15 @@
$isX7:true,
$ishw:true},
J1:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
fk:{
"^":"a;F5,bm",
$isfk:true},
wL:{
-"^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
+"^":"a:16;lR,ex",
+$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
$iswL:true,
$isEH:true},
B0:{
@@ -13635,27 +13713,27 @@
$isB0:true,
static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
"^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
if(a==null?b==null:a===b)return!0
if(a==null||b==null)return!1
if(a.length!==b.length)return!1
for(z=0;z<a.length;++z){y=a[z]
if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},
+au:function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},
+Zm:function(a,b){var z=J.WB(a,b)
if(typeof z!=="number")return H.s(z)
a=536870911&z
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+xk:function(a){if(typeof a!=="number")return H.s(a)
a=536870911&a+((67108863&a)<<3>>>0)
a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
+return 536870911&a+((16383&a)<<15>>>0)},
tc:{
"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
F2:function(a,b,c){return new U.Jy(a,b,c)}},
hw:{
"^":"a;",
@@ -13796,8 +13874,8 @@
return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
$isJy:true},
xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return U.Zm(a,J.v1(b))},
$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
"^":"",
FX:{
@@ -13823,9 +13901,12 @@
this.w5()
w=this.o9()
this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
+a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
+if(typeof z!=="number")return z.F()
+if(typeof b!=="number")return H.s(b)
+z=z>=b}else z=!1
+if(z)a=this.Tw(a)
+else break}return a},
qL:function(a,b){var z,y
z=J.x(b)
if(!!z.$isw6){z=z.gP(b)
@@ -13834,12 +13915,17 @@
y=b.gre()
this.Sk.toString
return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
+Tw:function(a){var z,y,x,w
z=this.fL.lo
this.w5()
y=this.WT()
while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
+w=z.gG8()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
else x=!1
if(!x)break
y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -13949,17 +14035,17 @@
return y},
tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
"^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
Ae:{
-"^":"a;vH>-317,P>-493",
+"^":"a;vH>-93,P>-265",
n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
$isAe:true,
"@":function(){return[C.Nw]},
"<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
"+IndexedValue":[0],
Bt:{
"^":"mW;ty",
@@ -13988,19 +14074,19 @@
return!1},
$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
"^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
+y1:function(a,b){var z,y,x
+if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
z=a.gAY()
if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
"^":"",
-wX:[function(a){switch(a){case 102:return 12
+wX:function(a){switch(a){case 102:return 12
case 110:return 10
case 114:return 13
case 116:return 9
case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
+default:return a}},
Pn:{
"^":"a;fY>,P>,G8<",
bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14098,7 +14184,7 @@
"^":"",
fr:{
"^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
d2:{
"^":"fr;",
W9:function(a){return this.xn(a)},
@@ -14111,8 +14197,7 @@
this.xn(a)},
ZR:function(a){var z
J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
this.xn(a)},
ti:function(a){return this.xn(a)},
o0:function(a){var z
@@ -14132,14 +14217,14 @@
this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
"^":"",
NQ:{
-"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,461,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
"@":function(){return[C.Is]},
static:{Zo:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -14147,36 +14232,36 @@
a.X0=w
C.Cc.ZL(a)
C.Cc.oX(a)
-return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[495],
-V23:{
+return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[268],
+V24:{
"^":"uL+Pi;",
$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
"^":"",
ov:{
-"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
-giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
+"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
+gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
+giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
+gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
+gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
+this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
qEQ:[function(a,b){var z,y
z=a.QV
if(z==null||a.FZ!==!0)return"min-width:32px;"
y=J.UQ(z.gu9(),b.gRd())
if(y==null)return"min-width:32px;"
if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
VH:[function(a){var z,y,x,w,v
if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
return}this.ct(a,C.Cv,0,1)
@@ -14184,15 +14269,15 @@
z=a.QV.q6(a.t7)
y=a.hX
x=a.QV
-if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,125,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
"@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,ze<-85",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
z=R.Jk([])
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.FZ=!1
@@ -14202,48 +14287,48 @@
a.X0=v
C.HD.ZL(a)
C.HD.oX(a)
-return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[503],
-V24:{
+return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[277],
+V25:{
"^":"uL+Pi;",
$isd3:true},
ZJ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
$isEH:true},
-"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
"^":"",
-knI:{
-"^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
+kn:{
+"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
gD5:[function(a){var z=a.tY
if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
r6:[function(a,b){var z=a.tY
if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
goc:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
if(J.J5(a.jJ,0)){z=J.iS(a.tY)
y=a.tY
if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
gO3:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
if(J.J5(a.jJ,0)){z=J.iS(a.tY)
y=a.tY
if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
"@":function(){return[C.Ur]},
static:{Th:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.jJ=-1
@@ -14253,31 +14338,31 @@
a.X0=w
C.c0.ZL(a)
C.c0.oX(a)
-return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[504],
+return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[278],
x4:{
"^":"xI+Pi;",
$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
"^":"",
fI:{
-"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,498,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
-gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
+"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
+gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Uz
if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
"@":function(){return[C.I3]},
static:{Ry:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.HJ=!1
@@ -14286,9 +14371,9 @@
a.X0=w
C.cJ.ZL(a)
C.cJ.oX(a)
-return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[505],
-V25:{
+return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[279],
+V26:{
"^":"uL+Pi;",
$isd3:true}}],["service","package:observatory/service.dart",,D,{
"^":"",
@@ -14308,25 +14393,57 @@
v.$builtinTypeInfo=[w]
v=new Q.wn(null,null,v,null,null)
v.$builtinTypeInfo=[w]
-w=J.bU
+w=P.KN
u=D.N8
t=new V.qC(P.Py(null,null,null,w,u),null,null)
t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
break
case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
z.$builtinTypeInfo=[null,null]
z=R.Jk(z)
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
v=[]
v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.Pp)
+u=D.U4
+t=[]
+t.$builtinTypeInfo=[u]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[u]
+u=P.L5(null,null,null,P.qU,P.CP)
u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
+case"Library":z=D.U4
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+z=D.rj
+w=[]
+w.$builtinTypeInfo=[z]
+w=new Q.wn(null,null,w,null,null)
+w.$builtinTypeInfo=[z]
+z=D.SI
+v=[]
+v.$builtinTypeInfo=[z]
+v=new Q.wn(null,null,v,null,null)
+v.$builtinTypeInfo=[z]
+z=D.SI
+u=[]
+u.$builtinTypeInfo=[z]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[z]
+z=D.SI
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
+s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
break
case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
@@ -14337,26 +14454,26 @@
x.$builtinTypeInfo=[z]
x=new Q.wn(null,null,x,null,null)
x.$builtinTypeInfo=[z]
-z=J.bU
-w=J.bU
+z=P.KN
+w=P.KN
v=new V.qC(P.Py(null,null,null,z,w),null,null)
v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
z.$builtinTypeInfo=[null,null]
s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
return s},
-D5:[function(a){var z
+D5:function(a){var z
if(a!=null){z=J.U6(a)
z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
+return z},
+ES:function(a,b){var z=J.x(a)
if(!!z.$isSI)return
if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},
+Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+f3:function(a,b){var z,y,x,w,v,u
for(z=a.ao,y=0;y<z.length;++y){x=z[y]
w=J.x(x)
v=!!w.$isqC
@@ -14364,29 +14481,29 @@
else u=!1
if(u)a.u(0,y,b.Zr(x))
else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
af:{
"^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,507,"vm",307],
+return z.gzf(z)},null,null,1,0,281,"vm",82],
gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,306,"isolate",307],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",307],
+return z.gF1(z)},null,null,1,0,81,"isolate",82],
+gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
+gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
gPj:[function(a){var z,y
z=this.gF1(this)
y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",307],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",307],
-sHP:[function(a){},null,null,3,0,115,99,[],"hashLink",307],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
+sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
gox:function(a){return this.kT},
gUm:function(){return!1},
gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",307],
+goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
xW:function(a){if(this.kT)return P.Ab(this,null)
return this.VD(0)},
VD:function(a){var z
@@ -14407,7 +14524,7 @@
this.bF(0,a,y)},
$isaf:true},
Pa:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
$1:[function(a){var z,y
z=J.UQ(a,"type")
y=J.rY(z)
@@ -14415,31 +14532,31 @@
y=this.a
if(!J.de(z,y.mQ))return D.ac(y.P3,a)
y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
jI:{
-"^":"Tp:126;b",
+"^":"Tp:22;b",
$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
$isEH:true},
u0g:{
"^":"af;"},
-zM:{
+H6:{
"^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,507,"vm",307],
-gF1:[function(a){return},null,null,1,0,306,"isolate",307],
+gzf:[function(a){return this},null,null,1,0,281,"vm",82],
+gF1:[function(a){return},null,null,1,0,81,"isolate",82],
gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,509,"isolates",307],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
+return z.gUQ(z)},null,null,1,0,284,"isolates",82],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
+gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
+gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
+gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
+gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
+gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
bZ:function(a){var z,y,x,w
z=$.rc().R4(0,a)
if(z==null)return
@@ -14477,7 +14594,13 @@
return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
if(v!=null)return J.am(v)
return this.jU(z.a).ml(new D.kk(z,this))},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+N7:function(a){var z
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Vu(D.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
+if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
+else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
+return P.Ab(a,null)},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
bF:function(a,b,c){var z,y
if(c)return
this.kT=!0
@@ -14495,7 +14618,7 @@
this.xA(z.t(b,"isolates"))},
xA:function(a){var z,y,x,w,v,u
z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
+y=P.L5(null,null,null,P.qU,D.bv)
for(x=J.GP(a);x.G();){w=x.gl()
v=J.UQ(w,"id")
u=z.t(0,v)
@@ -14509,79 +14632,72 @@
this.A4.u(0,"vm",this)
var z=P.EF(["id","vm","type","@VM"],null,null)
this.eC(R.Jk(z))},
-$iszM:true},
+$isH6:true},
O1w:{
"^":"u0g+Pi;",
$isd3:true},
MZ:{
-"^":"Tp:115;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){if(!J.x(a).$isH6)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
$isEH:true},
oe:{
-"^":"Tp:115;b,c",
+"^":"Tp:16;b,c",
$1:[function(a){var z
if(a==null)return this.b
z=this.c
if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
$isEH:true},
kk:{
-"^":"Tp:508;a,d",
+"^":"Tp:283;a,d",
$1:[function(a){var z,y
z=this.d
y=D.ac(z,a)
if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
QZ:{
-"^":"Tp:126;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e",
+$0:function(){return this.e},
$isEH:true},
Ey:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v
-try{w=C.xr.kV(a)
-z=R.Jk(w)
-if(!D.D5(z)){w=P.EF(["type","ServiceException","id","","kind","FormatException","response",z,"message","Top level service responses must be service maps."],null,null)
-w=R.Jk(w)
-w=P.Vu(D.ac(this.a,w),null,null)
-return w}if(J.de(J.UQ(z,"type"),"ServiceError")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}else if(J.de(J.UQ(z,"type"),"ServiceException")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}return z}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-P.JS(y)
-P.JS(x)
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){var z,y,x,w
+try{x=C.xr.kV(a)
+z=R.Jk(x)
+x=this.a.N7(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
+x=R.Jk(x)
+return P.Vu(D.ac(this.a,x),null,null)}},"$1",null,2,0,null,190,[],"call"],
$isEH:true},
tm:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){var z=this.b.G2
if(z.Gv>=4)H.vh(z.q7())
z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
$isEH:true},
Gk:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
-mR:{
-"^":"Tp:115;c",
+I2:{
+"^":"Tp:16;c",
$1:[function(a){var z=this.c.Li
if(z.Gv>=4)H.vh(z.q7())
z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,315,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,[],"call"],
$isEH:true},
-bp:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+mR:{
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.am(b)},
$isEH:true},
e5:{
"^":"a;SP,hw<,wZ",
@@ -14627,43 +14743,43 @@
for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
v=Array(v)
v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
+v.$builtinTypeInfo=[P.KN]
u=new D.e5(0,v,0)
u.CJ()
x.push(u)}if(typeof v!=="number")return H.s(v)
z=Array(v)
z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.e5(0,H.VM(z,[P.KN]),0)
this.yP=z
z.Bv(y)
return}z=this.RP
if(typeof z!=="number")return H.s(z)
z=Array(z)
z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
+u=new D.e5(a,H.VM(z,[P.KN]),0)
u.nZ(y,this.yP.hw)
this.yP.wY(0,y)
z=this.lI
z.push(u)
if(z.length>this.hD)C.Nm.KI(z,0)}},
bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
-gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
+gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
+ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
gPj:function(a){return this.KG},
gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
+geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
+gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
+gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
N3:function(a){var z,y,x,w
z=H.VM([],[D.kx])
y=J.U6(a)
@@ -14680,8 +14796,8 @@
x=z.t(a,"samples")
for(z=J.GP(y);z.G();){w=z.gl()
J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
+Ms:function(a){return this.cv("coverage").ml(this.gm6())},
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
Zr:function(a){var z,y,x
if(a==null)return
z=J.UQ(a,"id")
@@ -14694,35 +14810,37 @@
cv:function(a){var z=this.A4.t(0,a)
if(z!=null)return J.am(z)
return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
-gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
-gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
-at:function(a,b){return this.gNh(this).$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
+sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
+gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
+gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
+goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
+gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
+gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
+gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
+gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
+gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
+gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
+guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+at:function(a,b){return this.guT(this).$1(b)},
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
+gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
z=J.U6(b)
y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.wT,this.Er,y)
+this.Er=F.Wi(this,C.dH,this.Er,y)
y=z.t(b,"name")
this.KT=F.Wi(this,C.YS,this.KT,y)
y=z.t(b,"name")
@@ -14732,7 +14850,7 @@
D.ES(b,this)
if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.iG,this.v9,y)
if(z.t(b,"entry")!=null){y=z.t(b,"entry")
this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14787,8 +14905,11 @@
this.EY=y
y=this.l2!==!0&&this.No!==!0&&y!==!0
this.eU=F.Wi(this,C.q2,this.eU,y)
-z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},
+y=z.t(b,"error")
+this.yv=F.Wi(this,C.YU,this.yv,y)
+J.U2(this.DC)
+for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
+J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
KQ:function(a,b){this.FF=0
this.bj=a
@@ -14830,51 +14951,55 @@
"^":"u0g+Pi;",
$isd3:true},
iz:{
-"^":"Tp:115;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:16;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
a.Du=0
a.fF=0
a.mM=F.Wi(a,C.eF,a.mM,"")
a.qH=F.Wi(a,C.uU,a.qH,"")
J.U2(a.VS)
J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+J.U2(a.Oo)}},
$isEH:true},
oa:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
$isEH:true},
KQ:{
-"^":"Tp:508;a,b",
+"^":"Tp:283;a,b",
$1:[function(a){var z,y
z=this.a
y=D.ac(z,a)
if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
Ai:{
-"^":"Tp:126;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+"^":"Tp:22;c",
+$0:function(){return this.c},
$isEH:true},
Qq:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,300,[],"call"],
+$isEH:true},
+Yn:{
+"^":"Tp:75;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
$isEH:true},
AP:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
$1:[function(a){var z,y
z=Date.now()
new P.iP(z,!1).EK()
y=this.a.KJ
y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,212,[],"call"],
$isEH:true},
SI:{
"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.VZ)},
-gM8:function(){return this.gUm()},
+gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
+gM8:function(){return!1},
bu:function(a){return P.vW(this.RF)},
bF:function(a,b,c){var z,y,x
this.kT=!c
@@ -14906,13 +15031,13 @@
gB:function(a){var z=this.RF.Zp
return z.gB(z)},
BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,348],
+return z.BN(z)},"$0","gDx",0,0,126],
nq:function(a,b){var z=this.RF
return z.nq(z,b)},
ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,125],
+k0:[function(a){return},"$0","gqw",0,0,21],
ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,125],
+return},"$0","gl1",0,0,21],
gUj:function(a){var z=this.RF
return z.gUj(z)},
gnz:function(a){var z,y
@@ -14929,14 +15054,14 @@
static:{"^":"VZ"}},
pD:{
"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gFA:[function(a){return this.jo},null,null,1,0,329,"exception",307,308],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,331,30,[],"exception",307],
-gK7:[function(){return this.Ne},null,null,1,0,329,"stacktrace",307,308],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,331,30,[],"stacktrace",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
+gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
+sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
bF:function(a,b,c){var z,y,x
z=J.U6(b)
y=z.t(b,"kind")
@@ -14957,10 +15082,10 @@
$isd3:true},
fJ:{
"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
bF:function(a,b,c){var z,y
this.kT=!0
z=J.U6(b)
@@ -14978,12 +15103,12 @@
$isd3:true},
hR:{
"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
bF:function(a,b,c){var z,y
z=J.U6(b)
y=z.t(b,"kind")
@@ -15000,25 +15125,70 @@
w8F:{
"^":"af+Pi;",
$isd3:true},
+U4:{
+"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+gUm:function(){return!0},
+gM8:function(){return!1},
+bF:function(a,b,c){var z,y,x,w
+z=J.U6(b)
+y=z.t(b,"url")
+x=F.Wi(this,C.Fh,this.dj,y)
+this.dj=x
+if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
+w=J.U6(y)
+x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.bN,y)
+this.bN=y
+if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
+y=z.t(b,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+if(c)return
+this.kT=!0
+y=this.P3
+D.ES(b,y.gF1(y))
+y=this.JJ
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"imports"))
+y=this.XR
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"scripts"))
+y=this.DD
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"classes"))
+y=this.Z3
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"variables"))
+y=this.mu
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"functions"))},
+$isU4:true},
+V4b:{
+"^":"af+Pi;",
+$isd3:true},
c2:{
-"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
$isc2:true},
rj:{
-"^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,310,"library",307,308],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
+"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
sVB:[function(a){var z=this.wJ
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
+gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
sug:[function(a){var z=this.lx
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
gUm:function(){return!0},
gM8:function(){return!0},
rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15092,29 +15262,30 @@
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]))}}},
-V4b:{
+x.h(y,new D.c2(v,z[w]))}},
+$isrj:true},
+Zqa:{
"^":"af+Pi;",
$isd3:true},
N8:{
"^":"a;Yu<,Du<,fF<",
$isN8:true},
Z9:{
-"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
+sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
Nw:[function(){var z,y
z=this.LR
y=J.x(z)
if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
M2Y:[function(){var z,y
z=this.VF
y=J.x(z)
if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
bR:function(a){var z,y
this.ar=F.Wi(this,C.fX,this.ar,null)
z=this.VF
@@ -15123,33 +15294,33 @@
if(y==null)return
this.ar=F.Wi(this,C.fX,this.ar,a)
z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
+this.MT=F.Wi(this,C.oI,this.MT,z)},
$isZ9:true},
Q4:{
-"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
sPO:[function(a){var z=this.dh
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
+this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
xt:[function(){var z,y
z=this.Yu
y=J.x(z)
if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",307],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
Io:[function(a){var z
if(a==null)return""
z=J.UQ(a.gOo(),this.Yu)
if(z==null)return""
if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
HU:[function(a){var z
if(a==null)return""
z=J.UQ(a.gOo(),this.Yu)
if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
eQ:function(){var z,y,x,w
y=J.uH(this.L4," ")
x=y.length
@@ -15178,18 +15349,18 @@
this.nq(this,z)}this.dh=u
return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
+static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
WAE:{
"^":"a;uX",
bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
+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())},"$1","Ma",2,0,null,94,[]]}},
+throw H.b(P.hS())}}},
Vi:{
"^":"a;tT>,Av<",
$isVi:true},
@@ -15197,26 +15368,28 @@
"^":"a;tT>,Av<,wd>,Jv",
$ist9:true},
kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",307],
-gL1E:[function(){return this.Ni},null,null,1,0,329,"objectPool",307,308],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
-gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
+glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
+gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
+gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
+gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
+gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
+sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
gUm:function(){return!0},
gM8:function(){return!0},
tx:[function(a){var z,y
this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
QW:function(){if(this.ar!=null)return
if(!J.de(this.J6,C.l8))return
var z=this.MO
@@ -15254,15 +15427,16 @@
z=J.U6(b)
this.oc=z.t(b,"user_name")
this.zz=z.t(b,"name")
+y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.MH=F.Wi(this,C.FQ,this.MH,y)
y=D.CQ(z.t(b,"kind"))
this.J6=F.Wi(this,C.fy,this.J6,y)
this.vg=H.BU(z.t(b,"start"),16,null)
this.Mb=H.BU(z.t(b,"end"),16,null)
y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+x=y.gF1(y).Zr(z.t(b,"function"))
this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
+y=y.gF1(y).Zr(z.t(b,"object_pool"))
this.Ni=F.Wi(this,C.xG,this.Ni,y)
w=z.t(b,"disassembly")
if(w!=null)this.xs(w)
@@ -15273,8 +15447,8 @@
this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
xs:function(a){var z,y,x,w,v,u,t,s,r
z=this.va
y=J.w1(z)
@@ -15302,7 +15476,7 @@
v=z.t(a,"tryIndex")
u=J.rr(z.t(a,"kind"))
for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
DZ:function(a){var z
for(z=J.GP(a);z.G();)this.Ry(z.gl())},
@@ -15319,43 +15493,43 @@
w+=3}},
tg:function(a,b){J.J5(b,this.vg)
return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
$iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
-Zqa:{
+static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+D3i:{
"^":"af+Pi;",
$isd3:true},
Em:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y
z=this.a
y=J.UQ(z.MO,"script")
if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
$isEH:true},
fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
$isEH:true},
UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y
z=J.x(b)
y=!!z.$isqC
if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},
$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
"^":"",
zMr:{
-"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
+"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
"@":function(){return[C.uvO]},
static:{hp:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15363,21 +15537,21 @@
a.X0=w
C.SX.ZL(a)
C.SX.oX(a)
-return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[537],
-V26:{
+return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[314],
+V27:{
"^":"uL+Pi;",
$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
"^":"",
nk:{
-"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
+"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
"@":function(){return[C.vr3]},
static:{dS:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15385,30 +15559,30 @@
a.X0=w
C.Vd.ZL(a)
C.Vd.oX(a)
-return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[541],
-V27:{
+return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[318],
+V28:{
"^":"uL+Pi;",
$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
"^":"",
XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
z6:function(a,b){var z
N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
z=this.Jf
if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
dT:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){var z
N.Jx("").hh("HttpRequest.getString failed.")
z=J.RE(a)
z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
$isEH:true},
ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
q3:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.UQ(z.gRn(a),"id")
@@ -15418,7 +15592,7 @@
z=this.ja
v=z.t(0,y)
z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
z6:function(a,b){var z,y,x
z=""+this.yb
y=P.Fl(null,null)
@@ -15434,9 +15608,9 @@
N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
"^":"",
ob:{
-"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"object",307,330],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
+"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
hu:[function(a){var z
switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
J.CJ(z,a.mC)
@@ -15462,7 +15636,7 @@
case"HeapMap":z=W.r3("heap-map",null)
J.Nf(z,a.mC)
return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
J.ti(z,a.mC)
return z
case"Isolate":z=W.r3("isolate-view",null)
@@ -15491,8 +15665,8 @@
return z
default:z=W.r3("json-view",null)
J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
-fa:[function(a,b){var z,y,x
+return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+xJ:[function(a,b){var z,y,x
this.pj(a)
z=a.mC
if(z==null){N.Jx("").To("Viewing null object.")
@@ -15500,12 +15674,12 @@
x=this.hu(a)
if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,115,242,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
"@":function(){return[C.Tl]},
static:{zy:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15513,38 +15687,40 @@
a.X0=w
C.ZO.ZL(a)
C.ZO.oX(a)
-return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[543],
-V28:{
+return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[321],
+V29:{
"^":"uL+Pi;",
$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
"^":"",
xI:{
-"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"ref",307,330],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
-aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
+gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+P9:[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))},"$1","gLe",2,0,169,242,[],"refChanged"],
+this.ct(a,C.KG,0,1)
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
gO3:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
+return z.gHP()},null,null,1,0,87,"url"],
gOL:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
+return J.F8(z)},null,null,1,0,87,"serviceId"],
gD5:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
goc:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
+return J.O6(z)},null,null,1,0,87,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
"@":function(){return[C.JD]},
static:{lK:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -15553,27 +15729,27 @@
a.X0=w
C.wU.ZL(a)
C.wU.oX(a)
-return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[544],
+return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[322],
Vfx:{
"^":"uL+Pi;",
$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
"^":"",
Uj:{
-"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
-gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
+"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
+gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
+gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"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
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15581,21 +15757,21 @@
a.X0=w
C.fA.ZL(a)
C.fA.oX(a)
-return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[546],
+return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[324],
Bc:{
"^":"xc+Pi;",
$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
"^":"",
xT:{
-"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
+"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
"@":function(){return[C.Xv]},
static:{an:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15603,22 +15779,22 @@
a.X0=w
C.dX.ZL(a)
C.dX.oX(a)
-return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[548],
-V29:{
+return a},null,null,0,0,22,"new StackFrameElement$created"]}},
+"+StackFrameElement":[326],
+V30:{
"^":"uL+Pi;",
$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
"^":"",
uwf:{
-"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"trace",307,330],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.js]},
static:{bV:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15626,18 +15802,18 @@
a.X0=w
C.bg.ZL(a)
C.bg.oX(a)
-return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[549],
-V30:{
+return a},null,null,0,0,22,"new StackTraceElement$created"]}},
+"+StackTraceElement":[327],
+V31:{
"^":"uL+Pi;",
$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
"^":"",
-IP:[function(a){var z=J.x(a)
+IP:function(a){var z=J.x(a)
if(!!z.$isQl)return C.i3.f0(a)
switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},
+iX:function(a,b){var z,y,x,w,v,u,t,s
z=M.pN(a,b)
y=J.x(a)
if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15648,8 +15824,8 @@
if(s==null)continue
if(u==null)u=P.Py(null,null,null,null,null)
u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},
+HP:function(a,b,c,d,e){var z,y,x
if(b==null)return
if(b.gN2()!=null){z=b.gN2()
M.Ky(a).wh(z)
@@ -15658,17 +15834,17 @@
if(z.gwd(b)==null)return
y=b.gTe()-a.childNodes.length
for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
+bM:function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+return},
+pN:function(a,b){var z,y
z=J.x(a)
if(!!z.$iscv)return M.F5(a,b)
if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},
+F5:function(a,b){var z,y,x
z={}
z.a=null
z.b=!1
@@ -15678,8 +15854,8 @@
if(y==null){x=[]
z.a=x
y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},
+Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
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()
@@ -15708,8 +15884,8 @@
t.push(L.Sk(j,l,null))}o.wE(0)
p=o
s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},
+F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
z=a.length
if(z===0)return
for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15724,14 +15900,14 @@
v=t+2}if(v===z)w.push("")
z=new M.HS(w,null)
z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
+return z},
+SH:function(a,b){var z,y
z=a.firstChild
if(z==null)return
y=new M.yp(z,a.lastChild,b)
for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
+z=z.nextSibling}},
+Ky:function(a){var z,y,x,w
z=$.rw()
z.toString
y=H.VK(a,"expando$values")
@@ -15745,12 +15921,12 @@
else w=!0
x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
+return x},
+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},"$1","xS",2,0,null,211,[]],
+return z},
V2:{
"^":"TU;N1,mD,Ck",
Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15793,14 +15969,14 @@
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)}},
-H2:{
+b2i:{
"^":"TR;",
cO:function(a){if(this.qP==null)return
this.Ca.ed()
X.TR.prototype.cO.call(this,this)}},
-lP:{
-"^":"Tp:126;",
-$0:[function(){var z,y,x,w,v
+DO:{
+"^":"Tp:22;",
+$0:function(){var z,y,x,w,v
z=document.createElement("div",null).appendChild(W.ED(null))
y=J.RE(z)
y.st5(z,"checkbox")
@@ -15813,26 +15989,26 @@
v=document.createEvent("MouseEvent")
J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.mt:C.Nm.gtH(x)},
$isEH:true},
fTP:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
ppY:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
NP:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z=this.gH()
J.ta(z,a==null?"":H.d(a))},
FC:[function(a){var z=J.Vm(this.gH())
J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+O.Y3()},"$1","gqf",2,0,26,7,[]]},
+Vh:{
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z=X.TR.prototype.gH.call(this)
J.rP(z,null!=a&&!1!==a)},
@@ -15841,8 +16017,8 @@
J.ta(this.xS,z)
if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
+static:{kv:function(a){var z,y,x
z=J.RE(a)
if(z.gMB(a)!=null){z=z.gMB(a)
z.toString
@@ -15850,10 +16026,10 @@
return z.ev(z,new M.r0(a))}else{y=M.bM(a)
if(y==null)return C.xD
x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
+return x.ev(x,new M.jz(a))}}}},
r0:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y
+"^":"Tp:16;a",
+$1:function(a){var z,y
z=this.a
y=J.x(a)
if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -15861,15 +16037,15 @@
z=y==null?z==null:y===z}else z=!1
else z=!1
else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
$isEH:true},
jz:{
-"^":"Tp:115;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
$isEH:true},
SA:{
-"^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z
this.C7()
@@ -15895,18 +16071,18 @@
y=J.x(z)
if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
$isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
+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}}},
hB:{
-"^":"Tp:300;a",
+"^":"Tp:75;a",
$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
$isEH:true},
nv:{
-"^":"Tp:115;",
-$1:[function(a){return 0},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return 0},
$isEH:true},
ee:{
"^":"V2;N1,mD,Ck",
@@ -15914,8 +16090,7 @@
Z1:function(a,b,c,d){var z,y,x
z=J.x(b)
if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
y=this.gCd(this)
if(z.n(b,"value")){z=this.N1
@@ -15925,7 +16100,7 @@
x.Ca=M.IP(z).yI(x.gqf())
z=x}else{z=this.N1
x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
+x=new M.Vh(null,z,c,null,null,"checked",x)
x.Og(z,"checked",c,d)
x.Ca=M.IP(z).yI(x.gqf())
z=x}y.u(0,b,z)
@@ -15947,13 +16122,12 @@
for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
if(y!=null)J.wC(y)}this.mD=null},
gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
+if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
+glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
$isTU:true},
yp:{
-"^":"a;rg,qW,k8<"},
+"^":"a;rg,Ug,k8<"},
ug:{
"^":"V2;N1,mD,Ck",
gN1:function(){return this.N1},
@@ -15961,8 +16135,7 @@
if(J.de(b,"selectedindex"))b="selectedIndex"
z=J.x(b)
if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
y=this.N1
@@ -16085,7 +16258,7 @@
return!0},
Sy:function(){return this.wh(null)},
$isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
z=J.Lh(b,a,!1)
y=J.x(z)
if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16093,13 +16266,13 @@
else y=!1
if(y)return z
for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},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},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
z=J.RE(a)
y=z.gM0(a).createElement("template",null)
z.gKV(a).insertBefore(y,a)
@@ -16113,25 +16286,25 @@
u=v.getAttribute(w)
v.removeAttribute(w)
y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},KE:function(a,b,c){var z,y,x,w
z=J.G6(a)
if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
z=new M.OB()
y=J.MK(a,$.cz())
if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},oR:function(){if($.To===!0)return
$.To=!0
var z=document.createElement("style",null)
J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
+document.head.appendChild(z)}}},
OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+"^":"Tp:26;",
+$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
$isEH:true},
-Uf:{
-"^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
+lP:{
+"^":"Tp:16;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
$isEH:true},
p8:{
"^":"a;ud,lr,eS,ay",
@@ -16151,8 +16324,8 @@
this.ud=null},
$isTR:true},
NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a,b,c,d",
+$2:function(a,b){var z,y,x,w
for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
if(this.d)if(z.n(a,"if")){this.a.b=!0
if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16163,7 +16336,7 @@
z.a=w
z=w}else z=x
z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
$isEH:true},
HS:{
"^":"a;EJ<,PU",
@@ -16182,7 +16355,7 @@
if(0>=z.length)return H.e(z,0)
y=H.d(z[0])+H.d(a)
if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
DJ:[function(a){var z,y,x,w,v,u,t
z=this.EJ
if(0>=z.length)return H.e(z,0)
@@ -16192,7 +16365,7 @@
u=w+2
if(u>=z.length)return H.e(z,u)
t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
TG:{
"^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16213,12 +16386,12 @@
u=this.eD
v.push(L.Sk(z,u,null))
w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,126],
+this.Az(w.gP(w))},"$0","gjM",0,0,22],
Az:function(a){var z,y,x,w
z=this.xG
this.Gb()
y=J.x(a)
-if(!!y.$isList){this.xG=a
+if(!!y.$iszM){this.xG=a
x=a}else if(!!y.$isQV){x=y.br(a)
this.xG=x}else{this.xG=null
x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16293,7 +16466,7 @@
k=null}else{m=[]
if(this.DO!=null)o=this.Mv(o)
k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
uS:function(a){var z
for(z=J.GP(a);z.G();)J.wC(z.gl())},
Gb:function(){var z=this.IY
@@ -16310,21 +16483,21 @@
this.FS=null}this.e9.kr=null
this.pq=!0}},
VU:{
-"^":"Tp:115;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
$isEH:true},
Kj:{
-"^":"Tp:555;a",
+"^":"Tp:334;a",
$1:[function(a){var z,y,x
z=J.U6(a)
y=z.t(a,0)
x=z.t(a,1)
if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
$isEH:true},
R7:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
$isEH:true},
Ya:{
"^":"a;yT>,kU>",
@@ -16350,8 +16523,7 @@
gN1:function(){return this.N1},
Z1:function(a,b,c,d){var z,y,x
if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
y=this.N1
@@ -16389,18 +16561,18 @@
this.EC(J.Vm(this.xS))},
$isTR:true},
VD:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
"^":"",
I5:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.Ye]},
static:{cF:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -16409,21 +16581,21 @@
a.X0=w
C.V8.ZL(a)
C.V8.oX(a)
-return a},null,null,0,0,126,"new VMRefElement$created"]}},
-"+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,22,"new VMRefElement$created"]}},
+"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
"^":"",
-en:{
-"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+SC:{
+"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
+gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.Hk]},
static:{oH:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -16431,34 +16603,28 @@
a.X0=w
C.nt.ZL(a)
C.nt.oX(a)
-return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[558],
-V31:{
+return a},null,null,0,0,22,"new VMViewElement$created"]}},
+"+VMViewElement":[337],
+V32:{
"^":"uL+Pi;",
$isd3:true}}],])
I.$finishClasses($$,$,null)
$$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.qU.$isqU=true
+P.qU.$isTx=true
+P.qU.$asTx=[P.qU]
+P.qU.$isa=true
+P.lf.$isTx=true
+P.lf.$asTx=[P.lf]
+P.lf.$isa=true
+P.KN.$isKN=true
+P.KN.$isTx=true
+P.KN.$asTx=[P.lf]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isTx=true
+P.CP.$asTx=[P.lf]
+P.CP.$isa=true
W.KV.$isKV=true
W.KV.$isD0=true
W.KV.$isa=true
@@ -16472,9 +16638,9 @@
P.a6.$isTx=true
P.a6.$asTx=[P.a6]
P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
+P.zM.$iszM=true
+P.zM.$isQV=true
+P.zM.$isa=true
P.Od.$isa=true
P.a.$isa=true
W.cv.$iscv=true
@@ -16514,8 +16680,8 @@
P.wv.$isa=true
T.yj.$isyj=true
T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
W.OJ.$isea=true
W.OJ.$isa=true
A.XP.$isXP=true
@@ -16564,9 +16730,9 @@
W.ea.$isa=true
P.qh.$isqh=true
P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
+W.Aj.$isAj=true
+W.Aj.$isea=true
+W.Aj.$isa=true
G.DA.$isDA=true
G.DA.$isa=true
M.Ya.$isa=true
@@ -16604,6 +16770,18 @@
D.e5.$isa=true
D.Q4.$isa=true
D.N8.$isa=true
+D.U4.$isaf=true
+D.U4.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
D.c2.$isa=true
W.zU.$isD0=true
W.zU.$isa=true
@@ -16646,13 +16824,6 @@
V.qC.$isqC=true
V.qC.$isZ0=true
V.qC.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
P.jp.$isjp=true
P.jp.$isa=true
P.Tx.$isTx=true
@@ -16687,9 +16858,6 @@
D.hR.$isa=true
P.EH.$isEH=true
P.EH.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
J.Qc=function(a){if(typeof a=="number")return J.P.prototype
if(typeof a=="string")return J.O.prototype
if(a==null)return a
@@ -16718,10 +16886,10 @@
if(typeof a!="object")return a
if(a instanceof P.a)return a
return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.prototype
+if(typeof a=="boolean")return J.yEe.prototype
if(a.constructor==Array)return J.Q.prototype
if(typeof a!="object")return a
if(a instanceof P.a)return a
@@ -16743,7 +16911,6 @@
J.EC=function(a){return J.RE(a).giC(a)}
J.EY=function(a,b){return J.RE(a).od(a,b)}
J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
J.Ew=function(a){return J.RE(a).gSw(a)}
J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16756,6 +16923,7 @@
J.GL=function(a){return J.RE(a).gfN(a)}
J.GP=function(a){return J.w1(a).gA(a)}
J.GW=function(a){return J.RE(a).gVY(a)}
+J.H2=function(a,b){return J.RE(a).sDD(a,b)}
J.HF=function(a){return J.RE(a).gD7(a)}
J.Hf=function(a){return J.RE(a).gTq(a)}
J.IQ=function(a){return J.RE(a).Ms(a)}
@@ -16795,6 +16963,7 @@
J.OS=function(a,b){return J.w1(a).tt(a,b)}
J.Or=function(a){return J.RE(a).yx(a)}
J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
J.Q5=function(a){return J.RE(a).gwl(a)}
J.Q8=function(a){return J.RE(a).gp8(a)}
J.QC=function(a){return J.w1(a).wg(a)}
@@ -16835,7 +17004,6 @@
J.Xf=function(a,b){return J.RE(a).oo(a,b)}
J.Y5=function(a){return J.RE(a).gyT(a)}
J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
J.YP=function(a){return J.RE(a).gQ7(a)}
J.YV=function(a){return J.RE(a).goE(a)}
J.Yl=function(a){return J.w1(a).np(a)}
@@ -16847,12 +17015,11 @@
J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
J.ak=function(a){return J.RE(a).gNF(a)}
J.am=function(a){return J.RE(a).VD(a)}
-J.bB=function(a){return J.x(a).gbx(a)}
J.bY=function(a,b){return J.Wx(a).Y(a,b)}
J.bd=function(a,b){return J.RE(a).sBu(a,b)}
-J.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.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -16865,15 +17032,14 @@
J.dk=function(a,b){return J.RE(a).sMj(a,b)}
J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
J.eI=function(a,b){return J.RE(a).bA(a,b)}
+J.eY=function(a){return J.RE(a).gR(a)}
J.f5=function(a){return J.RE(a).gI(a)}
J.fH=function(a,b){return J.RE(a).stT(a,b)}
J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
J.fi=function(a,b){return J.RE(a).ps(a,b)}
J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
J.iS=function(a){return J.RE(a).gox(a)}
J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
J.jf=function(a,b){return J.x(a).T(a,b)}
J.kE=function(a,b){return J.U6(a).tg(a,b)}
J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -16889,6 +17055,7 @@
J.m4=function(a){return J.RE(a).gig(a)}
J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
return J.Wx(a).i(a,b)}
+J.nG=function(a,b){return J.RE(a).vV(a,b)}
J.nJ=function(a){return J.RE(a).ga4(a)}
J.oE=function(a,b){return J.Qc(a).iM(a,b)}
J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -16896,6 +17063,7 @@
J.on=function(a){return J.RE(a).gtT(a)}
J.pO=function(a){return J.U6(a).gor(a)}
J.pP=function(a){return J.RE(a).gDD(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
J.pe=function(a,b){return J.RE(a).pr(a,b)}
J.q8=function(a){return J.U6(a).gB(a)}
J.qA=function(a){return J.w1(a).br(a)}
@@ -16926,13 +17094,13 @@
J.w8=function(a){return J.RE(a).gkc(a)}
J.wC=function(a){return J.RE(a).cO(a)}
J.wD=function(a,b){return J.w1(a).sIr(a,b)}
+J.wT=function(a,b){return J.w1(a).h(a,b)}
J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
return J.Wx(a).W(a,b)}
J.xR=function(a){return J.RE(a).ghf(a)}
J.xq=function(a){return J.RE(a).gUj(a)}
J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
J.yxg=function(a){return J.RE(a).gGd(a)}
J.z2=function(a){return J.RE(a).gG1(a)}
J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -16945,11 +17113,11 @@
C.oq=Q.Tg.prototype
C.ka=Z.Jc.prototype
C.IK=O.CN.prototype
-C.ux=F.Be.prototype
+C.YD=F.Be.prototype
C.j8=R.i6.prototype
C.O0=R.lw.prototype
C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
+C.Gh=L.bf.prototype
C.UF=R.Lt.prototype
C.MC=D.UL.prototype
C.LT=A.jM.prototype
@@ -16967,12 +17135,12 @@
C.Xe=L.qkb.prototype
C.Nm=J.Q.prototype
C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
+C.jn=J.imn.prototype
C.jN=J.Jh.prototype
C.CD=J.P.prototype
C.xB=J.O.prototype
C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.Zt.prototype
C.Z3=R.LU.prototype
C.MG=M.KL.prototype
C.S2=W.H9.prototype
@@ -16988,7 +17156,7 @@
C.Iv=A.xc.prototype
C.Cc=Q.NQ.prototype
C.HD=T.ov.prototype
-C.c0=A.knI.prototype
+C.c0=A.kn.prototype
C.cJ=U.fI.prototype
C.SX=R.zMr.prototype
C.Vd=D.nk.prototype
@@ -17000,18 +17168,11 @@
C.lx=A.tz.prototype
C.vB=J.is.prototype
C.V8=X.I5.prototype
-C.nt=U.en.prototype
+C.nt=U.SC.prototype
C.ol=W.u9.prototype
C.KZ=new H.hJ()
C.OL=new U.EZ()
C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
C.J19=new K.ndx()
C.IU=new P.TO()
C.Us=new A.yL()
@@ -17020,7 +17181,7 @@
C.xd=new A.Mh()
C.vT=new P.mg()
C.NU=new P.R8()
-C.v8=new P.AHi()
+C.v8=new P.nU()
C.WA=new D.WAE("Collected")
C.l8=new D.WAE("Dart")
C.nj=new D.WAE("Native")
@@ -17053,7 +17214,7 @@
C.js=new A.V3("stack-trace")
C.Ur=new A.V3("script-ref")
C.tSc=new A.V3("class-ref")
-C.jy=new A.V3("breakpoint-list")
+C.PT=new A.V3("breakpoint-list")
C.VW=new A.V3("instance-ref")
C.Ye=new A.V3("vm-ref")
C.Gu=new A.V3("collapsible-content")
@@ -17061,8 +17222,8 @@
C.kR=new A.V3("observatory-application")
C.uvO=new A.V3("service-error-view")
C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
+C.oD=new A.V3("isolate-nav-menu")
+C.iF=new A.V3("class-nav-menu")
C.uW=new A.V3("error-view")
C.u7=new A.V3("nav-menu")
C.KH=new A.V3("json-view")
@@ -17073,17 +17234,17 @@
C.JD=new A.V3("service-ref")
C.nW=new A.V3("nav-bar")
C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
+C.be=new A.V3("instance-view")
C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
+C.mt=H.VM(new W.e0("change"),[W.ea])
+C.T1=H.VM(new W.e0("click"),[W.Aj])
+C.MD=H.VM(new W.e0("error"),[W.ew])
+C.PP=H.VM(new W.e0("hashchange"),[W.ea])
+C.i3=H.VM(new W.e0("input"),[W.ea])
+C.fK=H.VM(new W.e0("load"),[W.ew])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
+C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
C.Mc=function(hooks) {
if (typeof dartExperimentalFixupGetTag != "function") return hooks;
hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17217,12 +17378,12 @@
}
C.xr=new P.by(null,null)
C.A3=new P.Cf(null)
-C.cb=new P.dI(null,null)
+C.cb=new P.ze(null,null)
C.Ek=new N.qV("FINER",400)
C.R5=new N.qV("FINE",500)
C.IF=new N.qV("INFO",800)
C.cV=new N.qV("SEVERE",1000)
-C.UP=new N.qV("WARNING",900)
+C.nT=new N.qV("WARNING",900)
I.makeConstantList = function(list) {
list.immutable$list = init;
list.fixed$length = init;
@@ -17236,7 +17397,7 @@
C.Me=H.VM(I.makeConstantList([]),[P.Ms])
C.dn=H.VM(I.makeConstantList([]),[P.tg])
C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
+C.iH=H.VM(I.makeConstantList([]),[P.KN])
C.xD=I.makeConstantList([])
C.Qy=I.makeConstantList(["in","this"])
C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17248,8 +17409,8 @@
C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
+C.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.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
C.CM=new H.LPe(0,{},C.xD)
@@ -17284,8 +17445,10 @@
C.tP=new H.GD("entry")
C.YU=new H.GD("error")
C.ne=new H.GD("exception")
+C.dI=new H.GD("expand")
C.mr=new H.GD("expanded")
C.Of=new H.GD("expander")
+C.Jt=new H.GD("expanderStyle")
C.Yy=new H.GD("expr")
C.Gx=new H.GD("field")
C.CX=new H.GD("fileAndLine")
@@ -17294,7 +17457,7 @@
C.WG=new H.GD("formattedCollections")
C.uU=new H.GD("formattedExclusiveTicks")
C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
+C.oI=new H.GD("formattedLine")
C.ST=new H.GD("formattedTotalCollectionTime")
C.QH=new H.GD("fragmentation")
C.rE=new H.GD("frame")
@@ -17303,6 +17466,7 @@
C.mP=new H.GD("hasClass")
C.zS=new H.GD("hasDisassembly")
C.D2=new H.GD("hasParent")
+C.Ia=new H.GD("hashLinkWorkaround")
C.lb=new H.GD("hideTagsChecked")
C.du=new H.GD("hitStyle")
C.bA=new H.GD("hoverText")
@@ -17314,6 +17478,7 @@
C.P9=new H.GD("isDart")
C.ai=new H.GD("isEmpty")
C.nZ=new H.GD("isNotEmpty")
+C.FQ=new H.GD("isOptimized")
C.Z8=new H.GD("isolate")
C.Qn=new H.GD("jumpTarget")
C.fy=new H.GD("kind")
@@ -17321,17 +17486,19 @@
C.QL=new H.GD("last")
C.kA=new H.GD("lastTokenPos")
C.Wn=new H.GD("length")
+C.Ij=new H.GD("libraries")
C.EV=new H.GD("library")
C.eh=new H.GD("lineMode")
C.Cv=new H.GD("lines")
C.dB=new H.GD("link")
-C.wT=new H.GD("mainPort")
+C.dH=new H.GD("mainPort")
C.p3=new H.GD("map")
C.t6=new H.GD("mapAsString")
C.PC=new H.GD("dart.core.int")
C.ch=new H.GD("message")
C.UX=new H.GD("msg")
C.YS=new H.GD("name")
+C.KG=new H.GD("nameIsEmpty")
C.So=new H.GD("newHeapCapacity")
C.IO=new H.GD("newHeapUsed")
C.OV=new H.GD("noSuchMethod")
@@ -17339,6 +17506,7 @@
C.xG=new H.GD("objectPool")
C.Le=new H.GD("oldHeapCapacity")
C.SW=new H.GD("oldHeapUsed")
+C.ZU=new H.GD("pad")
C.wq=new H.GD("pausedOnExit")
C.NT=new H.GD("pausedOnStart")
C.Kl=new H.GD("pos")
@@ -17351,7 +17519,7 @@
C.mE=new H.GD("response")
C.UY=new H.GD("result")
C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
+C.iG=new H.GD("rootLib")
C.X8=new H.GD("running")
C.ok=new H.GD("dart.core.Null")
C.md=new H.GD("dart.core.double")
@@ -17381,55 +17549,47 @@
C.KS=new H.GD("vmName")
C.v6=new H.GD("void")
C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
+C.WP=new H.bB(C.n8,"K",0)
C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
+C.xC=new H.bB(C.SL,"V",0)
C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
+C.wW=new H.bB(C.QJ,"T",0)
C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
+C.io=new H.bB(C.Gsc,"E",0)
+C.nz=new H.bB(C.n8,"V",0)
C.RP=H.uV('hx')
+C.I7=H.uV('bf')
C.q0S=H.uV('Dg')
C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
C.qfw=H.uV('qW')
C.GTO=H.uV('F1')
+C.wc=H.uV('kn')
C.nY=H.uV('a')
C.Yc=H.uV('iP')
C.Pt=H.uV('ov')
C.jRs=H.uV('Be')
C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
+C.xF=H.uV('NQ')
+C.Xb=H.uV('pz')
C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
C.aj=H.uV('fI')
C.Kh=H.uV('I5')
-C.la=H.uV('ZX')
C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
+C.O4=H.uV('CP')
+C.yw=H.uV('KN')
C.b7=H.uV('uwf')
C.RcY=H.uV('aQ')
C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
C.dUi=H.uV('Uj')
C.U9=H.uV('UL')
-C.iG=H.uV('yc')
C.HI=H.uV('Pg')
C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
C.lpG=H.uV('LU')
C.Ch=H.uV('KL')
-C.jV=H.uV('rF')
C.OdR=H.uV('pL')
C.cj=H.uV('E7')
C.eB=H.uV('F1i')
@@ -17439,32 +17599,28 @@
C.qo=H.uV('jY')
C.l49=H.uV('uL')
C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
C.px=H.uV('tz')
C.epC=H.uV('Jc')
-C.JA3=H.uV('b0B')
+C.Xd=H.uV('b0B')
C.PF=H.uV('nk')
-C.Db=H.uV('String')
+C.Db=H.uV('qU')
C.BP=H.uV('qkb')
C.Tu=H.uV('xc')
C.bh=H.uV('i6')
C.Bm=H.uV('XP')
+C.wDw=H.uV('SC')
C.hg=H.uV('hd')
C.Fv=H.uV('ob')
C.Wza=H.uV('pR')
C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
+C.HL=H.uV('a2')
+C.Qf=H.uV('L9')
C.HH=H.uV('dynamic')
C.vVv=H.uV('iL')
C.Gp=H.uV('cw')
C.ri=H.uV('yy')
C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
C.R4R=H.uV('xT')
C.xM=new P.z0(!1)
C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17472,7 +17628,7 @@
$.te="$cachedFunction"
$.eb="$cachedInvocation"
$.OK=0
-$.bf=null
+$.mJ=null
$.P4=null
$.Jl=!1
$.NF=null
@@ -17500,14 +17656,14 @@
$.uP=!0
$.VZ="objects/"
$.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.IV},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17522,7 +17678,7 @@
I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17540,21 +17696,21 @@
I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w13().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
z.FV(0,C.eu)
return new A.HJ(z)})
I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17564,24 +17720,24 @@
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,window.location.href,null,null)})
+I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.wJY(),"-",new K.zOQ(),"*",new K.W6o(),"/",new K.MdQ(),"==",new K.YJG(),"!=",new K.DOe(),">",new K.lPa(),">=",new K.Ufa(),"<",new K.Raa(),"<=",new K.w0(),"||",new K.w4(),"&&",new K.w5(),"|",new K.w7()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().$0()})
+I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"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:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
I = I.$finishIsolateConstructor(I)
$=new I()
function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 463c10c..6fbc01e 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -17,6 +17,11 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<style>
+ nav {
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+ }
nav ul {
display: inline-table;
position: relative;
@@ -24,7 +29,7 @@
padding-left: 0;
margin-left: 0;
width: 100%;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background-color: #0489c3;
@@ -32,12 +37,21 @@
nav ul:after {
content: ""; clear: both; display: block;
}
+ .vertical-spacer {
+ height: 40px;
+ background-color: #0489c3;
+ }
</style>
<nav>
<ul>
<content></content>
</ul>
</nav>
+ <div class="vertical-spacer">
+ </div>
+ <template if="{{ pad }}">
+ <br>
+ </template>
</template>
</polymer-element>
@@ -64,7 +78,7 @@
margin: 0;
padding: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -107,7 +121,7 @@
padding: 0;
margin-left: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -171,10 +185,10 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ hashLinkWorkaround }}" 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('allocationprofile') }}" anchor="allocation 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>
@@ -205,7 +219,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ msg['breakpoints'].isEmpty }}">
@@ -276,13 +290,24 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+ <style>
+ .errorBox {
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ padding: 10px;
+ font-family: consolas, courier, monospace;
+ font-size: 1em;
+ line-height: 1.2em;
+ white-space: pre;
+ }
+ </style>
<span>
- <template if="{{ isUnexpected(ref.serviceType) }}">
- unexpected reference type <{{ ref.serviceType }}>
+ <template if="{{ isError(ref.serviceType) }}">
+ <pre class="errorBox">{{ ref.message }}</pre>
</template>
- <template if="{{ isError(ref.serviceType) }}">
- <pre>{{ ref.message }}</pre>
+ <template if="{{ isUnexpected(ref.serviceType) }}">
+ unexpected reference type <{{ ref.serviceType }}>
</template>
<template if="{{ isNull(ref.serviceType) }}">
@@ -378,7 +403,7 @@
white-space: pre-line;
}
.historyExpr a:hover {
- background-color: #e1f5fe
+ background-color: #fff3e3;
}
.historyValue {
display: block;
@@ -426,6 +451,32 @@
</polymer-element>
+<polymer-element name="eval-link">
+ <template>
+ <style>
+ .idle {
+ color: #0489c3;
+ cursor: pointer;
+ }
+ .busy {
+ color: #aaa;
+ cursor: wait;
+ }
+ </style>
+
+ <template if="{{ busy }}">
+ <span class="busy">[evaluate]</span>
+ </template>
+ <template if="{{ !busy }}">
+ <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+ </template>
+ <template if="{{ result != null }}">
+ = <instance-ref ref="{{ result }}"></instance-ref>
+ </template>
+
+ </template>
+
+</polymer-element>
<polymer-element name="field-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -459,10 +510,16 @@
</polymer-element>
<polymer-element name="library-ref" extends="service-ref">
<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ nameIsEmpty }}">
+ <a href="{{ url }}">unnamed</a>
+ </template>
+ <template if="{{ !nameIsEmpty }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
-</polymer-element><polymer-element name="script-ref" extends="service-ref">
+</polymer-element>
+<polymer-element name="script-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
@@ -544,6 +601,12 @@
<div class="memberValue">{{ cls.vmName }}</div>
</div>
</template>
+ <div class="memberItem">
+ <div class="memberName">retained size<br>(all instances)</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
</div>
</div>
@@ -557,7 +620,7 @@
<div class="content">
<template if="{{ cls['fields'].isNotEmpty }}">
fields ({{ cls['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in cls['fields'] }}">
<div class="memberItem">
@@ -572,12 +635,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ cls['functions'].isNotEmpty }}">
functions ({{ cls['functions'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['functions'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ function in cls['functions'] }}">
<div class="memberItem">
@@ -588,7 +651,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
@@ -606,7 +669,12 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<template if="{{ code.isDartCode }}">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ code.isOptimized }}">
+ <a href="{{ url }}">*{{ name }}</a>
+ </template>
+ <template if="{{ !code.isOptimized }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<template if="{{ !code.isDartCode }}">
<span>{{ name }}</span>
@@ -669,14 +737,25 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="content">
- <h1>Code for {{ code.name }}</h1>
+ <template if="{{ code.isDartCode && code.isOptimized }}">
+ <h1>Optimized code for {{ code.name }}</h1>
+ </template>
+ <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+ <h1>Code for {{ code.name }}</h1>
+ </template>
<div class="memberList">
<div class="memberItem">
- <div class="memberName">kind</div>
+ <div class="memberName">Kind</div>
<div class="memberValue">{{code.kind}}</div>
</div>
+ <template if="{{ code.isDartCode }}">
+ <div class="memberItem">
+ <div class="memberName">Optimized</div>
+ <div class="memberValue">{{code.isOptimized}}</div>
+ </div>
+ </template>
<div class="memberItem">
- <div class="memberName">function</div>
+ <div class="memberName">Function</div>
<div class="memberValue">
<function-ref ref="{{code.function}}">
</function-ref>
@@ -781,39 +860,14 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ error.kind }}</h1>
- <div class="well">{{ error.message }}</div>
+ <div class="content-centered">
+ <h1>{{ error.kind }}</h1>
+ <br>
+ <div class="well">{{ error.message }}</div>
</div>
</template>
</polymer-element>
-<polymer-element name="eval-link">
- <template>
- <style>
- .idle {
- color: #0489c3;
- cursor: pointer;
- }
- .busy {
- color: #aaa;
- cursor: wait;
- }
- </style>
-
- <template if="{{ busy }}">
- <span class="busy">[evaluate]</span>
- </template>
- <template if="{{ !busy }}">
- <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
- </template>
- <template if="{{ result != null }}">
- = <instance-ref ref="{{ result }}"></instance-ref>
- </template>
-
- </template>
-
-</polymer-element>
<polymer-element name="field-view" extends="observatory-element">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -827,7 +881,7 @@
<template if="{{ field['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
@@ -957,7 +1011,7 @@
<template if="{{ function['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
@@ -1059,19 +1113,27 @@
.hover {
position: fixed;
z-index: 999;
+ height: 16px;
width: 100%;
background: #ffffff;
}
+ .spacer {
+ height: 16px;
+ background-color: red;
+ }
</style>
- <nav-bar>
+ <nav-bar pad="{{ false }}">
<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-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="hover">
<p style="text-align:center">{{ status }}</p>
</div>
+ <div class="spacer">
+ <!-- Make sure no data is covered by hover bar initially -->
+ </div>
<div class="flex-row">
<canvas id="fragmentation" width="1px" height="1px"></canvas>
</div>
@@ -1242,82 +1304,101 @@
<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.mainPort }}</div>
- </div>
- <br>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+ <div class="content-centered">
+ <div class="flex-row">
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ isolate.rootLib }}"></library-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.mainPort }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
</div>
</div>
- </div>
- </div>
+
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div> <!-- flex row -->
+ </div> <!-- content -->
<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>
+ libraries ({{ isolate.libraries.length }})
+ <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ lib in isolate.libraries }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <library-ref ref="{{ lib }}"></library-ref>
+ </div>
+ </div>
+ </template>
</div>
- <div class="memberItem">
- <div class="memberName">old heap</div>
- <div class="memberValue">
- {{ isolate.oldHeapUsed | formatSize }}
- of
- {{ isolate.oldHeapCapacity | formatSize }}
- </div>
- </div>
- </div>
-
- <br>
-
- <div class="memberList">
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
- </div>
- </div>
- </div>
+ </curly-block>
</div>
<hr>
@@ -1386,6 +1467,12 @@
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
</div>
+ <div class="memberItem">
+ <div class="memberName">retained size</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
<template if="{{ instance['type_class'] != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
@@ -1421,7 +1508,7 @@
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<div class="memberItem">
@@ -1434,12 +1521,12 @@
</div>
</template>
</div>
- </curly-block>
+ </curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<div class="memberItem">
@@ -1448,12 +1535,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['elements'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<div class="memberItem">
@@ -1465,7 +1552,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
@@ -1508,18 +1595,8 @@
<div class="memberList">
<div class="memberItem">
<div class="memberName">url</div>
- <div class="memberValue">{{ library['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>
@@ -1532,11 +1609,27 @@
<hr>
<div class="content">
- <template if="{{ library['scripts'].isNotEmpty }}">
- scripts ({{ library['scripts'].length }})
- <curly-block>
+ <template if="{{ library.imports.isNotEmpty }}">
+ imports ({{ library.imports.length }})
+ <curly-block expand="{{ library.imports.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ script in library['scripts'] }}">
+ <template repeat="{{ imp in library.imports }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <library-ref ref="{{ imp }}"></library-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ <br>
+ </template>
+
+ <template if="{{ library.scripts.isNotEmpty }}">
+ scripts ({{ library.scripts.length }})
+ <curly-block expand="{{ library.scripts.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ script in library.scripts }}">
<div class="memberItem">
<div class="memberValue">
<script-ref ref="{{ script }}"></script-ref>
@@ -1545,13 +1638,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['classes'].isNotEmpty }}">
- classes ({{ library['classes'].length }})
- <curly-block>
+ <template if="{{ library.classes.isNotEmpty }}">
+ classes ({{ library.classes.length }})
+ <curly-block expand="{{ library.classes.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ cls in library['classes'] }}">
+ <template repeat="{{ cls in library.classes }}">
<div class="memberItem">
<div class="memberValue">
<class-ref ref="{{ cls }}"></class-ref>
@@ -1560,13 +1654,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['variables'].isNotEmpty }}">
- variables ({{ library['variables'].length }})
- <curly-block>
+ <template if="{{ library.variables.isNotEmpty }}">
+ variables ({{ library.variables.length }})
+ <curly-block expand="{{ library.variables.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ field in library['variables'] }}">
+ <template repeat="{{ field in library.variables }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field }}"></field-ref>
@@ -1580,13 +1675,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['functions'].isNotEmpty }}">
- functions ({{ library['functions'].length }})
- <curly-block>
+ <template if="{{ library.functions.isNotEmpty }}">
+ functions ({{ library.functions.length }})
+ <curly-block expand="{{ library.functions.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ function in library['functions'] }}">
+ <template repeat="{{ function in library.functions }}">
<div class="memberItem">
<div class="memberValue">
<function-ref ref="{{ function }}"></function-ref>
@@ -1595,6 +1691,7 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
</div>
@@ -1698,7 +1795,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<style>
@@ -1837,7 +1934,7 @@
<tbody>
<tr template="" repeat="{{row in tree.rows }}" style="{{}}">
<td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
- <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+ <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
<div style="position: relative;display: inline">
{{row.columns[0]}}
</div>
@@ -1911,7 +2008,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
<nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -1960,12 +2057,14 @@
<thead>
<tr>
<th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
</tr>
</thead>
<tbody>
@@ -1977,6 +2076,8 @@
<td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
<td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
<td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+ <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+ <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
</tr>
</tbody>
</table>
@@ -1990,7 +2091,6 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ script.isolate }}">
</isolate-nav-menu>
- <library-nav-menu library="{{ script.library }}"></library-nav-menu>
<nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
<li>
<input type="checkbox" checked="{{ showCoverage }}">
@@ -2047,7 +2147,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ trace['members'].isEmpty }}">
@@ -2134,10 +2234,13 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ exception.kind }}</h1>
- <div class="well">{{ exception.message }}</div>
+ <div class="content-centered">
+ <h1>{{ exception.kind }}</h1>
+ <br>
+ <div class="well">{{ exception.message }}</div>
+ <template if="{{ exception.response != '' }}">
<div class="well">{{ exception.response }}</div>
+ </template>
</div>
</template>
@@ -2148,8 +2251,9 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
+ <div class="content-centered">
<h1>{{ error.kind }}</h1>
+ <br>
<div class="well">{{ error.message }}</div>
</div>
</template>
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 7c6ca18..4a2c2f9 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
init()
$=I.p
var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
function map(b){b={x:b}
delete b.x
return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
HT:{
"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
"^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+ks:function(a){var z,y,x,w
z=a[init.dispatchPropertyName]
if(z==null)if($.Bv==null){H.XD()
z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,57 +167,54 @@
if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
if(w==null){y=Object.getPrototypeOf(a)
if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+else return C.vB}return w},
+e1:function(a){var z,y,x,w
z=$.Au
if(z==null)return
y=z
for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},
+Xr:function(a){var z,y,x
z=J.e1(a)
if(z==null)return
y=$.Au
x=z+1
if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
+return y[x]},
+Nq:function(a,b){var z,y,x
z=J.e1(a)
if(z==null)return
y=$.Au
x=z+2
if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
Gv:{
"^":"a;",
n:function(a,b){return a===b},
giO:function(a){return H.eQ(a)},
bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(a),null)},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,74,[]],
"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
bu:function(a){return String(a)},
giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
+$isa2:true},
Jh:{
-"^":"Null/Gv;",
+"^":"Gv;",
n:function(a,b){return null==b},
bu:function(a){return"null"},
giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
Ue1:{
"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.CS}},
+giO:function(a){return 0}},
FP:{
"^":"Ue1;"},
is:{
"^":"Ue1;"},
Q:{
-"^":"List/Gv;",
+"^":"Gv;",
h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
a.push(b)},
KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -233,11 +230,12 @@
for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
return!0}return!1},
ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
FV:function(a,b){var z
for(z=J.GP(b);z.G();)this.h(a,z.gl())},
V1:function(a){this.sB(a,0)},
aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
zV:function(a,b){var z,y,x,w
z=a.length
y=Array(z)
@@ -310,9 +308,9 @@
if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
a[b]=c},
-$isList:true,
-$isList:true,
-$asWO:null,
+$isQ:true,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null,
@@ -326,11 +324,11 @@
$isnM:true},
iY:{
"^":"nM;"},
-Jt:{
+Ib:{
"^":"nM;",
-$isJt:true},
+$isIb:true},
P:{
-"^":"num/Gv;",
+"^":"Gv;",
iM:function(a,b){var z
if(typeof b!=="number")throw H.b(P.u(b))
if(a<b)return-1
@@ -405,27 +403,25 @@
return a<=b},
F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
-gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$islf:true,
+static:{"^":"SAz,yc"}},
+imn:{
+"^":"P;",
+$isCP:true,
+$islf:true,
+$isKN:true},
Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
+"^":"P;",
+$isCP:true,
+$islf:true},
x1:{
-"^":"bU;"},
+"^":"imn;"},
VP:{
"^":"x1;"},
qa:{
"^":"VP;"},
O:{
-"^":"String/Gv;",
+"^":"Gv;",
j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b<0)throw H.b(P.N(b))
if(b>=a.length)throw H.b(P.N(b))
@@ -522,28 +518,27 @@
y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
y^=y>>11
return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
gB:function(a){return a.length},
t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
if(b>=a.length||b<0)throw H.b(P.N(b))
return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
for(z=a.length;b>0;b=y){y=b-1
if(y>=z)H.vh(P.N(y))
x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
"^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+ox:function(){--init.globalState.Xz.GL},
+oT:function(a,b){var z,y,x,w,v,u
z={}
z.a=b
b=b
@@ -551,14 +546,14 @@
if(b==null){b=[]
z.a=b
y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
y.i6(a)
init.globalState=y
if(init.globalState.EF===!0)return
y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
+x=P.L5(null,null,null,P.KN,H.yo)
+w=P.Ls(null,null,null,P.KN)
v=new H.yo(0,null,!1)
u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
w.h(0,0)
@@ -570,21 +565,21 @@
if(x)u.vV(0,new H.PK(z,a))
else{y=H.KT(y,[y,y]).BD(a)
if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},
+yl:function(){var z=init.currentScript
if(z!=null)return String(z.src)
if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
if(typeof version=="function"&&typeof system=="function")return thisFilename()
if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
z=new Error().stack
if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
if(y!=null)return y[1]
y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
z=H.Hh(b.data)
y=J.U6(z)
@@ -597,8 +592,8 @@
s=y.t(z,"startPaused")
r=H.Hh(y.t(z,"replyTo"))
y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
+q=P.L5(null,null,null,P.KN,H.yo)
+p=P.Ls(null,null,null,P.KN)
o=new H.yo(0,null,!1)
n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
p.h(0,0)
@@ -636,15 +631,15 @@
y.toString
self.postMessage(q)}else P.JS(y.t(z,"msg"))
break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
+ZF:function(a){var z,y,x,w
if(init.globalState.EF===!0){y=init.globalState.vd
x=H.Gy(P.EF(["command","log","msg",a],null,null))
y.toString
self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},
+Ws:function(a,b,c,d,e,f){var z,y,x,w
z=init.globalState.N0
y=z.jO
$.te=$.te+("_"+y)
@@ -655,24 +650,24 @@
J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
x=new H.Vg(a,b,c,d)
if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+Gy:function(a){var z
if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
z.il=new H.fP(null)
return z.h7(a)}else{z=new H.NO(new H.X1())
z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+return z.h7(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},
+VO:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
+ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
PK:{
-"^":"Tp:126;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b",
+$0:function(){this.b.$1(this.a.a)},
$isEH:true},
JO:{
-"^":"Tp:126;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
$isEH:true},
f0:{
"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -686,8 +681,8 @@
this.ji=y
this.vu=z&&!x
this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
+this.XC=P.L5(null,null,null,P.KN,null)
if(this.EF===!0){z=new H.JH()
this.vd=z
w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -784,10 +779,10 @@
init.globalState.i2.Rz(0,this.jO)
z=this.Jp
if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,125],
+this.Jp=null}},"$0","gQb",0,0,21],
$isaX:true},
NY:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
$0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
$isEH:true},
cC:{
@@ -816,23 +811,23 @@
w.toString
self.postMessage(v)}}},
RA:{
-"^":"Tp:125;a",
+"^":"Tp:21;a",
$0:[function(){if(!this.a.xB())return
P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
$isEH:true},
IY:{
"^":"a;F1*,i3,G1*",
VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+return}J.nG(this.F1,this.i3)},
$isIY:true},
JH:{
"^":"a;"},
jl:{
-"^":"Tp:126;a,b,c,d,e,f",
+"^":"Tp:22;a,b,c,d,e,f",
$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
$isEH:true},
Vg:{
-"^":"Tp:125;a,b,c,d",
+"^":"Tp:21;a,b,c,d",
$0:[function(){var z,y,x
if(this.d!==!0)this.a.$1(this.c)
else{z=this.a
@@ -870,7 +865,7 @@
$isbC:true,
$ishq:true},
Ua:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
$0:[function(){var z,y
z=this.b.JE
if(!z.gP0()){if(this.c){y=this.a
@@ -886,8 +881,8 @@
n:function(a,b){if(b==null)return!1
return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.c1(this.hQ,16)
+y=J.c1(this.Jz,8)
x=this.bv
if(typeof x!=="number")return H.s(x)
return(z^y^x)>>>0},
@@ -927,7 +922,7 @@
yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
throw H.b("Capability not serializable: "+a.bu(0))}},
II:{
-"^":"Xb;RZ",
+"^":"lY;RZ",
Vf:function(a){var z,y,x,w,v,u
z=J.U6(a)
y=z.t(a,1)
@@ -965,7 +960,7 @@
I8:function(a){var z
if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$iszM)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)
@@ -999,9 +994,9 @@
DE:function(a){return H.vh(P.SY(null))},
yf:function(a){return H.vh(P.SY(null))}},
OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},
$isEH:true},
Tf:{
"^":"BB;",
@@ -1030,7 +1025,7 @@
x[w]=v}return x},
DE:function(a){return H.vh(P.SY(null))},
yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
"^":"a;",
QS:function(a){if(H.ZR(a))return a
this.RZ=P.Py(null,null,null,null,null)
@@ -1093,12 +1088,12 @@
z.Qa(a,b)
return z}}},
FA:{
-"^":"Tp:125;a,b",
+"^":"Tp:21;a,b",
$0:[function(){this.a.p9=null
this.b.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
Av:{
-"^":"Tp:125;c,d",
+"^":"Tp:21;c,d",
$0:[function(){this.c.p9=null
H.ox()
this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1125,23 +1120,23 @@
$isku:true,
$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
"^":"",
-wV:[function(a,b){var z
+wV:function(a,b){var z
if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
if(typeof a==="string")return a
if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
else if(!1===a)return"false"
else if(a==null)return"null"
z=J.AG(a)
if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
+eQ:function(a){var z=a.$identityHash
if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
+BU:function(a,b,c){var z,y,x,w,v,u
if(c==null)c=H.Rm()
if(typeof a!=="string")H.vh(P.u(a))
z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1167,48 +1162,48 @@
if(!(v<u))break
y.j(w,0)
if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+IH:function(a,b){var z,y
if(typeof a!=="string")H.vh(P.u(a))
if(b==null)b=H.Rm()
if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
z=parseFloat(a)
if(isNaN(z)){y=J.rr(a)
if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
+return b.$1(a)}return z},
+lh:function(a){var z,y
z=C.AS(J.x(a))
if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
+a5:function(a){return"Instance of '"+H.lh(a)+"'"},
+RF:function(a){var z,y,x,w,v,u
z=a.length
for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
else{u=w+500
u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
y=new H.a7(a,a.length,0,null)
y.$builtinTypeInfo=[H.Kp(a,0)]
for(;y.G();){x=y.lo
if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
if(x<=65535)z.push(x)
else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
+eT:function(a){var z,y
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},
+Lw:function(a){var z
if(typeof a!=="number")return H.s(a)
if(0<=a){if(a<=65535)return String.fromCharCode(a)
if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1222,14 +1217,14 @@
if(x.E(a,0)||x.C(a,100)){w=new Date(y)
if(h)w.setUTCFullYear(a)
else w.setFullYear(a)
-return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},
+VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},
+aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},
+zo:function(a,b,c){var z,y,x
z={}
z.a=0
y=[]
@@ -1237,8 +1232,8 @@
if(b!=null){z.a=b.length
C.Nm.FV(y,b)}z.b=""
if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
z={}
if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
if(y==null)return H.zo(a,b,c)
@@ -1258,33 +1253,24 @@
C.Nm.FV(r,b)
y=a["$"+q]
if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
+return y.apply(a,r)},
+Pq:function(){var z={x:0}
delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return z},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
if(a==null)a=new P.LK()
z=new Error()
z.dartException=a
if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
+return z},
Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:function(a){throw H.b(a)},
+Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=new H.Am(a)
if(a==null)return
if(typeof a!=="object")return a
@@ -1322,29 +1308,29 @@
return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
z=a.length
for(y=0;y<z;y=w){x=y+1
w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
+b.u(0,a[y],a[x])}return b},
ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
if(z.n(c,0))return H.zd(b,new H.dr(a))
else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
+tR:function(a,b){var z
if(a==null)return
z=a.$identity
if(!!z)return z
z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=b[0]
z.$stubName
y=z.$callName
@@ -1373,36 +1359,36 @@
n=o.$callName
if(n!=null){m=d?o:H.SD(a,o,t)
w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.eZ
switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+SD:function(a,b,c){var z,y,x,w,v,u
if(c)return H.wg(a,b)
z=b.$stubName
y=b.length
x=a[z]
w=b==null?x==null:b===x
if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
+if(y===0){w=$.mJ
if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
v=$.OK
$.OK=J.WB(v,1)
return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
w="return function("+u+"){return this."
-v=$.bf
+v=$.mJ
if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
w=$.OK
$.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
z=H.eZ
y=H.yS
switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1414,8 +1400,8 @@
case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
default:return function(e,f,g,h){return function(){h=[g(this)]
Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+wg:function(a,b){var z,y,x,w,v,u,t,s
z=H.oN()
y=$.P4
if(y==null){y=H.B3("receiver")
@@ -1432,40 +1418,40 @@
y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
t=$.OK
$.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},
+qm:function(a,b,c,d,e,f){b.fixed$length=init
c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
if(a!=null)z=typeof a==="object"&&J.x(a)[b]
else z=!0
if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.SE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.tD(a,b,c,null)},
+Og:function(a,b){var z=a.name
if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},
+N7:function(){return C.KZ},
+uV:function(a){return new H.cu(a,null)},
+VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},
+oX:function(a){if(a==null)return
+return a.$builtinTypeInfo},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
+ip:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
else if(typeof a=="function")return a.builtin$cls
else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
if(a==null)return""
z=P.p9("")
for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1473,34 +1459,35 @@
v=a[y]
if(v!=null)w=!1
u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
else if(typeof a=="function"){a=H.ml(a,null,b)
if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
if(a==null)return!1
z=H.oX(a)
y=J.x(a)
if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
if(a==null||b==null)return!0
z=a.length
for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+XY:function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
if(b==null)return!0
z=H.oX(a)
a=J.x(a)
if(z!=null){y=z.slice()
y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
if(a===b)return!0
if(a==null||b==null)return!0
if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1517,8 +1504,8 @@
if(!y&&t==null||!w)return!0
y=y?a.slice(1):null
w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
if(b==null&&a==null)return!0
if(b==null)return c
if(a==null)return!1
@@ -1527,8 +1514,8 @@
if(c){if(z<y)return!1}else if(z!==y)return!1
for(x=0;x<y;++x){w=a[x]
v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
if(b==null)return!0
if(a==null)return!1
z=Object.getOwnPropertyNames(b)
@@ -1538,8 +1525,8 @@
if(!Object.hasOwnProperty.call(a,w))return!1
v=b[w]
u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
if(!("func" in a))return!1
if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
y=b.ret
@@ -1560,13 +1547,13 @@
n=w[m]
if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+ml:function(a,b,c){return a.apply(b,c)},
+kj:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+wzi:function(a){return H.eQ(a)},
+iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
z=$.NF.$1(a)
y=$.nw[z]
if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1591,20 +1578,20 @@
if(v==="*")throw H.b(P.SY(z))
if(init.leafTags[z]===true){u=H.Va(x)
Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},
+Lc:function(a,b){var z,y
z=Object.getPrototypeOf(a)
y=J.Qu(b,z,null,null)
Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+VF:function(a,b,c){var z=b.prototype
if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
$.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t
$.nw=Object.create(null)
$.vv=Object.create(null)
H.kO()
@@ -1620,8 +1607,8 @@
z["~"+w]=t
z["-"+w]=t
z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},
+kO:function(){var z,y,x,w,v,u,t
z=C.MA()
z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1632,9 +1619,9 @@
t=z.prototypeForTag
$.NF=new H.dC(v)
$.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
z=H.VM([],[P.Od])
y=b.length
x=a.length
@@ -1643,25 +1630,25 @@
z.push(new H.tQ(v,b,a))
u=v+x
if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},
+m2:function(a,b,c){var z,y
if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
else{z=J.x(b)
if(!!z.$isVR){z=C.xB.yn(a,c)
y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w,v
if(typeof b==="string")if(b==="")if(a==="")return c
else{z=P.p9("")
y=a.length
z.KF(c)
for(x=0;x<y;++x){w=a[x]
w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
else if(!!J.x(b).$isVR){v=b.gl9()
v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
+return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
Zd:{
"^":"a;"},
xQ:{
@@ -1697,12 +1684,12 @@
$isyN:true},
LD:{
"^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
+$1:function(a){return J.de(a,this.b)},
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
jJ:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
$isEH:true},
XR:{
"^":"mW;Y3",
@@ -1819,7 +1806,7 @@
z={}
if(this.NE==null){y=this.hG
this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+x=P.Fl(P.qU,P.KN)
for(w=this.Rv,v=0;v<y;++v){u=w+v
x.u(0,this.XL(u),u)}z.a=0
y=x.gvc()
@@ -1835,36 +1822,35 @@
H.VM(y,y["<>"])
return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
+static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
z=a.$reflectionInfo
if(z==null)return
z.fixed$length=init
z=z
y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a,b,c",
+$1:function(a){var z,y,x
z=this.b.NE
y=this.a.a++
x=this.c.t(0,a)
if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
$isEH:true},
Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+"^":"Tp:77;a,b,c",
+$2:function(a,b){var z=this.a
z.b=z.b+"$"+H.d(a)
this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
$isEH:true},
u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Tp:77;a,b",
+$2:function(a,b){var z=this.b
if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
$isEH:true},
Zr:{
"^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1883,7 +1869,7 @@
x=this.EP
if(x!==-1)y.receiver=z[x+1]
return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
z=a.match(/\\\$[a-zA-Z]+\\\$/g)
if(z==null)z=[]
@@ -1892,8 +1878,8 @@
w=z.indexOf("\\$expr\\$")
v=z.indexOf("\\$method\\$")
u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
+try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
W0:{
"^":"Ge;K9,Ga",
bu:function(a){var z=this.Ga
@@ -1921,9 +1907,9 @@
bu:function(a){var z=this.K9
return C.xB.gl0(z)?"Error":"Error: "+z}},
Am:{
-"^":"Tp:115;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
$isEH:true},
XO:{
"^":"a;lA,ui",
@@ -1936,30 +1922,31 @@
this.ui=z
return z}},
dr:{
-"^":"Tp:126;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a.$0()},
$isEH:true},
TL:{
-"^":"Tp:126;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b,c",
+$0:function(){return this.b.$1(this.c)},
$isEH:true},
KX:{
-"^":"Tp:126;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
$isEH:true},
uZ:{
-"^":"Tp:126;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
$isEH:true},
OQ:{
-"^":"Tp:126;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
$isEH:true},
Tp:{
"^":"a;",
bu:function(a){return"Closure"},
$isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
Bp:{
"^":"Tp;",
$isBp:true},
@@ -1975,15 +1962,15 @@
else y=typeof z!=="object"?J.v1(z):H.eQ(z)
return J.UN(y,H.eQ(this.jm))},
$isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
+static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.mJ=z}return z},B3:function(a){var z,y,x,w,v
z=new H.v("self","target","receiver","name")
y=Object.getOwnPropertyNames(z)
y.fixed$length=init
x=y
for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
+if(z[v]===a)return v}}}},
qq:{
"^":"a;Jy"},
va:{
@@ -2037,11 +2024,11 @@
for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
if(w)x+=", "
x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"Jl",Dz:function(a){var z,y,x
a=a
z=[]
for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
hJ:{
"^":"q1;",
bu:function(a){return"dynamic"},
@@ -2076,12 +2063,10 @@
static:{WE:function(a){return new H.oQ(a)}}},
cu:{
"^":"a;LU<,ke",
-bu:function(a){var z,y,x
+bu:function(a){var z,y
z=this.ke
if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
this.ke=y
return y},
giO:function(a){return J.v1(this.LU)},
@@ -2089,32 +2074,32 @@
return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
$iscu:true,
$isuq:true},
-QT:{
+bB:{
"^":"a;XP<,oc>,kU>"},
dC:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a(a)},
$isEH:true},
wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Tp:78;b",
+$2:function(a,b){return this.b(a,b)},
$isEH:true},
VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Tp:8;c",
+$1:function(a){return this.c(a)},
$isEH:true},
VR:{
-"^":"a;Ej,Ii,Ua",
+"^":"a;zO,Ej,Ii,Ua",
gl9:function(){var z=this.Ii
if(z!=null)return z
z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
this.Ii=z
return z},
gAT:function(){var z=this.Ua
if(z!=null)return z
z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
this.Ua=z
return z},
ej:function(a){var z
@@ -2151,14 +2136,14 @@
R4:function(a,b){return this.wL(a,b,0)},
$isVR:true,
$isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
z=b?"m":""
y=c?"":"i"
x=d?"g":""
w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
if(w instanceof RegExp)return w
v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
AX:{
"^":"a;zO,QK",
t:function(a,b){var z=this.QK
@@ -2201,11 +2186,11 @@
N.Jx("").To("Google Charts API loaded")
z=J.UQ(J.UQ($.cM(),"google"),"visualization")
$.NR=z
-return z},"$1","vN",2,0,115,116,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,117,[],118,[]],
-ap:[function(a,b){var z
+return z},"$1","vN",2,0,16,17,[]],
+G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
+ap:function(a,b){var z
for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],119,[]],
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
av:[function(a){var z,y,x
z=J.Wx(a)
if(z.C(a,1000))return z.bu(a)
@@ -2213,8 +2198,8 @@
a=z.Z(a,1000)
x=G.ap(y,3)
for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,120,121,[]],
-P0:[function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
+P0:function(a){var z,y,x,w
if(a==null)return"-"
z=J.LL(J.vX(a,1000))
y=C.jn.cU(z,3600000)
@@ -2224,14 +2209,14 @@
w=C.jn.cU(z,1000)
z=C.jn.Y(z,1000)
if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,122,[]],
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
Xz:[function(a){var z=J.Wx(a)
if(z.C(a,1024))return H.d(a)+"B"
else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,120,123,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
+mG:function(a){var z,y,x,w
if(a==null)return"-"
z=J.LL(J.vX(a,1000))
y=C.jn.cU(z,3600000)
@@ -2241,15 +2226,15 @@
P.p9("")
if(y!==0)return""+y+"h "+x+"m "+w+"s"
if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,122,[]],
+return""+w+"s"},
mL:{
-"^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
+"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
+gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
+gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
Da:function(){var z,y
z=this.Z6
z.sec(this)
@@ -2260,9 +2245,9 @@
z=z.gLi()
H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
+this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
+this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
US:function(){this.Da()},
hq:function(){this.Da()}},
ig:{
@@ -2281,8 +2266,8 @@
this.vR.V7("draw",[a.gYb(),z])}},
dZ:{
"^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",307,308],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
+gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
kI:function(){var z=C.PP.aM(window)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
if(window.location.hash==="")window.location.hash="#/vm"
@@ -2301,23 +2286,25 @@
this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
static:{"^":"K3D"}},
Qe:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
$isEH:true},
GH:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z,y
z=this.a
y=z.ec
y.AJ=F.Wi(y,C.mE,y.AJ,a)
z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
$isEH:true},
Y2:{
-"^":["Pi;eT>,yt<-317,wd>-318,oH<-319",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",307,308],
+"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",307],
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
+grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
goE:function(a){return this.z3},
soE:function(a,b){var z=this.z3
this.z3=b
@@ -2327,9 +2314,10 @@
this.o8()}}},
r8:function(){this.soE(0,!this.z3)
return this.z3},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
$isY2:true},
XN:{
-"^":["Pi;zU>-318,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
rT:function(a){var z,y
z=this.zU
y=J.w1(z)
@@ -2356,7 +2344,7 @@
w.UZ(z,v,v+y)}},
Kt:{
"^":"a;ph>,xy<",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,124,121,[]]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
Ni:{
"^":"a;UQ>",
$isNi:true},
@@ -2367,7 +2355,7 @@
gxp:function(){return this.pT},
np:function(a){H.rd(this.tW,new G.Nu(this))
F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
+gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
lb:function(){C.Nm.sB(this.zU,0)
C.Nm.sB(this.tW,0)},
aJ:function(a,b){var z=this.zU
@@ -2379,21 +2367,21 @@
if(a>>>0!==a||a>=z.length)return H.e(z,a)
y=J.UQ(J.U8(z[a]),b)
z=this.oH
-if(b>>>0!==b||b>=7)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gls",4,0,321,322,[],323,[],"getFormattedValue",307],
+if(b>>>0!==b||b>=9)return H.e(z,b)
+return z[b].gxy().$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
Qs:[function(a){var z
if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
return J.WB(J.Kz(z[a]),"\u2003")}z=this.oH
-if(a>>>0!==a||a>=7)return H.e(z,a)
+if(a>>>0!==a||a>=9)return H.e(z,a)
z=J.Kz(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
+return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
TK:[function(a,b){var z=this.zU
if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,324,322,[],323,[],"getValue",307]},
+return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x,w
z=this.a
y=z.zU
if(a>>>0!==a||a>=y.length)return H.e(y,a)
@@ -2401,23 +2389,23 @@
if(b>>>0!==b||b>=y.length)return H.e(y,b)
w=J.UQ(J.U8(y[b]),z.pT)
if(z.jV)return J.oE(w,x)
-else return J.oE(x,w)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+else return J.oE(x,w)},
+$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
"^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/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/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
$.uP=!1
-F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
"^":"",
pz:{
-"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"msg",307,330],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.jy]},
+"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.PT]},
static:{t4:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -2425,19 +2413,19 @@
a.X0=w
C.J0.ZL(a)
C.J0.oX(a)
-return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[333],
+return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[107],
pv:{
"^":"uL+Pi;",
$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
"^":"",
Tg:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.tSc]},
static:{rt:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -2446,20 +2434,21 @@
a.X0=w
C.oq.ZL(a)
C.oq.oX(a)
-return a},null,null,0,0,126,"new ClassRefElement$created"]}},
-"+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,22,"new ClassRefElement$created"]}},
+"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
"^":"",
Jc:{
-"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.aQx]},
static:{zg:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -2467,22 +2456,22 @@
a.X0=w
C.ka.ZL(a)
C.ka.oX(a)
-return a},null,null,0,0,126,"new ClassViewElement$created"]}},
-"+ClassViewElement":[338],
+return a},null,null,0,0,22,"new ClassViewElement$created"]}},
+"+ClassViewElement":[114],
Dsd:{
"^":"uL+Pi;",
$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
"^":"",
CN:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,339,"code",308],
-aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,115,242,[],"refChanged"],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
"@":function(){return[C.H3]},
static:{On:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -2491,80 +2480,80 @@
a.X0=w
C.IK.ZL(a)
C.IK.oX(a)
-return a},null,null,0,0,126,"new CodeRefElement$created"]}},
-"+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,22,"new CodeRefElement$created"]}},
+"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
"^":"",
Be:{
-"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,339,"code",307,330],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
+"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Xx
if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
m2:[function(a,b){var z,y,x
z=J.Vs(b).MW.getAttribute("data-jump-target")
if(z==="")return
y=H.BU(z,null,null)
x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
if(x==null)return
-return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
YI:[function(a,b,c,d){var z=this.m2(a,d)
if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
ZC:[function(a,b,c,d){var z=this.m2(a,d)
if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
"@":function(){return[C.xW]},
static:{Fe:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
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.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[345],
+C.YD.ZL(a)
+C.YD.oX(a)
+return a},null,null,0,0,22,"new CodeViewElement$created"]}},
+"+CodeViewElement":[122],
tuj:{
"^":"uL+Pi;",
$isd3:true},
hf:{
-"^":"Tp:341;",
-$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+"^":"Tp:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
$isEH:true},
-"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
"^":"",
i6:{
-"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
+"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
+gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
+gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
+this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
this.SS(a)
-this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
SS:[function(a){var z,y
z=a.Uy
y=a.zh
if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
"@":function(){return[C.Gu]},
-static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.zh="glyphicon glyphicon-chevron-down"
@@ -2575,47 +2564,52 @@
a.X0=w
C.j8.ZL(a)
C.j8.oX(a)
-return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[351],
+return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[129],
Vct:{
"^":"uL+Pi;",
$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
"^":"",
lw:{
-"^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
+"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
+gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,115,30,[],"callback",307],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
+git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+rL:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
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)},"$0","goJ",0,0,125,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Pl
if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
"@":function(){return[C.DKS]},
static:{fR:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.GV=!1
-a.Hu=!1
+a.Pl=!1
a.nx=null
+a.oM=!1
a.SO=z
a.B7=y
a.X0=w
C.O0.ZL(a)
C.O0.oX(a)
-return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[353],
+return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[131],
LP:{
"^":"xc+Pi;",
$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2627,21 +2621,21 @@
if(y==null)return"registerElement" in document
return J.de(J.UQ(y,"ready"),!0)},
wJ:{
-"^":"Tp:126;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:22;",
+$0:function(){if(B.G9())return P.Ab(null,null)
var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
+return z.gtH(z)},
$isEH:true}}],["dart._internal","dart:_internal",,H,{
"^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x,w
+return b},
+mx:function(a,b,c){var z,y,x,w
for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
w=a
if(x==null?w==null:x===w)return H.d(b)+"..."+H.d(c)}z=P.p9("")
@@ -2650,24 +2644,24 @@
z.We(a,", ")
z.KF(c)}finally{x=$.RM()
if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","FQ",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+rd:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
+K0:function(a,b,c){var z=J.Wx(b)
if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
+qG:function(a,b,c,d,e){var z,y,x,w
H.K0(a,b,c)
z=J.xH(c,b)
if(J.de(z,0))return
if(J.u6(e,0))throw H.b(P.u(e))
y=J.x(d)
-if(!!y.$isList){x=e
+if(!!y.$iszM){x=e
w=d}else{w=y.eR(d,e).tt(0,!1)
x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},
+IC:function(a,b,c){var z,y,x,w,v,u
z=J.Wx(b)
if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
y=J.x(c)
@@ -2683,37 +2677,37 @@
H.qG(a,z,w,a,b)
for(z=y.gA(c);z.G();b=u){v=z.gl()
u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},
+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())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},
+tb:function(a,b,c,d,e){var z,y,x,w,v
z=J.Wx(b)
if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
if(c>=a.length)return-1
if(c<0)c=0
for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,117,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
if(typeof c!=="number")return c.C()
if(c<0)return-1
z=a.length
if(c>=z)c=z-1
for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,117,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,117,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v,u
for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
v=z
while(!0){u=J.Wx(v)
if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,117,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},
+d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
z=J.Wx(a0)
y=J.Ts(J.WB(z.W(a0,b),1),6)
x=J.Qc(b)
@@ -2813,7 +2807,7 @@
k=e}else{t.u(a,i,t.t(a,j))
d=x.W(j,1)
t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,117,[],144,[],145,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
aL:{
"^":"mW;",
gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2857,7 +2851,7 @@
w.vM+=typeof u==="string"?u:H.d(u)
if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
es:function(a,b,c){var z,y,x
z=this.gB(this)
if(typeof z!=="number")return H.s(z)
@@ -3093,15 +3087,15 @@
YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
w2Y:{
"^":"ar+Tv;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -3122,99 +3116,95 @@
bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
$isGD:true,
$iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
z=J.U6(a)
if(z.gl0(a)!==!0){y=$.bw().Ej
if(typeof a!=="string")H.vh(P.u(a))
y=y.test(a)}else y=!0
if(y)return a
if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
"^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
+TS:function(a){return J.GL(a)},
+YC:function(a){if(a==null)return
+return new H.GD(a)},
vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
+jO:function(a){var z,y
z=$.Sl().t(0,a)
y=J.x(a)
if(y.n(a,"dynamic"))return $.P8()
if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
+return H.tT(H.YC(z==null?a:z),a)},
+tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=$.tY
if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
+$.tY=z}y=z[b]
+if(y!=null)return y
z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
+x=z.u8(b,"<")
+if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
+y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
+$.tY[b]=y
+return y}v=init.allClasses[b]
+if(v==null){u=init.functionAliases[b]
+if(u!=null){y=new H.ng(b,null,a)
+y.CM=new H.Ar(init.metadata[u],null,null,null,y)
+$.tY[b]=y
+return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
+if(t==null){s=null
+r=null}else{s=t["^"]
+z=J.x(s)
+if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
+s=z.t(s,0)}else r=null
+if(typeof s!=="string")s=""}z=J.uH(s,";")
if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
+q=J.uH(z[0],"+")
+if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
+else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+o=v.prototype["<>"]
+if(o==null||o.length===0)y=p
+else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
+y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
+return y},
+Vv:function(a){var z,y,x
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
+Fk:function(a){var z,y,x
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},
+EK:function(a,b){var z,y,x,w
z=P.L5(null,null,null,null,null)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
+if(b.Fb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},
+vE:function(a,b){var z,y,x,w,v
z=P.L5(null,null,null,null,null)
z.FV(0,b)
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
if(x.ghB()){w=x.gIf().fN
v=J.U6(w)
if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},
+MJ:function(a,b){var z,y,x,w
z=[]
for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
x.G()
w=x.lo
for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
+return w},
+w2:function(a,b){var z,y,x
z=J.U6(a)
y=0
while(!0){x=z.gB(a)
if(typeof x!=="number")return H.s(x)
if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
+Jf:function(a,b){var z,y,x,w,v,u,t
z={}
z.a=null
for(y=a;y!=null;){x=J.x(y)
@@ -3224,27 +3214,27 @@
else{x=z.a
if(x==null)w=H.Ko(b,null)
else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
+u=z.a.gNy()
return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
else{z=new H.rh(z)
if(typeof b==="number"){t=z.$1(b)
if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
+return P.re(C.yQ)},
+fb:function(a,b){if(a==null)return b
+return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
+pj:function(a){var z,y,x,w
z=a["@"]
if(z!=null)return z()
if(typeof a!="function")return C.xD
if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
y.fixed$length=init
return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
+jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
+if(!!z.$iszM){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
@@ -3252,18 +3242,18 @@
s=x[v]
v=t}else s=null
r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
+if(r!=null)d.push(r)}},
+Mk:function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[P.qU])
+return z.Fr(a,b)},
+BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},
+Y6:function(a){var z,y
z=J.x(a)
if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
y=z.t(a,0)
z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
+return z.n(y,"*")||z.n(y,"+")},
Sn:{
"^":"a;L5,F1>",
gvU:function(){var z,y,x,w
@@ -3271,11 +3261,11 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
this.L5=z
return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
+static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
y=init.libraries
if(y==null)return z
for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3289,10 +3279,10 @@
o=v.t(w,6)
n=v.t(w,7)
m=q==null?C.xD:q()
-J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
nI:{
-"^":"Tp:126;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return H.VM([],[P.D4])},
$isEH:true},
jU:{
"^":"a;",
@@ -3302,12 +3292,12 @@
Lj:{
"^":"jU;MA",
gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
+gcZ:function(){var z=$.Cm().gvU().Fb
return z.gUQ(z).XG(0,new H.mb())},
$isQF:true},
mb:{
-"^":"Tp:355;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
+"^":"Tp:132;",
+$1:function(a){return a.gGD()},
$isEH:true},
amu:{
"^":"jU;If<",
@@ -3347,7 +3337,7 @@
$isNL:true,
$isQF:true},
Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
gOO:function(){return"LibraryMirror"},
gUx:function(a){return this.If},
gEO:function(){return this.gm8()},
@@ -3358,11 +3348,11 @@
for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
if(!!J.x(x).$isMs){x=x.gJi()
if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
this.P8=z
return z},
rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
if(z==null)throw H.b(P.lr(this,a,[],null,null))
if(!J.x(z).$isRS)return H.vn(z.IB(this))
if(z.glT())return H.vn(z.IB(this))
@@ -3370,7 +3360,7 @@
if(y==null)throw H.b(P.SY(null))
return H.vn(y())},
F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
+z=this.gQH().Fb.t(0,a)
y=!!J.x(z).$isZk
if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
if(z!=null)x=y&&z.hB
@@ -3396,7 +3386,7 @@
if(r==null||!!s.$getterStub)break c$0
q=J.rY(r).nC(r,"new ")
if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
+r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
y.push(p)
p.jE=this}++v}this.SD=y
return y},
@@ -3412,17 +3402,17 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
this.mX=z
return z},
gF4:function(){var z=this.T1
if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
this.T1=z
return z},
gM1:function(){var z=this.fX
if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
this.fX=z
return z},
gcc:function(){var z,y,x
@@ -3430,7 +3420,7 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z,y
@@ -3440,19 +3430,19 @@
y=P.L5(null,null,null,null,null)
y.FV(0,z)
z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
+this.gQn().Fb.aN(0,z)
+this.gF4().Fb.aN(0,z)
+this.gM1().Fb.aN(0,z)
+this.gcc().Fb.aN(0,z)
+z=H.VM(new P.Oh(y),[P.wv,P.QF])
this.uA=z
return z},
gYK:function(){var z,y
z=this.Db
if(z!=null)return z
y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+this.gQH().Fb.aN(0,new H.oP(y))
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
gc9:function(){var z=this.xO
@@ -3468,16 +3458,16 @@
"^":"amu+M2;",
$isQF:true},
IB:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
oP:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
YX:{
-"^":"Tp:126;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return this.a},
$isEH:true},
BI:{
"^":"Un;AY<,XW,BB,i1,If",
@@ -3512,7 +3502,9 @@
$isQF:true},
iu:{
"^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
+gt5:function(a){var z=this.Ax
+if(z==null)return P.re(C.Qf)
+return H.jO(H.dJ(z))},
F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
CI:function(a,b){return this.F2(a,b,null)},
Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3606,12 +3598,12 @@
$isvr:true,
$isQF:true},
vo:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z,y
+"^":"Tp:134;a",
+$2:function(a,b){var z,y
z=J.GL(a)
y=this.a
if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
$isEH:true},
bl:{
"^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3645,7 +3637,7 @@
return z},
gEz:function(){var z=this.b0
if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
this.b0=z
return z},
gcc:function(){var z,y,x
@@ -3653,12 +3645,12 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z=this.uA
if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
this.uA=z
return z},
gYK:function(){var z,y
@@ -3668,7 +3660,7 @@
y.FV(0,this.gQH())
y.FV(0,this.gEz())
J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
rN:function(a){return this.NK.rN(a)},
@@ -3699,40 +3691,37 @@
$isX9:true,
$isNL:true},
tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
+"^":"Tp:8;a",
+$1:function(a){var z,y,x
z=H.BU(a,null,new H.Oo())
y=this.a
if(J.de(z,-1))y.push(H.jO(J.rr(a)))
else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
$isEH:true},
Oo:{
-"^":"Tp:115;",
-$1:[function(a){return-1},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return-1},
$isEH:true},
Tc:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b.$1(a)},
$isEH:true},
Ax:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){this.a.u(0,a.gIf(),a)
+return a},
$isEH:true},
Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
gEz:function(){var z=this.b0
if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
this.b0=z
return z},
ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
+z=this.aB.prototype
y=H.kU(z)
x=H.VM([],[H.Zk])
for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3741,18 +3730,18 @@
if(u==null)continue
t=z[v]
if(t.$reflectable==2)continue
-s=H.Sd(u,t,!1,!1)
+s=H.S5(u,t,!1,!1)
x.push(s)
s.jE=a}y=H.kU(init.statics[this.Cr])
for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
if(H.Y6(r))continue
-q=this.gXP().gae()[r]
+q=this.gXP().ae[r]
if("$reflectable" in q){p=q.$reflectionName
if(p==null)continue
o=C.xB.nC(p,"new ")
if(o){n=C.xB.yn(p,4)
p=H.ys(n,"$",".")}}else continue
-s=H.Sd(p,q,!o,o)
+s=H.S5(p,q,!o,o)
x.push(s)
s.jE=a}return x},
gEO:function(){var z=this.qu
@@ -3778,12 +3767,12 @@
return z},
ghp:function(){var z=this.FU
if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
this.FU=z
return z},
gF4:function(){var z=this.T1
if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
this.T1=z
return z},
gcc:function(){var z,y,x
@@ -3791,12 +3780,12 @@
if(z!=null)return z
y=P.L5(null,null,null,null,null)
for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
this.M2=z
return z},
gQH:function(){var z=this.uA
if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
this.uA=z
return z},
gYK:function(){var z,y
@@ -3804,41 +3793,41 @@
if(z!=null)return z
y=P.L5(null,null,null,P.wv,P.NL)
z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
+this.gQH().Fb.aN(0,z)
+this.gEz().Fb.aN(0,z)
J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
+z=H.VM(new P.Oh(y),[P.wv,P.NL])
this.Db=z
return z},
Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
+y=this.gF4().Fb.t(0,a)
return y!=null&&y.gFo()},
rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
+z=this.gcc().Fb.t(0,a)
if(z!=null&&z.gFo()){y=z.gcK()
if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
+else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
+w=this.ghp().Fb.t(0,a)
if(w!=null&&w.gFo()){x=w.gdl().$getter
if(x==null)throw H.b(P.SY(null))
return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
gXP:function(){var z,y
z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
+if(z==null){z=$.vK()
z=z.gUQ(z)
y=new H.MH(null,J.GP(z.l6),z.T6)
y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
+z=this.jE
if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
gc9:function(){var z=this.xO
if(z!=null)return z
z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
+if(z==null){z=H.pj(this.aB.prototype)
this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
this.xO=z
return z},
@@ -3858,7 +3847,7 @@
this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
this.qN=z}}}return J.de(z,this)?null:this.qN},
F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
+z=this.ghp().Fb.t(0,a)
y=z==null
if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3880,7 +3869,7 @@
z=this.UF
if(z!=null)return z
y=[]
-x=this.gaB().prototype["<>"]
+x=this.aB.prototype["<>"]
if(x==null)return y
for(w=0;w<x.length;++w){z=x[w]
v=init.metadata[z]
@@ -3899,17 +3888,17 @@
"^":"EE+M2;",
$isQF:true},
Ei:{
-"^":"Tp:356;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:133;a",
+$2:function(a,b){this.a.u(0,a,b)},
$isEH:true},
Ci:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,359,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){this.b.u(0,a.gIf(),a)
+return a},
$isEH:true},
t0:{
-"^":"Tp:360;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:136;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
XJ:{
"^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3948,10 +3937,10 @@
v.$builtinTypeInfo=[H.Kp(y,0)]
for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
if(a>=123&&a<=126)return a-117
if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
+return 0}}},
Sz:{
"^":"iu;Ax,xq",
gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3967,7 +3956,7 @@
H.eZ(y)
t=$.bx().t(0,w.gRA(y))
if(t==null)H.Hz(t)
-s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
+s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
y.constructor[z]=s
return s},
bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
@@ -3994,8 +3983,8 @@
v=H.zh(z)
if(v!=null){u=v.AM
if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
+if(this.xV)this.wM=this.jE
else this.wM=t.gdw()
s=v.Mo
for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4020,7 +4009,7 @@
$isRS:true,
$isNL:true,
$isQF:true,
-static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
+static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
z=a.split(":")
if(0>=z.length)return H.e(z,0)
a=z[0]
@@ -4047,8 +4036,8 @@
$isNL:true,
$isQF:true},
wt:{
-"^":"Tp:361;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
ng:{
"^":"amu;Cr<,CM,If",
@@ -4103,19 +4092,22 @@
y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
this.zM=z
return z},
+Hu:function(a){var z=init.mangledGlobalNames[a]
+if(z!=null)return z
+return a},
bu:function(a){var z,y,x,w,v,u
z=this.o3
if(z!=null)return z
z=this.d9
if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
w=""}if("opt" in z){x+=w+"["
for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
+else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
z=x+"'"
this.o3=z
return z},
@@ -4127,170 +4119,151 @@
$isX9:true,
$isNL:true},
rh:{
-"^":"Tp:362;a",
-$1:[function(a){var z,y,x
+"^":"Tp:138;a",
+$1:function(a){var z,y,x
z=init.metadata[a]
y=this.a
x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
+return J.UQ(y.a.gw8(),x)},
$isEH:true},
iW:{
-"^":"Tp:120;b",
-$1:[function(a){var z,y
+"^":"Tp:18;b",
+$1:function(a){var z,y
z=this.b.$1(a)
y=J.x(z)
if(!!y.$iscw)return H.d(z.Nz)
if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
else if(y.n(z,$.oj()))return"void"
else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
+return z.gCr()},
$isEH:true},
ye:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
$isEH:true},
O1:{
-"^":"Tp:361;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:137;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
"^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
+hY:function(a,b){var z,y,x,w,v,u,t
z=H.kU(a)
-y=P.Fl(J.O,J.O)
+y=P.Fl(P.qU,P.qU)
for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
u=a[v]
y.u(0,v,u)
if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","BH",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
+YK:function(a){var z=P.Fl(P.qU,P.qU)
a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+return z},
+kU:function(a){var z=H.VM(function(b,c){var y=[]
for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
z.fixed$length=init
-return z},"$1","DF",2,0,null,158,[]],
+return z},
Xh:{
-"^":"Tp:364;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
+"^":"Tp:139;a",
+$2:function(a,b){this.a.u(0,b,a)},
$isEH:true}}],["dart.async","dart:async",,P,{
"^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},
ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
+VH:function(a,b){var z=H.N7()
z=H.KT(z,[z,z]).BD(a)
if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
+else return b.cR(a)},
e4:function(a,b){var z=P.Dt(b)
P.rT(C.ny,new P.ZC(a,z))
return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
for(;z!=null;){J.cG(z)
z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
BG:[function(){var z
try{P.Cx()}catch(z){H.Ru(z)
$.ej().$1(P.qZ())
$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,125],
-IA:[function(a){var z,y
+throw z}},"$0","qZ",0,0,21],
+IA:function(a){var z,y
z=$.k8
if(z==null){z=new P.OM(a,null)
$.k8=z
$.S6=z
$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
+$.k8=y}},
+rb:function(a){var z
if(J.de($.X3,C.NU)){$.X3.wr(a)
return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+z.wr(z.xi(a,!0))},
bK:function(a,b,c,d){var z
if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
z.SJ=z
z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
if(a==null)return
try{z=a.$0()
if(!!J.x(z).$isb8)return z
return}catch(w){v=H.Ru(w)
y=v
x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,125],
-FE:[function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},
+YE:[function(a){},"$1","bZ",2,0,26,27,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
+dL:[function(){},"$0","v3",0,0,21],
+FE:function(a,b,c){var z,y,x,w
try{b.$1(a.$0())}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
rT:function(a,b){var z
if(J.de($.X3,C.NU))return $.X3.uN(a,b)
z=$.X3
return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+jL:function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},
+PJ:function(a){var z=$.X3
$.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,179,180,[],181,[],166,[],171,[],172,[]],
+return z},
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,32,33,[],34,[],35,[],30,[],31,[]],
T8:[function(a,b,c,d){var z,y
if(J.de($.X3,c))return d.$0()
z=P.PJ(c)
try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
V7:[function(a,b,c,d,e){var z,y
if(J.de($.X3,c))return d.$1(e)
z=P.PJ(c)
try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
Qx:[function(a,b,c,d,e,f){var z,y
if(J.de($.X3,c))return d.$2(e,f)
z=P.PJ(c)
try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
+CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
+$.oK=P.jt()
z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,50],
C6:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
$0:[function(){H.ox()
this.a.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
@@ -4317,9 +4290,9 @@
gHj:function(){var z=this.Ae
if(typeof z!=="number")return z.i()
return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
+static:{"^":"E2b,RG,cP"}},
WVu:{
"^":"a;iE@,SJ@",
gRW:function(){return!1},
@@ -4343,9 +4316,9 @@
q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
return new P.lj("Cannot add new events while doing an addStream")},
h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
cO:function(a){var z,y
z=this.Gv
if((z&4)!==0)return this.Ip
@@ -4397,19 +4370,19 @@
else this.Ip.OH(null)}},
tK:{
"^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Rg(0,this.b)},
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
OR:{
"^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.V8(this.b,this.c)},
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
Bg:{
"^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$1:function(a){a.Qj()},
$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
DL:{
"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
Iv:function(a){var z,y
@@ -4425,25 +4398,25 @@
"^":"a;",
$isb8:true},
ZC:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){var z,y,x,w
try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
$isEH:true},
-Ia:{
+Pf0:{
"^":"a;"},
Zf:{
-"^":"Ia;MM",
+"^":"Pf0;MM",
oo:[function(a,b){var z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
w0:[function(a,b){var z
if(a==null)throw H.b(P.u("Error must not be null"))
z=this.MM
if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,141,29,30,[],31,[]]},
vs:{
"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
gcg:function(){return this.Gv>=4},
@@ -4500,7 +4473,7 @@
P.HZ(this,z)},
K5:[function(a,b){var z=this.L3()
this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
OH:function(a){var z
if(a==null);else{z=J.x(a)
if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4521,15 +4494,15 @@
z.L7(a,b)
return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
do{z=b.gBQ()
b.sBQ(null)
P.HZ(a,b)
if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
z={}
z.e=a
for(y=a;!0;){x={}
@@ -4567,44 +4540,44 @@
v=x.c
b.E6(J.w8(v),v.gI4())}z.e=b
y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=q}}}},
da:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
pV:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
$isEH:true},
U7:{
-"^":"Tp:367;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Tp:143;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
$isEH:true},
rH:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
$isEH:true},
cX:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
$isEH:true},
ZL:{
-"^":"Tp:126;a,b,c",
+"^":"Tp:22;a,b,c",
$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
$isEH:true},
rq:{
-"^":"Tp:348;b,d,e,f",
-$0:[function(){var z,y,x,w
+"^":"Tp:126;b,d,e,f",
+$0:function(){var z,y,x,w
try{this.b.c=this.f.FI(this.d.gO1(),this.e)
return!0}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
$isEH:true},
RW:{
-"^":"Tp:125;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:21;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=this.c.e.gcG()
r=this.UI
y=r.gyK()
@@ -4636,11 +4609,11 @@
r.b=!1
return}this.b.b=!0}else{r=this.b
r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
$isEH:true},
RT:{
-"^":"Tp:125;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:21;c,b,Gq,Rm,w3",
+$0:function(){var z,y,x,w,v,u
z={}
z.a=null
try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4656,31 +4629,32 @@
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))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
$isEH:true},
jZ:{
-"^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:16;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
$isEH:true},
FZ:{
-"^":"Tp:367;a,mG",
+"^":"Tp:143;a,mG",
$2:[function(a,b){var z,y
z=this.a
if(!J.x(z.a).$isvs){y=P.Dt(null)
z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
$isEH:true},
OM:{
"^":"a;FR>,aw@",
Ki:function(a){return this.FR.$0()}},
qh:{
"^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
tg:function(a,b){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
return y},
aN:function(a,b){var z,y
z={}
@@ -4690,25 +4664,25 @@
return y},
Vr:function(a,b){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
return y},
gB:function(a){var z,y
z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
z.a=0
this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
return y},
gl0:function(a){var z,y
z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
z.a=null
z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
return y},
br:function(a){var z,y
z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
+y=P.Dt([P.zM,H.ip(this,"qh",0)])
this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
return y},
qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4739,41 +4713,41 @@
z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
return y},
$isqh:true},
-YJ:{
+Sd:{
"^":"Tp;a,b,c,d",
$1:[function(a){var z,y
z=this.a
y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
jv:{
-"^":"Tp:126;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return J.de(this.f,this.e)},
$isEH:true},
-LB:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+bi:{
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
$isEH:true},
-DO:{
-"^":"Tp:126;bK",
+YJ:{
+"^":"Tp:22;bK",
$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
$isEH:true},
lz:{
"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Rl:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
$isEH:true},
Jb:{
-"^":"Tp:115;",
-$1:[function(a){},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){},
$isEH:true},
M4:{
-"^":"Tp:126;UI",
+"^":"Tp:22;UI",
$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
$isEH:true},
Jp:{
@@ -4781,64 +4755,64 @@
$1:[function(a){var z,y
z=this.a
y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
h7:{
-"^":"Tp:126;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e,f",
+$0:function(){return this.e.$1(this.f)},
$isEH:true},
pr:{
-"^":"Tp:349;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
+"^":"Tp:127;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
$isEH:true},
eN:{
-"^":"Tp:126;bK",
+"^":"Tp:22;bK",
$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
$isEH:true},
B5:{
-"^":"Tp:115;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
PI:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
$isEH:true},
j4:{
-"^":"Tp:115;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
i9:{
-"^":"Tp:126;c",
+"^":"Tp:22;c",
$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
$isEH:true},
VV:{
"^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
Dy:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
$isEH:true},
lU:{
"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
OC:{
-"^":"Tp:126;d",
+"^":"Tp:22;d",
$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
$isEH:true},
UH:{
"^":"Tp;a,b",
$1:[function(a){var z=this.a
z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
Z5:{
-"^":"Tp:126;a,c",
+"^":"Tp:22;a,c",
$0:[function(){var z=this.a
if(z.b){this.c.rX(z.a)
return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4847,11 +4821,11 @@
"^":"Tp;a,b,c",
$1:[function(a){var z=this.a
if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
ii:{
-"^":"Tp:126;a,d",
+"^":"Tp:22;a,d",
$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
$isEH:true},
MO:{
@@ -4884,8 +4858,8 @@
yU:{
"^":"KA;Y8<",
tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,125],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,125]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,21],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
nP:{
"^":"a;"},
KA:{
@@ -4937,8 +4911,8 @@
this.Gv=z
if(z<32)this.SY()
else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,125],
-LP:[function(){},"$0","gZ9",0,0,125],
+uO:[function(){},"$0","gp4",0,0,21],
+LP:[function(){},"$0","gZ9",0,0,21],
tA:function(){},
w6:function(a){var z,y
z=this.Ri
@@ -4985,10 +4959,10 @@
z=(this.Gv&4294967263)>>>0
this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
$isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
Vo:{
-"^":"Tp:125;a,b,c",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,b,c",
+$0:function(){var z,y,x,w,v,u
z=this.a
y=z.Gv
if((y&8)!==0&&(y&16)===0)return
@@ -4998,19 +4972,20 @@
else{x=z.o7
w=H.N7()
w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+v=z.o7
+u=this.b
+if(w)y.z8(v,u,this.c)
+else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
$isEH:true},
qB:{
-"^":"Tp:125;a",
-$0:[function(){var z,y
+"^":"Tp:21;a",
+$0:function(){var z,y
z=this.a
y=z.Gv
if((y&16)===0)return
z.Gv=(y|42)>>>0
z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
$isEH:true},
aN:{
"^":"qh;",
@@ -5048,7 +5023,7 @@
return}P.rb(new P.CR(this,a))
this.Gv=1}},
CR:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){var z,y
z=this.a
y=z.Gv
@@ -5073,16 +5048,16 @@
this.N6=null
this.zR=null}},
v1y:{
-"^":"Tp:126;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
$isEH:true},
uR:{
-"^":"Tp:371;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Tp:146;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
$isEH:true},
-Q0:{
-"^":"Tp:126;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+vm:{
+"^":"Tp:22;a,b",
+$0:function(){return this.a.rX(this.b)},
$isEH:true},
YR:{
"^":"qh;",
@@ -5110,16 +5085,16 @@
P.KA.prototype.V8.call(this,a,b)},
uO:[function(){var z=this.Ee
if(z==null)return
-z.yy(0)},"$0","gp4",0,0,125],
+z.yy(0)},"$0","gp4",0,0,21],
LP:[function(){var z=this.Ee
if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,125],
+z.QE(0)},"$0","gZ9",0,0,21],
tA:function(){var z=this.Ee
if(z!=null){this.Ee=null
z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,125],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,21],
S8:function(a,b,c,d){var z,y
z=this.gOa()
y=this.gRE()
@@ -5148,6 +5123,15 @@
x=new H.XO(w,null)
b.V8(y,x)
return}J.QM(b,z)}},
+aW:{
+"^":"YR;pK,Sb",
+GW:function(a){return this.pK.$1(a)},
+Ml:function(a,b){var z,y,x,w,v
+try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
+J.QM(b,z)}}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+b.V8(y,x)}}},
Zz:{
"^":"YR;Em,Sb",
Ml:function(a,b){var z
@@ -5190,52 +5174,45 @@
Id:{
"^":"a;oh",
gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
+c1:function(a,b,c){var z=this.oh
+for(;z.gWY().gE2()==null;)z=z.geT(z)
+return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.oh
+for(;z.gWY().gcP()==null;)z=z.geT(z)
+return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.oh
+for(;z.gWY().gJl()==null;)z=z.geT(z)
+return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.oh
+for(;z.gWY().gpU()==null;)z=z.geT(z)
+return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.oh
+for(;z.gWY().gFh()==null;)z=z.geT(z)
+return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z=this.oh
+for(;z.gWY().gXp()==null;)z=z.geT(z)
+return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.oh
+for(;z.gWY().gfb()==null;)z=z.geT(z)
+return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;z.gWY().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gWY().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.oh
+for(;z.gWY().gZq()==null;)z=z.geT(z)
+return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
RB:function(a,b,c){var z,y
z=this.oh
for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
+y=z.gWY()
y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
+ld:function(a,b,c){var z,y
z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
+for(;z.gWY().giq()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
WH:{
"^":"a;",
fC:function(a){return this.gC5()===a.gC5()},
@@ -5268,28 +5245,28 @@
if(b)return new P.dv(this,z)
else return new P.ph(this,z)}},
TF:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
K5:{
-"^":"Tp:126;c,d",
+"^":"Tp:22;c,d",
$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
$isEH:true},
Cg:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
$isEH:true},
Hs:{
-"^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Tp:16;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
$isEH:true},
dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
$isEH:true},
ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
+"^":"Tp:75;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
$isEH:true},
uo:{
"^":"WH;eT>,WY<,R1",
@@ -5312,24 +5289,24 @@
uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
pK:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
$isEH:true},
eM:{
-"^":"Tp:126;c,d",
-$0:[function(){var z,y
+"^":"Tp:22;c,d",
+$0:function(){var z,y
z=this.c
P.JS("Uncaught Error: "+H.d(z))
y=this.d
if(y==null&&!!J.x(z).$isGe)y=z.gI4()
if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
+throw H.b(z)},
$isEH:true},
-Uez:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+rF:{
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true},
-AHi:{
+nU:{
"^":"a;",
gE2:function(){return P.Gx()},
hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5377,12 +5354,12 @@
"^":"",
EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:[function(){var z=Object.create(null)
+jB:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
+return z},
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
Py:function(a,b,c,d,e){var z
if(a==null){z=new P.k6(0,null,null,null,null)
z.$builtinTypeInfo=[d,e]
@@ -5390,15 +5367,15 @@
return P.MP(a,b,c,d,e)},
UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
+FO:function(a){var z,y
if($.xb().tg(0,a))return"(...)"
$.xb().h(0,a)
z=[]
try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
y.We(z,", ")
y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+return y.vM},
+Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
z=a.gA(a)
y=0
x=0
@@ -5434,10 +5411,10 @@
if(p==null){y+=5
p="..."}}if(p!=null)b.push(p)
b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w,v
+vW:function(a){var z,y,x,w,v
z={}
for(x=0;w=$.tw(),x<w.length;++x){w=w[x]
v=a
@@ -5448,7 +5425,7 @@
J.kH(a,new P.LG(z,y))
y.KF("}")}finally{z=$.tw()
if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
+z.pop()}return y.gvM()},
k6:{
"^":"a;X5,vv,OX,OB,wV",
gB:function(a){return this.X5},
@@ -5551,23 +5528,23 @@
for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
return-1},
$isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},a0:function(){var z=Object.create(null)
P.cW(z,"<non-identifier-key>",z)
delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
oi:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
$isEH:true},
ce:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
$isEH:true},
DJ:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
PL:{
@@ -5600,9 +5577,9 @@
static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
jG:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
$isEH:true},
fG:{
"^":"mW;Fb",
@@ -5745,21 +5722,21 @@
bu:function(a){return P.vW(this)},
$isFo:true,
$isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Qs:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
a1:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
$isEH:true},
ou:{
-"^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return J.de(this.a.t(0,a),this.b)},
$isEH:true},
S9:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
db:{
@@ -6031,10 +6008,10 @@
$isyN:true,
$isQV:true,
$asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+static:{T2:function(){var z=Object.create(null)
z["<non-identifier-key>"]=z
delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
+return z}}},
ef:{
"^":"a;Gc<,DG@,zQ@"},
zQ:{
@@ -6069,8 +6046,9 @@
$asQV:null},
mW:{
"^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
tg:function(a,b){var z
for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
return!1},
@@ -6120,8 +6098,8 @@
$asQV:null},
ar:{
"^":"a+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -6160,7 +6138,8 @@
z.We(a,b)
return z.vM},
ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
eR:function(a,b){return H.q9(a,b,null,null)},
tt:function(a,b){var z,y,x
if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6228,7 +6207,7 @@
if(J.de(y,0))return
if(e<0)throw H.b(P.u(e))
z=J.x(d)
-if(!!z.$isList){x=e
+if(!!z.$iszM){x=e
w=d}else{w=z.eR(d,e).tt(0,!1)
x=0}if(typeof y!=="number")return H.s(y)
z=J.U6(w)
@@ -6277,7 +6256,7 @@
this.Mh(a,b,c)},
Mh:function(a,b,c){var z,y
z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
+if(!!z.$iszM){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())}},
@@ -6288,20 +6267,49 @@
z.KF("[")
z.We(a,", ")
z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true},
+Bk:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a){return this.Fb.x4(a)},
+di:function(a){return this.Fb.di(a)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(){var z=this.Fb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:function(a){return P.vW(this.Fb)},
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true},
+Oh:{
+"^":"Bk+KPM;Fb",
+$isZ0:true},
LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
if(!z.a)this.b.KF(", ")
z.a=!1
z=this.b
z.KF(a)
z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
+z.KF(b)},
$isEH:true},
Sw:{
"^":"mW;v5,av,eZ,qT",
@@ -6344,7 +6352,7 @@
h:function(a,b){this.NZ(0,b)},
FV:function(a,b){var z,y,x,w,v,u,t,s,r
z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
+if(!!z.$iszM){y=z.gB(b)
x=this.gB(this)
if(typeof y!=="number")return H.s(y)
z=x+y
@@ -6454,11 +6462,11 @@
$asQV:null,
static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
z.Eo(a,b)
-return z},ua:[function(a){var z
+return z},ua:function(a){var z
if(typeof a!=="number")return a.O()
a=(a<<2>>>0)-1
for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
+if(z===0)return a}}}},
o0:{
"^":"a;Lz,pP,qT,Dc,fD",
gl:function(){return this.fD},
@@ -6586,23 +6594,23 @@
y=new P.An(c)
return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
An:{
-"^":"Tp:115;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,121,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){var z=H.XY(a,this.a)
+return z},
$isEH:true},
bF:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
BW:{
-"^":"Tp:375;a,b,c",
-$1:[function(a){var z,y,x,w
+"^":"Tp:149;a,b,c",
+$1:function(a){var z,y,x,w
for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
if(z!==y.bb)throw H.b(P.a4(y))
w=a.T8
if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
+a=a.Bb}return!1},
$isEH:true},
S6B:{
"^":"a;",
@@ -6663,23 +6671,23 @@
Wb:function(a){return a},
$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
"^":"",
-VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+VQ:function(a,b){var z=new P.JC()
+return z.$2(null,new P.f1(z).$1(a))},
+BS:function(a,b){var z,y,x,w
x=a
if(typeof x!=="string")throw H.b(P.u(a))
z=null
try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return b},
$isEH:true},
f1:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;a",
+$1:function(a){var z,y,x,w,v,u,t
if(a==null||typeof a!="object")return a
if(Object.getPrototypeOf(a)===Array.prototype){z=a
for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6688,7 +6696,7 @@
for(y=this.a,x=0;x<w.length;++x){u=w[x]
v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},"$1",null,2,0,null,21,[],"call"],
+return v},
$isEH:true},
Uk:{
"^":"a;"},
@@ -6696,7 +6704,7 @@
"^":"a;"},
Zi:{
"^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
Ud:{
"^":"Ge;Ct,FN",
bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6715,13 +6723,13 @@
KP:function(a){return this.Co(a,null)},
gZE:function(){return C.cb},
gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
-dI:{
+$asUk:function(){return[P.a,P.qU]}},
+ze:{
"^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+$aszF:function(){return[P.a,P.qU]}},
Cf:{
"^":"zF;N5",
-$aszF:function(){return[J.O,P.a]}},
+$aszF:function(){return[P.qU,P.a]}},
Sh:{
"^":"a;iY,Vy,bV",
Wt:function(a){return this.iY.$1(a)},
@@ -6796,7 +6804,7 @@
this.aK(a)
z.KF("\"")
return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
+if(!!z.$iszM){this.WD(a)
y=this.Vy
y.KF("[")
if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6820,26 +6828,26 @@
Ei:function(a){var z=this.bV
if(0>=z.length)return H.e(z,0)
z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,dH,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
b=P.BC()
z=P.p9("")
P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
+return z.vM}}},
z0:{
"^":"Zi;lH",
goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
+gZE:function(){return new P.E3()}},
+E3:{
"^":"zF;",
WJ:function(a){var z,y,x
z=J.U6(a)
y=J.vX(z.gB(a),3)
if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
+y=H.VM(Array(y),[P.KN])
x=new P.Rw(0,0,y)
if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
+$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
Rw:{
"^":"a;WF,ZP,EN",
Lb:function(a,b){var z,y,x,w,v
@@ -6910,9 +6918,9 @@
z[u]=128|v&63}}return w},
static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
"^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
+hl:function(a){var z,y,x,w,v
if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
if(typeof a==="string"){z=new P.Rn("")
z.vM="\""
@@ -6929,11 +6937,11 @@
else{w=H.Lw(v)
w=z.vM+=w}}y=w+"\""
z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
O8:function(a,b,c){var z,y,x
z=J.Qi(a,c)
if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6944,22 +6952,22 @@
if(b)return z
z.fixed$length=init
return z},
-JS:[function(a){var z,y
+JS:function(a){var z,y
z=H.d(a)
y=$.oK
if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
+else y.$1(z)},
HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,a.gfN(a),b)},
$isEH:true},
CL:{
-"^":"Tp:357;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:134;a",
+$2:function(a,b){var z=this.a
if(z.b>0)z.a.KF(", ")
z.a.KF(J.GL(a))
z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
$isEH:true},
p4:{
"^":"a;OF",
@@ -6967,7 +6975,8 @@
a2:{
"^":"a;",
bu:function(a){return this?"true":"false"},
-$isbool:true},
+$isa2:true},
+"+bool":0,
Tx:{
"^":"a;"},
iP:{
@@ -6992,8 +7001,8 @@
EK:function(){H.o2(this)},
RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
$isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
if(z!=null){y=new P.MF()
x=z.QK
if(1>=x.length)return H.e(x,1)
@@ -7026,28 +7035,32 @@
if(typeof l!=="number")return H.s(l)
s=J.xH(s,n*l)}k=!0}else k=!1
j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
z=Math.abs(a)
y=a<0?"-":""
if(z>=1000)return""+a
if(z>=100)return y+"0"+H.d(z)
if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
MF:{
-"^":"Tp:377;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:150;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
$isEH:true},
Rq:{
-"^":"Tp:378;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
+"^":"Tp:151;",
+$1:function(a){if(a==null)return 0
+return H.IH(a,null)},
$isEH:true},
+CP:{
+"^":"lf;",
+$isCP:true},
+"+double":0,
a6:{
"^":"a;Fq<",
g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7076,20 +7089,20 @@
v=new P.P7().$1(C.CD.JV(y,1000000))
return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
$isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,za,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,za,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
P7:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Tp:18;",
+$1:function(a){if(a>=100000)return H.d(a)
if(a>=10000)return"0"+H.d(a)
if(a>=1000)return"00"+H.d(a)
if(a>=100)return"000"+H.d(a)
if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
$isEH:true},
DW:{
-"^":"Tp:120;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:18;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
$isEH:true},
Ge:{
"^":"a;",
@@ -7192,31 +7205,51 @@
EH:{
"^":"a;",
$isEH:true},
+KN:{
+"^":"lf;",
+$isKN:true},
+"+int":0,
QV:{
"^":"a;",
$isQV:true,
$asQV:null},
AC:{
"^":"a;"},
+zM:{
+"^":"a;",
+$iszM:true,
+$aszM:null,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+"+List":0,
Z0:{
"^":"a;",
$isZ0:true},
L9:{
"^":"a;",
bu:function(a){return"null"}},
+"+Null":0,
+lf:{
+"^":"a;",
+$islf:true},
+"+num":0,
a:{
"^":";",
n:function(a,b){return this===b},
giO:function(a){return H.eQ(this)},
bu:function(a){return H.a5(this)},
T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
$isa:true},
Od:{
"^":"a;",
$isOd:true},
MN:{
"^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
WU:{
"^":"a;Qk,SU,Oq,Wn",
gl:function(){return this.Wn},
@@ -7224,14 +7257,11 @@
z=this.Oq
this.SU=z
y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
if((u&64512)===56320){this.Oq=v+1
this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
return!0}}this.Oq=v
@@ -7284,7 +7314,7 @@
if(z&&!0)return""
z=!z
if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
return y},
Ky:function(a,b){if(a==="")return"/"+H.d(b)
return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7319,13 +7349,20 @@
z.KF(y)}y=this.Ka
if(""!==y){z.KF("#")
z.KF(y)}return z.vM},
-n:function(a,b){var z,y
+n:function(a,b){var z,y,x
if(b==null)return!1
z=J.x(b)
if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=this.Fi
+x=b.Fi
+if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+if(z==null?y==null:z===y){z=this.tP
+y=b.tP
+if(z==null?y==null:z===y){z=this.Ka
+y=b.Ka
+y=z==null?y==null:z===y
+z=y}else z=!1}else z=!1}else z=!1
else z=!1
else z=!1
else z=!1
@@ -7337,7 +7374,7 @@
else this.HC=e
this.r0=this.x6(c,d)},
$isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
x=new P.hP()
w=new P.Uo(a1)
v=J.U6(a1)
@@ -7394,17 +7431,17 @@
a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
x=J.Wx(i)
a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
+return z},L7:function(a){var z,y
if(a.length===0)return a
if(C.xB.j(a,0)===91){z=a.length-1
if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
P.eg(C.xB.Nj(a,1,z))
return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
z=new P.hb()
if(a==null)return""
y=a.length
@@ -7418,7 +7455,7 @@
if(u>=8)return H.e(C.mK,u)
u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
z={}
y=a==null
if(y&&!0)return""
@@ -7427,7 +7464,8 @@
x=P.p9("")
z.a=!0
C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},UJ:function(a){if(a==null)return""
+return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z={}
y=J.U6(a).u8(a,"%")
z.a=y
@@ -7466,11 +7504,11 @@
r=m}else{z.a=t
r=t}}if(z.b==null)return a
if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
+return J.AG(z.b)},q5:function(a){var z,y
z=new P.Mx()
y=a.split(".")
if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
z=new P.kZ()
y=new P.JT(a,z)
if(J.q8(a)<2)z.$1("address is too short")
@@ -7490,26 +7528,26 @@
if(t>=J.q8(s))H.vh(P.N(t))
if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
+J.wT(x,-1)
+u=!0}else J.wT(x,y.$2(w,t))
w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
q=J.de(w,J.q8(a))
p=J.de(J.MQ(x),-1)
if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
+if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
+s=J.c1(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.Eh(J.UQ(v,2),8)
+J.wT(x,(s|r)>>>0)
+r=J.c1(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)
+J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
s=new H.kV(x,new P.d9(x))
s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
z=new P.rI()
y=P.p9("")
x=c.gZE().WJ(b)
@@ -7522,173 +7560,173 @@
y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
y.vM+=u}else{u=H.Lw(37)
y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
+z.$2(v,y)}}return y.vM}}},
hP:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=a>>>4
if(z>=8)return H.e(C.aa,z)
z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
Uo:{
-"^":"Tp:381;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:153;a",
+$1:function(a){a=J.aK(this.a,"]",a)
if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
+return a+1},
$isEH:true},
hb:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=a>>>4
if(z>=8)return H.e(C.HE,z)
z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
Kd:{
-"^":"Tp:115;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
$isEH:true},
yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+"^":"Tp:75;a,b",
+$2:function(a,b){var z=this.a
if(!z.a)this.b.KF("&")
z.a=!1
z=this.b
z.KF(P.jW(C.kg,a,C.xM,!0))
b.gl0(b)
z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},
$isEH:true},
Gs:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(!(48<=a&&a<=57))z=65<=a&&a<=70
else z=!0
-return z},"$1",null,2,0,null,382,[],"call"],
+return z},
$isEH:true},
pm:{
-"^":"Tp:380;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
+"^":"Tp:152;",
+$1:function(a){return 97<=a&&a<=102},
$isEH:true},
Tw:{
-"^":"Tp:380;",
-$1:[function(a){var z
+"^":"Tp:152;",
+$1:function(a){var z
if(a<128){z=C.jn.GG(a,4)
if(z>=8)return H.e(C.kg,z)
z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,379,[],"call"],
+return z},
$isEH:true},
wm:{
-"^":"Tp:381;b,c,d",
-$1:[function(a){var z,y
+"^":"Tp:153;b,c,d",
+$1:function(a){var z,y
z=this.b
-y=C.xB.j(z,a)
+y=J.lE(z,a)
if(this.d.$1(y)===!0)return y-32
else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
+else return y},
$isEH:true},
FB:{
-"^":"Tp:381;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
+"^":"Tp:153;e",
+$1:function(a){var z,y,x,w,v
+for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
+if(48<=v&&v<=57)x=x*16+v-48
+else{v|=32
+if(97<=v&&v<=102)x=x*16+v-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
$isEH:true},
Lk:{
-"^":"Tp:125;a,f",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:21;a,f",
+$0:function(){var z,y,x,w,v
z=this.a
y=z.b
x=z.c
w=this.f
v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
+if(y==null)z.b=P.p9(J.Nj(w,x,v))
+else y.KF(J.Nj(w,x,v))},
$isEH:true},
XZ:{
-"^":"Tp:384;",
-$2:[function(a,b){var z=J.v1(a)
+"^":"Tp:154;",
+$2:function(a,b){var z=J.v1(a)
if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
+return b*31+z&1073741823},
$isEH:true},
Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
$isEH:true},
C9:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y
z=H.BU(a,null,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,385,[],"call"],
+return z},"$1",null,2,0,null,155,[],"call"],
$isEH:true},
kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
+"^":"Tp:49;",
+$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
$isEH:true},
JT:{
-"^":"Tp:386;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:156;a,b",
+$2:function(a,b){var z,y
if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
z=H.BU(C.xB.Nj(this.a,a,b),16,null)
y=J.Wx(z)
if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
+return z},
$isEH:true},
d9:{
-"^":"Tp:115;c",
-$1:[function(a){var z=J.x(a)
+"^":"Tp:16;c",
+$1:function(a){var z=J.x(a)
if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},
$isEH:true},
rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Tp:75;",
+$2:function(a,b){var z=J.Wx(a)
b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
$isEH:true}}],["dart.dom.html","dart:html",,W,{
"^":"",
UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,61,7,[]],
+r3:function(a,b){return document.createElement(a)},
+Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
z=W.zU
y=H.VM(new P.Zf(P.Dt(z)),[z])
x=new XMLHttpRequest()
C.W3.eo(x,"GET",a,!0)
z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
z=C.MD.aM(x)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
ED:function(a){var z,y
z=document.createElement("input",null)
if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+C0:function(a,b){a=536870911&a+b
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
if(a==null)return
if("setInterval" in a){z=W.P1(a)
if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},
+qr:function(a){return a},
+Pd:function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},
+YT:function(a,b){return new W.vZ(a,b)},
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
z=J.Xr(d)
if(z==null)throw H.b(P.u(d))
y=z.prototype
@@ -7710,19 +7748,19 @@
Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
q={prototype:s}
if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},
+aF:function(a){if(J.de($.X3,C.NU))return a
if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},
qE:{
"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
zw:{
"^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$iszM:true,
+$aszM:function(){return[W.nX]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.nX]},
@@ -7789,7 +7827,7 @@
Kb:function(a,b){return a.getElementById(b)},
ek:function(a,b,c){return a.importNode(b,c)},
gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
gLm:function(a){return C.i3.aM(a)},
gVY:function(a){return C.DK.aM(a)},
Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7797,7 +7835,7 @@
pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
$isYN:true,
"%":"Document|HTMLDocument|XMLDocument"},
-Aj:{
+hN:{
"^":"KV;",
gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
return a._docChildren},
@@ -7836,6 +7874,9 @@
Ja:function(a,b){return a.querySelector(b)},
pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
gDD:function(a){return new W.I4(a)},
+sDD:function(a,b){var z=this.gDD(a)
+z.V1(0)
+z.FV(z,b)},
gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
i4:function(a){},
@@ -7859,7 +7900,7 @@
PN:function(a,b){return a.getAttribute(b)},
Zi:function(a){return a.getBoundingClientRect()},
gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
gLm:function(a){return C.i3.f0(a)},
gVY:function(a){return C.DK.f0(a)},
gE8:function(a){return C.W2.f0(a)},
@@ -7912,8 +7953,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -7965,7 +8006,7 @@
"^":"qE;mH:href=,t5:type%",
$isQj:true,
"%":"HTMLLinkElement"},
-U4:{
+ZD:{
"^":"Gv;cC:hash%,mH:href=",
VD:function(a){return a.reload()},
bu:function(a){return a.toString()},
@@ -8014,7 +8055,7 @@
tH:{
"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
"%":"MIDIInput;MIDIPort"},
-Wp:{
+Aj:{
"^":"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},
@@ -8025,7 +8066,7 @@
z=W.qc(a.target)
y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+$isAj:true,
"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
H9:{
"^":"Gv;",
@@ -8083,8 +8124,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -8134,7 +8175,7 @@
$islp:true,
"%":"HTMLSelectElement"},
I0:{
-"^":"Aj;",
+"^":"hN;",
Kb:function(a,b){return a.getElementById(b)},
$isI0:true,
"%":"ShadowRoot"},
@@ -8224,7 +8265,7 @@
X6:function(a,b,c){return this.xc(a,b,c,null)},
bu:function(a){return a.toString()},
gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
gLm:function(a){return C.i3.aM(a)},
gVY:function(a){return C.DK.aM(a)},
$isu9:true,
@@ -8263,7 +8304,7 @@
$istn:true,
$astn:function(){return[null]},
"%":"ClientRect|DOMRect"},
-SC:{
+Wp:{
"^":"qE;",
$isD0:true,
"%":"HTMLFrameSetElement"},
@@ -8280,8 +8321,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]},
@@ -8300,8 +8341,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]},
@@ -8320,8 +8361,8 @@
throw H.b(P.w("No elements"))},
Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]},
@@ -8364,7 +8405,7 @@
if(z==null)throw H.b(P.w("No elements"))
return z},
$asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
+$aszM:function(){return[W.cv]},
$asQV:function(){return[W.cv]}},
wz:{
"^":"ar;Sn,Sc",
@@ -8378,14 +8419,15 @@
np:function(a){return this.GT(a,null)},
grZ:function(a){return C.t5.grZ(this.Sn)},
gDD:function(a){return W.or(this.Sc)},
+sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
+gVl:function(a){return C.T1.Uh(this)},
gLm:function(a){return C.i3.Uh(this)},
gVY:function(a){return C.DK.Uh(this)},
nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null,
@@ -8393,8 +8435,14 @@
z.nJ(a,b)
return z}}},
B1:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
+$isEH:true},
+BH:{
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
+J.H2(a,z)
+return z},
$isEH:true},
nX:{
"^":"Gv;"},
@@ -8411,28 +8459,28 @@
static:{"^":"fD"}},
RAp:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
Gb:{
"^":"RAp+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
Kx:{
-"^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
-$isEH:true},
-Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
$isEH:true},
iO:{
-"^":"Tp:115;b,c",
+"^":"Tp:75;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
+$isEH:true},
+bU:{
+"^":"Tp:16;b,c",
$1:[function(a){var z,y,x
z=this.c
y=z.status
@@ -8441,11 +8489,11 @@
x=this.b
if(y){y=x.MM
if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(b!=null)this.a[a]=b},
$isEH:true},
e7:{
"^":"ar;NL",
@@ -8492,61 +8540,61 @@
return z[b]},
$ise7:true,
$asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
$asQV:function(){return[W.KV]}},
nNL:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
ma:{
"^":"nNL+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
yoo:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
ecX:{
"^":"yoo+Gm;",
-$isList:true,
-$asWO:function(){return[W.KV]},
+$iszM:true,
+$aszM:function(){return[W.KV]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.KV]}},
zLC:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]}},
w1p:{
"^":"zLC+Gm;",
-$isList:true,
-$asWO:function(){return[W.yg]},
+$iszM:true,
+$aszM:function(){return[W.yg]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.yg]}},
dxW:{
"^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]}},
kEI:{
"^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$iszM:true,
+$aszM:function(){return[W.uj]},
$isyN:true,
$isQV:true,
$asQV:function(){return[W.uj]}},
@@ -8562,23 +8610,23 @@
b.$2(y,this.t(0,y))}},
gvc:function(){var z,y,x,w
z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
y.push(J.O6(z[w]))}}return y},
gUQ:function(a){var z,y,x,w
z=this.MW.attributes
-y=H.VM([],[J.O])
+y=H.VM([],[P.qU])
for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
y.push(J.Vm(z[w]))}}return y},
gl0:function(a){return this.gB(this)===0},
gor:function(a){return this.gB(this)!==0},
$isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
$isEH:true},
i7:{
"^":"tJ;MW",
@@ -8594,7 +8642,7 @@
FJ:function(a){return a.namespaceURI==null}},
nF:{
"^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,P.qU)
this.Kd.aN(0,new W.Si(z))
return z},
p5:function(a){var z,y
@@ -8610,38 +8658,38 @@
z.yJ(a)
return z}}},
FK:{
-"^":"Tp:115;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Si:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a.FV(0,a.lF())},
$isEH:true},
vf:{
-"^":"Tp:115;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.OS(this.a)},
$isEH:true},
Iw:{
-"^":"Tp:115;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a,b",
+$1:function(a){return a.O4(this.a,this.b)},
$isEH:true},
Fc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.V1(a,this.a)},
$isEH:true},
hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){return this.a.$1(b)===!0||a===!0},
$isEH:true},
I4:{
"^":"As;MW",
lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+z=P.Ls(null,null,null,P.qU)
for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
if(x.length!==0)z.h(0,x)}return z},
p5:function(a){P.F(a,!0,null)
J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+e0:{
"^":"a;Ph",
zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
aM:function(a){return this.zc(a,!1)},
@@ -8663,13 +8711,13 @@
return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
$isqh:true},
ie:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
$isEH:true},
Ea:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
pu:{
"^":"qh;DI,Sg,Ph",
@@ -8687,13 +8735,13 @@
yI:function(a){return this.KR(a,null,null,null)},
$isqh:true},
i2:{
-"^":"Tp:115;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,316,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.eI(J.l2(a),this.a)},
$isEH:true},
b0:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+return a},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Ov:{
"^":"MO;VP,uv,Ph,u7,Sg",
@@ -8724,10 +8772,10 @@
cO:[function(a){var z,y
for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,125],
+this.aV.cO(0)},"$0","gJK",0,0,21],
KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
RX:{
-"^":"Tp:126;a,b",
+"^":"Tp:22;a,b",
$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
$isEH:true},
bO:{
@@ -8749,8 +8797,8 @@
YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
@@ -8758,7 +8806,7 @@
"^":"ar;xa",
gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
+h:function(a,b){J.wT(this.xa,b)},
Rz:function(a,b){return J.V1(this.xa,b)},
V1:function(a){J.U2(this.xa)},
t:function(a,b){var z=this.xa
@@ -8794,11 +8842,11 @@
return!1},
gl:function(){return this.QZ}},
vZ:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z=H.Va(this.b)
Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,62,[],"call"],
$isEH:true},
dW:{
"^":"a;Ui",
@@ -8810,8 +8858,8 @@
On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
$isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:function(a){if(a===window)return a
+else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
"^":"",
hF:{
"^":"Gv;",
@@ -8866,7 +8914,7 @@
ca:{
"^":"d5;x=,y=",
"%":"SVGFEPointLightElement"},
-zu:{
+zt:{
"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
"%":"SVGFESpecularLightingElement"},
eW:{
@@ -8899,7 +8947,7 @@
Ac:{
"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
"%":"SVGPatternElement"},
-MU:{
+jr:{
"^":"Yz;fg:height=,R:width=,x=,y=",
"%":"SVGRectElement"},
nd:{
@@ -8917,7 +8965,7 @@
J.r4(z.h2.NL)
z.FV(0,b)},
gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
gLm:function(a){return C.i3.f0(a)},
gVY:function(a){return C.DK.f0(a)},
gE8:function(a){return C.W2.f0(a)},
@@ -8947,7 +8995,7 @@
"^":"As;LO",
lF:function(){var z,y,x,w
z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+y=P.Ls(null,null,null,P.qU)
if(z==null)return y
for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
if(w.length!==0)y.h(0,w)}return y},
@@ -8962,16 +9010,16 @@
$ishq:true,
static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
"^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
R4:[function(a,b,c,d){var z
if(b===!0){z=[c]
C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
+Dm:function(a,b,c){var z
if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},
wY:[function(a){var z
if(a==null)return
else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -8980,10 +9028,10 @@
else if(!!z.$isiP)return H.o2(a)
else if(!!z.$isE4)return a.eh
else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,115,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
+hE:function(a,b,c){var z=P.Om(a,b)
if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
dU:[function(a){var z
if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
else{if(a instanceof Object){z=J.x(a)
@@ -8991,13 +9039,13 @@
if(z)return a
else if(a instanceof Date)return P.Wu(a.getTime(),!1)
else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
+ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
E4:{
"^":"a;eh",
t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9025,9 +9073,9 @@
C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
x=z.bind.apply(z,y)
String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","Ij",2,0,null,248,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
Gn:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y,x,w,v
z=this.a
if(z.x4(a))return z.t(0,a)
@@ -9038,7 +9086,7 @@
x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
z.u(0,a,v)
C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
$isEH:true},
r7:{
"^":"E4;eh"},
@@ -9077,61 +9125,61 @@
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
GT:function(a,b){this.V7("sort",[b])},
np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
+static:{BE:function(a,b,c){var z=J.Wx(a)
if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
Wk:{
"^":"E4+lD;",
-$isList:true,
-$asWO:null,
+$iszM:true,
+$aszM:null,
$isyN:true,
$isQV:true,
$asQV:null},
DV:{
-"^":"Tp:115;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Tp:16;",
+$1:function(a){var z=P.xZ(a,!1)
P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
$isEH:true},
Hp:{
-"^":"Tp:115;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return new this.a(a)},
$isEH:true},
Nz:{
-"^":"Tp:115;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.r7(a)},
$isEH:true},
Jd:{
-"^":"Tp:115;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
$isEH:true},
QS:{
-"^":"Tp:115;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return new P.E4(a)},
$isEH:true}}],["dart.math","dart:math",,P,{
"^":"",
-VC:[function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
if(typeof b!=="number")throw H.b(P.u(b))
if(a>b)return b
if(a<b)return a
if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
if(typeof b!=="number")throw H.b(P.u(b))
if(a>b)return a
if(a<b)return b
if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
if(C.ON.gG0(b))return b
return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],199,[]],
+return a},
mg:{
"^":"a;",
j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9233,14 +9281,20 @@
$ishL:true},
HDe:{
"^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
if(b==null)return!1
z=J.x(b)
if(!z.$istn)return!1
@@ -9249,20 +9303,26 @@
if(y==null?x==null:y===x){y=this.G6
x=z.gG6(b)
if(y==null?x==null:y===x){x=this.Bb
+w=this.R
if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
z=J.v1(this.gBb(this))
y=this.G6
x=J.v1(y)
w=this.Bb
+v=this.R
if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
+if(typeof u!=="number")return H.s(u)
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
z.$builtinTypeInfo=this.$builtinTypeInfo
return z}},
@@ -9279,14 +9339,14 @@
else y=d
return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
"^":"",
-re:[function(a){var z,y
+re:function(a){var z,y
z=J.x(a)
if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
y=P.o1(a)
if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","vG",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
+return y.gJi()},
+o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},
QF:{
"^":"a;",
$isQF:true},
@@ -9336,7 +9396,7 @@
WS4:{
"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
"^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
Gj:{
"^":"mAS;EV"},
mAS:{
@@ -9366,7 +9426,6 @@
Rz:function(a,b){return this.EV.Rz(0,b)},
gUQ:function(a){var z=this.EV
return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
"^":"",
UI:function(a){a.toString
@@ -9377,7 +9436,6 @@
return a},
WZ:{
"^":"Gv;",
-gbx:function(a){return C.PT},
$isWZ:true,
"%":"ArrayBuffer"},
pF:{
@@ -9393,12 +9451,10 @@
"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
df:{
"^":"pF;",
-gbx:function(a){return C.T1},
$isHY:true,
"%":"DataView"},
Hg:{
"^":"Dg;",
-gbx:function(a){return C.hN},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9407,16 +9463,15 @@
a[b]=c},
D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
$isHY:true,
"%":"Float32Array"},
fS:{
"^":"Dg;",
-gbx:function(a){return C.lk},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9425,16 +9480,15 @@
a[b]=c},
D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]},
+$asQV:function(){return[P.CP]},
$isHY:true,
"%":"Float64Array"},
PS:{
"^":"Pg;",
-gbx:function(a){return C.jV},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9443,16 +9497,15 @@
a[b]=c},
D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int16Array"},
dE:{
"^":"Pg;",
-gbx:function(a){return C.Im},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9461,16 +9514,15 @@
a[b]=c},
D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int32Array"},
-IJ:{
+Eb:{
"^":"Pg;",
-gbx:function(a){return C.la},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9479,16 +9531,15 @@
a[b]=c},
D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Int8Array"},
us:{
"^":"Pg;",
-gbx:function(a){return C.iG},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9497,16 +9548,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Uint16Array"},
qe:{
"^":"Pg;",
-gbx:function(a){return C.Vh},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
return a[b]},
@@ -9515,16 +9565,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"Uint32Array"},
eE:{
"^":"Pg;",
-gbx:function(a){return C.nG},
gB:function(a){return a.length},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9534,16 +9583,15 @@
a[b]=c},
D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":"CanvasPixelArray|Uint8ClampedArray"},
V6:{
"^":"Pg;",
-gbx:function(a){return C.eY},
gB:function(a){return a.length},
t:function(a,b){var z=a.length
if(b>>>0!==b||b>=z)this.J2(a,b,z)
@@ -9553,11 +9601,11 @@
a[b]=c},
D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]},
+$asQV:function(){return[P.KN]},
$isHY:true,
"%":";Uint8Array"},
b0B:{
@@ -9582,18 +9630,18 @@
return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
$isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
Ui:{
"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iszM:true,
+$aszM:function(){return[P.CP]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.Pp]}},
+$asQV:function(){return[P.CP]}},
Ip:{
"^":"Ui+SU7;"},
Pg:{
@@ -9602,36 +9650,36 @@
return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
$isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
ObS:{
"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iszM:true,
+$aszM:function(){return[P.KN]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.bU]}},
+$asQV:function(){return[P.KN]}},
nA:{
"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
"^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
return}if(typeof window=="object")return
if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
"^":"",
Ir:{
-"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"error",307,330],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
+"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
"@":function(){return[C.uW]},
static:{hG:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9639,29 +9687,29 @@
a.X0=w
C.OD.ZL(a)
C.OD.oX(a)
-return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[392],
+return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[159],
D13:{
"^":"uL+Pi;",
$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
"^":"",
-rm:{
-"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
+bf:{
+"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
+gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
+gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
+gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
z=this.ct(a,C.eh,a.Ab,z)
a.Ab=z
if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
kk:[function(a,b,c,d){var z,y,x
J.zJ(b)
z=a.a3
@@ -9670,15 +9718,15 @@
x=R.Jk(y)
J.kW(x,"expr",z)
J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
"@":function(){return[C.Qz]},
static:{Rp:[function(a){var z,y,x,w,v
z=R.Jk([])
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.Ab="1-line"
@@ -9688,39 +9736,39 @@
a.X0=v
C.Gh.ZL(a)
C.Gh.oX(a)
-return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[400],
+return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[167],
WZq:{
"^":"uL+Pi;",
$isd3:true},
YW:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
"^":"",
Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
-gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
+"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
+gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,115,30,[],"callback",307],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",307,330],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",307],
-gyG:[function(a){return a.oy},null,null,1,0,310,"result",307,330],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,311,30,[],"result",307],
-hT:[function(a,b,c,d){var z=a.TS
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
+gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
+gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+wB:[function(a,b,c,d){var z=a.TS
if(z===!0)return
if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
"@":function(){return[C.Vn]},
static:{fL:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.TS=!1
@@ -9732,35 +9780,35 @@
a.X0=w
C.UF.ZL(a)
C.UF.oX(a)
-return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[401],
+return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[169],
Nr:{
"^":"xc+Pi;",
$isd3:true},
Ou:{
-"^":"Tp:311;a-85",
+"^":"Tp:86;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
$isEH:true},
-"+ Ou":[346],
+"+ Ou":[124],
tM:{
-"^":"Tp:126;b-85",
+"^":"Tp:22;b-29",
$0:[function(){var z,y
z=this.b
y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ tM":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ tM":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
"^":"",
UL:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.E6]},
static:{zY:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -9769,19 +9817,19 @@
a.X0=w
C.MC.ZL(a)
C.MC.oX(a)
-return a},null,null,0,0,126,"new FieldRefElement$created"]}},
-"+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,22,"new FieldRefElement$created"]}},
+"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
"^":"",
jM:{
-"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"field",307,330],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
+st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,105,27,[],"field",82],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
+static:{Sy:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9789,18 +9837,18 @@
a.X0=w
C.LT.ZL(a)
C.LT.oX(a)
-return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[402],
+return a},null,null,0,0,22,"new FieldViewElement$created"]}},
+"+FieldViewElement":[170],
pva:{
"^":"uL+Pi;",
$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
"^":"",
qW:{
-"^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
-aZ:[function(a,b){var z,y,x
-Q.xI.prototype.aZ.call(this,a,b)
+"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+P9:[function(a,b){var z,y,x
+Q.xI.prototype.P9.call(this,a,b)
this.ct(a,C.D2,0,1)
this.ct(a,C.mP,0,1)
z=a.tY
@@ -9812,18 +9860,18 @@
a.qe=this.ct(a,C.D2,a.qe,x)
if(y){y=J.U6(z)
y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
+gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
+gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
"@":function(){return[C.o3]},
static:{Wz:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.lh=!0
@@ -9836,20 +9884,20 @@
a.X0=w
C.Xo.ZL(a)
C.Xo.oX(a)
-return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[403],
+return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[171],
rs:{
"^":"xI+Pi;",
$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
"^":"",
mk:{
-"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",307],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",307,330],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",307],
+"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
+gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
+gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
FW:[function(a,b){var z,y,x
z=b!=null
y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9858,7 +9906,7 @@
z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
x=z?J.UQ(b,"owner"):null
if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
ql:[function(a,b){var z,y
this.ct(a,C.AO,0,1)
this.ct(a,C.fy,0,1)
@@ -9891,13 +9939,13 @@
case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
break
default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.nu]},
static:{N0:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -9905,43 +9953,43 @@
a.X0=w
C.h4.ZL(a)
C.h4.oX(a)
-return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[405],
+return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[174],
cda:{
"^":"uL+Pi;",
$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
"^":"",
Qb:{
"^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
uc:{
"^":"a;Yu<,tL"},
pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
-gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,331,30,[],"fragmentation",307],
+"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
+gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
a.hi=z
J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
LV:[function(a,b){var z,y,x
for(z=J.GP(b),y=0;z.G();){x=z.gl()
if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
tn:[function(a,b,c,d){var z,y
z=a.UL
y=J.uH(c,"@")
if(0>=y.length)return H.e(y,0)
J.kW(z,b,y[0])
J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
an:[function(a,b,c){var z,y,x,w,v,u,t
for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
x=J.U6(y)
@@ -9956,16 +10004,16 @@
J.kW(t,w,x[0])
J.kW(a.rM,w,u)
J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
Ic:[function(a,b){var z,y,x
z=O.x6(a.An,b)
y=z.mS
x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
+z=J.vX(a.dW,J.eY(a.An))
y=J.Ts(O.x6(a.An,b).mS,4)
x=J.Wx(y)
w=x.Z(y,z)
@@ -9990,7 +10038,7 @@
break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
r=J.UQ(a.Oh,"unit_size_bytes")
if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
U8:[function(a,b){var z,y,x,w,v,u
z=J.RE(b)
y=this.WE(a,z.gD7(b))
@@ -10001,9 +10049,9 @@
v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
My:[function(a){var z,y,x,w
z=a.Oh
if(z==null||a.hi==null)return
@@ -10019,9 +10067,9 @@
if(typeof w!=="number")return H.s(w)
w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
a.An=w
-J.No(a.hi,J.YD(w))
+J.No(a.hi,J.eY(w))
J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,125,"_updateFragmentationData"],
+this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
z=J.UQ(a.Oh,"pages")
y=J.U6(z)
@@ -10057,20 +10105,20 @@
J.wp(n.gRn(o),y,x.g(y,4),l)
v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.eY(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
pA:[function(a,b){var z=a.Oh
if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
"@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
z=P.Fl(null,null)
y=P.Fl(null,null)
x=P.Fl(null,null)
w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
+v=P.Py(null,null,null,P.qU,W.I0)
+u=P.qU
t=W.cv
t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
a.rM=z
@@ -10081,41 +10129,41 @@
a.X0=t
C.pJ.ZL(a)
C.pJ.oX(a)
-return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[420],
+return a},null,null,0,0,22,"new HeapMapElement$created"]}},
+"+HeapMapElement":[189],
waa:{
"^":"uL+Pi;",
$isd3:true},
WQ:{
-"^":"Tp:126;a-85,b-317",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29,b-93",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ WQ":[346],
+"+ WQ":[124],
aG:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ aG":[346],
+"+ aG":[124],
aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ aO":[346],
+"+ aO":[124],
oc:{
-"^":"Tp:126;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
+"^":"Tp:22;a-29",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
$isEH:true},
-"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
"^":"",
jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
-gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
+"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
+gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
i4:[function(a){var z,y
Z.uL.prototype.i4.call(this,a)
z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10128,10 +10176,10 @@
z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
a.CO=z
z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,125,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
+this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
a.nc.lb()
for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
if(this.K1(a,y))continue
@@ -10142,81 +10190,85 @@
t=this.VI(a,y,4)
s=this.VI(a,y,5)
r=this.VI(a,y,6)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
+q=this.VI(a,y,7)
+p=this.VI(a,y,8)
+J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
a.GQ.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(q)
-J.qK(a.GQ,["Used",z.t(q,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.GQ,["External",z.t(q,"external")])
+o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
+z=J.U6(o)
+J.qK(a.GQ,["Used",z.t(o,"used")])
+J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.GQ,["External",z.t(o,"external")])
a.Oc.lb()
-q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(q)
-J.qK(a.Oc,["Used",z.t(q,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
-J.qK(a.Oc,["External",z.t(q,"external")])
-this.uB(a)},"$0","gYs",0,0,125,"_updateChartData"],
+o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
+z=J.U6(o)
+J.qK(a.Oc,["Used",z.t(o,"used")])
+J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
+J.qK(a.Oc,["External",z.t(o,"external")])
+this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
uB:[function(a){var z=a.J0
if(z==null)return
z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,125,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
AE:[function(a,b,c,d){var z,y
if(!!J.x(d).$isqk){z=a.nc.gxp()
y=d.cellIndex
if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
K1:[function(a,b){var z,y,x
z=J.U6(b)
y=z.t(b,"new")
x=z.t(b,"old")
for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
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)
-return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
-case 2:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),6),J.UQ(z.t(b,"old"),6))
-case 3:return J.UQ(J.UQ(b,"old"),7)
-case 4:return J.UQ(J.UQ(b,"old"),6)
-case 5:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
-case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
+case 1:return J.UQ(J.UQ(b,"new"),7)
+case 2:return J.UQ(J.UQ(b,"new"),6)
+case 3:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+case 4:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+case 5:return J.UQ(J.UQ(b,"old"),7)
+case 6:return J.UQ(J.UQ(b,"old"),6)
+case 7:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+case 8:z=J.U6(b)
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
pA:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
cQ:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
eJ:[function(a,b){var z=a.Ol
if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
pM:[function(a,b){var z,y,x,w
try{this.hZ(a)}catch(x){w=H.Ru(x)
z=w
y=new H.XO(x,null)
N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
Ar:[function(a,b){var z,y,x
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
x=J.UQ(J.UQ(z,"heaps"),y)
z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
uW:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
Q0:[function(a,b){var z,y
z=a.Ol
if(z==null)return""
y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
a.GQ=z
z.Gl("string","Type")
@@ -10226,14 +10278,14 @@
z.Gl("string","Type")
a.Oc.Gl("number","Size")
z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator",G.AF()),new G.Kt("Accumulator",G.Vj()),new G.Kt("Accumulator (Old space)",G.AF()),new G.Kt("Accumulator (Old space)",G.Vj()),new G.Kt("Current",G.AF()),new G.Kt("Current",G.Vj())],z,[],0,!0,null,null))
+z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
a.nc=z
-z.sxp(1)},null,null,0,0,126,"created"],
+z.sxp(1)},null,null,0,0,22,"created"],
"@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10242,65 +10294,65 @@
C.Vc.ZL(a)
C.Vc.oX(a)
C.Vc.Dd(a)
-return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[431],
+return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[200],
V4:{
"^":"uL+Pi;",
$isd3:true},
nx:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ nx":[346],
+"+ nx":[124],
jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ jm":[346],
+"+ jm":[124],
AN:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ AN":[346],
+"+ AN":[124],
Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ Ao":[346],
+"+ Ao":[124],
xj:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
$isEH:true},
-"+ xj":[346],
+"+ xj":[124],
VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
$isEH:true},
-"+ VB":[346]}],["html_common","dart:html_common",,P,{
+"+ VB":[124]}],["html_common","dart:html_common",,P,{
"^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
z=[]
y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
+f9:function(a){var z,y
z=J.x(a)
if(!!z.$isSg){y=z.gRn(a)
if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
dg:function(){var z=$.L4
if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
$.L4=z}return z},
@@ -10308,34 +10360,34 @@
if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
$.PN=z}return z},
aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+"^":"Tp:52;b,c",
+$1:function(a){var z,y,x
z=this.b
y=z.length
for(x=0;x<y;++x)if(z[x]===a)return x
z.push(a)
this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
$isEH:true},
rG:{
-"^":"Tp:361;d",
-$1:[function(a){var z=this.d
+"^":"Tp:137;d",
+$1:function(a){var z=this.d
if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
$isEH:true},
yh:{
-"^":"Tp:432;e",
-$2:[function(a,b){var z=this.e
+"^":"Tp:201;e",
+$2:function(a,b){var z=this.e
if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
$isEH:true},
wO:{
-"^":"Tp:126;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){},
$isEH:true},
Tm:{
-"^":"Tp:115;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+"^":"Tp:16;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
z={}
if(a==null)return a
if(typeof a==="boolean")return a
@@ -10357,7 +10409,7 @@
z.a=w
this.bK.$2(x,w)
y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+return z.a}if(!!y.$iszM){v=y.gB(a)
x=this.f.$1(a)
w=this.UI.$1(x)
if(w!=null){if(!0===w){w=new Array(v)
@@ -10367,37 +10419,37 @@
u=0
for(;u<v;++u){z=this.$1(y.t(a,u))
if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
$isEH:true},
ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
$isEH:true},
CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Tp:52;a,b",
+$1:function(a){var z,y,x,w
z=this.a
y=z.length
for(x=0;x<y;++x){w=z[x]
if(w==null?a==null:w===a)return x}z.push(a)
this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
$isEH:true},
YL:{
-"^":"Tp:361;c",
-$1:[function(a){var z=this.c
+"^":"Tp:137;c",
+$1:function(a){var z=this.c
if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,325,[],"call"],
+return z[a]},
$isEH:true},
KC:{
-"^":"Tp:432;d",
-$2:[function(a,b){var z=this.d
+"^":"Tp:201;d",
+$2:function(a,b){var z=this.d
if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
+z[a]=b},
$isEH:true},
xL:{
-"^":"Tp:115;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Tp:16;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
if(a==null)return a
if(typeof a==="boolean")return a
if(typeof a==="number")return a
@@ -10421,11 +10473,11 @@
u=J.w1(y)
t=0
for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
$isEH:true},
-qS:{
+la:{
"^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isla:true,
$isSg:true},
As:{
"^":"a;",
@@ -10444,9 +10496,11 @@
aN:function(a,b){this.lF().aN(0,b)},
zV:function(a,b){return this.lF().zV(0,b)},
ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
ev:function(a,b){var z=this.lF()
return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
Vr:function(a,b){return this.lF().Vr(0,b)},
gl0:function(a){return this.lF().X5===0},
gor:function(a){return this.lF().X5!==0},
@@ -10475,24 +10529,24 @@
this.p5(z)
return y},
$isz5:true,
-$asz5:function(){return[J.O]},
+$asz5:function(){return[P.qU]},
$isyN:true,
$isQV:true,
-$asQV:function(){return[J.O]}},
+$asQV:function(){return[P.qU]}},
GE:{
-"^":"Tp:115;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.h(0,this.a)},
$isEH:true},
rl:{
-"^":"Tp:115;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return a.FV(0,this.a)},
$isEH:true},
uQ:{
-"^":"Tp:115;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a.V1(0)},
$isEH:true},
D7:{
-"^":"ar;qt,h2",
+"^":"ar;ndS,h2",
gzT:function(){var z=this.h2
return P.F(z.ev(z,new P.hT()),!0,W.cv)},
aN:function(a,b){H.bQ(this.gzT(),b)},
@@ -10529,36 +10583,36 @@
gA:function(a){var z=this.gzT()
return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
hT:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$iscv},
$isEH:true},
GS:{
-"^":"Tp:115;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.QC(a)},
$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
"^":"",
pR:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
gD5:[function(a){var z=a.tY
if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired. Consider refreshing the page."
else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,126,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
vQ:[function(a,b,c){var z,y
z=a.tY
if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
else{y=J.w1(z)
y.u(z,"fields",null)
y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
"@":function(){return[C.VW]},
static:{lu:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -10567,31 +10621,32 @@
a.X0=w
C.cp.ZL(a)
C.cp.oX(a)
-return a},null,null,0,0,126,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[336],
+return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[110],
Js:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y
z=J.U6(a)
if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
a.szz(z.t(a,"valueAsString"))}z=this.a
y=J.RE(z)
y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
"^":"",
hx:{
-"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"instance",307,330],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-"@":function(){return[C.qlk]},
+"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"@":function(){return[C.be]},
static:{Co:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10599,15 +10654,15 @@
a.X0=w
C.pU.ZL(a)
C.pU.oX(a)
-return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[436],
+return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[206],
V9:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
"^":"",
Se:{
-"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
+"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
C4:function(a){var z,y,x,w,v,u,t,s,r
z=this.B1
y=J.UQ(z,"threshold")
@@ -10620,6 +10675,7 @@
if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
w.h(x,X.SJ(z,t,s,this))}},
o8:function(){},
+Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
mW:function(a,b,c,d){var z,y
z=this.H
this.Vh=H.d(z.gAv())
@@ -10639,29 +10695,30 @@
static:{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,[],"\u2192",!1,null,null)
+z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
+z.k7(d)
z.mW(a,b,c,d)
return z}}},
E7:{
-"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",307],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",307,308],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",307],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",307,308],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",307],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",307,308],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
+gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
+gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
+gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
+gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
+gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
+gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
+gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
+gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
pM:[function(a,b){var z,y,x,w
z=a.pD
if(z==null)return
@@ -10684,27 +10741,27 @@
a.ik=this.ct(a,C.aH,a.ik,z)
J.QP(a.pD).N3(a.pD)
J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
i4:[function(a){var z=R.Jk([])
a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,125,"_update"],
+this.EX(a)},"$0","gBn",0,0,21,"_update"],
EX:[function(a){var z,y,x,w,v
z=J.QP(a.pD).gBC()
if(z==null)return
try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
y=v
x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
YF:[function(a,b,c,d){var z,y,x,w,v,u
w=J.RE(b)
if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10715,12 +10772,12 @@
w.qU(v-1)}catch(u){w=H.Ru(u)
y=w
x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
"@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.eH=""
@@ -10737,27 +10794,27 @@
a.X0=w
C.kS.ZL(a)
C.kS.oX(a)
-return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[441],
+return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[211],
V10:{
"^":"uL+Pi;",
$isd3:true},
SV:{
-"^":"Tp:331;a-85",
+"^":"Tp:105;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
$isEH:true},
-"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
"^":"",
oO:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.j6]},
static:{Zgg:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -10766,18 +10823,18 @@
a.X0=w
C.LN.ZL(a)
C.LN.oX(a)
-return a},null,null,0,0,126,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
"^":"",
Stq:{
-"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,306,"isolate",307,330],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
"@":function(){return[C.aM]},
static:{N5:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10785,14 +10842,14 @@
a.X0=w
C.Qt.ZL(a)
C.Qt.oX(a)
-return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[443],
+return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[214],
V11:{
"^":"uL+Pi;",
$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
"^":"",
Lr:{
-"^":"a;hO,Pl",
+"^":"a;hO,YT",
eC:function(a){var z,y,x,w,v,u,t,s,r,q
z=this.hO.Yb
if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10833,36 +10890,36 @@
y.$builtinTypeInfo=[null]
z.V7("addRow",[y])}},
W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
+if(this.YT==null){z=P.L5(null,null,null,null,null)
y=new G.qu(null,z)
y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
+this.YT=y
z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
+this.YT.bG.u(0,"connectSteps",!1)
+this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
qkb:{
-"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
+"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
xo:[function(a){var z
Z.uL.prototype.xo.call(this,a)
z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
"@":function(){return[C.NG]},
static:{uD:[function(a){var z,y,x,w,v
z=P.zV(J.UQ($.NR,"DataTable"),null)
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.e6=new L.Lr(new G.ig(z),null)
@@ -10871,27 +10928,27 @@
a.X0=v
C.Xe.ZL(a)
C.Xe.oX(a)
-return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[446],
+return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[217],
V12:{
"^":"uL+Pi;",
$isd3:true},
BQ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y,x
z=this.a
y=J.RE(z)
y.ge6(z).eC(a)
x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
$isEH:true},
-"+ BQ":[346],
+"+ BQ":[124],
IT:{
-"^":"Tp:115;a-85",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
+"^":"Tp:16;a-29",
+$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
$isEH:true},
-"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
"^":"",
fM:{
"^":"a;Fv,lp",
@@ -10910,7 +10967,7 @@
x.vM+=q
this.KN(t,v)
q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof " "!=="number")return H.s(" ")
+x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof " "!=="number")return H.s(" ")
r=b*" "
s=typeof r==="string"
x.vM+=s?r:H.d(r)
@@ -10937,7 +10994,7 @@
x.vM=s+"{\n"
this.KN(v,w)
s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof " "!=="number")return H.s(" ")
+x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof " "!=="number")return H.s(" ")
t=b*" "
u=typeof t==="string"
s=x.vM+=u?t:H.d(t)
@@ -10950,12 +11007,12 @@
u=x.vM+=typeof v==="string"?v:H.d(v)
x.vM=u+"\n"}}z.Rz(0,a)}},
vj:{
-"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
+"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
-gdQ:[function(a){return a.X7},null,null,1,0,312,"mapAsString",307,308],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",307],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
+gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
oC:[function(a,b){var z,y,x
z=P.p9("")
y=P.Ls(null,null,null,null)
@@ -10965,12 +11022,12 @@
new Z.fM(z,y).KN(x,0)
z.KF("}\n")
z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
"@":function(){return[C.KH]},
static:{mA:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -10978,19 +11035,19 @@
a.X0=w
C.Yt.ZL(a)
C.Yt.oX(a)
-return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[448],
+return a},null,null,0,0,22,"new JsonViewElement$created"]}},
+"+JsonViewElement":[219],
V13:{
"^":"uL+Pi;",
$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
"^":"",
LU:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.uy]},
static:{rA:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -10999,20 +11056,20 @@
a.X0=w
C.Z3.ZL(a)
C.Z3.oX(a)
-return a},null,null,0,0,126,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
"^":"",
KL:{
-"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.Oyb]},
static:{Ro:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -11020,8 +11077,8 @@
a.X0=w
C.MG.ZL(a)
C.MG.oX(a)
-return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[449],
+return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[223],
V14:{
"^":"uL+Pi;",
$isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -11058,7 +11115,7 @@
J4:function(a){return this.dL(a,null,null)},
ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
j2:function(a){return this.xH(a,null,null)},
WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
hh:function(a){return this.WB(a,null,null)},
@@ -11074,17 +11131,17 @@
$isTJ:true,
static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
dG:{
-"^":"Tp:126;a",
-$0:[function(){var z,y,x,w,v
+"^":"Tp:22;a",
+$0:function(){var z,y,x,w,v
z=this.a
if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
y=C.xB.cn(z,".")
if(y===-1)x=z!==""?N.Jx(""):null
else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
$isEH:true},
qV:{
"^":"a;oc>,P>",
@@ -11108,34 +11165,39 @@
giO:function(a){return this.P},
bu:function(a){return this.oc},
$isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
HV:{
"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
$isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
"^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
+E2:function(){N.Jx("").sOR(C.IF)
N.Jx("").gSZ().yI(new F.em())
N.Jx("").To("Starting Observatory")
var z=H.VM(new P.Zf(P.Dt(null)),[null])
N.Jx("").To("Loading Google Charts API")
J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},
em:{
-"^":"Tp:451;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
+"^":"Tp:225;",
+$1:[function(a){var z
+if(J.de(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
+else z=!1}else z=!1
+if(z)return
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
$isEH:true},
Lb:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,17,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
"^":"",
jh:{
"^":"a;T9,Ym",
-static:{"^":"n4I,ziq,pjg,nq,xa"}},
-tzK:{
+static:{"^":"LB,en,pjg,nq,xa"}},
+WO:{
"^":"a;"},
jA:{
"^":"a;oc>"},
@@ -11145,34 +11207,40 @@
"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
"^":"",
F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
"@":function(){return[C.nW]},
static:{aD:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Mz=!0
a.SO=z
a.B7=y
a.X0=w
C.kD.ZL(a)
C.kD.oX(a)
-return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[452],
+return a},null,null,0,0,22,"new NavBarElement$created"]}},
+"+NavBarElement":[226],
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
aQ:{
-"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.u7]},
static:{AJ:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.KU="#"
@@ -11183,22 +11251,22 @@
a.X0=w
C.SU.ZL(a)
C.SU.oX(a)
-return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[453],
-V15:{
+return a},null,null,0,0,22,"new NavMenuElement$created"]}},
+"+NavMenuElement":[227],
+V16:{
"^":"uL+Pi;",
$isd3:true},
Qa:{
-"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
+"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
+gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
"@":function(){return[C.qT]},
static:{JR:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.KU="#"
@@ -11208,31 +11276,31 @@
a.X0=w
C.nn.ZL(a)
C.nn.oX(a)
-return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[454],
-V16:{
+return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[228],
+V17:{
"^":"uL+Pi;",
$isd3:true},
Ww:{
-"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,126,"callback",307,330],
+"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
Ki:function(a){return this.gFR(a).$0()},
LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
+gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
+gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
Ty:[function(a,b,c,d){var z=a.SB
if(z===!0)return
a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
"@":function(){return[C.XG]},
static:{zN:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SB=!1
@@ -11242,20 +11310,20 @@
a.X0=w
C.J7.ZL(a)
C.J7.oX(a)
-return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[455],
-V17:{
+return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[229],
+V18:{
"^":"uL+Pi;",
$isd3:true},
tz:{
-"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.hr]},
static:{J8:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11264,22 +11332,27 @@
a.X0=w
C.lx.ZL(a)
C.lx.oX(a)
-return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[456],
-V18:{
+return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[230],
+V19:{
"^":"uL+Pi;",
$isd3:true},
Mv:{
-"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
-"@":function(){return[C.zaS]},
+"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+gu6:[function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},null,null,1,0,87,"hashLinkWorkaround",82],
+su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
+"@":function(){return[C.oD]},
static:{Du:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11288,22 +11361,22 @@
a.X0=w
C.RR.ZL(a)
C.RR.oX(a)
-return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[457],
-V19:{
+return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[232],
+V20:{
"^":"uL+Pi;",
$isd3:true},
-oM:{
-"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"library",307,330],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
+Zt:{
+"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
"@":function(){return[C.KI]},
static:{PQ:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11312,22 +11385,22 @@
a.X0=w
C.ct.ZL(a)
C.ct.oX(a)
-return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[458],
-V20:{
+return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[233],
+V21:{
"^":"uL+Pi;",
$isd3:true},
iL:{
-"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
-"@":function(){return[C.qJ]},
+"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
+grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"@":function(){return[C.iF]},
static:{lT:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Jo=!1
@@ -11336,35 +11409,35 @@
a.X0=w
C.ae.ZL(a)
C.ae.oX(a)
-return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[459],
-V21:{
+return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[234],
+V22:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
"^":"",
F1i:{
-"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
+guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
z.Lw()
z.PI()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
z.Lw()
z.SC()
z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,126,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
"@":function(){return[C.kR]},
static:{fv:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.k5=!1
@@ -11374,43 +11447,43 @@
C.k0.ZL(a)
C.k0.oX(a)
C.k0.ZB(a)
-return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[463],
-V22:{
+return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[238],
+V23:{
"^":"uL+Pi;",
$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
"^":"",
uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
at:[function(a,b){var z,y,x
z=J.U6(b)
y=J.UQ(z.t(b,"script"),"user_name")
x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
"@":function(){return[C.Br]},
static:{Hx:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -11418,8 +11491,8 @@
a.X0=w
C.Pf.ZL(a)
C.Pf.oX(a)
-return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
"^":"",
Pi:{
"^":"a;",
@@ -11428,8 +11501,8 @@
z=P.bK(this.gl1(a),z,!0,null)
a.AP=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,125],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,125],
+k0:[function(a){},"$0","gqw",0,0,21],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
BN:[function(a){var z,y,x
z=a.fn
a.fn=null
@@ -11437,7 +11510,7 @@
x=H.VM(new P.Yp(z),[T.yj])
if(y.Gv>=4)H.vh(y.q7())
y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,348],
+return!0}return!1},"$0","gDx",0,0,126],
gnz:function(a){var z,y
z=a.AP
if(z!=null){y=z.iE
@@ -11461,7 +11534,7 @@
"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
kb:function(a){return this.rk.$1(a)},
gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,126,"value",307],
+gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
wE:function(a){var z,y,x,w,v
if(this.YX)return
this.YX=!0
@@ -11474,14 +11547,14 @@
x.push(w)}this.Ow()},
TF:[function(a){if(this.B6)return
this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
Ow:[function(){var z,y
this.B6=!1
z=this.b9
if(z.length===0)return
y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,125],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
cO:function(a){var z,y
z=this.b9
if(z.length===0)return
@@ -11489,15 +11562,15 @@
C.Nm.sB(z,0)
C.Nm.sB(this.kK,0)
this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,126],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,126],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
$isJ3:true},
E5:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
$isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
"^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
+Y3:function(){var z,y,x,w,v,u,t,s,r,q
if($.Td)return
if($.tW==null)return
$.Td=!0
@@ -11518,45 +11591,45 @@
for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
q=J.U6(r)
w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
+$.Td=!1},
+Ht:function(){var z={}
z.a=!1
z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
o5:{
-"^":"Tp:470;a",
-$2:[function(a,b){var z=this.a
+"^":"Tp:247;a",
+$2:function(a,b){var z=this.a
if(z.a)return
z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
+a.RK(b,new O.b5(z))},
$isEH:true},
b5:{
-"^":"Tp:126;a",
+"^":"Tp:22;a",
$0:[function(){this.a.a=!1
O.Y3()},"$0",null,0,0,null,"call"],
$isEH:true},
zI:{
-"^":"Tp:182;b",
+"^":"Tp:36;b",
$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
$isEH:true},
Zb:{
-"^":"Tp:126;c,d,e,f",
+"^":"Tp:22;c,d,e,f",
$0:[function(){this.c.$2(this.d,this.e)
return this.f.$0()},"$0",null,0,0,null,"call"],
$isEH:true},
id:{
-"^":"Tp:471;UI",
+"^":"Tp:248;UI",
$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
$isEH:true},
iV:{
-"^":"Tp:115;bK,Gq,Rm,w3",
+"^":"Tp:16;bK,Gq,Rm,w3",
$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
"^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
z=J.WB(J.xH(f,e),1)
y=J.WB(J.xH(c,b),1)
if(typeof z!=="number")return H.s(z)
@@ -11580,8 +11653,8 @@
l=J.WB(J.UQ(m,t),1)
if(v>=w)return H.e(x,v)
k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+J.kW(x[v],t,P.J(l,k))}}return x},
+Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p
z=a.length
y=z-1
if(0>=z)return H.e(a,0)
@@ -11608,11 +11681,11 @@
w=r
y=t}else{v.push(2)
x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
+w=q}}}return H.VM(new H.iK(v),[null]).br(0)},
+rB:function(a,b,c){var z,y,x
for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+return c},
+xU:function(a,b,c){var z,y,x,w,v,u
z=J.U6(a)
y=z.gB(a)
x=J.U6(b)
@@ -11622,8 +11695,8 @@
u=z.t(a,y)
w=J.xH(w,1)
u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.Wx(c)
y=J.Wx(f)
x=P.J(z.W(c,b),y.W(f,e))
@@ -11643,7 +11716,7 @@
if(typeof f!=="number")return H.s(f)
z=J.U6(d)
for(;e<f;e=r){r=e+1
-J.bi(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
+J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
t=[]
y=new P.Yp(t)
y.$builtinTypeInfo=[null]
@@ -11658,7 +11731,7 @@
y.$builtinTypeInfo=[null]
s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
n=J.WB(n,1)
-J.bi(s.Il,z.t(d,o));++o
+J.wT(s.Il,z.t(d,o));++o
break
case 2:if(s==null){t=[]
y=new P.Yp(t)
@@ -11669,10 +11742,10 @@
case 3:if(s==null){t=[]
y=new P.Yp(t)
y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
+s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
z=J.RE(b)
y=z.gWA(b)
z=z.gvH(b)
@@ -11712,12 +11785,12 @@
q.sjr(J.WB(q.gjr(),m))
if(typeof m!=="number")return H.s(m)
s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
z=H.VM([],[G.DA])
for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
+return z},
+u2:function(a,b){var z,y,x,w,v,u
if(b.length===1)return b
z=[]
for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11726,7 +11799,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},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
DA:{
"^":"a;WA>,ok<,Il<,jr@,dM",
gvH:function(a){return this.jr},
@@ -11757,15 +11830,15 @@
vly:{
"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
"^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
+Wi:function(a,b,c,d){var z=J.RE(a)
if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+return d},
d3:{
"^":"a;",
$isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+X6:{
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y,x,w,v
z=this.b
y=z.wv.rN(a).gAx()
if(!J.de(b,y)){x=this.a
@@ -11774,14 +11847,14 @@
x.a=v
x=v}else x=w
x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
"^":"",
xh:{
"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",307],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",307],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
"^":"",
wn:{
"^":"er;b3,xg,ao,AP,fn",
@@ -11789,7 +11862,7 @@
if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
this.xg=z}z.toString
return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
sB:[function(a,b){var z,y,x,w,v,u
z=this.ao
y=z.length
@@ -11817,10 +11890,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,361,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
t:[function(a,b){var z=this.ao
if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
u:[function(a,b,c){var z,y,x,w
z=this.ao
if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11832,12 +11905,12 @@
w=new P.Yp(x)
w.$builtinTypeInfo=[null]
this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
Mh:function(a,b,c){var z,y,x
z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
y=J.q8(c)
z=this.xg
if(z!=null){x=z.iE
@@ -11898,7 +11971,7 @@
oF:function(a,b,c){var z,y,x,w
if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$iszM&&!z.$isz5)c=z.br(c)
y=J.q8(c)
z=this.ao
x=z.length
@@ -11952,7 +12025,7 @@
if(x){x=H.VM(new P.Yp(y),[G.DA])
if(z.Gv>=4)H.vh(z.q7())
z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,348],
+return!0}return!1},"$0","gL6",0,0,126],
$iswn:true,
static:{uX:function(a,b){var z=H.VM([],[b])
return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11960,8 +12033,8 @@
"^":"ar+Pi;",
$isd3:true},
Bj:{
-"^":"Tp:126;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){this.a.xg=null},
$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
"^":"",
HA:{
@@ -11973,18 +12046,18 @@
$isHA:true},
qC:{
"^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",307],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,472,"length",307],
+return z.gB(z)},null,null,1,0,249,"length",82],
gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
+return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
u:[function(a,b,c){var z,y,x,w,v
z=this.Zp
y=z.gB(z)
@@ -11993,9 +12066,8 @@
w=this.AP
if(w!=null){v=w.iE
w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",307],
+if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
FV:function(a,b){J.kH(b,new V.zT(this))},
Rz:function(a,b){var z,y,x,w,v
z=this.Zp
@@ -12027,68 +12099,68 @@
return y}}},
zT:{
"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
"^":"",
-Wa:[function(a,b){var z=J.x(a)
+Wa:function(a,b){var z=J.x(a)
if(!!z.$isqI)return J.de(a.oc,b)
if(!!z.$isHA){z=J.x(b)
if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},
+yf:function(a,b){var z,y,x,w
if(a==null)return
x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$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)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=J.zH(z)
try{if(L.TH(y,b)){x=z.rN(b).gAx()
return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+return},
+ir:function(a,b,c){var z,y,x,w
if(a==null)return!1
x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&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)
+y=J.zH(z)
try{if(L.dR(y,b)){x=c
z.tu(b,2,[x],C.CM)
H.vn(x)
return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
+return!1},
+TH:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb
if(z.x4(b))return!0
if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
+a=L.pY(a)}return!1},
+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
+for(;!J.de(a,$.aA());){y=a.gYK().Fb
if(!!J.x(y.t(0,b)).$isRY)return!0
if(y.x4(z))return!0
if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
+a=L.pY(a)}return!1},
+M6:function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
+a=L.pY(a)}return!1},
+pY:function(a){var z,y
try{z=a.gAY()
return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},
+cB:function(a){a=J.JA(a,$.c3(),"")
if(a==="")return!0
if(0>=a.length)return H.e(a,0)
if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
WR:{
"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
E4:function(a){return this.cT.$1(a)},
@@ -12101,7 +12173,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,126,"value",307],
+return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
sP:[function(a,b){var z,y,x,w
z=this.BK
y=z.length
@@ -12117,16 +12189,16 @@
if(w>=z.length)return H.e(z,w)
if(L.ir(x,z[w],b)){z=this.kN
if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,474,243,[],"value",307],
+z[y]=b}},null,null,3,0,251,66,[],"value",82],
k0:[function(a){O.Pi.prototype.k0.call(this,this)
this.ov()
-this.XI()},"$0","gqw",0,0,125],
+this.XI()},"$0","gqw",0,0,21],
ni:[function(a){var z,y
for(z=0;y=this.cs,z<y.length;++z){y=y[z]
if(y!=null){y.ed()
y=this.cs
if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,125],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
Zy:function(a){var z,y,x,w,v,u
if(a==null)a=this.BK.length
z=this.BK
@@ -12212,24 +12284,24 @@
z.d4(a,b,c)
return z}}},
qL:{
-"^":"Tp:115;",
-$1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return},
$isEH:true},
Px:{
-"^":"Tp:475;a,b,c",
+"^":"Tp:253;a,b,c",
$1:[function(a){var z,y
for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
$isEH:true},
C4:{
-"^":"Tp:476;d,e,f",
+"^":"Tp:254;d,e,f",
$1:[function(a){var z,y
for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+return}},"$1",null,2,0,null,252,[],"call"],
$isEH:true},
Md:{
-"^":"Tp:126;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
$isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
"^":"",
Jk:[function(a){var z,y,x
@@ -12240,46 +12312,46 @@
return y}if(!!z.$isQV){z=z.ez(a,R.np())
x=Q.uX(null,null)
x.FV(0,z)
-return x}return a},"$1","np",2,0,115,30,[]],
+return x}return a},"$1","np",2,0,16,27,[]],
km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
"^":"",
-JX:[function(){var z,y
+JX:function(){var z,y
z=document.createElement("style",null)
J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
y=document.querySelector("head")
y.insertBefore(z,y.firstChild)
A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},
+B2:function(){var z,y,x
for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.pP(x.lo).h(0,"polymer-veiled")}},"$0","r8",0,0,null],
-yV:[function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
+yV:function(a){var z,y
z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
+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
+for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
if(y.gFo()||y.gq4())continue
x=J.x(y)
if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
else w=!0
if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},
+yX:function(a,b){var z,y
+do{z=a.gYK().Fb.t(0,b)
y=J.x(z)
if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
+return},
+bc:function(a,b){var z,y
z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
+y=a.gYK().Fb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},
+YG:function(a,b,c){var z,y,x
z=$.cM()
if(z==null||a==null)return
if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12287,8 +12359,8 @@
if(y==null)return
x=J.UQ(y,"ShadowCSS")
if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v,u
if(a==null)return""
w=J.RE(a)
z=w.gmH(a)
@@ -12306,67 +12378,68 @@
if(!!J.x(w).$isNh){y=w
x=new H.XO(u,null)
$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","BV",2,0,null,272,[]],
-Ad:[function(a,b){var z
+return""}else throw u}},
+Ad:function(a,b){var z
if(b==null)b=C.Tu
$.Ej().u(0,a,b)
z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+if(z!=null)J.Or(z)},
+xv:function(a){A.om(a,new A.Mq())},
+om:function(a,b){var z
if(a==null)return
b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
+lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},
+z9:function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
+return $.od().t(0,a)},
+HR:function(a,b,c){var z,y,x
z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
+y=A.Rk(z.gt5(z),b)
if(y!=null){x=y.gMP()
x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
+Rk:function(a,b){var z
+do{z=a.gYK().Fb.t(0,b)
if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","Uy",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+a=a.gAY()}while(a!=null)},
+ZI:function(a,b){var z,y
if(a==null)return
z=document.createElement("style",null)
J.c9(z,J.nJ(a))
y=a.getAttribute("element")
if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
+b.appendChild(z)},
+pX:function(){var z=window
C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},
+al:function(a,b){var z,y,x
z=J.x(b)
y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
z=J.RE(y)
if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
+z=H.vn(a)
+return z.gt5(z)}return y},
+h5:function(a){if(a==null)return C.Qf
if(typeof a==="number"&&Math.floor(a)===a)return C.yw
if(typeof a==="number")return C.O4
if(typeof a==="boolean")return C.HL
if(typeof a==="string")return C.Db
if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},
+Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
z.Gr(A.PB())
return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
+return $.X3},
ei:[function(){var z=document
W.wi(window,z,"polymer-element",C.Bm,null)
A.Jv()
A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,125],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
+$.ax().ml(new A.rD())},"$0","PB",0,0,21],
+Jv:function(){var z,y,x,w,v,u,t
+for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
try{A.pw(z)}catch(v){u=H.Ru(v)
y=u
x=new H.XO(v,null)
@@ -12376,11 +12449,11 @@
t=y
if(t==null)H.vh(P.u("Error must not be null"))
if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},
+GA:function(a,b,c,d){var z,y,x,w,v,u
if(c==null)c=P.Ls(null,null,null,W.YN)
if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
y=$.oK
if(y==null)H.qw(z)
else y.$1(z)
@@ -12394,8 +12467,8 @@
x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
v=$.oK
if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},
+pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
z=$.RQ()
z.toString
y=P.hK(a)
@@ -12417,17 +12490,19 @@
s=y.tP}w=z.ku
v=z.gJf(z)
u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
+y=$.UG().Fb
o=y.t(0,p)
n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+r=p.Fi
+q=z.Fi
+if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
else z=!1
else z=!1
else z=!1
if(z){z=p.r0
m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
+return}z=o.gYK().Fb
z=z.gUQ(z)
y=new A.Fn()
r=new H.U5(z,y)
@@ -12436,7 +12511,7 @@
y=new H.SO(z,y)
y.$builtinTypeInfo=[H.Kp(r,0)]
for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
+z=o.gYK().Fb
z=z.gUQ(z)
y=new A.e3()
r=new H.U5(z,y)
@@ -12450,8 +12525,8 @@
j=l.gYj()
$.Ej().u(0,q,j)
i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},
+ZB:function(a,b){var z,y,x
for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
break}if(!y)return
if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12464,10 +12539,10 @@
z=$.oK
if(z==null)H.qw(x)
else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
+return}a.CI(b.gIf(),C.xD)},
Zj:{
-"^":"Tp:115;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
XP:{
"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12503,7 +12578,7 @@
A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
A.YG(this.gZf(a),y,z)
w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
+v=w.gYK().Fb.t(0,C.c8)
if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
this.Ba(a,y)
A.yV(a.RT)},
@@ -12511,7 +12586,7 @@
$.p2().u(0,b,a)
if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
return!0}return!1},
Ba:function(a,b){var z,y,x,w
for(z=a,y=null;z!=null;){x=J.RE(z)
@@ -12532,7 +12607,7 @@
y=y!=null&&y.x4(w)}else y=!1
if(y)continue
v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
+u=A.yX(b,v)
if(u==null){window
y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
if(typeof console!="undefined")console.warn(y)
@@ -12540,7 +12615,7 @@
if(y==null){y=P.Fl(null,null)
a.Q7=y}y.u(0,v,u)}}},
Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
+z=P.L5(null,null,null,P.qU,P.a)
a.xX=z
y=a.aa
if(y!=null)z.FV(0,J.Ng(y))
@@ -12588,14 +12663,14 @@
q1:function(a,b){var z,y,x,w
if(J.de(b,$.H8()))return
this.q1(a,b.gAY())
-for(z=b.gYK().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
+for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
x=y.gIf().fN
w=J.rY(x)
if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
x=w.Nj(x,0,J.xH(w.gB(x),7))
a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
+qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
b.aN(0,new A.MX(z))
return z},
du:function(a){a.RT=a.getAttribute("name")
@@ -12606,48 +12681,48 @@
C.zb.du(a)
return a}}},
q6:{
-"^":"Tp:126;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+"^":"Tp:22;",
+$0:function(){return[]},
$isEH:true},
CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
$isEH:true},
LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;a",
+$2:function(a,b){var z,y,x
z=J.rY(a)
if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
$isEH:true},
ZG:{
-"^":"Tp:115;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
$isEH:true},
Oc:{
-"^":"Tp:115;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.Kf(a,this.a)},
$isEH:true},
MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
$isEH:true},
-w13:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
+w12:{
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+return z},
$isEH:true},
r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
+"^":"Tp:75;a",
+$2:function(a,b){this.a.u(0,b,a)},
$isEH:true},
yL:{
"^":"ndx;",
$isyL:true},
zs:{
-"^":["a;KM:X0=-328",function(){return[C.Nw]}],
+"^":["a;KM:X0=-102",function(){return[C.Nw]}],
Pa:function(a){var z
if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
else z=!0
@@ -12712,7 +12787,7 @@
x=y.rN(z.gIf()).gAx()
w=Z.Zh(c,x,A.al(x,z))
if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,255],
B2:function(a,b){var z=J.ak(a.dZ)
if(z==null)return
return z.t(0,b)},
@@ -12764,14 +12839,14 @@
J.AA(M.Ky(a))
y=this.gIW(a)
for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,125],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
BT:function(a,b){var z
if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
z=a.oq
if(z!=null){z.TP(0)
a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
+A.om(this.gIW(a),new A.TV())},
oW:function(a){return this.BT(a,null)},
Xl:function(a){var z,y,x,w,v
z=J.xR(a.dZ)
@@ -12784,7 +12859,7 @@
x=P.L5(null,null,null,P.wv,A.bS)
for(w=J.GP(b);w.G();){v=w.gl()
if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
+J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
rJ:function(a,b,c,d){var z,y,x,w,v
z=J.xR(a.dZ)
if(z==null)return
@@ -12801,7 +12876,7 @@
w.Bd=x.Al(P.v3())
x=H.d(J.GL(b))+"__array"
v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
a.Sa=v}v.u(0,x,w)}},
l5:function(a,b){var z=a.Sa.Rz(0,b)
if(z==null)return!1
@@ -12838,7 +12913,7 @@
u=J.UQ($.QX(),v)
t=w.t(0,u!=null?u:v)
if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
ea:function(a,b,c,d){var z,y
z=$.SS()
y=z.Im(C.R5)
@@ -12854,31 +12929,31 @@
$isD0:true,
$isKV:true},
WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+"^":"Tp:75;a",
+$2:function(a,b){var z=J.Vs(this.a)
if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
$isEH:true},
Xi:{
-"^":"Tp:126;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Tp:22;b",
+$0:function(){return this.b},
$isEH:true},
TV:{
-"^":"Tp:115;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Tp:16;",
+$1:function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},
$isEH:true},
Mq:{
-"^":"Tp:115;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
$isEH:true},
Oa:{
-"^":"Tp:126;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return new A.bS(this.a.jL,null)},
$isEH:true},
n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
+"^":"Tp:75;b,c,d,e",
+$2:function(a,b){var z,y,x
z=this.e
if(z!=null&&z.x4(a))J.Jr(this.b,a)
z=this.d
@@ -12887,14 +12962,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])}},"$2",null,4,0,null,12,[],483,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
$isEH:true},
xf:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
L6:{
-"^":"Tp:300;a,b",
+"^":"Tp:75;a,b",
$2:[function(a,b){var z,y,x
z=$.SS()
if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12903,10 +12978,10 @@
if(x!=null)y=x
z=J.f5(b).t(0,y)
H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
$isEH:true},
Rs:{
-"^":"Tp:115;c,d,e",
+"^":"Tp:16;c,d,e",
$1:[function(a){var z,y,x,w,v,u
z=this.e
y=A.z9(z)
@@ -12918,25 +12993,26 @@
u=L.Sk(v,C.xB.yn(w,1),null)
w=u.gP(u)}else v=y
u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,316,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
$isEH:true},
uJ:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
$isEH:true},
hm:{
-"^":"Tp:115;",
-$1:[function(a){var z,y,x
+"^":"Tp:16;",
+$1:[function(a){var z,y,x,w
z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-x.h(0,"polymer-unveil")
-x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,116,[],"call"],
+w=J.w1(x)
+w.h(x,"polymer-unveil")
+w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Ji:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"$1",null,2,0,null,116,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Bf:{
"^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -12951,15 +13027,15 @@
if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
z=this.dY
if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,485,265,[]],
+return}}},"$1","giz",2,0,261,252,[]],
bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
oX:function(a){this.Pa(a)},
static:{G7:function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -12969,7 +13045,7 @@
C.Iv.oX(a)
return a}}},
jpR:{
-"^":["qE+zs;KM:X0=-328",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
$iszs:true,
$isTU:true,
$isd3:true,
@@ -12991,105 +13067,104 @@
if(z!=null){z.ed()
this.ih=null}},
tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,125]},
+this.Ws()}},"$0","gv6",0,0,21]},
V3:{
"^":"a;ns",
$isV3:true},
rD:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){var z=$.mC().MM
if(z.Gv!==0)H.vh(P.w("Future already completed"))
z.OH(null)
-return},"$1",null,2,0,null,116,[],"call"],
+return},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
Fn:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isRS},
$isEH:true},
e3:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!!J.x(a).$isMs},
$isEH:true},
pM:{
-"^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return!a.gQ2()},
$isEH:true},
Mh:{
"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
"^":"",
-Zh:[function(a,b,c){var z,y,x
+Zh:function(a,b,c){var z,y,x
z=J.UQ($.CT(),J.Ba(c))
if(z!=null)return z.$2(a,b)
try{y=C.xr.kV(J.JA(a,"'","\""))
return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
+return a}},
W6:{
-"^":"Tp:126;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:22;",
+$0:function(){var z=P.L5(null,null,null,null,null)
z.u(0,C.AZ,new Z.Lf())
z.u(0,C.ok,new Z.fT())
z.u(0,C.N4,new Z.pp())
z.u(0,C.Kc,new Z.nl())
z.u(0,C.PC,new Z.ik())
z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return z},
$isEH:true},
Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
pp:{
-"^":"Tp:300;",
+"^":"Tp:75;",
$2:[function(a,b){var z,y
try{z=P.Gl(a)
return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],487,[],"call"],
+return b}},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],116,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
$isEH:true},
ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
mf:{
-"^":"Tp:115;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return this.a},
$isEH:true},
LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
$isEH:true},
HK:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){return this.b},
$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
"^":"",
ul:[function(a){var z=J.x(a)
if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,121,[]],
+return z},"$1","qP",2,0,54,70,[]],
PX:[function(a){var z=J.x(a)
if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,121,[]],
+return z},"$1","Fx",2,0,54,70,[]],
o8:{
-"^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:function(a){return J.de(this.a.t(0,a),!0)},
$isEH:true},
ex:{
-"^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
$isEH:true},
e9:{
"^":"T4p;",
op:[function(a,b,c){var z,y,x
-if(a==null)return
z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
y=new U.tc()
y=new T.FX(y,z,null,null)
@@ -13101,23 +13176,23 @@
if(M.wR(c)){z=J.x(b)
z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,263],
CE:function(a){return new T.uK(this)}},
Xy:{
-"^":"Tp:300;a,b,c",
+"^":"Tp:75;a,b,c",
$2:[function(a,b){var z
if(!J.x(a).$isz6){z=this.a.nF
a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
$isEH:true},
uK:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z
if(!!J.x(a).$isz6)z=a
else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
$isEH:true},
mY:{
"^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13126,12 +13201,12 @@
z=this.Y7
if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,115,121,[]],
-gP:[function(a){return this.Y7},null,null,1,0,126,"value",307],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
+gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
sP:[function(a,b){var z,y,x
try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,115,121,[],"value",307],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
yB:function(a,b,c){var z,y,x,w
y=this.Cu
y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13144,14 +13219,14 @@
z.yB(a,b,c)
return z}}},
GX:{
-"^":"Tp:115;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
mB:{
-"^":"Tp:115;a,b",
+"^":"Tp:16;a,b",
$1:[function(a){var z=P.L5(null,null,null,null,null)
z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,325,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
$isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
"^":"",
XF:{
@@ -13164,14 +13239,14 @@
bX:{
"^":"Tp;a,b",
$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,325,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
$isEH:true,
$signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
"^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},
+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)
@@ -13199,79 +13274,79 @@
if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
if(s)J.kW(p,u,b)
else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,121,[]],
+H.vn(b)}},
+ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},
+Uf:{
+"^":"Tp:75;",
+$2:function(a,b){return J.WB(a,b)},
+$isEH:true},
wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.xH(a,b)},
$isEH:true},
zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.vX(a,b)},
$isEH:true},
W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.FW(a,b)},
$isEH:true},
MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.de(a,b)},
$isEH:true},
YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return!J.de(a,b)},
$isEH:true},
DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.z8(a,b)},
$isEH:true},
lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.J5(a,b)},
$isEH:true},
Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.u6(a,b)},
$isEH:true},
Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return J.Bl(a,b)},
$isEH:true},
w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0||b===!0},
$isEH:true},
w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return a===!0&&b===!0},
$isEH:true},
w5:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
+"^":"Tp:75;",
+$2:function(a,b){var z=H.Og(P.a)
z=H.KT(z,[z]).BD(b)
if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,117,[],128,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},
+$isEH:true},
+w7:{
+"^":"Tp:16;",
+$1:function(a){return a},
$isEH:true},
w10:{
-"^":"Tp:115;",
-$1:[function(a){return a},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return J.Z7(a)},
$isEH:true},
w11:{
-"^":"Tp:115;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-w12:{
-"^":"Tp:115;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return a!==!0},
$isEH:true},
c4:{
-"^":"Tp:126;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Tp:22;a",
+$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
$isEH:true},
z6:{
"^":"a;eT>,k8<,bq,G9",
@@ -13285,7 +13360,8 @@
else{z=this.bq.Zp
if(z.x4(b))return K.ci(z.t(0,b))
else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
+z=this.gCH()
+x=Z.y1(z.gt5(z),y)
z=J.x(x)
if(!z.$isRY)w=!!z.$isRS&&x.glT()
else w=!0
@@ -13293,17 +13369,19 @@
else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
if(z!=null)return K.ci(z.t(0,b))
else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
+tI:function(a){var z,y
if(J.de(a,"this"))return
else{z=this.bq
if(z.Zp.x4(a))return z
else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
+tg:function(a,b){var z,y
if(this.bq.Zp.x4(b))return!0
else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
+y=this.gCH()
+if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
if(z!=null)return z.tg(0,b)
return!1},
$isz6:true},
@@ -13352,13 +13430,13 @@
return x},
ZR:function(a){var z,y,x,w,v
z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+if(y!=null)H.bQ(y,new K.Os(v))
return v},
ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
o0:function(a){var z,y
@@ -13369,7 +13447,7 @@
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))
+x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
z.sbO(x)
y.sbO(x)
return x},
@@ -13393,16 +13471,16 @@
y.sbO(x)
return x}},
Os:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
a.sbO(z)
-return z},"$1",null,2,0,null,117,[],"call"],
+return z},
$isEH:true},
B8:{
-"^":"Tp:115;a",
-$1:[function(a){var z=this.a
+"^":"Tp:16;a",
+$1:function(a){var z=this.a
a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+return z},
$isEH:true},
Wh:{
"^":"Ay;KL,bO,tj,Lv,k6",
@@ -13430,11 +13508,11 @@
$iskB:true,
$ishw:true},
ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},
$isEH:true},
-qR:{
+jV:{
"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
RR:function(a,b){return b.YV(this)},
$asAy:function(){return[U.wk]},
@@ -13456,12 +13534,12 @@
$isw6:true,
$ishw:true},
Qv:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
Xm:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
mv:{
"^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13497,8 +13575,8 @@
$isuk:true,
$ishw:true},
uA:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
vl:{
"^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13518,12 +13596,12 @@
$isx9:true,
$ishw:true},
Li:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
WK:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
iT:{
"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13533,18 +13611,18 @@
return}y=this.Jn.gLv()
x=J.U6(z)
this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
RR:function(a,b){return b.CU(this)},
$asAy:function(){return[U.zX]},
$iszX:true,
$ishw:true},
-tE:{
-"^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+ja:{
+"^":"Tp:16;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
ey:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
$isEH:true},
fa:{
"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13568,16 +13646,16 @@
$isJy:true,
$ishw:true},
WW:{
-"^":"Tp:115;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
$isEH:true},
vQ:{
-"^":"Tp:476;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
+"^":"Tp:254;a,b,c",
+$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
$isEH:true},
a9:{
-"^":"Tp:115;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Tp:16;d",
+$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
$isEH:true},
VA:{
"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13595,15 +13673,15 @@
$isX7:true,
$ishw:true},
J1:{
-"^":"Tp:115;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
$isEH:true},
fk:{
"^":"a;F5,bm",
$isfk:true},
wL:{
-"^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
+"^":"a:16;lR,ex",
+$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
$iswL:true,
$isEH:true},
B0:{
@@ -13612,27 +13690,27 @@
$isB0:true,
static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
"^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
if(a==null?b==null:a===b)return!0
if(a==null||b==null)return!1
if(a.length!==b.length)return!1
for(z=0;z<a.length;++z){y=a[z]
if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},
+au:function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},
+Zm:function(a,b){var z=J.WB(a,b)
if(typeof z!=="number")return H.s(z)
a=536870911&z
a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+xk:function(a){if(typeof a!=="number")return H.s(a)
a=536870911&a+((67108863&a)<<3>>>0)
a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
+return 536870911&a+((16383&a)<<15>>>0)},
tc:{
"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
F2:function(a,b,c){return new U.Jy(a,b,c)}},
hw:{
"^":"a;",
@@ -13773,8 +13851,8 @@
return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
$isJy:true},
xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){return U.Zm(a,J.v1(b))},
$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
"^":"",
FX:{
@@ -13800,9 +13878,12 @@
this.w5()
w=this.o9()
this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
+a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
+if(typeof z!=="number")return z.F()
+if(typeof b!=="number")return H.s(b)
+z=z>=b}else z=!1
+if(z)a=this.Tw(a)
+else break}return a},
qL:function(a,b){var z,y
z=J.x(b)
if(!!z.$isw6){z=z.gP(b)
@@ -13811,12 +13892,17 @@
y=b.gre()
this.Sk.toString
return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
+Tw:function(a){var z,y,x,w
z=this.fL.lo
this.w5()
y=this.WT()
while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
+w=z.gG8()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
else x=!1
if(!x)break
y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -13926,17 +14012,17 @@
return y},
tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
"^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
Ae:{
-"^":"a;vH>-317,P>-493",
+"^":"a;vH>-93,P>-265",
n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
$isAe:true,
"@":function(){return[C.Nw]},
"<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
"+IndexedValue":[0],
Bt:{
"^":"mW;ty",
@@ -13965,19 +14051,19 @@
return!1},
$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
"^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
+y1:function(a,b){var z,y,x
+if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
z=a.gAY()
if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
"^":"",
-wX:[function(a){switch(a){case 102:return 12
+wX:function(a){switch(a){case 102:return 12
case 110:return 10
case 114:return 13
case 116:return 9
case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
+default:return a}},
Pn:{
"^":"a;fY>,P>,G8<",
bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14075,7 +14161,7 @@
"^":"",
fr:{
"^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
d2:{
"^":"fr;",
W9:function(a){return this.xn(a)},
@@ -14088,8 +14174,7 @@
this.xn(a)},
ZR:function(a){var z
J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
this.xn(a)},
ti:function(a){return this.xn(a)},
o0:function(a){var z
@@ -14109,14 +14194,14 @@
this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
"^":"",
NQ:{
-"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,461,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
+"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
"@":function(){return[C.Is]},
static:{Zo:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -14124,36 +14209,36 @@
a.X0=w
C.Cc.ZL(a)
C.Cc.oX(a)
-return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[495],
-V23:{
+return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[268],
+V24:{
"^":"uL+Pi;",
$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
"^":"",
ov:{
-"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
-giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
+"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
+gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
+giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
+gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
+gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
+this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
qEQ:[function(a,b){var z,y
z=a.QV
if(z==null||a.FZ!==!0)return"min-width:32px;"
y=J.UQ(z.gu9(),b.gRd())
if(y==null)return"min-width:32px;"
if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
VH:[function(a){var z,y,x,w,v
if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
return}this.ct(a,C.Cv,0,1)
@@ -14161,15 +14246,15 @@
z=a.QV.q6(a.t7)
y=a.hX
x=a.QV
-if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,125,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
"@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,ze<-85",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
z=R.Jk([])
y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
+x=P.Py(null,null,null,P.qU,W.I0)
+w=P.qU
v=W.cv
v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
a.FZ=!1
@@ -14179,48 +14264,48 @@
a.X0=v
C.HD.ZL(a)
C.HD.oX(a)
-return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[503],
-V24:{
+return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[277],
+V25:{
"^":"uL+Pi;",
$isd3:true},
ZJ:{
-"^":"Tp:115;a-85",
+"^":"Tp:16;a-29",
$1:[function(a){var z,y
z=this.a
y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
$isEH:true},
-"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
"^":"",
-knI:{
-"^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
+kn:{
+"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
gD5:[function(a){var z=a.tY
if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
r6:[function(a,b){var z=a.tY
if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
goc:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
if(J.J5(a.jJ,0)){z=J.iS(a.tY)
y=a.tY
if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
gO3:[function(a){var z,y
if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
if(J.J5(a.jJ,0)){z=J.iS(a.tY)
y=a.tY
if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
"@":function(){return[C.Ur]},
static:{Th:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.jJ=-1
@@ -14230,31 +14315,31 @@
a.X0=w
C.c0.ZL(a)
C.c0.oX(a)
-return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[504],
+return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[278],
x4:{
"^":"xI+Pi;",
$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
"^":"",
fI:{
-"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,498,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
-gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
+"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
+gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
i4:[function(a){var z
Z.uL.prototype.i4.call(this,a)
z=a.Uz
if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
"@":function(){return[C.I3]},
static:{Ry:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.HJ=!1
@@ -14263,9 +14348,9 @@
a.X0=w
C.cJ.ZL(a)
C.cJ.oX(a)
-return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[505],
-V25:{
+return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[279],
+V26:{
"^":"uL+Pi;",
$isd3:true}}],["service","package:observatory/service.dart",,D,{
"^":"",
@@ -14285,25 +14370,57 @@
v.$builtinTypeInfo=[w]
v=new Q.wn(null,null,v,null,null)
v.$builtinTypeInfo=[w]
-w=J.bU
+w=P.KN
u=D.N8
t=new V.qC(P.Py(null,null,null,w,u),null,null)
t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
break
case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
z.$builtinTypeInfo=[null,null]
z=R.Jk(z)
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
v=[]
v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.Pp)
+u=D.U4
+t=[]
+t.$builtinTypeInfo=[u]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[u]
+u=P.L5(null,null,null,P.qU,P.CP)
u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
+case"Library":z=D.U4
+x=[]
+x.$builtinTypeInfo=[z]
+x=new Q.wn(null,null,x,null,null)
+x.$builtinTypeInfo=[z]
+z=D.rj
+w=[]
+w.$builtinTypeInfo=[z]
+w=new Q.wn(null,null,w,null,null)
+w.$builtinTypeInfo=[z]
+z=D.SI
+v=[]
+v.$builtinTypeInfo=[z]
+v=new Q.wn(null,null,v,null,null)
+v.$builtinTypeInfo=[z]
+z=D.SI
+u=[]
+u.$builtinTypeInfo=[z]
+u=new Q.wn(null,null,u,null,null)
+u.$builtinTypeInfo=[z]
+z=D.SI
+t=[]
+t.$builtinTypeInfo=[z]
+t=new Q.wn(null,null,t,null,null)
+t.$builtinTypeInfo=[z]
+s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
break
case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
@@ -14314,26 +14431,26 @@
x.$builtinTypeInfo=[z]
x=new Q.wn(null,null,x,null,null)
x.$builtinTypeInfo=[z]
-z=J.bU
-w=J.bU
+z=P.KN
+w=P.KN
v=new V.qC(P.Py(null,null,null,z,w),null,null)
v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
break
default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
z.$builtinTypeInfo=[null,null]
s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
return s},
-D5:[function(a){var z
+D5:function(a){var z
if(a!=null){z=J.U6(a)
z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
+return z},
+ES:function(a,b){var z=J.x(a)
if(!!z.$isSI)return
if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},
+Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+f3:function(a,b){var z,y,x,w,v,u
for(z=a.ao,y=0;y<z.length;++y){x=z[y]
w=J.x(x)
v=!!w.$isqC
@@ -14341,29 +14458,29 @@
else u=!1
if(u)a.u(0,y,b.Zr(x))
else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
af:{
"^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,507,"vm",307],
+return z.gzf(z)},null,null,1,0,281,"vm",82],
gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,306,"isolate",307],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",307],
+return z.gF1(z)},null,null,1,0,81,"isolate",82],
+gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
+gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
gPj:[function(a){var z,y
z=this.gF1(this)
y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",307],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",307],
-sHP:[function(a){},null,null,3,0,115,99,[],"hashLink",307],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
+sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
gox:function(a){return this.kT},
gUm:function(){return!1},
gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",307],
+goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
xW:function(a){if(this.kT)return P.Ab(this,null)
return this.VD(0)},
VD:function(a){var z
@@ -14384,7 +14501,7 @@
this.bF(0,a,y)},
$isaf:true},
Pa:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
$1:[function(a){var z,y
z=J.UQ(a,"type")
y=J.rY(z)
@@ -14392,31 +14509,31 @@
y=this.a
if(!J.de(z,y.mQ))return D.ac(y.P3,a)
y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
jI:{
-"^":"Tp:126;b",
+"^":"Tp:22;b",
$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
$isEH:true},
u0g:{
"^":"af;"},
-zM:{
+H6:{
"^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,507,"vm",307],
-gF1:[function(a){return},null,null,1,0,306,"isolate",307],
+gzf:[function(a){return this},null,null,1,0,281,"vm",82],
+gF1:[function(a){return},null,null,1,0,81,"isolate",82],
gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,509,"isolates",307],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
+return z.gUQ(z)},null,null,1,0,284,"isolates",82],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
+gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
+gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
+gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
+gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
+gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
bZ:function(a){var z,y,x,w
z=$.rc().R4(0,a)
if(z==null)return
@@ -14454,7 +14571,13 @@
return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
if(v!=null)return J.am(v)
return this.jU(z.a).ml(new D.kk(z,this))},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+N7:function(a){var z
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Vu(D.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
+if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
+else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
+return P.Ab(a,null)},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
bF:function(a,b,c){var z,y
if(c)return
this.kT=!0
@@ -14472,7 +14595,7 @@
this.xA(z.t(b,"isolates"))},
xA:function(a){var z,y,x,w,v,u
z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
+y=P.L5(null,null,null,P.qU,D.bv)
for(x=J.GP(a);x.G();){w=x.gl()
v=J.UQ(w,"id")
u=z.t(0,v)
@@ -14486,79 +14609,72 @@
this.A4.u(0,"vm",this)
var z=P.EF(["id","vm","type","@VM"],null,null)
this.eC(R.Jk(z))},
-$iszM:true},
+$isH6:true},
O1w:{
"^":"u0g+Pi;",
$isd3:true},
MZ:{
-"^":"Tp:115;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Tp:16;a,b",
+$1:[function(a){if(!J.x(a).$isH6)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
$isEH:true},
oe:{
-"^":"Tp:115;b,c",
+"^":"Tp:16;b,c",
$1:[function(a){var z
if(a==null)return this.b
z=this.c
if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
$isEH:true},
kk:{
-"^":"Tp:508;a,d",
+"^":"Tp:283;a,d",
$1:[function(a){var z,y
z=this.d
y=D.ac(z,a)
if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
QZ:{
-"^":"Tp:126;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Tp:22;e",
+$0:function(){return this.e},
$isEH:true},
Ey:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y,x,w,v
-try{w=C.xr.kV(a)
-z=R.Jk(w)
-if(!D.D5(z)){w=P.EF(["type","ServiceException","id","","kind","FormatException","response",z,"message","Top level service responses must be service maps."],null,null)
-w=R.Jk(w)
-w=P.Vu(D.ac(this.a,w),null,null)
-return w}if(J.de(J.UQ(z,"type"),"ServiceError")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}else if(J.de(J.UQ(z,"type"),"ServiceException")){w=P.Vu(D.ac(this.a,z),null,null)
-return w}return z}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-P.JS(y)
-P.JS(x)
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){var z,y,x,w
+try{x=C.xr.kV(a)
+z=R.Jk(x)
+x=this.a.N7(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
+x=R.Jk(x)
+return P.Vu(D.ac(this.a,x),null,null)}},"$1",null,2,0,null,190,[],"call"],
$isEH:true},
tm:{
-"^":"Tp:115;b",
+"^":"Tp:16;b",
$1:[function(a){var z=this.b.G2
if(z.Gv>=4)H.vh(z.q7())
z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
$isEH:true},
Gk:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
-mR:{
-"^":"Tp:115;c",
+I2:{
+"^":"Tp:16;c",
$1:[function(a){var z=this.c.Li
if(z.Gv>=4)H.vh(z.q7())
z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,315,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,[],"call"],
$isEH:true},
-bp:{
-"^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+mR:{
+"^":"Tp:16;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
+"^":"Tp:75;",
+$2:function(a,b){J.am(b)},
$isEH:true},
e5:{
"^":"a;SP<,hw<,wZ",
@@ -14605,43 +14721,43 @@
for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
v=Array(v)
v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
+v.$builtinTypeInfo=[P.KN]
u=new D.e5(0,v,0)
u.CJ()
x.push(u)}if(typeof v!=="number")return H.s(v)
z=Array(v)
z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.e5(0,H.VM(z,[P.KN]),0)
this.yP=z
z.Bv(y)
return}z=this.RP
if(typeof z!=="number")return H.s(z)
z=Array(z)
z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
+u=new D.e5(a,H.VM(z,[P.KN]),0)
u.nZ(y,this.yP.hw)
this.yP.wY(0,y)
z=this.lI
z.push(u)
if(z.length>this.hD)C.Nm.KI(z,0)}},
bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
-gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
+gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
+ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
gPj:function(a){return this.KG},
gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
+geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
+gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
+gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
N3:function(a){var z,y,x,w
z=H.VM([],[D.kx])
y=J.U6(a)
@@ -14658,8 +14774,8 @@
x=z.t(a,"samples")
for(z=J.GP(y);z.G();){w=z.gl()
J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
+Ms:function(a){return this.cv("coverage").ml(this.gm6())},
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
Zr:function(a){var z,y,x
if(a==null)return
z=J.UQ(a,"id")
@@ -14672,35 +14788,37 @@
cv:function(a){var z=this.A4.t(0,a)
if(z!=null)return J.am(z)
return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
-gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
-gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
-at:function(a,b){return this.gNh(this).$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
+sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
+gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
+gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
+goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
+gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
+gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
+gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
+gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
+gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
+gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
+gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
+guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+at:function(a,b){return this.guT(this).$1(b)},
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
+gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
z=J.U6(b)
y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.wT,this.Er,y)
+this.Er=F.Wi(this,C.dH,this.Er,y)
y=z.t(b,"name")
this.KT=F.Wi(this,C.YS,this.KT,y)
y=z.t(b,"name")
@@ -14710,7 +14828,7 @@
D.ES(b,this)
if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.iG,this.v9,y)
if(z.t(b,"entry")!=null){y=z.t(b,"entry")
this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14765,8 +14883,11 @@
this.EY=y
y=this.l2!==!0&&this.No!==!0&&y!==!0
this.eU=F.Wi(this,C.q2,this.eU,y)
-z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},
+y=z.t(b,"error")
+this.yv=F.Wi(this,C.YU,this.yv,y)
+J.U2(this.DC)
+for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
+J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
KQ:function(a,b){this.FF=0
this.bj=a
@@ -14808,51 +14929,55 @@
"^":"u0g+Pi;",
$isd3:true},
iz:{
-"^":"Tp:115;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:16;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
a.Du=0
a.fF=0
a.mM=F.Wi(a,C.eF,a.mM,"")
a.qH=F.Wi(a,C.uU,a.qH,"")
J.U2(a.VS)
J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+J.U2(a.Oo)}},
$isEH:true},
oa:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
$isEH:true},
KQ:{
-"^":"Tp:508;a,b",
+"^":"Tp:283;a,b",
$1:[function(a){var z,y
z=this.a
y=D.ac(z,a)
if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,282,[],"call"],
$isEH:true},
Ai:{
-"^":"Tp:126;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+"^":"Tp:22;c",
+$0:function(){return this.c},
$isEH:true},
Qq:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,300,[],"call"],
+$isEH:true},
+Yn:{
+"^":"Tp:75;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
$isEH:true},
AP:{
-"^":"Tp:508;a",
+"^":"Tp:283;a",
$1:[function(a){var z,y
z=Date.now()
new P.iP(z,!1).EK()
y=this.a.KJ
y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,212,[],"call"],
$isEH:true},
SI:{
"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.VZ)},
-gM8:function(){return this.gUm()},
+gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
+gM8:function(){return!1},
bu:function(a){return P.vW(this.RF)},
bF:function(a,b,c){var z,y,x
this.kT=!c
@@ -14884,13 +15009,13 @@
gB:function(a){var z=this.RF.Zp
return z.gB(z)},
BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,348],
+return z.BN(z)},"$0","gDx",0,0,126],
nq:function(a,b){var z=this.RF
return z.nq(z,b)},
ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,125],
+k0:[function(a){return},"$0","gqw",0,0,21],
ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,125],
+return},"$0","gl1",0,0,21],
gUj:function(a){var z=this.RF
return z.gUj(z)},
gnz:function(a){var z,y
@@ -14907,14 +15032,14 @@
static:{"^":"VZ"}},
pD:{
"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gFA:[function(a){return this.jo},null,null,1,0,329,"exception",307,308],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,331,30,[],"exception",307],
-gK7:[function(){return this.Ne},null,null,1,0,329,"stacktrace",307,308],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,331,30,[],"stacktrace",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
+gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
+sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
bF:function(a,b,c){var z,y,x
z=J.U6(b)
y=z.t(b,"kind")
@@ -14935,10 +15060,10 @@
$isd3:true},
fJ:{
"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
bF:function(a,b,c){var z,y
this.kT=!0
z=J.U6(b)
@@ -14956,12 +15081,12 @@
$isd3:true},
hR:{
"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
bF:function(a,b,c){var z,y
z=J.U6(b)
y=z.t(b,"kind")
@@ -14978,25 +15103,70 @@
w8F:{
"^":"af+Pi;",
$isd3:true},
+U4:{
+"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+gUm:function(){return!0},
+gM8:function(){return!1},
+bF:function(a,b,c){var z,y,x,w
+z=J.U6(b)
+y=z.t(b,"url")
+x=F.Wi(this,C.Fh,this.dj,y)
+this.dj=x
+if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
+w=J.U6(y)
+x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.bN,y)
+this.bN=y
+if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
+y=z.t(b,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+if(c)return
+this.kT=!0
+y=this.P3
+D.ES(b,y.gF1(y))
+y=this.JJ
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"imports"))
+y=this.XR
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"scripts"))
+y=this.DD
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"classes"))
+y=this.Z3
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"variables"))
+y=this.mu
+w=J.w1(y)
+w.V1(y)
+w.FV(y,z.t(b,"functions"))},
+$isU4:true},
+V4b:{
+"^":"af+Pi;",
+$isd3:true},
c2:{
-"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
$isc2:true},
rj:{
-"^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,310,"library",307,308],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
+"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
+gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
sVB:[function(a){var z=this.wJ
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
+gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
sug:[function(a){var z=this.lx
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
gUm:function(){return!0},
gM8:function(){return!0},
rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15070,29 +15240,30 @@
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]))}}},
-V4b:{
+x.h(y,new D.c2(v,z[w]))}},
+$isrj:true},
+Zqa:{
"^":"af+Pi;",
$isd3:true},
N8:{
"^":"a;Yu<,Du<,fF<",
$isN8:true},
Z9:{
-"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
+sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
Nw:[function(){var z,y
z=this.LR
y=J.x(z)
if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
M2Y:[function(){var z,y
z=this.VF
y=J.x(z)
if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
bR:function(a){var z,y
this.ar=F.Wi(this,C.fX,this.ar,null)
z=this.VF
@@ -15101,33 +15272,33 @@
if(y==null)return
this.ar=F.Wi(this,C.fX,this.ar,a)
z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
+this.MT=F.Wi(this,C.oI,this.MT,z)},
$isZ9:true},
Q4:{
-"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
sPO:[function(a){var z=this.dh
if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
+this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
xt:[function(){var z,y
z=this.Yu
y=J.x(z)
if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",307],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
Io:[function(a){var z
if(a==null)return""
z=J.UQ(a.gOo(),this.Yu)
if(z==null)return""
if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
HU:[function(a){var z
if(a==null)return""
z=J.UQ(a.gOo(),this.Yu)
if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
eQ:function(){var z,y,x,w
y=J.uH(this.L4," ")
x=y.length
@@ -15156,18 +15327,18 @@
this.nq(this,z)}this.dh=u
return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
+static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
WAE:{
"^":"a;uX",
bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
+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())},"$1","Ma",2,0,null,94,[]]}},
+throw H.b(P.hS())}}},
Vi:{
"^":"a;tT>,Av<",
$isVi:true},
@@ -15175,26 +15346,28 @@
"^":"a;tT>,Av<,wd>,Jv",
$ist9:true},
kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",307],
-gL1E:[function(){return this.Ni},null,null,1,0,329,"objectPool",307,308],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
-gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
-gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
+glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
+gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
+gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
+gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
+gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
+gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
+gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
+sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
gUm:function(){return!0},
gM8:function(){return!0},
tx:[function(a){var z,y
this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
QW:function(){if(this.ar!=null)return
if(!J.de(this.J6,C.l8))return
var z=this.MO
@@ -15232,15 +15405,16 @@
z=J.U6(b)
this.oc=z.t(b,"user_name")
this.zz=z.t(b,"name")
+y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.MH=F.Wi(this,C.FQ,this.MH,y)
y=D.CQ(z.t(b,"kind"))
this.J6=F.Wi(this,C.fy,this.J6,y)
this.vg=H.BU(z.t(b,"start"),16,null)
this.Mb=H.BU(z.t(b,"end"),16,null)
y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+x=y.gF1(y).Zr(z.t(b,"function"))
this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
+y=y.gF1(y).Zr(z.t(b,"object_pool"))
this.Ni=F.Wi(this,C.xG,this.Ni,y)
w=z.t(b,"disassembly")
if(w!=null)this.xs(w)
@@ -15251,8 +15425,8 @@
this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
xs:function(a){var z,y,x,w,v,u,t,s,r
z=this.va
y=J.w1(z)
@@ -15280,7 +15454,7 @@
v=z.t(a,"tryIndex")
u=J.rr(z.t(a,"kind"))
for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
DZ:function(a){var z
for(z=J.GP(a);z.G();)this.Ry(z.gl())},
@@ -15297,43 +15471,43 @@
w+=3}},
tg:function(a,b){J.J5(b,this.vg)
return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
$iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
-Zqa:{
+static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+D3i:{
"^":"af+Pi;",
$isd3:true},
Em:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z,y
z=this.a
y=J.UQ(z.MO,"script")
if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
$isEH:true},
fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
+"^":"Tp:75;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
$isEH:true},
UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+"^":"Tp:75;a,b",
+$2:function(a,b){var z,y
z=J.x(b)
y=!!z.$isqC
if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},
$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
"^":"",
zMr:{
-"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
+"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
"@":function(){return[C.uvO]},
static:{hp:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15341,21 +15515,21 @@
a.X0=w
C.SX.ZL(a)
C.SX.oX(a)
-return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[537],
-V26:{
+return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[314],
+V27:{
"^":"uL+Pi;",
$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
"^":"",
nk:{
-"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
+"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
"@":function(){return[C.vr3]},
static:{dS:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15363,30 +15537,30 @@
a.X0=w
C.Vd.ZL(a)
C.Vd.oX(a)
-return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[541],
-V27:{
+return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[318],
+V28:{
"^":"uL+Pi;",
$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
"^":"",
XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
z6:function(a,b){var z
N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
z=this.Jf
if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
dT:{
-"^":"Tp:115;",
+"^":"Tp:16;",
$1:[function(a){var z
N.Jx("").hh("HttpRequest.getString failed.")
z=J.RE(a)
z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
$isEH:true},
ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
q3:[function(a){var z,y,x,w,v
z=J.RE(a)
y=J.UQ(z.gRn(a),"id")
@@ -15396,7 +15570,7 @@
z=this.ja
v=z.t(0,y)
z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
z6:function(a,b){var z,y,x
z=""+this.yb
y=P.Fl(null,null)
@@ -15412,9 +15586,9 @@
N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
"^":"",
ob:{
-"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"object",307,330],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
+"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
hu:[function(a){var z
switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
J.CJ(z,a.mC)
@@ -15440,7 +15614,7 @@
case"HeapMap":z=W.r3("heap-map",null)
J.Nf(z,a.mC)
return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
J.ti(z,a.mC)
return z
case"Isolate":z=W.r3("isolate-view",null)
@@ -15469,8 +15643,8 @@
return z
default:z=W.r3("json-view",null)
J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
-fa:[function(a,b){var z,y,x
+return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+xJ:[function(a,b){var z,y,x
this.pj(a)
z=a.mC
if(z==null){N.Jx("").To("Viewing null object.")
@@ -15478,12 +15652,12 @@
x=this.hu(a)
if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,115,242,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
"@":function(){return[C.Tl]},
static:{zy:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15491,38 +15665,40 @@
a.X0=w
C.ZO.ZL(a)
C.ZO.oX(a)
-return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[543],
-V28:{
+return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[321],
+V29:{
"^":"uL+Pi;",
$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
"^":"",
xI:{
-"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,310,"ref",307,330],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
-aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
+gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+P9:[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))},"$1","gLe",2,0,169,242,[],"refChanged"],
+this.ct(a,C.KG,0,1)
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
gO3:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
+return z.gHP()},null,null,1,0,87,"url"],
gOL:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
+return J.F8(z)},null,null,1,0,87,"serviceId"],
gD5:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
+return z.gzz()},null,null,1,0,87,"hoverText"],
goc:[function(a){var z=a.tY
if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
+return J.O6(z)},null,null,1,0,87,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
"@":function(){return[C.JD]},
static:{lK:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -15531,27 +15707,27 @@
a.X0=w
C.wU.ZL(a)
C.wU.oX(a)
-return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[544],
+return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[322],
Vfx:{
"^":"uL+Pi;",
$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
"^":"",
Uj:{
-"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,348,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
-gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
+"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
+gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
+gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"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
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15559,21 +15735,21 @@
a.X0=w
C.fA.ZL(a)
C.fA.oX(a)
-return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[546],
+return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[324],
Bc:{
"^":"xc+Pi;",
$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
"^":"",
xT:{
-"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
+"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
"@":function(){return[C.Xv]},
static:{an:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15581,22 +15757,22 @@
a.X0=w
C.dX.ZL(a)
C.dX.oX(a)
-return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[548],
-V29:{
+return a},null,null,0,0,22,"new StackFrameElement$created"]}},
+"+StackFrameElement":[326],
+V30:{
"^":"uL+Pi;",
$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
"^":"",
uwf:{
-"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",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,329,"trace",307,330],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.js]},
static:{bV:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -15604,18 +15780,18 @@
a.X0=w
C.bg.ZL(a)
C.bg.oX(a)
-return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[549],
-V30:{
+return a},null,null,0,0,22,"new StackTraceElement$created"]}},
+"+StackTraceElement":[327],
+V31:{
"^":"uL+Pi;",
$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
"^":"",
-IP:[function(a){var z=J.x(a)
+IP:function(a){var z=J.x(a)
if(!!z.$isQl)return C.i3.f0(a)
switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},
+iX:function(a,b){var z,y,x,w,v,u,t,s
z=M.pN(a,b)
y=J.x(a)
if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15626,8 +15802,8 @@
if(s==null)continue
if(u==null)u=P.Py(null,null,null,null,null)
u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},
+HP:function(a,b,c,d,e){var z,y,x
if(b==null)return
if(b.gN2()!=null){z=b.gN2()
M.Ky(a).wh(z)
@@ -15636,17 +15812,17 @@
if(z.gwd(b)==null)return
y=b.gTe()-a.childNodes.length
for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
+bM:function(a){var z
for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+return},
+pN:function(a,b){var z,y
z=J.x(a)
if(!!z.$iscv)return M.F5(a,b)
if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},
+F5:function(a,b){var z,y,x
z={}
z.a=null
z.b=!1
@@ -15656,8 +15832,8 @@
if(y==null){x=[]
z.a=x
y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},
+Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
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()
@@ -15686,8 +15862,8 @@
t.push(L.Sk(j,l,null))}o.wE(0)
p=o
s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},
+F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
z=a.length
if(z===0)return
for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15702,14 +15878,14 @@
v=t+2}if(v===z)w.push("")
z=new M.HS(w,null)
z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
+return z},
+SH:function(a,b){var z,y
z=a.firstChild
if(z==null)return
y=new M.yp(z,a.lastChild,b)
for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
+z=z.nextSibling}},
+Ky:function(a){var z,y,x,w
z=$.rw()
z.toString
y=H.VK(a,"expando$values")
@@ -15723,12 +15899,12 @@
else w=!0
x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
+return x},
+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},"$1","xS",2,0,null,211,[]],
+return z},
V2:{
"^":"TU;N1,mD,Ck",
Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15771,14 +15947,14 @@
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)}},
-H2:{
+b2i:{
"^":"TR;",
cO:function(a){if(this.qP==null)return
this.Ca.ed()
X.TR.prototype.cO.call(this,this)}},
-lP:{
-"^":"Tp:126;",
-$0:[function(){var z,y,x,w,v
+DO:{
+"^":"Tp:22;",
+$0:function(){var z,y,x,w,v
z=document.createElement("div",null).appendChild(W.ED(null))
y=J.RE(z)
y.st5(z,"checkbox")
@@ -15791,26 +15967,26 @@
v=document.createEvent("MouseEvent")
J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.mt:C.Nm.gtH(x)},
$isEH:true},
fTP:{
-"^":"Tp:115;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
ppY:{
-"^":"Tp:115;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
$isEH:true},
NP:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z=this.gH()
J.ta(z,a==null?"":H.d(a))},
FC:[function(a){var z=J.Vm(this.gH())
J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+O.Y3()},"$1","gqf",2,0,26,7,[]]},
+Vh:{
+"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z=X.TR.prototype.gH.call(this)
J.rP(z,null!=a&&!1!==a)},
@@ -15819,8 +15995,8 @@
J.ta(this.xS,z)
if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
+static:{kv:function(a){var z,y,x
z=J.RE(a)
if(z.gMB(a)!=null){z=z.gMB(a)
z.toString
@@ -15828,10 +16004,10 @@
return z.ev(z,new M.r0(a))}else{y=M.bM(a)
if(y==null)return C.xD
x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
+return x.ev(x,new M.jz(a))}}}},
r0:{
-"^":"Tp:115;a",
-$1:[function(a){var z,y
+"^":"Tp:16;a",
+$1:function(a){var z,y
z=this.a
y=J.x(a)
if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -15839,15 +16015,15 @@
z=y==null?z==null:y===z}else z=!1
else z=!1
else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
$isEH:true},
jz:{
-"^":"Tp:115;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+"^":"Tp:16;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
$isEH:true},
SA:{
-"^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
gH:function(){return X.TR.prototype.gH.call(this)},
EC:function(a){var z
this.C7()
@@ -15873,18 +16049,18 @@
y=J.x(z)
if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
$isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
+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}}},
hB:{
-"^":"Tp:300;a",
+"^":"Tp:75;a",
$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
$isEH:true},
nv:{
-"^":"Tp:115;",
-$1:[function(a){return 0},"$1",null,2,0,null,116,[],"call"],
+"^":"Tp:16;",
+$1:function(a){return 0},
$isEH:true},
ee:{
"^":"V2;N1,mD,Ck",
@@ -15892,8 +16068,7 @@
Z1:function(a,b,c,d){var z,y,x
z=J.x(b)
if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
y=this.gCd(this)
if(z.n(b,"value")){z=this.N1
@@ -15903,7 +16078,7 @@
x.Ca=M.IP(z).yI(x.gqf())
z=x}else{z=this.N1
x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
+x=new M.Vh(null,z,c,null,null,"checked",x)
x.Og(z,"checked",c,d)
x.Ca=M.IP(z).yI(x.gqf())
z=x}y.u(0,b,z)
@@ -15925,13 +16100,12 @@
for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
if(y!=null)J.wC(y)}this.mD=null},
gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
+if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
+glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
$isTU:true},
yp:{
-"^":"a;rg,qW,k8<"},
+"^":"a;rg,Ug,k8<"},
ug:{
"^":"V2;N1,mD,Ck",
gN1:function(){return this.N1},
@@ -15939,8 +16113,7 @@
if(J.de(b,"selectedindex"))b="selectedIndex"
z=J.x(b)
if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
y=this.N1
@@ -16063,7 +16236,7 @@
return!0},
Sy:function(){return this.wh(null)},
$isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
z=J.Lh(b,a,!1)
y=J.x(z)
if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16071,13 +16244,13 @@
else y=!1
if(y)return z
for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},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},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
z=J.RE(a)
y=z.gM0(a).createElement("template",null)
z.gKV(a).insertBefore(y,a)
@@ -16091,25 +16264,25 @@
u=v.getAttribute(w)
v.removeAttribute(w)
y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},KE:function(a,b,c){var z,y,x,w
z=J.G6(a)
if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
z=new M.OB()
y=J.MK(a,$.cz())
if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},oR:function(){if($.To===!0)return
$.To=!0
var z=document.createElement("style",null)
J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
+document.head.appendChild(z)}}},
OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+"^":"Tp:26;",
+$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
$isEH:true},
-Uf:{
-"^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
+lP:{
+"^":"Tp:16;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
$isEH:true},
p8:{
"^":"a;ud,lr,eS,ay",
@@ -16129,8 +16302,8 @@
this.ud=null},
$isTR:true},
NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
+"^":"Tp:75;a,b,c,d",
+$2:function(a,b){var z,y,x,w
for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
if(this.d)if(z.n(a,"if")){this.a.b=!0
if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16141,7 +16314,7 @@
z.a=w
z=w}else z=x
z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
$isEH:true},
HS:{
"^":"a;EJ<,PU",
@@ -16160,7 +16333,7 @@
if(0>=z.length)return H.e(z,0)
y=H.d(z[0])+H.d(a)
if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
DJ:[function(a){var z,y,x,w,v,u,t
z=this.EJ
if(0>=z.length)return H.e(z,0)
@@ -16170,7 +16343,7 @@
u=w+2
if(u>=z.length)return H.e(z,u)
t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
TG:{
"^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16191,12 +16364,12 @@
u=this.eD
v.push(L.Sk(z,u,null))
w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,126],
+this.Az(w.gP(w))},"$0","gjM",0,0,22],
Az:function(a){var z,y,x,w
z=this.xG
this.Gb()
y=J.x(a)
-if(!!y.$isList){this.xG=a
+if(!!y.$iszM){this.xG=a
x=a}else if(!!y.$isQV){x=y.br(a)
this.xG=x}else{this.xG=null
x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16271,7 +16444,7 @@
k=null}else{m=[]
if(this.DO!=null)o=this.Mv(o)
k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
uS:function(a){var z
for(z=J.GP(a);z.G();)J.wC(z.gl())},
Gb:function(){var z=this.IY
@@ -16288,21 +16461,21 @@
this.FS=null}this.e9.kr=null
this.pq=!0}},
VU:{
-"^":"Tp:115;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
+"^":"Tp:16;",
+$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
$isEH:true},
Kj:{
-"^":"Tp:555;a",
+"^":"Tp:334;a",
$1:[function(a){var z,y,x
z=J.U6(a)
y=z.t(a,0)
x=z.t(a,1)
if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
$isEH:true},
R7:{
-"^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
+"^":"Tp:16;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
$isEH:true},
Ya:{
"^":"a;yT>,kU>",
@@ -16328,8 +16501,7 @@
gN1:function(){return this.N1},
Z1:function(a,b,c,d){var z,y,x
if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
+J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
J.Vs(this.N1).Rz(0,b)
z=this.gCd(this)
y=this.N1
@@ -16367,18 +16539,18 @@
this.EC(J.Vm(this.xS))},
$isTR:true},
VD:{
-"^":"Tp:115;a",
+"^":"Tp:16;a",
$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
"^":"",
I5:{
-"^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
"@":function(){return[C.Ye]},
static:{cF:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.Pe=!1
@@ -16387,21 +16559,21 @@
a.X0=w
C.V8.ZL(a)
C.V8.oX(a)
-return a},null,null,0,0,126,"new VMRefElement$created"]}},
-"+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,22,"new VMRefElement$created"]}},
+"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
"^":"",
-en:{
-"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+SC:{
+"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
+gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
"@":function(){return[C.Hk]},
static:{oH:[function(a){var z,y,x,w
z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
+y=P.Py(null,null,null,P.qU,W.I0)
+x=P.qU
w=W.cv
w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
a.SO=z
@@ -16409,34 +16581,28 @@
a.X0=w
C.nt.ZL(a)
C.nt.oX(a)
-return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[558],
-V31:{
+return a},null,null,0,0,22,"new VMViewElement$created"]}},
+"+VMViewElement":[337],
+V32:{
"^":"uL+Pi;",
$isd3:true}}],])
I.$finishClasses($$,$,null)
$$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.qU.$isqU=true
+P.qU.$isTx=true
+P.qU.$asTx=[P.qU]
+P.qU.$isa=true
+P.lf.$isTx=true
+P.lf.$asTx=[P.lf]
+P.lf.$isa=true
+P.KN.$isKN=true
+P.KN.$isTx=true
+P.KN.$asTx=[P.lf]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isTx=true
+P.CP.$asTx=[P.lf]
+P.CP.$isa=true
W.KV.$isKV=true
W.KV.$isD0=true
W.KV.$isa=true
@@ -16450,9 +16616,9 @@
P.a6.$isTx=true
P.a6.$asTx=[P.a6]
P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
+P.zM.$iszM=true
+P.zM.$isQV=true
+P.zM.$isa=true
P.Od.$isa=true
P.a.$isa=true
W.cv.$iscv=true
@@ -16492,8 +16658,8 @@
P.wv.$isa=true
T.yj.$isyj=true
T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
W.OJ.$isea=true
W.OJ.$isa=true
A.XP.$isXP=true
@@ -16542,9 +16708,9 @@
W.ea.$isa=true
P.qh.$isqh=true
P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
+W.Aj.$isAj=true
+W.Aj.$isea=true
+W.Aj.$isa=true
G.DA.$isDA=true
G.DA.$isa=true
M.Ya.$isa=true
@@ -16582,6 +16748,18 @@
D.e5.$isa=true
D.Q4.$isa=true
D.N8.$isa=true
+D.U4.$isaf=true
+D.U4.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
D.c2.$isa=true
W.zU.$isD0=true
W.zU.$isa=true
@@ -16624,13 +16802,6 @@
V.qC.$isqC=true
V.qC.$isZ0=true
V.qC.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
P.jp.$isjp=true
P.jp.$isa=true
P.Tx.$isTx=true
@@ -16665,9 +16836,6 @@
D.hR.$isa=true
P.EH.$isEH=true
P.EH.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
J.Qc=function(a){if(typeof a=="number")return J.P.prototype
if(typeof a=="string")return J.O.prototype
if(a==null)return a
@@ -16696,10 +16864,10 @@
if(typeof a!="object")return a
if(a instanceof P.a)return a
return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.prototype
+if(typeof a=="boolean")return J.yEe.prototype
if(a.constructor==Array)return J.Q.prototype
if(typeof a!="object")return a
if(a instanceof P.a)return a
@@ -16721,7 +16889,6 @@
J.EC=function(a){return J.RE(a).giC(a)}
J.EY=function(a,b){return J.RE(a).od(a,b)}
J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
J.Ew=function(a){return J.RE(a).gSw(a)}
J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16734,6 +16901,7 @@
J.GL=function(a){return J.RE(a).gfN(a)}
J.GP=function(a){return J.w1(a).gA(a)}
J.GW=function(a){return J.RE(a).gVY(a)}
+J.H2=function(a,b){return J.RE(a).sDD(a,b)}
J.HF=function(a){return J.RE(a).gD7(a)}
J.Hf=function(a){return J.RE(a).gTq(a)}
J.IQ=function(a){return J.RE(a).Ms(a)}
@@ -16775,6 +16943,7 @@
J.OS=function(a,b){return J.w1(a).tt(a,b)}
J.Or=function(a){return J.RE(a).yx(a)}
J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
J.Q5=function(a){return J.RE(a).gwl(a)}
J.Q8=function(a){return J.RE(a).gp8(a)}
J.QC=function(a){return J.w1(a).wg(a)}
@@ -16815,7 +16984,6 @@
J.Xf=function(a,b){return J.RE(a).oo(a,b)}
J.Y5=function(a){return J.RE(a).gyT(a)}
J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
J.YP=function(a){return J.RE(a).gQ7(a)}
J.YV=function(a){return J.RE(a).goE(a)}
J.Yl=function(a){return J.w1(a).np(a)}
@@ -16827,12 +16995,11 @@
J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
J.ak=function(a){return J.RE(a).gNF(a)}
J.am=function(a){return J.RE(a).VD(a)}
-J.bB=function(a){return J.x(a).gbx(a)}
J.bY=function(a,b){return J.Wx(a).Y(a,b)}
J.bd=function(a,b){return J.RE(a).sBu(a,b)}
-J.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.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -16845,15 +17012,14 @@
J.dk=function(a,b){return J.RE(a).sMj(a,b)}
J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
J.eI=function(a,b){return J.RE(a).bA(a,b)}
+J.eY=function(a){return J.RE(a).gR(a)}
J.f5=function(a){return J.RE(a).gI(a)}
J.fH=function(a,b){return J.RE(a).stT(a,b)}
J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
J.fi=function(a,b){return J.RE(a).ps(a,b)}
J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
J.iS=function(a){return J.RE(a).gox(a)}
J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
J.jf=function(a,b){return J.x(a).T(a,b)}
J.kE=function(a,b){return J.U6(a).tg(a,b)}
J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -16869,6 +17035,7 @@
J.m4=function(a){return J.RE(a).gig(a)}
J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
return J.Wx(a).i(a,b)}
+J.nG=function(a,b){return J.RE(a).vV(a,b)}
J.nJ=function(a){return J.RE(a).ga4(a)}
J.oE=function(a,b){return J.Qc(a).iM(a,b)}
J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -16876,6 +17043,7 @@
J.on=function(a){return J.RE(a).gtT(a)}
J.pO=function(a){return J.U6(a).gor(a)}
J.pP=function(a){return J.RE(a).gDD(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
J.pe=function(a,b){return J.RE(a).pr(a,b)}
J.q8=function(a){return J.U6(a).gB(a)}
J.qA=function(a){return J.w1(a).br(a)}
@@ -16906,6 +17074,7 @@
J.w8=function(a){return J.RE(a).gkc(a)}
J.wC=function(a){return J.RE(a).cO(a)}
J.wD=function(a,b){return J.w1(a).sIr(a,b)}
+J.wT=function(a,b){return J.w1(a).h(a,b)}
J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
return J.Wx(a).W(a,b)}
@@ -16913,7 +17082,6 @@
J.xR=function(a){return J.RE(a).ghf(a)}
J.xq=function(a){return J.RE(a).gUj(a)}
J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
J.yxg=function(a){return J.RE(a).gGd(a)}
J.z2=function(a){return J.RE(a).gG1(a)}
J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -16926,11 +17094,11 @@
C.oq=Q.Tg.prototype
C.ka=Z.Jc.prototype
C.IK=O.CN.prototype
-C.ux=F.Be.prototype
+C.YD=F.Be.prototype
C.j8=R.i6.prototype
C.O0=R.lw.prototype
C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
+C.Gh=L.bf.prototype
C.UF=R.Lt.prototype
C.MC=D.UL.prototype
C.LT=A.jM.prototype
@@ -16948,12 +17116,12 @@
C.Xe=L.qkb.prototype
C.Nm=J.Q.prototype
C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
+C.jn=J.imn.prototype
C.jN=J.Jh.prototype
C.CD=J.P.prototype
C.xB=J.O.prototype
C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.Zt.prototype
C.Z3=R.LU.prototype
C.MG=M.KL.prototype
C.S2=W.H9.prototype
@@ -16969,7 +17137,7 @@
C.Iv=A.xc.prototype
C.Cc=Q.NQ.prototype
C.HD=T.ov.prototype
-C.c0=A.knI.prototype
+C.c0=A.kn.prototype
C.cJ=U.fI.prototype
C.SX=R.zMr.prototype
C.Vd=D.nk.prototype
@@ -16981,18 +17149,11 @@
C.lx=A.tz.prototype
C.vB=J.is.prototype
C.V8=X.I5.prototype
-C.nt=U.en.prototype
+C.nt=U.SC.prototype
C.ol=W.u9.prototype
C.KZ=new H.hJ()
C.OL=new U.EZ()
C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
C.J19=new K.ndx()
C.IU=new P.TO()
C.Us=new A.yL()
@@ -17001,7 +17162,7 @@
C.xd=new A.Mh()
C.vT=new P.mg()
C.NU=new P.R8()
-C.v8=new P.AHi()
+C.v8=new P.nU()
C.WA=new D.WAE("Collected")
C.l8=new D.WAE("Dart")
C.nj=new D.WAE("Native")
@@ -17034,7 +17195,7 @@
C.js=new A.V3("stack-trace")
C.Ur=new A.V3("script-ref")
C.tSc=new A.V3("class-ref")
-C.jy=new A.V3("breakpoint-list")
+C.PT=new A.V3("breakpoint-list")
C.VW=new A.V3("instance-ref")
C.Ye=new A.V3("vm-ref")
C.Gu=new A.V3("collapsible-content")
@@ -17042,8 +17203,8 @@
C.kR=new A.V3("observatory-application")
C.uvO=new A.V3("service-error-view")
C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
+C.oD=new A.V3("isolate-nav-menu")
+C.iF=new A.V3("class-nav-menu")
C.uW=new A.V3("error-view")
C.u7=new A.V3("nav-menu")
C.KH=new A.V3("json-view")
@@ -17054,17 +17215,17 @@
C.JD=new A.V3("service-ref")
C.nW=new A.V3("nav-bar")
C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
+C.be=new A.V3("instance-view")
C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
+C.mt=H.VM(new W.e0("change"),[W.ea])
+C.T1=H.VM(new W.e0("click"),[W.Aj])
+C.MD=H.VM(new W.e0("error"),[W.ew])
+C.PP=H.VM(new W.e0("hashchange"),[W.ea])
+C.i3=H.VM(new W.e0("input"),[W.ea])
+C.fK=H.VM(new W.e0("load"),[W.ew])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
+C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
C.Mc=function(hooks) {
if (typeof dartExperimentalFixupGetTag != "function") return hooks;
hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17198,12 +17359,12 @@
}
C.xr=new P.by(null,null)
C.A3=new P.Cf(null)
-C.cb=new P.dI(null,null)
+C.cb=new P.ze(null,null)
C.Ek=new N.qV("FINER",400)
C.R5=new N.qV("FINE",500)
C.IF=new N.qV("INFO",800)
C.cV=new N.qV("SEVERE",1000)
-C.UP=new N.qV("WARNING",900)
+C.nT=new N.qV("WARNING",900)
I.makeConstantList = function(list) {
list.immutable$list = init;
list.fixed$length = init;
@@ -17217,7 +17378,7 @@
C.Me=H.VM(I.makeConstantList([]),[P.Ms])
C.dn=H.VM(I.makeConstantList([]),[P.tg])
C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
+C.iH=H.VM(I.makeConstantList([]),[P.KN])
C.xD=I.makeConstantList([])
C.Qy=I.makeConstantList(["in","this"])
C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17229,8 +17390,8 @@
C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
+C.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.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
C.CM=new H.LPe(0,{},C.xD)
@@ -17265,8 +17426,10 @@
C.tP=new H.GD("entry")
C.YU=new H.GD("error")
C.ne=new H.GD("exception")
+C.dI=new H.GD("expand")
C.mr=new H.GD("expanded")
C.Of=new H.GD("expander")
+C.Jt=new H.GD("expanderStyle")
C.Yy=new H.GD("expr")
C.IV=new H.GD("field")
C.CX=new H.GD("fileAndLine")
@@ -17275,7 +17438,7 @@
C.WG=new H.GD("formattedCollections")
C.uU=new H.GD("formattedExclusiveTicks")
C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
+C.oI=new H.GD("formattedLine")
C.ST=new H.GD("formattedTotalCollectionTime")
C.QH=new H.GD("fragmentation")
C.rE=new H.GD("frame")
@@ -17284,6 +17447,7 @@
C.mP=new H.GD("hasClass")
C.zS=new H.GD("hasDisassembly")
C.D2=new H.GD("hasParent")
+C.Ia=new H.GD("hashLinkWorkaround")
C.lb=new H.GD("hideTagsChecked")
C.du=new H.GD("hitStyle")
C.bA=new H.GD("hoverText")
@@ -17295,6 +17459,7 @@
C.P9=new H.GD("isDart")
C.ai=new H.GD("isEmpty")
C.nZ=new H.GD("isNotEmpty")
+C.FQ=new H.GD("isOptimized")
C.Z8=new H.GD("isolate")
C.Qn=new H.GD("jumpTarget")
C.fy=new H.GD("kind")
@@ -17302,17 +17467,19 @@
C.QL=new H.GD("last")
C.kA=new H.GD("lastTokenPos")
C.Wn=new H.GD("length")
+C.Ij=new H.GD("libraries")
C.EV=new H.GD("library")
C.eh=new H.GD("lineMode")
C.Cv=new H.GD("lines")
C.dB=new H.GD("link")
-C.wT=new H.GD("mainPort")
+C.dH=new H.GD("mainPort")
C.p3=new H.GD("map")
C.t6=new H.GD("mapAsString")
C.PC=new H.GD("dart.core.int")
C.ch=new H.GD("message")
C.UX=new H.GD("msg")
C.YS=new H.GD("name")
+C.KG=new H.GD("nameIsEmpty")
C.So=new H.GD("newHeapCapacity")
C.IO=new H.GD("newHeapUsed")
C.OV=new H.GD("noSuchMethod")
@@ -17320,6 +17487,7 @@
C.xG=new H.GD("objectPool")
C.Le=new H.GD("oldHeapCapacity")
C.SW=new H.GD("oldHeapUsed")
+C.ZU=new H.GD("pad")
C.wq=new H.GD("pausedOnExit")
C.NT=new H.GD("pausedOnStart")
C.Kl=new H.GD("pos")
@@ -17332,7 +17500,7 @@
C.mE=new H.GD("response")
C.UY=new H.GD("result")
C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
+C.iG=new H.GD("rootLib")
C.X8=new H.GD("running")
C.ok=new H.GD("dart.core.Null")
C.md=new H.GD("dart.core.double")
@@ -17362,55 +17530,47 @@
C.KS=new H.GD("vmName")
C.v6=new H.GD("void")
C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
+C.WP=new H.bB(C.n8,"K",0)
C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
+C.xC=new H.bB(C.SL,"V",0)
C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
+C.wW=new H.bB(C.QJ,"T",0)
C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
+C.io=new H.bB(C.Gsc,"E",0)
+C.nz=new H.bB(C.n8,"V",0)
C.RP=H.uV('hx')
+C.I7=H.uV('bf')
C.q0S=H.uV('Dg')
C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
C.qfw=H.uV('qW')
C.GTO=H.uV('F1')
+C.wc=H.uV('kn')
C.nY=H.uV('a')
C.Yc=H.uV('iP')
C.Pt=H.uV('ov')
C.jRs=H.uV('Be')
C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
+C.xF=H.uV('NQ')
+C.Xb=H.uV('pz')
C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
C.aj=H.uV('fI')
C.Kh=H.uV('I5')
-C.la=H.uV('ZX')
C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
+C.O4=H.uV('CP')
+C.yw=H.uV('KN')
C.b7=H.uV('uwf')
C.RcY=H.uV('aQ')
C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
C.dUi=H.uV('Uj')
C.U9=H.uV('UL')
-C.iG=H.uV('yc')
C.HI=H.uV('Pg')
C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
C.lpG=H.uV('LU')
C.Ch=H.uV('KL')
-C.jV=H.uV('rF')
C.OdR=H.uV('pL')
C.cj=H.uV('E7')
C.eB=H.uV('F1i')
@@ -17420,32 +17580,28 @@
C.qo=H.uV('jY')
C.l49=H.uV('uL')
C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
C.px=H.uV('tz')
C.epC=H.uV('Jc')
-C.JA3=H.uV('b0B')
+C.Xd=H.uV('b0B')
C.PF=H.uV('nk')
-C.Db=H.uV('String')
+C.Db=H.uV('qU')
C.BP=H.uV('qkb')
C.Tu=H.uV('xc')
C.bh=H.uV('i6')
C.Bm=H.uV('XP')
+C.wDw=H.uV('SC')
C.hg=H.uV('hd')
C.Fv=H.uV('ob')
C.Wza=H.uV('pR')
C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
+C.HL=H.uV('a2')
+C.Qf=H.uV('L9')
C.HH=H.uV('dynamic')
C.vVv=H.uV('iL')
C.Gp=H.uV('cw')
C.ri=H.uV('yy')
C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
C.R4R=H.uV('xT')
C.xM=new P.z0(!1)
C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17453,7 +17609,7 @@
$.te="$cachedFunction"
$.eb="$cachedInvocation"
$.OK=0
-$.bf=null
+$.mJ=null
$.P4=null
$.Jl=!1
$.NF=null
@@ -17481,14 +17637,14 @@
$.uP=!0
$.VZ="objects/"
$.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.PQ},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.PQ},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17503,7 +17659,7 @@
I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17521,21 +17677,21 @@
I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w13().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
z.FV(0,C.eu)
return new A.HJ(z)})
I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17545,24 +17701,24 @@
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,window.location.href,null,null)})
+I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.wJY(),"-",new K.zOQ(),"*",new K.W6o(),"/",new K.MdQ(),"==",new K.YJG(),"!=",new K.DOe(),">",new K.lPa(),">=",new K.Ufa(),"<",new K.Raa(),"<=",new K.w0(),"||",new K.w4(),"&&",new K.w5(),"|",new K.w7()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().$0()})
+I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"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:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
I = I.$finishIsolateConstructor(I)
$=new I()
function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index 400ab2c..5068ea7 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -8,7 +8,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ msg['breakpoints'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 97897d9..89e557c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -1,6 +1,7 @@
<head>
<link rel="import" href="curly_block.html">
<link rel="import" href="eval_box.html">
+ <link rel="import" href="eval_link.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
@@ -84,6 +85,12 @@
<div class="memberValue">{{ cls.vmName }}</div>
</div>
</template>
+ <div class="memberItem">
+ <div class="memberName">retained size<br>(all instances)</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
</div>
</div>
@@ -97,7 +104,7 @@
<div class="content">
<template if="{{ cls['fields'].isNotEmpty }}">
fields ({{ cls['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in cls['fields'] }}">
<div class="memberItem">
@@ -112,12 +119,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ cls['functions'].isNotEmpty }}">
functions ({{ cls['functions'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['functions'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ function in cls['functions'] }}">
<div class="memberItem">
@@ -128,7 +135,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index 71daf57..368a0ac 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -5,7 +5,12 @@
<template>
<link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
<template if="{{ code.isDartCode }}">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ code.isOptimized }}">
+ <a href="{{ url }}">*{{ name }}</a>
+ </template>
+ <template if="{{ !code.isOptimized }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<template if="{{ !code.isDartCode }}">
<span>{{ name }}</span>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index 0a91d71..a0a7297 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -59,14 +59,25 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="content">
- <h1>Code for {{ code.name }}</h1>
+ <template if="{{ code.isDartCode && code.isOptimized }}">
+ <h1>Optimized code for {{ code.name }}</h1>
+ </template>
+ <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+ <h1>Code for {{ code.name }}</h1>
+ </template>
<div class="memberList">
<div class="memberItem">
- <div class="memberName">kind</div>
+ <div class="memberName">Kind</div>
<div class="memberValue">{{code.kind}}</div>
</div>
+ <template if="{{ code.isDartCode }}">
+ <div class="memberItem">
+ <div class="memberName">Optimized</div>
+ <div class="memberValue">{{code.isOptimized}}</div>
+ </div>
+ </template>
<div class="memberItem">
- <div class="memberName">function</div>
+ <div class="memberName">Function</div>
<div class="memberValue">
<function-ref ref="{{code.function}}">
</function-ref>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
index 105907c..3245eb2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
@@ -13,6 +13,12 @@
font: 400 14px 'Montserrat', sans-serif;
}
+.content-centered {
+ padding-left: 10%;
+ padding-right: 10%;
+ font: 400 14px 'Montserrat', sans-serif;
+}
+
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
@@ -73,7 +79,6 @@
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
- border:1px solid #ddd;
}
.list-group-item:first-child {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index 41c4566..878a0ec 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -8,9 +8,10 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ error.kind }}</h1>
- <div class="well">{{ error.message }}</div>
+ <div class="content-centered">
+ <h1>{{ error.kind }}</h1>
+ <br>
+ <div class="well">{{ error.message }}</div>
</div>
</template>
<script type="application/dart" src="error_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
index b6dde44..7d4d50b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
@@ -34,7 +34,7 @@
white-space: pre-line;
}
.historyExpr a:hover {
- background-color: #e1f5fe
+ background-color: #fff3e3;
}
.historyValue {
display: block;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index d41fd07..7058f36 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -19,7 +19,7 @@
<template if="{{ field['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index 5280336..aba3443 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -21,7 +21,7 @@
<template if="{{ function['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index 21b89b2..984ce06 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -10,19 +10,27 @@
.hover {
position: fixed;
z-index: 999;
+ height: 16px;
width: 100%;
background: #ffffff;
}
+ .spacer {
+ height: 16px;
+ background-color: red;
+ }
</style>
- <nav-bar>
+ <nav-bar pad="{{ false }}">
<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-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="hover">
<p style="text-align:center">{{ status }}</p>
</div>
+ <div class="spacer">
+ <!-- Make sure no data is covered by hover bar initially -->
+ </div>
<div class="flex-row">
<canvas id="fragmentation" width="1px" height="1px"></canvas>
</div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index 6cc8c1b..087849b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -41,7 +41,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
<nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -90,12 +90,14 @@
<thead>
<tr>
<th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
</tr>
</thead>
<tbody>
@@ -107,6 +109,8 @@
<td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
<td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
<td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+ <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+ <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
</tr>
</tbody>
</table>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index 8aedfc1..e74dfdb 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -6,13 +6,24 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+ <style>
+ .errorBox {
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ padding: 10px;
+ font-family: consolas, courier, monospace;
+ font-size: 1em;
+ line-height: 1.2em;
+ white-space: pre;
+ }
+ </style>
<span>
- <template if="{{ isUnexpected(ref.serviceType) }}">
- unexpected reference type <{{ ref.serviceType }}>
+ <template if="{{ isError(ref.serviceType) }}">
+ <pre class="errorBox">{{ ref.message }}</pre>
</template>
- <template if="{{ isError(ref.serviceType) }}">
- <pre>{{ ref.message }}</pre>
+ <template if="{{ isUnexpected(ref.serviceType) }}">
+ unexpected reference type <{{ ref.serviceType }}>
</template>
<template if="{{ isNull(ref.serviceType) }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index 4d1fb2d..3ff1251 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -52,6 +52,12 @@
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
</div>
+ <div class="memberItem">
+ <div class="memberName">retained size</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
<template if="{{ instance['type_class'] != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
@@ -87,7 +93,7 @@
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<div class="memberItem">
@@ -100,12 +106,12 @@
</div>
</template>
</div>
- </curly-block>
+ </curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<div class="memberItem">
@@ -114,12 +120,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['elements'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<div class="memberItem">
@@ -131,7 +137,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index 99d85d3..fe8ddb9 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -11,7 +11,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<style>
@@ -152,7 +152,7 @@
<td on-click="{{toggleExpanded}}"
class="{{ coloring(row) }}"
style="{{ padding(row) }}">
- <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+ <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
<div style="position: relative;display: inline">
{{row.columns[0]}}
</div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index c7f1a64c..44bc2f8 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -107,82 +107,101 @@
<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.mainPort }}</div>
- </div>
- <br>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+ <div class="content-centered">
+ <div class="flex-row">
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ isolate.rootLib }}"></library-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.mainPort }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
</div>
</div>
- </div>
- </div>
+
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div> <!-- flex row -->
+ </div> <!-- content -->
<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>
+ libraries ({{ isolate.libraries.length }})
+ <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ lib in isolate.libraries }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <library-ref ref="{{ lib }}"></library-ref>
+ </div>
+ </div>
+ </template>
</div>
- <div class="memberItem">
- <div class="memberName">old heap</div>
- <div class="memberValue">
- {{ isolate.oldHeapUsed | formatSize }}
- of
- {{ isolate.oldHeapCapacity | formatSize }}
- </div>
- </div>
- </div>
-
- <br>
-
- <div class="memberList">
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
- </div>
- </div>
- </div>
+ </curly-block>
</div>
<hr>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index 4866eea..74e2d29 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -3,7 +3,12 @@
</head>
<polymer-element name="library-ref" extends="service-ref">
<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ nameIsEmpty }}">
+ <a href="{{ url }}">unnamed</a>
+ </template>
+ <template if="{{ !nameIsEmpty }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<script type="application/dart" src="library_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index 75f316c..6abf998 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -29,18 +29,8 @@
<div class="memberList">
<div class="memberItem">
<div class="memberName">url</div>
- <div class="memberValue">{{ library['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>
@@ -53,11 +43,27 @@
<hr>
<div class="content">
- <template if="{{ library['scripts'].isNotEmpty }}">
- scripts ({{ library['scripts'].length }})
- <curly-block>
+ <template if="{{ library.imports.isNotEmpty }}">
+ imports ({{ library.imports.length }})
+ <curly-block expand="{{ library.imports.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ script in library['scripts'] }}">
+ <template repeat="{{ imp in library.imports }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <library-ref ref="{{ imp }}"></library-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ <br>
+ </template>
+
+ <template if="{{ library.scripts.isNotEmpty }}">
+ scripts ({{ library.scripts.length }})
+ <curly-block expand="{{ library.scripts.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ script in library.scripts }}">
<div class="memberItem">
<div class="memberValue">
<script-ref ref="{{ script }}"></script-ref>
@@ -66,13 +72,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['classes'].isNotEmpty }}">
- classes ({{ library['classes'].length }})
- <curly-block>
+ <template if="{{ library.classes.isNotEmpty }}">
+ classes ({{ library.classes.length }})
+ <curly-block expand="{{ library.classes.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ cls in library['classes'] }}">
+ <template repeat="{{ cls in library.classes }}">
<div class="memberItem">
<div class="memberValue">
<class-ref ref="{{ cls }}"></class-ref>
@@ -81,13 +88,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['variables'].isNotEmpty }}">
- variables ({{ library['variables'].length }})
- <curly-block>
+ <template if="{{ library.variables.isNotEmpty }}">
+ variables ({{ library.variables.length }})
+ <curly-block expand="{{ library.variables.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ field in library['variables'] }}">
+ <template repeat="{{ field in library.variables }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field }}"></field-ref>
@@ -101,13 +109,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['functions'].isNotEmpty }}">
- functions ({{ library['functions'].length }})
- <curly-block>
+ <template if="{{ library.functions.isNotEmpty }}">
+ functions ({{ library.functions.length }})
+ <curly-block expand="{{ library.functions.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ function in library['functions'] }}">
+ <template repeat="{{ function in library.functions }}">
<div class="memberItem">
<div class="memberValue">
<function-ref ref="{{ function }}"></function-ref>
@@ -116,6 +125,7 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 5efe4bf..3817c7f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -6,6 +6,11 @@
<template>
<link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
<style>
+ nav {
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+ }
nav ul {
display: inline-table;
position: relative;
@@ -13,7 +18,7 @@
padding-left: 0;
margin-left: 0;
width: 100%;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background-color: #0489c3;
@@ -21,12 +26,21 @@
nav ul:after {
content: ""; clear: both; display: block;
}
+ .vertical-spacer {
+ height: 40px;
+ background-color: #0489c3;
+ }
</style>
<nav>
<ul>
<content></content>
</ul>
</nav>
+ <div class="vertical-spacer">
+ </div>
+ <template if="{{ pad }}">
+ <br>
+ </template>
</template>
</polymer-element>
@@ -53,7 +67,7 @@
margin: 0;
padding: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -96,7 +110,7 @@
padding: 0;
margin-left: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -160,13 +174,13 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ hashLinkWorkaround }}" 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>
+ anchor="allocation 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') }}"
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index c251423..2c2c64a 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -9,7 +9,6 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ script.isolate }}">
</isolate-nav-menu>
- <library-nav-menu library="{{ script.library }}"></library-nav-menu>
<nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
<li>
<input type="checkbox" checked="{{ showCoverage }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index c69df68..a45c081 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -8,8 +8,9 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
+ <div class="content-centered">
<h1>{{ error.kind }}</h1>
+ <br>
<div class="well">{{ error.message }}</div>
</div>
</template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index 111eabf..b3d9c62 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -8,10 +8,13 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ exception.kind }}</h1>
- <div class="well">{{ exception.message }}</div>
+ <div class="content-centered">
+ <h1>{{ exception.kind }}</h1>
+ <br>
+ <div class="well">{{ exception.message }}</div>
+ <template if="{{ exception.response != '' }}">
<div class="well">{{ exception.response }}</div>
+ </template>
</div>
</template>
<script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index d196e1f..13ad0a5 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -9,7 +9,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ trace['members'].isEmpty }}">
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 993ff72..0b90a99 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -11,13 +11,21 @@
@observable final List<String> columns = [];
static const arrowRight = '\u2192';
static const arrowDownRight = '\u21b3';
+ static const showExpanderStyle = 'cursor: pointer;';
+ static const hideExpanderStyle = 'visibility:hidden;';
+
// TODO(johnmccutchan): Move expander display decisions into html once
// tables and templates are better supported.
@observable String expander = arrowRight;
+ @observable String expanderStyle = showExpanderStyle;
TableTreeRow(TableTreeRow parent) :
parent = parent,
- depth = parent != null ? parent.depth+1 : 0;
+ depth = parent != null ? parent.depth+1 : 0 {
+ if (!hasChildren()) {
+ expanderStyle = hideExpanderStyle;
+ }
+ }
bool _expanded = false;
bool get expanded => _expanded;
@@ -41,6 +49,8 @@
return expanded;
}
+ bool hasChildren();
+
/// Fired when the tree row is expanded. Add children rows here.
void onShow();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 40dd7ff..2e5c4bb 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -8,7 +8,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ msg['breakpoints'].isEmpty }}">
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 8c35168..b55f8ae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -18,6 +18,11 @@
return cls.isolate.get(
cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
}
+
+ // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
+ Future<ServiceObject> retainedSize(String dummy) {
+ return cls.isolate.get(cls.id + "/retained");
+ }
void refresh(var done) {
cls.reload().whenComplete(done);
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 7bcb3e2..46ae269 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,6 +1,7 @@
<head>
<link rel="import" href="curly_block.html">
<link rel="import" href="eval_box.html">
+ <link rel="import" href="eval_link.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
@@ -84,6 +85,12 @@
<div class="memberValue">{{ cls.vmName }}</div>
</div>
</template>
+ <div class="memberItem">
+ <div class="memberName">retained size<br>(all instances)</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
</div>
</div>
@@ -97,7 +104,7 @@
<div class="content">
<template if="{{ cls['fields'].isNotEmpty }}">
fields ({{ cls['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in cls['fields'] }}">
<div class="memberItem">
@@ -112,12 +119,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ cls['functions'].isNotEmpty }}">
functions ({{ cls['functions'].length }})
- <curly-block>
+ <curly-block expand="{{ cls['functions'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ function in cls['functions'] }}">
<div class="memberItem">
@@ -128,7 +135,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index 16800a8..6e83e03 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -5,7 +5,12 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<template if="{{ code.isDartCode }}">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ code.isOptimized }}">
+ <a href="{{ url }}">*{{ name }}</a>
+ </template>
+ <template if="{{ !code.isOptimized }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<template if="{{ !code.isDartCode }}">
<span>{{ name }}</span>
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 4973b61..91bbb5c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -59,14 +59,25 @@
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="content">
- <h1>Code for {{ code.name }}</h1>
+ <template if="{{ code.isDartCode && code.isOptimized }}">
+ <h1>Optimized code for {{ code.name }}</h1>
+ </template>
+ <template if="{{ !(code.isDartCode && code.isOptimized) }}">
+ <h1>Code for {{ code.name }}</h1>
+ </template>
<div class="memberList">
<div class="memberItem">
- <div class="memberName">kind</div>
+ <div class="memberName">Kind</div>
<div class="memberValue">{{code.kind}}</div>
</div>
+ <template if="{{ code.isDartCode }}">
+ <div class="memberItem">
+ <div class="memberName">Optimized</div>
+ <div class="memberValue">{{code.isOptimized}}</div>
+ </div>
+ </template>
<div class="memberItem">
- <div class="memberName">function</div>
+ <div class="memberName">Function</div>
<div class="memberValue">
<function-ref ref="{{code.function}}">
</function-ref>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index 105907c..3245eb2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -13,6 +13,12 @@
font: 400 14px 'Montserrat', sans-serif;
}
+.content-centered {
+ padding-left: 10%;
+ padding-right: 10%;
+ font: 400 14px 'Montserrat', sans-serif;
+}
+
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
@@ -73,7 +79,6 @@
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
- border:1px solid #ddd;
}
.list-group-item:first-child {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
index 9b76ef6..b0dafb8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
@@ -13,6 +13,11 @@
@observable bool expanded = false;
@observable bool busy = false;
@published var callback = null;
+ @published bool expand = false;
+
+ void expandChanged(oldValue) {
+ expanded = expand;
+ }
void doneCallback() {
expanded = !expanded;
@@ -20,6 +25,7 @@
}
void toggleExpand(var a, var b, var c) {
+ assert(callback == null || expand == false);
if (busy) {
return;
}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 092d042..22aaa59 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -8,9 +8,10 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ error.kind }}</h1>
- <div class="well">{{ error.message }}</div>
+ <div class="content-centered">
+ <h1>{{ error.kind }}</h1>
+ <br>
+ <div class="well">{{ error.message }}</div>
</div>
</template>
<script type="application/dart" src="error_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
index b6dde44..7d4d50b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -34,7 +34,7 @@
white-space: pre-line;
}
.historyExpr a:hover {
- background-color: #e1f5fe
+ background-color: #fff3e3;
}
.historyValue {
display: block;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 8b55068..1fbb75d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -19,7 +19,7 @@
<template if="{{ field['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index bd12295..1528938 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -21,7 +21,7 @@
<template if="{{ function['owner'].serviceType == 'Library' }}">
<library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
</template>
- <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index efe7712..65e56d8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -10,19 +10,27 @@
.hover {
position: fixed;
z-index: 999;
+ height: 16px;
width: 100%;
background: #ffffff;
}
+ .spacer {
+ height: 16px;
+ background-color: red;
+ }
</style>
- <nav-bar>
+ <nav-bar pad="{{ false }}">
<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-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<div class="hover">
<p style="text-align:center">{{ status }}</p>
</div>
+ <div class="spacer">
+ <!-- Make sure no data is covered by hover bar initially -->
+ </div>
<div class="flex-row">
<canvas id="fragmentation" width="1px" height="1px"></canvas>
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index 7901dee..8980ae8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -45,17 +45,21 @@
_oldPieDataTable.addColumn('number', 'Size');
var columns = [
new SortedTableColumn('Class'),
- new SortedTableColumn.withFormatter('Accumulator',
+ new SortedTableColumn.withFormatter('Accumulator Size (New)',
Utils.formatSize),
- new SortedTableColumn.withFormatter('Accumulator',
+ new SortedTableColumn.withFormatter('Accumulator (New)',
Utils.formatCommaSeparated),
- new SortedTableColumn.withFormatter('Accumulator (Old space)',
+ new SortedTableColumn.withFormatter('Current Size (New)',
Utils.formatSize),
- new SortedTableColumn.withFormatter('Accumulator (Old space)',
+ new SortedTableColumn.withFormatter('Current (New)',
Utils.formatCommaSeparated),
- new SortedTableColumn.withFormatter('Current',
+ new SortedTableColumn.withFormatter('Accumulator Size (Old)',
Utils.formatSize),
- new SortedTableColumn.withFormatter('Current',
+ new SortedTableColumn.withFormatter('Accumulator (Old)',
+ Utils.formatCommaSeparated),
+ new SortedTableColumn.withFormatter('Current Size (Old)',
+ Utils.formatSize),
+ new SortedTableColumn.withFormatter('Current (Old)',
Utils.formatCommaSeparated)
];
classTable = new SortedTable(columns);
@@ -91,7 +95,9 @@
_combinedTableColumnValue(cls, 3),
_combinedTableColumnValue(cls, 4),
_combinedTableColumnValue(cls, 5),
- _combinedTableColumnValue(cls, 6)];
+ _combinedTableColumnValue(cls, 6),
+ _combinedTableColumnValue(cls, 7),
+ _combinedTableColumnValue(cls, 8)];
classTable.addRow(new SortedTableRow(row));
}
classTable.sort();
@@ -143,29 +149,29 @@
dynamic _combinedTableColumnValue(Map v, int index) {
assert(index >= 0);
- assert(index < 7);
+ assert(index < 9);
switch (index) {
case 0:
return v['class']['user_name'];
case 1:
- return v['new'][ACCUMULATED_SIZE] +
- v['old'][ACCUMULATED_SIZE];
+ return v['new'][ACCUMULATED_SIZE];
case 2:
- return v['new'][ACCUMULATED] +
- v['old'][ACCUMULATED];
+ return v['new'][ACCUMULATED];
case 3:
- return v['old'][ACCUMULATED_SIZE];
- case 4:
- return v['old'][ACCUMULATED];
- case 5:
return v['new'][LIVE_AFTER_GC_SIZE] +
- v['new'][ALLOCATED_SINCE_GC_SIZE] +
- v['old'][LIVE_AFTER_GC_SIZE] +
- v['old'][ALLOCATED_SINCE_GC_SIZE];
- case 6:
+ v['new'][ALLOCATED_SINCE_GC_SIZE];
+ case 4:
return v['new'][LIVE_AFTER_GC] +
- v['new'][ALLOCATED_SINCE_GC] +
- v['old'][LIVE_AFTER_GC] +
+ v['new'][ALLOCATED_SINCE_GC];
+ case 5:
+ return v['old'][ACCUMULATED_SIZE];
+ case 6:
+ return v['old'][ACCUMULATED];
+ case 7:
+ return v['old'][LIVE_AFTER_GC_SIZE] +
+ v['old'][ALLOCATED_SINCE_GC_SIZE];
+ case 8:
+ return v['old'][LIVE_AFTER_GC] +
v['old'][ALLOCATED_SINCE_GC];
}
throw new FallThroughError();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index aa97123..b5c006d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -41,7 +41,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
<nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -90,12 +90,14 @@
<thead>
<tr>
<th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Size">{{ classTable.getColumnLabel(3) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Old Space Accumulated Instances">{{ classTable.getColumnLabel(4) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Size">{{ classTable.getColumnLabel(5) }}</th>
- <th on-click="{{changeSort}}" class="clickable" title="Total Current Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
</tr>
</thead>
<tbody>
@@ -107,6 +109,8 @@
<td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
<td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
<td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+ <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+ <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
</tr>
</tbody>
</table>
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 8e73c8a..7ef469a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -6,13 +6,24 @@
<polymer-element name="instance-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+ <style>
+ .errorBox {
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ padding: 10px;
+ font-family: consolas, courier, monospace;
+ font-size: 1em;
+ line-height: 1.2em;
+ white-space: pre;
+ }
+ </style>
<span>
- <template if="{{ isUnexpected(ref.serviceType) }}">
- unexpected reference type <{{ ref.serviceType }}>
+ <template if="{{ isError(ref.serviceType) }}">
+ <pre class="errorBox">{{ ref.message }}</pre>
</template>
- <template if="{{ isError(ref.serviceType) }}">
- <pre>{{ ref.message }}</pre>
+ <template if="{{ isUnexpected(ref.serviceType) }}">
+ unexpected reference type <{{ ref.serviceType }}>
</template>
<template if="{{ isNull(ref.serviceType) }}">
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 295dddf..6189f19 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -20,6 +20,11 @@
instance.id + "/eval?expr=${Uri.encodeComponent(text)}");
}
+ // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
+ Future<ServiceObject> retainedSize(String dummy) {
+ return instance.isolate.get(instance.id + "/retained");
+ }
+
void refresh(var done) {
instance.reload().whenComplete(done);
}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 759e7ae..ad41d44 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -52,6 +52,12 @@
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
</div>
+ <div class="memberItem">
+ <div class="memberName">retained size</div>
+ <div class="memberValue">
+ <eval-link callback="{{ retainedSize }}"></eval-link>
+ </div>
+ </div>
<template if="{{ instance['type_class'] != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
@@ -87,7 +93,7 @@
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['fields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<div class="memberItem">
@@ -100,12 +106,12 @@
</div>
</template>
</div>
- </curly-block>
+ </curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<div class="memberItem">
@@ -114,12 +120,12 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
- <curly-block>
+ <curly-block expand="{{ instance['elements'].length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<div class="memberItem">
@@ -131,7 +137,7 @@
</div>
</template>
</div>
- </curly-block><br>
+ </curly-block><br><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 5cec638..dafa994 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -81,6 +81,10 @@
void onHide() {
}
+
+ bool hasChildren() {
+ return node.children.length > 0;
+ }
}
/// Displays an IsolateProfile
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 676a8dc..94d4d3e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -11,7 +11,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<style>
@@ -152,7 +152,7 @@
<td on-click="{{toggleExpanded}}"
class="{{ coloring(row) }}"
style="{{ padding(row) }}">
- <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
+ <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
<div style="position: relative;display: inline">
{{row.columns[0]}}
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index a6ccef6..91e573b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -107,82 +107,101 @@
<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.mainPort }}</div>
- </div>
- <br>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+ <div class="content-centered">
+ <div class="flex-row">
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">root library</div>
+ <div class="memberValue">
+ <library-ref ref="{{ isolate.rootLib }}"></library-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.mainPort }}</div>
+ </div>
+ <br>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+ </div>
+ </div>
</div>
</div>
- </div>
- </div>
+
+ <div class="flex-item-fixed-6-12">
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberName">new heap</div>
+ <div class="memberValue">
+ {{ isolate.newHeapUsed | formatSize }}
+ of
+ {{ isolate.newHeapCapacity | formatSize }}
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberName">old heap</div>
+ <div class="memberValue">
+ {{ isolate.oldHeapUsed | formatSize }}
+ of
+ {{ isolate.oldHeapCapacity | formatSize }}
+ </div>
+ </div>
+ </div>
+ <br>
+ <div class="memberList">
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+ </div>
+ </div>
+ <div class="memberItem">
+ <div class="memberValue">
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div> <!-- flex row -->
+ </div> <!-- content -->
<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>
+ libraries ({{ isolate.libraries.length }})
+ <curly-block expand="{{ isolate.libraries.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ lib in isolate.libraries }}">
+ <div class="memberItem">
+ <div class="memberName">
+ <library-ref ref="{{ lib }}"></library-ref>
+ </div>
+ </div>
+ </template>
</div>
- <div class="memberItem">
- <div class="memberName">old heap</div>
- <div class="memberValue">
- {{ isolate.oldHeapUsed | formatSize }}
- of
- {{ isolate.oldHeapCapacity | formatSize }}
- </div>
- </div>
- </div>
-
- <br>
-
- <div class="memberList">
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
- </div>
- </div>
- <div class="memberItem">
- <div class="memberValue">
- See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
- </div>
- </div>
- </div>
+ </curly-block>
</div>
<hr>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index d1e356e..4d04a0b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -3,7 +3,12 @@
</head>
<polymer-element name="library-ref" extends="service-ref">
<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
- <a href="{{ url }}">{{ name }}</a>
+ <template if="{{ nameIsEmpty }}">
+ <a href="{{ url }}">unnamed</a>
+ </template>
+ <template if="{{ !nameIsEmpty }}">
+ <a href="{{ url }}">{{ name }}</a>
+ </template>
</template>
<script type="application/dart" src="library_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</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 f22e019..64d6e6c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -12,7 +12,7 @@
@CustomTag('library-view')
class LibraryViewElement extends ObservatoryElement {
- @published ServiceMap library;
+ @published Library library;
LibraryViewElement.created() : super.created();
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 7ae311b..58cd763 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -29,18 +29,8 @@
<div class="memberList">
<div class="memberItem">
<div class="memberName">url</div>
- <div class="memberValue">{{ library['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>
@@ -53,11 +43,27 @@
<hr>
<div class="content">
- <template if="{{ library['scripts'].isNotEmpty }}">
- scripts ({{ library['scripts'].length }})
- <curly-block>
+ <template if="{{ library.imports.isNotEmpty }}">
+ imports ({{ library.imports.length }})
+ <curly-block expand="{{ library.imports.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ script in library['scripts'] }}">
+ <template repeat="{{ imp in library.imports }}">
+ <div class="memberItem">
+ <div class="memberValue">
+ <library-ref ref="{{ imp }}"></library-ref>
+ </div>
+ </div>
+ </template>
+ </div>
+ </curly-block><br>
+ <br>
+ </template>
+
+ <template if="{{ library.scripts.isNotEmpty }}">
+ scripts ({{ library.scripts.length }})
+ <curly-block expand="{{ library.scripts.length <= 8 }}">
+ <div class="memberList">
+ <template repeat="{{ script in library.scripts }}">
<div class="memberItem">
<div class="memberValue">
<script-ref ref="{{ script }}"></script-ref>
@@ -66,13 +72,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['classes'].isNotEmpty }}">
- classes ({{ library['classes'].length }})
- <curly-block>
+ <template if="{{ library.classes.isNotEmpty }}">
+ classes ({{ library.classes.length }})
+ <curly-block expand="{{ library.classes.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ cls in library['classes'] }}">
+ <template repeat="{{ cls in library.classes }}">
<div class="memberItem">
<div class="memberValue">
<class-ref ref="{{ cls }}"></class-ref>
@@ -81,13 +88,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['variables'].isNotEmpty }}">
- variables ({{ library['variables'].length }})
- <curly-block>
+ <template if="{{ library.variables.isNotEmpty }}">
+ variables ({{ library.variables.length }})
+ <curly-block expand="{{ library.variables.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ field in library['variables'] }}">
+ <template repeat="{{ field in library.variables }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field }}"></field-ref>
@@ -101,13 +109,14 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
- <template if="{{ library['functions'].isNotEmpty }}">
- functions ({{ library['functions'].length }})
- <curly-block>
+ <template if="{{ library.functions.isNotEmpty }}">
+ functions ({{ library.functions.length }})
+ <curly-block expand="{{ library.functions.length <= 8 }}">
<div class="memberList">
- <template repeat="{{ function in library['functions'] }}">
+ <template repeat="{{ function in library.functions }}">
<div class="memberItem">
<div class="memberValue">
<function-ref ref="{{ function }}"></function-ref>
@@ -116,6 +125,7 @@
</template>
</div>
</curly-block><br>
+ <br>
</template>
</div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index ad58d58..c82b427 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -12,6 +12,8 @@
@CustomTag('nav-bar')
class NavBarElement extends ObservatoryElement {
+ @published bool pad = true;
+
NavBarElement.created() : super.created();
}
@@ -67,12 +69,27 @@
@published bool last = false;
@published Isolate isolate;
+ void isolateChanged(oldValue) {
+ notifyPropertyChange(#hashLinkWorkaround, 0, 1);
+ }
+
+ // TODO(turnidge): Figure out why polymer needs this function.
+ @reflectable
+ String get hashLinkWorkaround {
+ if (isolate != null) {
+ return isolate.hashLink;
+ } else {
+ return '';
+ }
+ }
+ @reflectable set hashLinkWorkaround(var x) { /* silence polymer */ }
+
IsolateNavMenuElement.created() : super.created();
}
@CustomTag('library-nav-menu')
class LibraryNavMenuElement extends ObservatoryElement {
- @published ServiceMap library;
+ @published Library library;
@published bool last = false;
LibraryNavMenuElement.created() : super.created();
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 e11f9f0..dc7391c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -6,6 +6,11 @@
<template>
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
<style>
+ nav {
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+ }
nav ul {
display: inline-table;
position: relative;
@@ -13,7 +18,7 @@
padding-left: 0;
margin-left: 0;
width: 100%;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background-color: #0489c3;
@@ -21,12 +26,21 @@
nav ul:after {
content: ""; clear: both; display: block;
}
+ .vertical-spacer {
+ height: 40px;
+ background-color: #0489c3;
+ }
</style>
<nav>
<ul>
<content></content>
</ul>
</nav>
+ <div class="vertical-spacer">
+ </div>
+ <template if="{{ pad }}">
+ <br>
+ </template>
</template>
</polymer-element>
@@ -53,7 +67,7 @@
margin: 0;
padding: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -96,7 +110,7 @@
padding: 0;
margin-left: 0;
width: auto;
- z-index: 10;
+ z-index: 1000;
font: 400 16px 'Montserrat', sans-serif;
color: white;
background: #567;
@@ -160,13 +174,13 @@
<polymer-element name="isolate-nav-menu" extends="observatory-element">
<template>
- <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
+ <nav-menu link="{{ hashLinkWorkaround }}" 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>
+ anchor="allocation 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') }}"
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index 24e53ba..2d0d60d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -82,7 +82,7 @@
return (!['Null',
'Smi',
'Mint',
- 'Biginit',
+ 'Bigint',
'Bool',
'String',
'Double',
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index c251423..2c2c64a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -9,7 +9,6 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ script.isolate }}">
</isolate-nav-menu>
- <library-nav-menu library="{{ script.library }}"></library-nav-menu>
<nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
<li>
<input type="checkbox" checked="{{ showCoverage }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index 6dad343..b215980 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -8,8 +8,9 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
+ <div class="content-centered">
<h1>{{ error.kind }}</h1>
+ <br>
<div class="well">{{ error.message }}</div>
</div>
</template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index 7bf21e6..b939e38 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -8,10 +8,13 @@
<nav-bar>
<top-nav-menu last="{{ true }}"></top-nav-menu>
</nav-bar>
- <div class="content">
- <h1>{{ exception.kind }}</h1>
- <div class="well">{{ exception.message }}</div>
+ <div class="content-centered">
+ <h1>{{ exception.kind }}</h1>
+ <br>
+ <div class="well">{{ exception.message }}</div>
+ <template if="{{ exception.response != '' }}">
<div class="well">{{ exception.response }}</div>
+ </template>
</div>
</template>
<script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 9af8c16..2286b1a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -17,6 +17,7 @@
void refChanged(oldValue) {
notifyPropertyChange(#url, "", url);
notifyPropertyChange(#name, [], name);
+ notifyPropertyChange(#nameIsEmpty, 0, 1);
notifyPropertyChange(#hoverText, "", hoverText);
}
@@ -47,4 +48,9 @@
}
return ref.name;
}
+
+ // Workaround isEmpty not being useable due to missing @MirrorsUsed.
+ bool get nameIsEmpty {
+ return name.isEmpty;
+ }
}
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 822645f..5b08d8a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -52,6 +52,28 @@
HeapMapElement element = new Element.tag('heap-map');
element.fragmentation = object;
return element;
+ case 'LibraryPrefix':
+ case 'TypeRef':
+ case 'TypeParameter':
+ case 'BoundedType':
+ case 'Int32x4':
+ case 'Float32x4':
+ case 'Float64x4':
+ case 'TypedData':
+ case 'ExternalTypedData':
+ case 'Capability':
+ case 'ReceivePort':
+ case 'SendPort':
+ case 'Stacktrace':
+ case 'JSRegExp':
+ case 'WeakProperty':
+ case 'MirrorReference':
+ case 'UserTag':
+ // TODO(turnidge): The types above this comment are instance
+ // types and should be handled by the InstanceViewElement. We
+ // need to go through these and make sure that they print in a
+ // reasonable way.
+ case 'Type':
case 'Array':
case 'Bool':
case 'Closure':
@@ -59,8 +81,9 @@
case 'GrowableObjectArray':
case 'Instance':
case 'Smi':
+ case 'Mint':
+ case 'Bigint':
case 'String':
- case 'Type':
InstanceViewElement element = new Element.tag('instance-view');
element.instance = object;
return element;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index 59428c1..f134d7f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -9,7 +9,7 @@
<nav-bar>
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
- <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
+ <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
</nav-bar>
<template if="{{ trace['members'].isEmpty }}">
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 045f975..a94a706 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -30,6 +30,7 @@
@reflectable String get link => isolate.relativeLink(_id);
/// The complete service url of this object with a '#/' prefix.
+ // TODO(turnidge): Figure out why using a getter here messes up polymer.
@reflectable String get hashLink => '#/${link}';
@reflectable set hashLink(var o) { /* silence polymer */ }
@@ -73,6 +74,9 @@
case 'Isolate':
obj = new Isolate._empty(owner);
break;
+ case 'Library':
+ obj = new Library._empty(owner);
+ break;
case 'ServiceError':
obj = new ServiceError._empty(owner);
break;
@@ -280,6 +284,28 @@
});
}
+ Future<ObservableMap> _processMap(ObservableMap map) {
+ // Verify that the top level response is a service map.
+ if (!_isServiceMap(map)) {
+ return new Future.error(
+ new ServiceObject._fromMap(this, toObservable({
+ 'type': 'ServiceException',
+ 'id': '',
+ 'kind': 'FormatException',
+ 'response': map,
+ 'message': 'Top level service responses must be service maps.',
+ })));
+ }
+ // Preemptively capture ServiceError and ServiceExceptions.
+ if (map['type'] == 'ServiceError') {
+ return new Future.error(new ServiceObject._fromMap(this, map));
+ } else if (map['type'] == 'ServiceException') {
+ return new Future.error(new ServiceObject._fromMap(this, map));
+ }
+ // map is now guaranteed to be a non-error/exception ServiceObject.
+ return new Future.value(map);
+ }
+
/// Gets [id] as an [ObservableMap] from the service directly. If
/// an error occurs, the future is completed as an error with a
/// ServiceError or ServiceException. Therefore any chained then() calls
@@ -288,34 +314,19 @@
return getString(id).then((response) {
try {
var map = toObservable(JSON.decode(response));
- // Verify that the top level response is a service map.
- if (!_isServiceMap(map)) {
- return new Future.error(
- new ServiceObject._fromMap(this, toObservable({
- 'type': 'ServiceException',
- 'id': '',
- 'kind': 'FormatException',
- 'response': map,
- 'message': 'Top level service responses must be service maps.',
- })));
- }
- // Preemptively capture ServiceError and ServiceExceptions.
- if (map['type'] == 'ServiceError') {
- return new Future.error(new ServiceObject._fromMap(this, map));
- } else if (map['type'] == 'ServiceException') {
- return new Future.error(new ServiceObject._fromMap(this, map));
- }
- // map is now guaranteed to be a non-error/exception ServiceObject.
- return map;
+ return _processMap(map);
} catch (e, st) {
- print(e);
- print(st);
return new Future.error(
new ServiceObject._fromMap(this, toObservable({
'type': 'ServiceException',
'id': '',
'kind': 'DecodeException',
- 'response': response,
+ 'response':
+ 'This is likely a result of a known V8 bug. Although the '
+ 'the bug has been fixed the fix may not be in your Chrome'
+ ' version. For more information see dartbug.com/18385. '
+ 'Observatory is still functioning and you should try your'
+ ' action again.',
'message': 'Could not decode JSON: $e',
})));
}
@@ -576,7 +587,9 @@
});
}
- @observable ServiceMap rootLib;
+ @observable Library rootLib;
+ @observable ObservableList<Library> libraries =
+ new ObservableList<Library>();
@observable ObservableMap topFrame;
@observable String name;
@@ -667,6 +680,12 @@
running = map['topFrame'] != null;
idle = !pausedOnStart && !pausedOnExit && !running;
error = map['error'];
+
+ libraries.clear();
+ for (var lib in map['libraries']) {
+ libraries.add(lib);
+ }
+ libraries.sort((a,b) => a.name.compareTo(b.name));
}
Future<TagProfile> updateTagProfile() {
@@ -731,10 +750,10 @@
bool get canCache {
return (_serviceType == 'Class' ||
_serviceType == 'Function' ||
- _serviceType == 'Library') &&
+ _serviceType == 'Field') &&
!_id.startsWith(objectIdRingPrefix);
}
- bool get immutable => canCache;
+ bool get immutable => false;
ServiceMap._empty(ServiceObjectOwner owner) : super._empty(owner);
@@ -843,6 +862,49 @@
}
}
+class Library extends ServiceObject {
+ @observable String url;
+ @reflectable final imports = new ObservableList<Library>();
+ @reflectable final scripts = new ObservableList<Script>();
+ @reflectable final classes = new ObservableList<ServiceMap>();
+ @reflectable final variables = new ObservableList<ServiceMap>();
+ @reflectable final functions = new ObservableList<ServiceMap>();
+
+ bool get canCache => true;
+ bool get immutable => false;
+
+ Library._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+ void _update(ObservableMap map, bool mapIsRef) {
+ url = map['url'];
+ var shortUrl = url;
+ if (url.startsWith('file://') ||
+ url.startsWith('http://')) {
+ shortUrl = url.substring(url.lastIndexOf('/') + 1);
+ }
+ name = map['user_name'];
+ if (name.isEmpty) {
+ name = shortUrl;
+ }
+ vmName = map['name'];
+ if (mapIsRef) {
+ return;
+ }
+ _loaded = true;
+ _upgradeCollection(map, isolate);
+ imports.clear();
+ imports.addAll(map['imports']);
+ scripts.clear();
+ scripts.addAll(map['scripts']);
+ classes.clear();
+ classes.addAll(map['classes']);
+ variables.clear();
+ variables.addAll(map['variables']);
+ functions.clear();
+ functions.addAll(map['functions']);
+ }
+}
+
class ScriptLine {
@reflectable final int line;
@reflectable final String text;
@@ -852,7 +914,6 @@
class Script extends ServiceObject {
@reflectable final lines = new ObservableList<ScriptLine>();
@reflectable final hits = new ObservableMap<int, int>();
- @observable ServiceObject library;
@observable String kind;
@observable int firstTokenPos;
@observable int lastTokenPos;
@@ -1151,6 +1212,7 @@
@observable ServiceMap objectPool;
@observable ServiceMap function;
@observable Script script;
+ @observable bool isOptimized = false;
String name;
String vmName;
@@ -1267,6 +1329,7 @@
void _update(ObservableMap m, bool mapIsRef) {
name = m['user_name'];
vmName = m['name'];
+ isOptimized = m['isOptimized'] != null ? m['isOptimized'] : false;
kind = CodeKind.fromString(m['kind']);
startAddress = int.parse(m['start'], radix:16);
endAddress = int.parse(m['end'], radix:16);
diff --git a/runtime/bin/vmservice/client/web/main.dart b/runtime/bin/vmservice/client/web/main.dart
index f386529..db5153c 100644
--- a/runtime/bin/vmservice/client/web/main.dart
+++ b/runtime/bin/vmservice/client/web/main.dart
@@ -9,7 +9,14 @@
main() {
Logger.root.level = Level.INFO;
Logger.root.onRecord.listen((LogRecord rec) {
- print('${rec.level.name}: ${rec.time}: ${rec.message}');
+ if (rec.level == Level.WARNING &&
+ rec.message.startsWith('Error evaluating expression') &&
+ (rec.message.contains("Can't assign to null: ") ||
+ rec.message.contains('Expression is not assignable: '))) {
+ // Suppress flaky polymer errors.
+ return;
+ }
+ print('${rec.level.name}: ${rec.time}: ${rec.message}');
});
Logger.root.info('Starting Observatory');
GoogleChart.initOnce().then((_) {
@@ -17,4 +24,4 @@
Logger.root.info('Initializing Polymer');
initPolymer();
});
-}
\ No newline at end of file
+}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 5648eb6..77da50c 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -391,6 +391,17 @@
DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2);
/**
+ * Returns a hash code for the argument. The hash code of objects that are equal
+ * according to Dart_IdentityEquals will return the same hash code, but the hash
+ * codes of non-equal objects are not necessarily distinct.
+ *
+ * \param obj An object for which to derive a hash code.
+ *
+ * \return A hash code for the parameter.
+ */
+DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj);
+
+/**
* Allocates a handle in the current scope from a persistent handle.
*/
DART_EXPORT Dart_Handle Dart_HandleFromPersistent(Dart_PersistentHandle object);
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 788113b..c86ff8f 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -26,13 +26,11 @@
native "List_copyFromObjectArray";
void insert(int index, E element) {
- throw new UnsupportedError(
- "Cannot insert into a fixed-length list");
+ throw NonGrowableListError.add();
}
void insertAll(int index, Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot insert into a fixed-length list");
+ throw NonGrowableListError.add();
}
void setAll(int index, Iterable<E> iterable) {
@@ -40,23 +38,19 @@
}
E removeAt(int index) {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw NonGrowableListError.remove();
}
bool remove(Object element) {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw NonGrowableListError.remove();
}
void removeWhere(bool test(E element)) {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw NonGrowableListError.remove();
}
void retainWhere(bool test(E element)) {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw NonGrowableListError.remove();
}
Iterable<E> getRange(int start, [int end]) {
@@ -94,13 +88,11 @@
}
void removeRange(int start, int end) {
- throw new UnsupportedError(
- "Cannot remove range from a fixed-length list");
+ throw NonGrowableListError.remove();
}
void replaceRange(int start, int end, Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot remove range from a fixed-length list");
+ throw NonGrowableListError.remove();
}
void fillRange(int start, int end, [E fillValue]) {
@@ -222,44 +214,39 @@
}
void add(E element) {
- throw new UnsupportedError(
- "Cannot add to a fixed-length list");
+ throw NonGrowableListError.add();
}
void addAll(Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot add to a fixed-length list");
+ throw NonGrowableListError.add();
}
void clear() {
- throw new UnsupportedError(
- "Cannot clear a fixed-length list");
+ throw NonGrowableListError.remove();
}
void set length(int length) {
- throw new UnsupportedError(
- "Cannot resize a fixed-length list");
+ throw NonGrowableListError.length();
}
E removeLast() {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw NonGrowableListError.remove();
}
E get first {
if (length > 0) return this[0];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E get last {
if (length > 0) return this[length - 1];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E get single {
if (length == 1) return this[0];
- if (length == 0) throw new StateError("No elements");
- throw new StateError("More than one element");
+ if (length == 0) throw IterableElementError.noElement();
+ throw IterableElementError.tooMany();
}
List<E> toList({ bool growable: true}) {
@@ -297,70 +284,57 @@
E operator [](int index) native "List_getIndexed";
void operator []=(int index, E value) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
int get length native "List_getLength";
void insert(int index, E element) {
- throw new UnsupportedError(
- "Cannot add to an immutable array");
+ throw UnmodifiableListError.add();
}
void insertAll(int index, Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot add to an immutable array");
+ throw UnmodifiableListError.add();
}
void setAll(int index, Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
E removeAt(int index) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.remove();
}
bool remove(Object element) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.remove();
}
void removeWhere(bool test(E element)) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.remove();
}
void retainWhere(bool test(E element)) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.remove();
}
void copyFrom(List src, int srcStart, int dstStart, int count) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
void removeRange(int start, int end) {
- throw new UnsupportedError(
- "Cannot remove range of an immutable array");
+ throw UnmodifiableListError.remove();
}
void fillRange(int start, int end, [E fillValue]) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
void replaceRange(int start, int end, Iterable<E> iterable) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
List<E> sublist(int start, [int end]) {
@@ -461,13 +435,11 @@
Iterable<E> get reversed => IterableMixinWorkaround.reversedList(this);
void sort([int compare(E a, E b)]) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
void shuffle([Random random]) {
- throw new UnsupportedError(
- "Cannot modify an immutable array");
+ throw UnmodifiableListError.change();
}
String toString() {
@@ -488,44 +460,39 @@
}
void add(E element) {
- throw new UnsupportedError(
- "Cannot add to an immutable array");
+ throw UnmodifiableListError.add();
}
void addAll(Iterable<E> elements) {
- throw new UnsupportedError(
- "Cannot add to an immutable array");
+ throw UnmodifiableListError.add();
}
void clear() {
- throw new UnsupportedError(
- "Cannot clear an immutable array");
+ throw UnmodifiableListError.remove();
}
void set length(int length) {
- throw new UnsupportedError(
- "Cannot change the length of an immutable array");
+ throw UnmodifiableListError.length();
}
E removeLast() {
- throw new UnsupportedError(
- "Cannot remove from a fixed-length list");
+ throw UnmodifiableListError.remove();
}
E get first {
if (length > 0) return this[0];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E get last {
if (length > 0) return this[length - 1];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E get single {
if (length == 1) return this[0];
- if (length == 0) throw new StateError("No elements");
- throw new StateError("More than one element");
+ if (length == 0) throw IterableElementError.noElement();
+ throw IterableElementError.tooMany();
}
List<E> toList({ bool growable: true }) {
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index a4cac7d..edfa26d 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -271,7 +271,8 @@
DEFINE_NATIVE_ENTRY(Double_getIsNegative, 1) {
const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
// Include negative zero, infinity.
- return Bool::Get(signbit(arg.value()) && !isnan(arg.value())).raw();
+ double dval = arg.value();
+ return Bool::Get(signbit(dval) && !isnan(dval)).raw();
}
// Add here only functions using/referring to old-style casts.
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index e9c1082..ed5551a 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -198,18 +198,18 @@
T get first {
if (length > 0) return this[0];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
T get last {
if (length > 0) return this[length - 1];
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
T get single {
if (length == 1) return this[0];
- if (length == 0) throw new StateError("No elements");
- throw new StateError("More than one element");
+ if (length == 0) throw IterableElementError.noElement();
+ throw IterableElementError.tooMany();;
}
int indexOf(Object element, [int start = 0]) {
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index dd0ebd9..a7d8d90 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -948,6 +948,8 @@
return _qualifiedName;
}
+ bool get isPrivate => _n(simpleName).startsWith('_');
+
List<InstanceMirror> get metadata {
// Get the metadata objects, convert them into InstanceMirrors using
// reflect() and then make them into a Dart list.
@@ -977,7 +979,6 @@
return _owner;
}
- bool get isPrivate => false;
bool get isStatic => false;
bool get isTopLevel => false;
@@ -1051,7 +1052,6 @@
: super(reflectee, _s(simpleName));
bool get isTopLevel => true;
- bool get isPrivate => false;
DeclarationMirror _owner;
DeclarationMirror get owner {
@@ -1417,8 +1417,6 @@
this.isConst)
: super(reflectee, _s(simpleName));
- bool get isPrivate => _n(simpleName).startsWith('_');
-
bool get isTopLevel => owner is LibraryMirror;
SourceLocation get location {
diff --git a/runtime/lib/profiler.cc b/runtime/lib/profiler.cc
index 75bf2d1..3128fb9 100644
--- a/runtime/lib/profiler.cc
+++ b/runtime/lib/profiler.cc
@@ -36,8 +36,17 @@
if (FLAG_trace_intrinsified_natives) {
OS::Print("UserTag_makeCurrent: %s\n", self.ToCString());
}
+ const UserTag& old = UserTag::Handle(isolate->current_tag());
self.MakeActive();
- return Object::null();
+ return old.raw();
+}
+
+
+DEFINE_NATIVE_ENTRY(UserTag_defaultTag, 0) {
+ if (FLAG_trace_intrinsified_natives) {
+ OS::Print("UserTag_defaultTag\n");
+ }
+ return isolate->object_store()->default_tag();
}
@@ -49,15 +58,4 @@
}
-DEFINE_NATIVE_ENTRY(Profiler_clearCurrentTag, 0) {
- // Use a NoGCScope to avoid creating a handle for the old current.
- NoGCScope no_gc;
- RawUserTag* old_current = isolate->current_tag();
- UserTag::ClearActive();
- if (FLAG_trace_intrinsified_natives) {
- OS::Print("Profiler_clearCurrentTag\n");
- }
- return old_current;
-}
-
} // namespace dart
diff --git a/runtime/lib/profiler.dart b/runtime/lib/profiler.dart
index 5ed8df5..c42e966 100644
--- a/runtime/lib/profiler.dart
+++ b/runtime/lib/profiler.dart
@@ -8,6 +8,7 @@
/* patch */ factory UserTag(String label) {
return new _UserTag(label);
}
+ /* patch */ static UserTag get defaultTag => _getDefaultTag();
}
@@ -20,5 +21,4 @@
patch UserTag getCurrentTag() => _getCurrentTag();
UserTag _getCurrentTag() native "Profiler_getCurrentTag";
-patch UserTag clearCurrentTag() => _clearCurrentTag();
-UserTag _clearCurrentTag() native "Profiler_clearCurrentTag";
+UserTag _getDefaultTag() native "UserTag_defaultTag";
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index 953cf10..f202562 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -179,6 +179,10 @@
static uint16_t HostToLittleEndian16(uint16_t host_value);
static uint32_t HostToLittleEndian32(uint32_t host_value);
static uint64_t HostToLittleEndian64(uint64_t host_value);
+
+ static bool DoublesBitEqual(const double a, const double b) {
+ return bit_cast<int64_t, double>(a) == bit_cast<int64_t, double>(b);
+ }
};
} // namespace dart
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 7202e43..d4aadf6 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -17,6 +17,7 @@
cc/Sleep: Pass, Fail
[ $mode == debug ]
+cc/PrintJSON: Crash # Issue 18652
[ $arch == x64 ]
cc/IsolateInterrupt: Skip
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index bb23185..9b07893 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -36,31 +36,34 @@
// to a stack frame above the frame where these objects were allocated.
class StackResource {
public:
- explicit StackResource(BaseIsolate* isolate)
- : isolate_(isolate), previous_(NULL) {
+ explicit StackResource(Isolate* isolate)
+ : isolate_(reinterpret_cast<BaseIsolate*>(isolate)), previous_(NULL) {
// We can only have longjumps and exceptions when there is a current
// isolate. If there is no current isolate, we don't need to
// protect this case.
- if (isolate != NULL) {
- previous_ = isolate->top_resource();
- isolate->set_top_resource(this);
+ if (isolate_ != NULL) {
+ previous_ = isolate_->top_resource();
+ isolate_->set_top_resource(this);
}
}
virtual ~StackResource() {
- if (isolate() != NULL) {
- StackResource* top = isolate()->top_resource();
+ if (isolate_ != NULL) {
+ StackResource* top = isolate_->top_resource();
ASSERT(top == this);
- isolate()->set_top_resource(previous_);
+ isolate_->set_top_resource(previous_);
}
#if defined(DEBUG)
- if (isolate() != NULL) {
- BaseIsolate::AssertCurrent(isolate());
+ if (isolate_ != NULL) {
+ BaseIsolate::AssertCurrent(isolate_);
}
#endif
}
- BaseIsolate* isolate() const { return isolate_; }
+ // We can only create StackResources with Isolates, so provide the original
+ // isolate to the subclasses. The only reason we have a BaseIsolate in the
+ // StackResource is to break the header include cycles.
+ Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
private:
BaseIsolate* const isolate_; // Current isolate for this stack resource.
diff --git a/runtime/vm/assembler.cc b/runtime/vm/assembler.cc
index 1b25ac3..65e5627 100644
--- a/runtime/vm/assembler.cc
+++ b/runtime/vm/assembler.cc
@@ -13,7 +13,7 @@
namespace dart {
-DEFINE_FLAG(bool, code_comments, true,
+DEFINE_FLAG(bool, code_comments, false,
"Include comments into code and disassembly");
#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
DEFINE_FLAG(bool, use_far_branches, false,
@@ -210,7 +210,7 @@
void Assembler::Comment(const char* format, ...) {
- if (FLAG_code_comments && (FLAG_disassemble || FLAG_disassemble_optimized)) {
+ if (FLAG_code_comments || FLAG_disassemble || FLAG_disassemble_optimized) {
char buffer[1024];
va_list args;
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index a4a208e..aeaa13b 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -566,9 +566,17 @@
}
+void Assembler::LoadDImmediate(VRegister vd, double immd, Register pp) {
+ if (!fmovdi(vd, immd)) {
+ int64_t imm = bit_cast<int64_t, double>(immd);
+ LoadImmediate(TMP, imm, pp);
+ fmovdr(vd, TMP);
+ }
+}
+
+
void Assembler::AddImmediate(
Register dest, Register rn, int64_t imm, Register pp) {
- ASSERT(rn != TMP2);
Operand op;
if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
add(dest, rn, op);
@@ -576,12 +584,67 @@
Operand::Immediate) {
sub(dest, rn, op);
} else {
+ // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
+ ASSERT(rn != TMP2);
LoadImmediate(TMP2, imm, pp);
add(dest, rn, Operand(TMP2));
}
}
+void Assembler::AddImmediateSetFlags(
+ Register dest, Register rn, int64_t imm, Register pp) {
+ Operand op;
+ if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
+ adds(dest, rn, op);
+ } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
+ Operand::Immediate) {
+ subs(dest, rn, op);
+ } else {
+ // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
+ ASSERT(rn != TMP2);
+ LoadImmediate(TMP2, imm, pp);
+ adds(dest, rn, Operand(TMP2));
+ }
+}
+
+
+void Assembler::AndImmediate(
+ Register rd, Register rn, int64_t imm, Register pp) {
+ Operand imm_op;
+ if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+ andi(rd, rn, imm);
+ } else {
+ LoadImmediate(TMP, imm, pp);
+ and_(rd, rn, Operand(TMP));
+ }
+}
+
+
+void Assembler::OrImmediate(
+ Register rd, Register rn, int64_t imm, Register pp) {
+ Operand imm_op;
+ if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+ orri(rd, rn, imm);
+ } else {
+ LoadImmediate(TMP, imm, pp);
+ orr(rd, rn, Operand(TMP));
+ }
+}
+
+
+void Assembler::XorImmediate(
+ Register rd, Register rn, int64_t imm, Register pp) {
+ Operand imm_op;
+ if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+ eori(rd, rn, imm);
+ } else {
+ LoadImmediate(TMP, imm, pp);
+ eor(rd, rn, Operand(TMP));
+ }
+}
+
+
void Assembler::TestImmediate(Register rn, int64_t imm, Register pp) {
Operand imm_op;
if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
@@ -594,7 +657,6 @@
void Assembler::CompareImmediate(Register rn, int64_t imm, Register pp) {
- ASSERT(rn != TMP2);
Operand op;
if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
cmp(rn, op);
@@ -602,6 +664,7 @@
Operand::Immediate) {
cmn(rn, op);
} else {
+ ASSERT(rn != TMP2);
LoadImmediate(TMP2, imm, pp);
cmp(rn, Operand(TMP2));
}
@@ -610,10 +673,10 @@
void Assembler::LoadFromOffset(
Register dest, Register base, int32_t offset, OperandSize sz) {
- ASSERT(base != TMP2);
if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
ldr(dest, Address(base, offset, Address::Offset, sz), sz);
} else {
+ ASSERT(base != TMP2);
// Since offset is 32-bits, it won't be loaded from the pool.
AddImmediate(TMP2, base, offset, kNoPP);
ldr(dest, Address(TMP2), sz);
@@ -621,13 +684,25 @@
}
+void Assembler::LoadDFromOffset(VRegister dest, Register base, int32_t offset) {
+ if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
+ fldrd(dest, Address(base, offset, Address::Offset, kDWord));
+ } else {
+ ASSERT(base != TMP2);
+ // Since offset is 32-bits, it won't be loaded from the pool.
+ AddImmediate(TMP2, base, offset, kNoPP);
+ fldrd(dest, Address(TMP2));
+ }
+}
+
+
void Assembler::StoreToOffset(
Register src, Register base, int32_t offset, OperandSize sz) {
- ASSERT(src != TMP2);
ASSERT(base != TMP2);
if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
str(src, Address(base, offset, Address::Offset, sz), sz);
} else {
+ ASSERT(src != TMP2);
// Since offset is 32-bits, it won't be loaded from the pool.
AddImmediate(TMP2, base, offset, kNoPP);
str(src, Address(TMP2), sz);
@@ -635,6 +710,18 @@
}
+void Assembler::StoreDToOffset(VRegister src, Register base, int32_t offset) {
+ if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
+ fstrd(src, Address(base, offset, Address::Offset, kDWord));
+ } else {
+ ASSERT(base != TMP2);
+ // Since offset is 32-bits, it won't be loaded from the pool.
+ AddImmediate(TMP2, base, offset, kNoPP);
+ fstrd(src, Address(TMP2));
+ }
+}
+
+
// Store into object.
// Preserves object and value registers.
void Assembler::StoreIntoObjectFilterNoSmi(Register object,
@@ -832,12 +919,9 @@
// optimized function and there may be extra space for spill slots to
// allocate. We must also set up the pool pointer for the function.
void Assembler::EnterOsrFrame(intptr_t extra_size, Register new_pp) {
- const intptr_t offset = CodeSize();
-
Comment("EnterOsrFrame");
adr(TMP, -CodeSize());
- AddImmediate(TMP, TMP, -offset, kNoPP);
StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
// Setup pool pointer for this dart function.
@@ -864,11 +948,22 @@
void Assembler::EnterCallRuntimeFrame(intptr_t frame_size) {
EnterFrame(0);
- // TODO(zra): also save volatile FPU registers.
+ // Store fpu registers with the lowest register number at the lowest
+ // address.
+ for (int i = kNumberOfVRegisters - 1; i >= 0; i--) {
+ if ((i >= kAbiFirstPreservedFpuReg) && (i <= kAbiLastPreservedFpuReg)) {
+ // TODO(zra): When SIMD is added, we must also preserve the top
+ // 64-bits of the callee-saved registers.
+ continue;
+ }
+ // TODO(zra): Save the whole V register.
+ VRegister reg = static_cast<VRegister>(i);
+ PushDouble(reg);
+ }
for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) {
const Register reg = static_cast<Register>(i);
- if ((reg != R16) && (reg != R17)) {
+ if ((reg != TMP) && (reg != TMP2)) {
Push(reg);
}
}
@@ -883,15 +978,27 @@
// We need to restore it before restoring registers.
// TODO(zra): Also include FPU regs in this count once they are added.
const intptr_t kPushedRegistersSize =
- kDartVolatileCpuRegCount * kWordSize;
+ kDartVolatileCpuRegCount * kWordSize +
+ kDartVolatileFpuRegCount * kWordSize;
AddImmediate(SP, FP, -kPushedRegistersSize, PP);
for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
const Register reg = static_cast<Register>(i);
- if ((reg != R16) && (reg != R17)) {
+ if ((reg != TMP) && (reg != TMP2)) {
Pop(reg);
}
}
+ for (int i = 0; i < kNumberOfVRegisters; i++) {
+ if ((i >= kAbiFirstPreservedFpuReg) && (i <= kAbiLastPreservedFpuReg)) {
+ // TODO(zra): When SIMD is added, we must also restore the top
+ // 64-bits of the callee-saved registers.
+ continue;
+ }
+ // TODO(zra): Restore the whole V register.
+ VRegister reg = static_cast<VRegister>(i);
+ PopDouble(reg);
+ }
+
Pop(FP);
Pop(LR);
}
@@ -1008,6 +1115,48 @@
}
}
+
+void Assembler::TryAllocate(const Class& cls,
+ Label* failure,
+ Register instance_reg,
+ Register temp_reg,
+ Register pp) {
+ ASSERT(failure != NULL);
+ if (FLAG_inline_alloc) {
+ Heap* heap = Isolate::Current()->heap();
+ const intptr_t instance_size = cls.instance_size();
+ LoadImmediate(instance_reg, heap->TopAddress(), pp);
+ ldr(instance_reg, Address(instance_reg));
+ AddImmediate(instance_reg, instance_reg, instance_size, pp);
+
+ // instance_reg: potential next object start.
+ LoadImmediate(TMP, heap->EndAddress(), pp);
+ ldr(TMP, Address(TMP));
+ CompareRegisters(TMP, instance_reg);
+ // fail if heap end unsigned less than or equal to instance_reg.
+ b(failure, LS);
+
+ // Successfully allocated the object, now update top to point to
+ // next object start and store the class in the class field of object.
+ LoadImmediate(TMP, heap->TopAddress(), pp);
+ str(instance_reg, Address(TMP));
+
+ ASSERT(instance_size >= kHeapObjectTag);
+ AddImmediate(
+ instance_reg, instance_reg, -instance_size + kHeapObjectTag, pp);
+ UpdateAllocationStats(cls.id(), temp_reg, pp);
+
+ uword tags = 0;
+ tags = RawObject::SizeTag::update(instance_size, tags);
+ ASSERT(cls.id() != kIllegalCid);
+ tags = RawObject::ClassIdTag::update(cls.id(), tags);
+ LoadImmediate(TMP, tags, pp);
+ StoreFieldToOffset(TMP, instance_reg, Object::tags_offset());
+ } else {
+ b(failure);
+ }
+}
+
} // namespace dart
#endif // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index de40152..17b317e 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -513,6 +513,12 @@
void madd(Register rd, Register rn, Register rm, Register ra) {
EmitMiscDP3Source(MADD, rd, rn, rm, ra, kDoubleWord);
}
+ void msub(Register rd, Register rn, Register rm, Register ra) {
+ EmitMiscDP3Source(MSUB, rd, rn, rm, ra, kDoubleWord);
+ }
+ void smulh(Register rd, Register rn, Register rm) {
+ EmitMiscDP3Source(SMULH, rd, rn, rm, R0, kDoubleWord);
+ }
// Move wide immediate.
void movk(Register rd, uint16_t imm, int hw_idx) {
@@ -554,6 +560,15 @@
void csel(Register rd, Register rn, Register rm, Condition cond) {
EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
}
+ void csinc(Register rd, Register rn, Register rm, Condition cond) {
+ EmitCoditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord);
+ }
+ void cinc(Register rd, Register rn, Condition cond) {
+ csinc(rd, rn, rn, InvertCondition(cond));
+ }
+ void cset(Register rd, Condition cond) {
+ csinc(rd, ZR, ZR, InvertCondition(cond));
+ }
// Comparison.
// rn cmp o.
@@ -601,6 +616,75 @@
EmitExceptionGenOp(HLT, imm);
}
+ // Double floating point.
+ bool fmovdi(VRegister vd, double immd) {
+ int64_t imm64 = bit_cast<int64_t, double>(immd);
+ const uint8_t bit7 = imm64 >> 63;
+ const uint8_t bit6 = (~(imm64 >> 62)) & 0x1;
+ const uint8_t bit54 = (imm64 >> 52) & 0x3;
+ const uint8_t bit30 = (imm64 >> 48) & 0xf;
+ const uint8_t imm8 = (bit7 << 7) | (bit6 << 6) | (bit54 << 4) | bit30;
+ const int64_t expimm8 = Instr::VFPExpandImm(imm8);
+ if (imm64 != expimm8) {
+ return false;
+ }
+ EmitFPImm(FMOVDI, vd, imm8);
+ return true;
+ }
+ void fmovdr(VRegister vd, Register rn) {
+ ASSERT(rn != R31);
+ ASSERT(rn != SP);
+ const Register crn = ConcreteRegister(rn);
+ EmitFPIntCvtOp(FMOVDR, static_cast<Register>(vd), crn);
+ }
+ void fmovrd(Register rd, VRegister vn) {
+ ASSERT(rd != R31);
+ ASSERT(rd != SP);
+ const Register crd = ConcreteRegister(rd);
+ EmitFPIntCvtOp(FMOVRD, crd, static_cast<Register>(vn));
+ }
+ void scvtfd(VRegister vd, Register rn) {
+ ASSERT(rn != R31);
+ ASSERT(rn != SP);
+ const Register crn = ConcreteRegister(rn);
+ EmitFPIntCvtOp(SCVTFD, static_cast<Register>(vd), crn);
+ }
+ void fcvtzds(Register rd, VRegister vn) {
+ ASSERT(rd != R31);
+ ASSERT(rd != SP);
+ const Register crd = ConcreteRegister(rd);
+ EmitFPIntCvtOp(FCVTZDS, crd, static_cast<Register>(vn));
+ }
+ void fmovdd(VRegister vd, VRegister vn) {
+ EmitFPOneSourceOp(FMOVDD, vd, vn);
+ }
+ void fldrd(VRegister vt, Address a) {
+ ASSERT(a.type() != Address::PCOffset);
+ EmitLoadStoreReg(FLDR, static_cast<Register>(vt), a, kDoubleWord);
+ }
+ void fstrd(VRegister vt, Address a) {
+ ASSERT(a.type() != Address::PCOffset);
+ EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kDoubleWord);
+ }
+ void fcmpd(VRegister vn, VRegister vm) {
+ EmitFPCompareOp(FCMPD, vn, vm);
+ }
+ void fcmpzd(VRegister vn) {
+ EmitFPCompareOp(FCMPZD, vn, V0);
+ }
+ void fmuld(VRegister vd, VRegister vn, VRegister vm) {
+ EmitFPTwoSourceOp(FMULD, vd, vn, vm);
+ }
+ void fdivd(VRegister vd, VRegister vn, VRegister vm) {
+ EmitFPTwoSourceOp(FDIVD, vd, vn, vm);
+ }
+ void faddd(VRegister vd, VRegister vn, VRegister vm) {
+ EmitFPTwoSourceOp(FADDD, vd, vn, vm);
+ }
+ void fsubd(VRegister vd, VRegister vn, VRegister vm) {
+ EmitFPTwoSourceOp(FSUBD, vd, vn, vm);
+ }
+
// Aliases.
void mov(Register rd, Register rn) {
if ((rd == SP) || (rn == SP)) {
@@ -610,7 +694,7 @@
}
}
void mvn(Register rd, Register rm) {
- orr(rd, ZR, Operand(rm));
+ orn(rd, ZR, Operand(rm));
}
void neg(Register rd, Register rm) {
sub(rd, ZR, Operand(rm));
@@ -629,6 +713,12 @@
ASSERT(reg != PP); // Only pop PP with PopAndUntagPP().
ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
}
+ void PushDouble(VRegister reg) {
+ fstrd(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
+ }
+ void PopDouble(VRegister reg) {
+ fldrd(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
+ }
void TagAndPushPP() {
// Add the heap object tag back to PP before putting it on the stack.
add(TMP, PP, Operand(kHeapObjectTag));
@@ -699,6 +789,11 @@
// pool pointer is in another register, or that it is not available at all,
// PP should be passed for pp.
void AddImmediate(Register dest, Register rn, int64_t imm, Register pp);
+ void AddImmediateSetFlags(
+ Register dest, Register rn, int64_t imm, Register pp);
+ void AndImmediate(Register rd, Register rn, int64_t imm, Register pp);
+ void OrImmediate(Register rd, Register rn, int64_t imm, Register pp);
+ void XorImmediate(Register rd, Register rn, int64_t imm, Register pp);
void TestImmediate(Register rn, int64_t imm, Register pp);
void CompareImmediate(Register rn, int64_t imm, Register pp);
@@ -707,11 +802,19 @@
void LoadFieldFromOffset(Register dest, Register base, int32_t offset) {
LoadFromOffset(dest, base, offset - kHeapObjectTag);
}
+ void LoadDFromOffset(VRegister dest, Register base, int32_t offset);
+ void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) {
+ LoadDFromOffset(dest, base, offset - kHeapObjectTag);
+ }
- void StoreToOffset(Register dest, Register base, int32_t offset,
+ void StoreToOffset(Register src, Register base, int32_t offset,
OperandSize sz = kDoubleWord);
- void StoreFieldToOffset(Register dest, Register base, int32_t offset) {
- StoreToOffset(dest, base, offset - kHeapObjectTag);
+ void StoreFieldToOffset(Register src, Register base, int32_t offset) {
+ StoreToOffset(src, base, offset - kHeapObjectTag);
+ }
+ void StoreDToOffset(VRegister src, Register base, int32_t offset);
+ void StoreDFieldToOffset(VRegister src, Register base, int32_t offset) {
+ StoreDToOffset(src, base, offset - kHeapObjectTag);
}
// Storing into an object.
@@ -750,6 +853,7 @@
void LoadDecodableImmediate(Register reg, int64_t imm, Register pp);
void LoadImmediateFixed(Register reg, int64_t imm);
void LoadImmediate(Register reg, int64_t imm, Register pp);
+ void LoadDImmediate(VRegister reg, double immd, Register pp);
void PushObject(const Object& object, Register pp) {
LoadObject(TMP, object, pp);
@@ -790,6 +894,16 @@
Register pp,
Heap::Space space = Heap::kNew);
+ // Inlined allocation of an instance of class 'cls', code has no runtime
+ // calls. Jump to 'failure' if the instance cannot be allocated here.
+ // Allocated instance is returned in 'instance_reg'.
+ // Only the tags field of the object is initialized.
+ void TryAllocate(const Class& cls,
+ Label* failure,
+ Register instance_reg,
+ Register temp_reg,
+ Register pp);
+
private:
AssemblerBuffer buffer_; // Contains position independent code.
@@ -1114,6 +1228,48 @@
Emit(encoding);
}
+ void EmitFPImm(FPImmOp op, VRegister vd, uint8_t imm8) {
+ const int32_t encoding =
+ op |
+ (static_cast<int32_t>(vd) << kVdShift) |
+ (imm8 << kImm8Shift);
+ Emit(encoding);
+ }
+
+ void EmitFPIntCvtOp(FPIntCvtOp op, Register rd, Register rn) {
+ const int32_t encoding =
+ op |
+ (static_cast<int32_t>(rd) << kRdShift) |
+ (static_cast<int32_t>(rn) << kRnShift);
+ Emit(encoding);
+ }
+
+ void EmitFPOneSourceOp(FPOneSourceOp op, VRegister vd, VRegister vn) {
+ const int32_t encoding =
+ op |
+ (static_cast<int32_t>(vd) << kVdShift) |
+ (static_cast<int32_t>(vn) << kVnShift);
+ Emit(encoding);
+ }
+
+ void EmitFPTwoSourceOp(FPTwoSourceOp op,
+ VRegister vd, VRegister vn, VRegister vm) {
+ const int32_t encoding =
+ op |
+ (static_cast<int32_t>(vd) << kVdShift) |
+ (static_cast<int32_t>(vn) << kVnShift) |
+ (static_cast<int32_t>(vm) << kVmShift);
+ Emit(encoding);
+ }
+
+ void EmitFPCompareOp(FPCompareOp op, VRegister vn, VRegister vm) {
+ const int32_t encoding =
+ op |
+ (static_cast<int32_t>(vn) << kVnShift) |
+ (static_cast<int32_t>(vm) << kVmShift);
+ Emit(encoding);
+ }
+
void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
// Shorter filtering sequence that assumes that value is not a smi.
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 0f67e8c..9544852 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -716,6 +716,114 @@
}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) {
+ Label l;
+
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ LoadDImmediate(V1, 234.0, kNoPP);
+ __ LoadDImmediate(V2, 234.0, kNoPP);
+
+ __ fcmpd(V1, V2);
+ __ b(&l, EQ);
+ __ LoadDImmediate(V0, 0.0, kNoPP);
+ __ Bind(&l);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpEqBranch, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) {
+ Label l;
+
+ __ LoadDImmediate(V0, 0.0, kNoPP);
+ __ LoadDImmediate(V1, 233.0, kNoPP);
+ __ LoadDImmediate(V2, 234.0, kNoPP);
+
+ __ fcmpd(V1, V2);
+ __ b(&l, EQ);
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ Bind(&l);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) {
+ Label l;
+
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ LoadDImmediate(V1, 233.0, kNoPP);
+ __ LoadDImmediate(V2, 234.0, kNoPP);
+
+ __ fcmpd(V1, V2);
+ __ b(&l, LT);
+ __ LoadDImmediate(V0, 0.0, kNoPP);
+ __ Bind(&l);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpLtBranch, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) {
+ Label l;
+
+ __ LoadDImmediate(V0, 0.0, kNoPP);
+ __ LoadDImmediate(V1, 235.0, kNoPP);
+ __ LoadDImmediate(V2, 234.0, kNoPP);
+
+ __ fcmpd(V1, V2);
+ __ b(&l, LT);
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ Bind(&l);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) {
+ Label l;
+
+ __ LoadDImmediate(V0, 235.0, kNoPP);
+ __ LoadDImmediate(V1, 233.0, kNoPP);
+
+ __ fcmpzd(V1);
+ __ b(&l, GT);
+ __ LoadDImmediate(V0, 0.0, kNoPP);
+ __ ret();
+ __ Bind(&l);
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) {
Label l;
@@ -1065,6 +1173,35 @@
}
+ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) {
+ __ movz(R1, 6, 0);
+ __ movz(R2, 7, 0);
+ __ smulh(R0, R1, R2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Smulh_pos, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) {
+ __ movz(R1, 6, 0);
+ __ movz(R2, 7, 0);
+ __ neg(R2, R2);
+ __ smulh(R0, R1, R2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Smulh_neg, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
// Loading immediate values without the object pool.
ASSEMBLER_TEST_GENERATE(LoadImmediateSmall, assembler) {
__ LoadImmediate(R0, 42, kNoRegister);
@@ -1316,6 +1453,280 @@
}
+ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) {
+ __ LoadImmediate(R1, 42, kNoRegister);
+ __ LoadImmediate(R2, 1234, kNoRegister);
+ __ CompareRegisters(R1, R2);
+ __ csinc(R0, R2, R1, GE);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsincFalse, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) {
+ __ LoadImmediate(R1, 42, kNoRegister);
+ __ LoadImmediate(R2, 1234, kNoRegister);
+ __ CompareRegisters(R1, R2);
+ __ csinc(R0, R2, R1, LT);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsincTrue, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// Floating point move immediate, to/from integer register.
+ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) {
+ __ LoadDImmediate(V0, 1.0, kNoPP);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdi, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovdi2, assembler) {
+ __ LoadDImmediate(V0, 123412983.1324524315, kNoPP);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdi2, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_FLOAT_EQ(123412983.1324524315,
+ EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()), 0.0001f);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovrd, assembler) {
+ __ LoadDImmediate(V1, 1.0, kNoPP);
+ __ fmovrd(R0, V1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovrd, test) {
+ typedef int (*SimpleCode)();
+ const int64_t one = bit_cast<int64_t, double>(1.0);
+ EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmovdr, assembler) {
+ __ LoadDImmediate(V1, 1.0, kNoPP);
+ __ fmovrd(R1, V1);
+ __ fmovdr(V0, R1);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmovdr, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex));
+ __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex));
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) {
+ __ LoadDImmediate(V0, 42.0, kNoPP);
+ __ fcvtzds(R0, V0);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fcvtzds, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Scvtfd, assembler) {
+ __ LoadImmediate(R0, 42, kNoPP);
+ __ scvtfd(V0, R0);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Scvtfd, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fmuld, assembler) {
+ __ LoadDImmediate(V1, 84.0, kNoPP);
+ __ LoadDImmediate(V2, 0.5, kNoPP);
+ __ fmuld(V0, V1, V2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fmuld, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fdivd, assembler) {
+ __ LoadDImmediate(V1, 84.0, kNoPP);
+ __ LoadDImmediate(V2, 2.0, kNoPP);
+ __ fdivd(V0, V1, V2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fdivd, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Faddd, assembler) {
+ __ LoadDImmediate(V1, 41.5, kNoPP);
+ __ LoadDImmediate(V2, 0.5, kNoPP);
+ __ faddd(V0, V1, V2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Faddd, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fsubd, assembler) {
+ __ LoadDImmediate(V1, 42.5, kNoPP);
+ __ LoadDImmediate(V2, 0.5, kNoPP);
+ __ fsubd(V0, V1, V2);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fsubd, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
+ __ LoadDImmediate(V0, 43.0, kNoPP);
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP);
+ __ add(R2, SP, Operand(1));
+ __ fstrd(V1, Address(R2, -1));
+ __ fldrd(V0, Address(R2, -1));
+ __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP);
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) {
+ __ LoadDImmediate(V0, 43.0, kNoPP);
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ // Largest negative offset that can fit in the signed 9-bit immediate field.
+ __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex));
+ // Largest positive kWordSize aligned offset that we can fit.
+ __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex));
+ // Correction.
+ __ add(SP, SP, Operand(kWordSize)); // Restore SP.
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) {
+ __ LoadDImmediate(V0, 43.0, kNoPP);
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ __ sub(SP, SP, Operand(512*kWordSize));
+ __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset));
+ __ add(SP, SP, Operand(512*kWordSize));
+ __ fldrd(V0, Address(SP));
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
+ __ LoadDImmediate(V0, 43.0, kNoPP);
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ __ movz(R2, 0xfff8, 0);
+ __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t).
+ // This should sign extend R2, and add to SP to get address,
+ // i.e. SP - kWordSize.
+ __ fstrd(V1, Address(SP, R2, SXTW));
+ __ sub(SP, SP, Operand(kWordSize));
+ __ fldrd(V0, Address(SP));
+ __ add(SP, SP, Operand(kWordSize));
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
+ __ LoadDImmediate(V0, 43.0, kNoPP);
+ __ LoadDImmediate(V1, 42.0, kNoPP);
+ __ movz(R2, 10, 0);
+ __ sub(SP, SP, Operand(10*kWordSize));
+ // Store V1 into SP + R2 * kWordSize.
+ __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
+ __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
+ __ add(SP, SP, Operand(10*kWordSize));
+ __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) {
+ typedef int (*SimpleCode)();
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
// Called from assembler_test.cc.
// LR: return address.
// R0: context.
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index e17dd70..734f59d 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -691,7 +691,6 @@
void StoreObject(const Address& dst, const Object& obj, Register pp);
void PushObject(const Object& object, Register pp);
void CompareObject(Register reg, const Object& object, Register pp);
- void LoadDoubleConstant(XmmRegister dst, double value);
// Destroys value.
void StoreIntoObject(Register object, // Object we are storing into.
@@ -723,7 +722,6 @@
void EnterCallRuntimeFrame(intptr_t frame_space);
void LeaveCallRuntimeFrame();
-
void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
/*
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index b663650..569d531 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -355,9 +355,9 @@
V(LibraryPrefix_load, 1) \
V(UserTag_new, 2) \
V(UserTag_label, 1) \
+ V(UserTag_defaultTag, 0) \
V(UserTag_makeCurrent, 1) \
V(Profiler_getCurrentTag, 0) \
- V(Profiler_clearCurrentTag, 0) \
class BootstrapNatives : public AllStatic {
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index 1e03d79..6b76496 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -98,9 +98,44 @@
}
+// This class pattern matches on a load from the object pool. Loading on
+// ARM64 is complicated because it can take more than one form. We
+// match backwards from the end of the sequence so we can reuse the code for
+// matching object pool loads at calls.
+class EdgeCounter : public ValueObject {
+ public:
+ EdgeCounter(uword pc, const Code& code)
+ : end_(pc - kAdjust), object_pool_(Array::Handle(code.ObjectPool())) {
+ // An IsValid predicate is complicated and duplicates the code in the
+ // decoding function. Instead we rely on decoding the pattern which
+ // will assert partial validity.
+ }
+
+ RawObject* edge_counter() const {
+ Register ignored;
+ intptr_t index;
+ InstructionPattern::DecodeLoadWordFromPool(end_, &ignored, &index);
+ ASSERT(ignored == R0);
+ return object_pool_.At(index);
+ }
+
+ private:
+ // The object pool load is followed by the fixed-size edge counter
+ // incrementing code:
+ // ldr ip, [r0, #+11]
+ // adds ip, ip, #2
+ // str ip, [r0, #+11]
+ static const intptr_t kAdjust = 3 * Instr::kInstrSize;
+
+ uword end_;
+ const Array& object_pool_;
+};
+
+
RawObject* CodePatcher::GetEdgeCounterAt(uword pc, const Code& code) {
- UNIMPLEMENTED();
- return NULL;
+ ASSERT(code.ContainsInstructionAt(pc));
+ EdgeCounter counter(pc, code);
+ return counter.edge_counter();
}
} // namespace dart
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index a986f03..ef002bb 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -466,7 +466,8 @@
if (FLAG_constant_propagation) {
// Constant propagation can use information from range analysis to
- // find unreachable branch targets.
+ // find unreachable branch targets and eliminate branches that have
+ // the same true- and false-target.
ConstantPropagator::OptimizeBranches(flow_graph);
DEBUG_ASSERT(flow_graph->VerifyUseLists());
}
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index aa02afe..ae55829 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -97,12 +97,11 @@
};
// Register alias for floating point scratch register.
-const VRegister VTMP0 = V30;
-const VRegister VTMP1 = V31;
+const VRegister VTMP = V31;
// Architecture independent aliases.
typedef VRegister FpuRegister;
-const FpuRegister FpuTMP = VTMP0;
+const FpuRegister FpuTMP = VTMP;
const int kNumberOfFpuRegisters = kNumberOfVRegisters;
const FpuRegister kNoFpuRegister = kNoVRegister;
@@ -143,6 +142,8 @@
(1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) |
(1 << R23) | (1 << R24) | (1 << R25) | (1 << R26) |
(1 << R27) | (1 << R28);
+const Register kAbiFirstPreservedCpuReg = R19;
+const Register kAbiLastPreservedCpuReg = R28;
const int kAbiPreservedCpuRegCount = 10;
const VRegister kAbiFirstPreservedFpuReg = V8;
const VRegister kAbiLastPreservedFpuReg = V15;
@@ -164,9 +165,7 @@
const Register kDartFirstVolatileCpuReg = R0;
const Register kDartLastVolatileCpuReg = R18;
const int kDartVolatileCpuRegCount = 17; // Excluding R16 and R17.
-const VRegister kDartFirstVolatileFpuReg = V0;
-const VRegister kDartLastVolatileFpuReg = V7;
-const int kDartVolatileFpuRegCount = 8;
+const int kDartVolatileFpuRegCount = 24;
static inline Register ConcreteRegister(Register r) {
return ((r == ZR) || (r == SP)) ? R31 : r;
@@ -194,6 +193,11 @@
kMaxCondition = 16,
};
+static inline Condition InvertCondition(Condition c) {
+ const int32_t i = static_cast<int32_t>(c) ^ 0x1;
+ return static_cast<Condition>(i);
+}
+
enum Bits {
B0 = (1 << 0), B1 = (1 << 1), B2 = (1 << 2), B3 = (1 << 3),
B4 = (1 << 4), B5 = (1 << 5), B6 = (1 << 6), B7 = (1 << 7),
@@ -259,6 +263,9 @@
DPSimd2Mask = 0x1e000000,
DPSimd2Fixed = B28 | DPSimd1Fixed,
+
+ FPMask = 0x5e000000,
+ FPFixed = B28 | B27 | B26 | B25,
};
// C3.2.1
@@ -317,13 +324,6 @@
RET = BR | B22,
};
-enum LoadStoreRegOp {
- LoadStoreRegMask = 0x3a000000,
- LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
- STR = LoadStoreRegFixed,
- LDR = LoadStoreRegFixed | B22,
-};
-
// C3.3.5
enum LoadRegLiteralOp {
LoadRegLiteralMask = 0x3b000000,
@@ -331,6 +331,16 @@
LDRpc = LoadRegLiteralFixed,
};
+// C3.3.7-10
+enum LoadStoreRegOp {
+ LoadStoreRegMask = 0x3a000000,
+ LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
+ STR = LoadStoreRegFixed,
+ LDR = LoadStoreRegFixed | B22,
+ FSTR = STR | B26,
+ FLDR = LDR | B26,
+};
+
// C3.4.1
enum AddSubImmOp {
AddSubImmMask = 0x1f000000,
@@ -379,6 +389,7 @@
ConditionalSelectMask = 0x1fe00000,
ConditionalSelectFixed = DPRegisterFixed | B28 | B23,
CSEL = ConditionalSelectFixed,
+ CSINC = ConditionalSelectFixed | B10,
};
// C3.5.8
@@ -397,6 +408,8 @@
MiscDP3SourceMask = 0x1f000000,
MiscDP3SourceFixed = DPRegisterFixed | B28 | B24,
MADD = MiscDP3SourceFixed,
+ MSUB = MiscDP3SourceFixed | B15,
+ SMULH = MiscDP3SourceFixed | B31 | B22,
};
// C3.5.10
@@ -413,6 +426,50 @@
BICS = LogicalShiftFixed | B30 | B29 | B21,
};
+// C.3.6.22
+enum FPCompareOp {
+ FPCompareMask = 0xffa0fc07,
+ FPCompareFixed = FPFixed | B21 | B13,
+ FCMPD = FPCompareFixed | B22,
+ FCMPZD = FPCompareFixed | B22 | B3,
+};
+
+// C3.6.25
+enum FPOneSourceOp {
+ FPOneSourceMask = 0x5f207c00,
+ FPOneSourceFixed = FPFixed | B21 | B14,
+ FMOVDD = FPOneSourceFixed | B22,
+};
+
+// C3.6.26
+enum FPTwoSourceOp {
+ FPTwoSourceMask = 0xff200c00,
+ FPTwoSourceFixed = FPFixed | B21 | B11,
+ FMULD = FPTwoSourceFixed | B22,
+ FDIVD = FPTwoSourceFixed | B22 | B12,
+ FADDD = FPTwoSourceFixed | B22 | B13,
+ FSUBD = FPTwoSourceFixed | B22 | B13 | B12,
+};
+
+// C3.6.28
+enum FPImmOp {
+ FPImmMask = 0x5f201c00,
+ FPImmFixed = FPFixed | B21 | B12,
+ FMOVSI = FPImmFixed,
+ FMOVDI = FPImmFixed | B22,
+};
+
+// C3.6.30
+enum FPIntCvtOp {
+ FPIntCvtMask = 0x5f20fc00,
+ FPIntCvtFixed = FPFixed | B21,
+ FMOVRD = FPIntCvtFixed | B31 | B22 | B18 | B17,
+ FMOVDR = FPIntCvtFixed | B31 | B22 | B18 | B17 | B16,
+ FCVTZDS = FPIntCvtFixed | B31 | B22 | B20 | B19,
+ SCVTFD = FPIntCvtFixed | B31 | B22 | B17,
+};
+
+
#define APPLY_OP_LIST(_V) \
_V(DPImmediate) \
_V(CompareBranch) \
@@ -420,6 +477,7 @@
_V(DPRegister) \
_V(DPSimd1) \
_V(DPSimd2) \
+_V(FP) \
_V(CompareAndBranch) \
_V(ConditionalBranch) \
_V(ExceptionGen) \
@@ -438,6 +496,11 @@
_V(MiscDP2Source) \
_V(MiscDP3Source) \
_V(LogicalShift) \
+_V(FPOneSource) \
+_V(FPTwoSource) \
+_V(FPImm) \
+_V(FPIntCvt) \
+_V(FPCompare) \
enum Shift {
@@ -494,11 +557,23 @@
kRtShift = 0,
kRtBits = 5,
+ // V Registers.
+ kVdShift = 0,
+ kVdBits = 5,
+ kVnShift = 5,
+ kVnBits = 5,
+ kVmShift = 16,
+ kVmBits = 5,
+ kVtShift = 0,
+ kVtBits = 5,
+
// Immediates.
kImm3Shift = 10,
kImm3Bits = 3,
kImm6Shift = 10,
kImm6Bits = 6,
+ kImm8Shift = 13,
+ kImm8Bits = 8,
kImm9Shift = 12,
kImm9Bits = 9,
kImm12Shift = 10,
@@ -655,10 +730,19 @@
inline Register RtField() const { return static_cast<Register>(
Bits(kRtShift, kRtBits)); }
+ inline VRegister VdField() const { return static_cast<VRegister>(
+ Bits(kVdShift, kVdBits)); }
+ inline VRegister VnField() const { return static_cast<VRegister>(
+ Bits(kVnShift, kVnBits)); }
+ inline VRegister VmField() const { return static_cast<VRegister>(
+ Bits(kVmShift, kVmBits)); }
+ inline VRegister VtField() const { return static_cast<VRegister>(
+ Bits(kVtShift, kVtBits)); }
+
// Immediates
inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
inline int Imm6Field() const { return Bits(kImm6Shift, kImm6Bits); }
-
+ inline int Imm8Field() const { return Bits(kImm8Shift, kImm8Bits); }
inline int Imm9Field() const { return Bits(kImm9Shift, kImm9Bits); }
// Sign-extended Imm9Field()
inline int64_t SImm9Field() const {
@@ -802,6 +886,20 @@
return 0;
}
+ static int64_t VFPExpandImm(uint8_t imm8) {
+ const int64_t sign =
+ static_cast<int64_t>((imm8 & 0x80) >> 7) << 63;
+ const int64_t hi_exp =
+ static_cast<int64_t>(!((imm8 & 0x40) >> 6)) << 62;
+ const int64_t mid_exp =
+ (((imm8 & 0x40) >> 6) == 0) ? 0 : (0xffLL << 54);
+ const int64_t low_exp =
+ static_cast<int64_t>((imm8 & 0x30) >> 4) << 52;
+ const int64_t frac =
+ static_cast<int64_t>(imm8 & 0x0f) << 48;
+ return sign | hi_exp | mid_exp | low_exp | frac;
+ }
+
// Instructions are read out of a code stream. The only way to get a
// reference to an instruction is to convert a pointer. There is no way
// to allocate or create instances of class Instr.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 5f88fbc..66e9601 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -267,6 +267,10 @@
// Create tag table.
isolate->set_tag_table(
GrowableObjectArray::Handle(GrowableObjectArray::New()));
+ // Set up default UserTag.
+ const UserTag& default_tag = UserTag::Handle(UserTag::DefaultTag());
+ isolate->set_current_tag(default_tag);
+
return Error::null();
}
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 070d646..3fd21df 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -599,6 +599,50 @@
}
+DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj) {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+
+ const Object& object = Object::Handle(isolate, Api::UnwrapHandle(obj));
+ if (!object.IsInstance() && !object.IsNull()) {
+ return 0;
+ }
+
+ const Library& libcore = Library::Handle(isolate, Library::CoreLibrary());
+ const String& function_name = String::Handle(isolate,
+ String::New("identityHashCode"));
+ const Function& function =
+ Function::Handle(isolate,
+ libcore.LookupFunctionAllowPrivate(function_name));
+ if (function.IsNull()) {
+ UNREACHABLE();
+ return 0;
+ }
+
+ const Array& arguments = Array::Handle(isolate, Array::New(1));
+ arguments.SetAt(0, object);
+ const Object& result =
+ Object::Handle(isolate, DartEntry::InvokeFunction(function, arguments));
+
+ if (result.IsSmi()) {
+ return Smi::Cast(result).Value();
+ }
+ if (result.IsMint()) {
+ const Mint& mint = Mint::Cast(result);
+ if (!mint.IsNegative()) {
+ return mint.AsInt64Value();
+ }
+ }
+ if (result.IsBigint()) {
+ const Bigint& bigint = Bigint::Cast(result);
+ if (BigintOperations::FitsIntoUint64(bigint)) {
+ return BigintOperations::ToUint64(bigint);
+ }
+ }
+ return 0;
+}
+
+
DART_EXPORT Dart_Handle Dart_HandleFromPersistent(
Dart_PersistentHandle object) {
Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 1ba3b9c..41f893b 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -521,20 +521,32 @@
TEST_CASE(IdentityEquals) {
- Dart_Handle five = NewString("5");
- Dart_Handle five_again = NewString("5");
- Dart_Handle seven = NewString("7");
+ Dart_Handle five = Dart_NewInteger(5);
+ Dart_Handle five_again = Dart_NewInteger(5);
+ Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
+ Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
+ Dart_Handle abc = NewString("abc");
+ Dart_Handle abc_again = NewString("abc");
+ Dart_Handle xyz = NewString("abc");
Dart_Handle dart_core = NewString("dart:core");
Dart_Handle dart_mirrors = NewString("dart:mirrors");
// Same objects.
EXPECT(Dart_IdentityEquals(five, five));
+ EXPECT(Dart_IdentityEquals(mint, mint));
+ EXPECT(Dart_IdentityEquals(abc, abc));
+ EXPECT(Dart_IdentityEquals(xyz, xyz));
- // Equal objects.
- EXPECT(!Dart_IdentityEquals(five, five_again));
+ // Equal objects with special spec rules.
+ EXPECT(Dart_IdentityEquals(five, five_again));
+ EXPECT(Dart_IdentityEquals(mint, mint_again));
+
+ // Equal objects without special spec rules.
+ EXPECT(!Dart_IdentityEquals(abc, abc_again));
// Different objects.
- EXPECT(!Dart_IdentityEquals(five, seven));
+ EXPECT(!Dart_IdentityEquals(five, mint));
+ EXPECT(!Dart_IdentityEquals(abc, xyz));
// Case where identical() is not the same as pointer equality.
Dart_Handle nan1 = Dart_NewDouble(NAN);
@@ -559,6 +571,47 @@
}
+TEST_CASE(IdentityHash) {
+ Dart_Handle five = Dart_NewInteger(5);
+ Dart_Handle five_again = Dart_NewInteger(5);
+ Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
+ Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
+ Dart_Handle abc = NewString("abc");
+ // Dart_Handle abc_again = NewString("abc");
+ Dart_Handle xyz = NewString("abc");
+ Dart_Handle dart_core = NewString("dart:core");
+ Dart_Handle dart_mirrors = NewString("dart:mirrors");
+
+ // Same objects.
+ EXPECT_EQ(Dart_IdentityHash(five), Dart_IdentityHash(five));
+ EXPECT_EQ(Dart_IdentityHash(mint), Dart_IdentityHash(mint));
+ EXPECT_EQ(Dart_IdentityHash(abc), Dart_IdentityHash(abc));
+ EXPECT_EQ(Dart_IdentityHash(xyz), Dart_IdentityHash(xyz));
+
+ // Equal objects with special spec rules.
+ EXPECT_EQ(Dart_IdentityHash(five), Dart_IdentityHash(five_again));
+ EXPECT_EQ(Dart_IdentityHash(mint), Dart_IdentityHash(mint_again));
+
+ // Note abc and abc_again are not required to have equal identity hashes.
+
+ // Case where identical() is not the same as pointer equality.
+ Dart_Handle nan1 = Dart_NewDouble(NAN);
+ Dart_Handle nan2 = Dart_NewDouble(NAN);
+ EXPECT_EQ(Dart_IdentityHash(nan1), Dart_IdentityHash(nan2));
+
+ // Non-instance objects.
+ {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+ Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
+ Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
+
+ EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1));
+ EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2));
+ }
+}
+
+
TEST_CASE(ObjectEquals) {
bool equal = false;
Dart_Handle five = NewString("5");
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c3ffeb8..e66f964 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -30,6 +30,8 @@
DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
"Trace debugger stacktrace collection");
+DEFINE_FLAG(bool, show_invisible_frames, false,
+ "Show invisible frames in debugger stack traces");
Debugger::EventHandler* Debugger::event_handler_ = NULL;
@@ -864,7 +866,7 @@
void DebuggerStackTrace::AddActivation(ActivationFrame* frame) {
- if (frame->function().is_visible()) {
+ if (FLAG_show_invisible_frames || frame->function().is_visible()) {
trace_.Add(frame);
}
}
@@ -1543,6 +1545,11 @@
if (best_fit_index >= 0) {
return desc.TokenPos(best_fit_index);
}
+ // We didn't find a safe point in the given token range. Try and find
+ // a safe point in the remaining source code of the function.
+ if (last_token_pos < func.end_token_pos()) {
+ return ResolveBreakpointPos(func, last_token_pos, func.end_token_pos());
+ }
return -1;
}
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index b9e0490..55cc0fd 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -31,6 +31,7 @@
// Printing of common values.
void PrintRegister(int reg, R31Type r31t);
+ void PrintVRegister(int reg);
void PrintShiftExtendRm(Instr* instr);
void PrintMemOperand(Instr* instr);
void PrintS(Instr* instr);
@@ -38,6 +39,7 @@
// Handle formatting of instructions and their options.
int FormatRegister(Instr* instr, const char* option);
+ int FormatVRegister(Instr*instr, const char* option);
int FormatOption(Instr* instr, const char* format);
void Format(Instr* instr, const char* format);
void Unknown(Instr* instr);
@@ -103,6 +105,15 @@
}
+void ARM64Decoder::PrintVRegister(int reg) {
+ ASSERT(0 <= reg);
+ ASSERT(reg < kNumberOfVRegisters);
+ buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+ remaining_size_in_buffer(),
+ "v%d", reg);
+}
+
+
// These shift names are defined in a way to match the native disassembler
// formatting. See for example the command "objdump -d <binary file>".
static const char* shift_names[kMaxShift] = {
@@ -291,6 +302,30 @@
}
+int ARM64Decoder::FormatVRegister(Instr* instr, const char* format) {
+ ASSERT(format[0] == 'v');
+ if (format[1] == 'd') {
+ int reg = instr->VdField();
+ PrintVRegister(reg);
+ return 2;
+ } else if (format[1] == 'n') {
+ int reg = instr->VnField();
+ PrintVRegister(reg);
+ return 2;
+ } else if (format[1] == 'm') {
+ int reg = instr->VmField();
+ PrintVRegister(reg);
+ return 2;
+ } else if (format[1] == 't') {
+ int reg = instr->VtField();
+ PrintVRegister(reg);
+ return 2;
+ }
+ UNREACHABLE();
+ return -1;
+}
+
+
// FormatOption takes a formatting string and interprets it based on
// the current instructions. The format string points to the first
// character of the option string (the option escape has already been
@@ -363,30 +398,41 @@
}
return 2;
}
- case 'i': { // 'imm12, imm16
- uint64_t imm;
- int ret = 5;
- if (format[4] == '2') {
- ASSERT(STRING_STARTS_WITH(format, "imm12"));
- imm = instr->Imm12Field();
- if (format[5] == 's') {
- // shifted immediate.
- if (instr->Imm12ShiftField() == 1) {
- imm = imm << 12;
- } else if ((instr->Imm12ShiftField() & 0x2) != 0) {
- Print("Unknown Shift");
+ case 'i': { // 'imm12, 'imm16, 'immd
+ if (format[3] == '1') {
+ uint64_t imm;
+ int ret = 5;
+ if (format[4] == '2') {
+ ASSERT(STRING_STARTS_WITH(format, "imm12"));
+ imm = instr->Imm12Field();
+ if (format[5] == 's') {
+ // shifted immediate.
+ if (instr->Imm12ShiftField() == 1) {
+ imm = imm << 12;
+ } else if ((instr->Imm12ShiftField() & 0x2) != 0) {
+ Print("Unknown Shift");
+ }
+ ret = 6;
}
- ret = 6;
+ } else {
+ ASSERT(STRING_STARTS_WITH(format, "imm16"));
+ imm = instr->Imm16Field();
}
+ buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+ remaining_size_in_buffer(),
+ "0x%"Px64,
+ imm);
+ return ret;
} else {
- ASSERT(STRING_STARTS_WITH(format, "imm16"));
- imm = instr->Imm16Field();
+ ASSERT(STRING_STARTS_WITH(format, "immd"));
+ double dimm = bit_cast<double, int64_t>(
+ Instr::VFPExpandImm(instr->Imm8Field()));
+ buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+ remaining_size_in_buffer(),
+ "%f",
+ dimm);
+ return 4;
}
- buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
- remaining_size_in_buffer(),
- "0x%"Px64,
- imm);
- return ret;
}
case 'm': {
ASSERT(STRING_STARTS_WITH(format, "memop"));
@@ -420,6 +466,9 @@
case 'r': {
return FormatRegister(instr, format);
}
+ case 'v': {
+ return FormatVRegister(instr, format);
+ }
case 's': { // 's: S flag.
if (format[1] == 'h') {
ASSERT(STRING_STARTS_WITH(format, "shift_op"));
@@ -513,14 +562,28 @@
void ARM64Decoder::DecodeLoadStoreReg(Instr* instr) {
- if (instr->Bits(25, 2) != 0) {
+ if (instr->Bit(23) != 0) {
+ // 128-bit ldr/str.
Unknown(instr);
- return;
}
- if (instr->Bit(22) == 1) {
- Format(instr, "ldr'sz 'rt, 'memop");
+ if (instr->Bit(26) == 1) {
+ if (instr->Bits(30, 2) != 3) {
+ // Only 64-bit double variant supported.
+ Unknown(instr);
+ }
+ // SIMD or FP src/dst.
+ if (instr->Bit(22) == 1) {
+ Format(instr, "fldrd 'vt, 'memop");
+ } else {
+ Format(instr, "fstrd 'vt, 'memop");
+ }
} else {
- Format(instr, "str'sz 'rt, 'memop");
+ // Integer src/dst.
+ if (instr->Bit(22) == 1) {
+ Format(instr, "ldr'sz 'rt, 'memop");
+ } else {
+ Format(instr, "str'sz 'rt, 'memop");
+ }
}
}
@@ -554,7 +617,7 @@
break;
}
case 1: {
- if ((instr->RdField() == R31) && (instr->SFField())) {
+ if ((instr->RdField() == R31) && (instr->SField() == 1)) {
Format(instr, "cmpi'sf 'rn, 'imm12s");
} else {
Format(instr, "subi'sf's 'rd, 'rn, 'imm12s");
@@ -842,6 +905,12 @@
} else {
Format(instr, "madd'sf 'rd, 'rn, 'rm, 'ra");
}
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
+ (instr->Bit(15) == 1)) {
+ Format(instr, "msub'sf 'rd, 'rn, 'rm, 'ra");
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 2) &&
+ (instr->Bit(15) == 0)) {
+ Format(instr, "smulh 'rd, 'rn, 'rm");
} else {
Unknown(instr);
}
@@ -851,6 +920,8 @@
void ARM64Decoder::DecodeConditionalSelect(Instr* instr) {
if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
+ Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
} else {
Unknown(instr);
}
@@ -879,8 +950,121 @@
}
+void ARM64Decoder::DecodeFPImm(Instr* instr) {
+ if ((instr->Bit(31) != 0) || (instr->Bit(29) != 0) || (instr->Bit(23) != 0) ||
+ (instr->Bits(5, 5) != 0)) {
+ Unknown(instr);
+ return;
+ }
+ if (instr->Bit(22) == 1) {
+ // Double.
+ Format(instr, "fmovd 'vd, 'immd");
+ } else {
+ // Single.
+ Unknown(instr);
+ }
+}
+
+
+void ARM64Decoder::DecodeFPIntCvt(Instr* instr) {
+ if ((instr->SFField() != 1) || (instr->Bit(29) != 0) ||
+ (instr->Bits(22, 2) != 1)) {
+ Unknown(instr);
+ return;
+ }
+ if (instr->Bits(16, 5) == 2) {
+ Format(instr, "scvtfd 'vd, 'vn");
+ } else if (instr->Bits(16, 5) == 6) {
+ Format(instr, "fmovrd 'rd, 'vn");
+ } else if (instr->Bits(16, 5) == 7) {
+ Format(instr, "fmovdr 'vd, 'rn");
+ } else if (instr->Bits(16, 5) == 24) {
+ Format(instr, "fcvtzds 'rd, 'vn");
+ } else {
+ Unknown(instr);
+ }
+}
+
+
+void ARM64Decoder::DecodeFPOneSource(Instr* instr) {
+ const int opc = instr->Bits(15, 2);
+
+ switch (opc) {
+ case 0:
+ Format(instr, "fmovdd 'vd, 'vn");
+ break;
+ default:
+ Unknown(instr);
+ break;
+ }
+}
+
+
+void ARM64Decoder::DecodeFPTwoSource(Instr* instr) {
+ if (instr->Bits(22, 2) != 1) {
+ Unknown(instr);
+ return;
+ }
+ const int opc = instr->Bits(12, 4);
+
+ switch (opc) {
+ case 0:
+ Format(instr, "fmuld 'vd, 'vn, 'vm");
+ break;
+ case 1:
+ Format(instr, "fdivd 'vd, 'vn, 'vm");
+ break;
+ case 2:
+ Format(instr, "faddd 'vd, 'vn, 'vm");
+ break;
+ case 3:
+ Format(instr, "fsubd 'vd, 'vn, 'vm");
+ break;
+ default:
+ Unknown(instr);
+ break;
+ }
+}
+
+
+void ARM64Decoder::DecodeFPCompare(Instr* instr) {
+ if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 0)) {
+ Format(instr, "fcmpd 'vn, 'vm");
+ } else if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 1)) {
+ if (instr->VmField() == V0) {
+ Format(instr, "fcmpd 'vn, #0.0");
+ } else {
+ Unknown(instr);
+ }
+ } else {
+ Unknown(instr);
+ }
+}
+
+
+void ARM64Decoder::DecodeFP(Instr* instr) {
+ if (instr->IsFPImmOp()) {
+ DecodeFPImm(instr);
+ } else if (instr->IsFPIntCvtOp()) {
+ DecodeFPIntCvt(instr);
+ } else if (instr->IsFPOneSourceOp()) {
+ DecodeFPOneSource(instr);
+ } else if (instr->IsFPTwoSourceOp()) {
+ DecodeFPTwoSource(instr);
+ } else if (instr->IsFPCompareOp()) {
+ DecodeFPCompare(instr);
+ } else {
+ Unknown(instr);
+ }
+}
+
+
void ARM64Decoder::DecodeDPSimd2(Instr* instr) {
- Unknown(instr);
+ if (instr->IsFPOp()) {
+ DecodeFP(instr);
+ } else {
+ Unknown(instr);
+ }
}
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index 3651210..cb845d7 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -526,7 +526,7 @@
// Print only if jumping to entry point.
const Code& code = Code::Handle(Code::LookupCode(addr));
if (!code.IsNull() && (code.EntryPoint() == addr)) {
- const String& name = String::Handle(code.UserName());
+ const String& name = String::Handle(code.PrettyName());
const char* name_c = name.ToCString();
Print(" [");
Print(name_c);
@@ -1360,7 +1360,7 @@
Print(" ");
PrintXmmRegister(regop);
Print(",");
- data += PrintRightOperand(data);
+ data += PrintRightXmmOperand(data);
} else if (f0byte == 0xB1) {
data += 2;
data += PrintOperands(f0mnem, OPER_REG_OP_ORDER, data);
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index 3c751e5..f9cd609 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -838,7 +838,7 @@
// Print only if jumping to entry point.
const Code& code = Code::Handle(Code::LookupCode(addr));
if (!code.IsNull() && (code.EntryPoint() == addr)) {
- const String& name = String::Handle(code.UserName());
+ const String& name = String::Handle(code.PrettyName());
const char* name_c = name.ToCString();
AppendToBuffer(" [%s]", name_c);
}
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index db6d1e0..1359ea7 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -230,12 +230,6 @@
kill_[graph_entry_->postorder_number()]->Add(vreg);
live_in_[graph_entry_->postorder_number()]->Remove(vreg);
}
-
- // Update initial live_in sets to match live_out sets. Has to be
- // done in a separate path because of backwards branches.
- for (intptr_t i = 0; i < block_count; i++) {
- UpdateLiveIn(*postorder_[i]);
- }
}
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 9315c22..8d937f2 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -18,6 +18,7 @@
#include "vm/isolate.h"
#include "vm/longjump.h"
#include "vm/object.h"
+#include "vm/object_store.h"
#include "vm/os.h"
#include "vm/parser.h"
#include "vm/resolver.h"
@@ -39,6 +40,27 @@
DECLARE_FLAG(bool, enable_type_checks);
+// TODO(srdjan): Allow compiler to add constants as they are encountered in
+// the compilation.
+const double kCommonDoubleConstants[] =
+ {-1.0, -0.5, -0.1, 0.0, 0.1, 0.5, 1.0, 2.0, 4.0, 5.0,
+ 10.0, 20.0, 30.0, 64.0, 255.0, NAN,
+ // From dart:math
+ 2.718281828459045, 2.302585092994046, 0.6931471805599453,
+ 1.4426950408889634, 0.4342944819032518, 3.1415926535897932,
+ 0.7071067811865476, 1.4142135623730951};
+
+uword FlowGraphBuilder::FindDoubleConstant(double value) {
+ intptr_t len = sizeof(kCommonDoubleConstants) / sizeof(double); // NOLINT
+ for (intptr_t i = 0; i < len; i++) {
+ if (Utils::DoublesBitEqual(value, kCommonDoubleConstants[i])) {
+ return reinterpret_cast<uword>(&kCommonDoubleConstants[i]);
+ }
+ }
+ return 0;
+}
+
+
// Base class for a stack of enclosing statements of interest (e.g.,
// blocks (breakable) and loops (continuable)).
class NestedStatement : public ValueObject {
@@ -1296,7 +1318,7 @@
// Since called only when type tested against is not instantiated.
ASSERT(instantiator_class.NumTypeParameters() > 0);
Value* instantiator_type_arguments = NULL;
- Value* instantiator = BuildInstantiator();
+ Value* instantiator = BuildInstantiator(instantiator_class);
if (instantiator == NULL) {
// No instantiator when inside factory.
*push_instantiator_result = PushArgument(BuildNullValue());
@@ -1325,7 +1347,7 @@
owner()->parsed_function()->function().Owner());
// Since called only when type tested against is not instantiated.
ASSERT(instantiator_class.NumTypeParameters() > 0);
- instantiator = BuildInstantiator();
+ instantiator = BuildInstantiator(instantiator_class);
if (instantiator == NULL) {
// No instantiator when inside factory.
instantiator = BuildNullValue();
@@ -2561,12 +2583,8 @@
}
-Value* EffectGraphVisitor::BuildInstantiator() {
- const Class& instantiator_class = Class::Handle(
- owner()->parsed_function()->function().Owner());
- if (instantiator_class.NumTypeParameters() == 0) {
- return NULL;
- }
+Value* EffectGraphVisitor::BuildInstantiator(const Class& instantiator_class) {
+ ASSERT(instantiator_class.NumTypeParameters() > 0);
Function& outer_function =
Function::Handle(owner()->parsed_function()->function().raw());
while (outer_function.IsLocalFunction()) {
@@ -2576,11 +2594,10 @@
return NULL;
}
- ASSERT(owner()->parsed_function()->instantiator() != NULL);
- ValueGraphVisitor for_instantiator(owner());
- owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
- Append(for_instantiator);
- return for_instantiator.value();
+ LocalVariable* instantiator = owner()->parsed_function()->instantiator();
+ ASSERT(instantiator != NULL);
+ Value* result = Bind(BuildLoadLocal(*instantiator));
+ return result;
}
@@ -2611,14 +2628,13 @@
if (outer_function.IsFactory()) {
// No instantiator for factories.
ASSERT(instantiator == NULL);
- ASSERT(owner()->parsed_function()->instantiator() != NULL);
- ValueGraphVisitor for_instantiator(owner());
- owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
- Append(for_instantiator);
- return for_instantiator.value();
+ LocalVariable* instantiator_var =
+ owner()->parsed_function()->instantiator();
+ ASSERT(instantiator_var != NULL);
+ return Bind(BuildLoadLocal(*instantiator_var));
}
if (instantiator == NULL) {
- instantiator = BuildInstantiator();
+ instantiator = BuildInstantiator(instantiator_class);
}
// The instantiator is the receiver of the caller, which is not a factory.
// The receiver cannot be null; extract its TypeArguments object.
@@ -3464,6 +3480,16 @@
}
}
}
+ } else if (MustSaveRestoreContext(node)) {
+ // Even when the current scope has no context variables, we may
+ // still need to save the current context if, for example, there
+ // are loop scopes below this which will allocate a context
+ // object.
+ BuildSaveContext(
+ *owner()->parsed_function()->saved_entry_context_var());
+ AddInstruction(
+ new StoreContextInstr(Bind(new ConstantInstr(Object::ZoneHandle(
+ Isolate::Current()->object_store()->empty_context())))));
}
// This check may be deleted if the generated code is leaf.
@@ -3531,7 +3557,6 @@
if (is_open()) {
if (MustSaveRestoreContext(node)) {
- ASSERT(num_context_variables > 0);
BuildRestoreContext(
*owner()->parsed_function()->saved_entry_context_var());
} else if (num_context_variables > 0) {
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 81d2c77..3ec5db9 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -207,6 +207,9 @@
// OSR entry point.
void PruneUnreachable();
+ // Returns address where the constant 'value' is stored or 0 if not found.
+ static uword FindDoubleConstant(double value);
+
private:
friend class NestedStatement; // Explicit access to nesting_stack_.
@@ -346,7 +349,7 @@
void BuildTypecheckArguments(intptr_t token_pos,
Value** instantiator,
Value** instantiator_type_arguments);
- Value* BuildInstantiator();
+ Value* BuildInstantiator(const Class& instantiator_class);
Value* BuildInstantiatorTypeArguments(intptr_t token_pos,
const Class& instantiator_class,
Value* instantiator);
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 0893ee7..4b90de5 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -308,8 +308,9 @@
// Compile all successors until an exit, branch, or a block entry.
for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
Instruction* instr = it.Current();
- if (FLAG_code_comments &&
- (FLAG_disassemble || FLAG_disassemble_optimized)) {
+ if (FLAG_code_comments ||
+ FLAG_disassemble ||
+ FLAG_disassemble_optimized) {
if (FLAG_source_lines) {
EmitSourceLine(instr);
}
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 92fa0ef..699ef8b 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -58,7 +58,9 @@
RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
DeoptInfoBuilder* builder,
const Array& deopt_table) {
- if (deopt_env_ == NULL) return DeoptInfo::null();
+ if (deopt_env_ == NULL) {
+ return DeoptInfo::null();
+ }
intptr_t stack_height = compiler->StackSize();
AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -160,7 +162,9 @@
#define __ assem->
__ Comment("Deopt stub for id %" Pd "", deopt_id());
__ Bind(entry_label());
- if (FLAG_trap_on_deoptimization) __ bkpt(0);
+ if (FLAG_trap_on_deoptimization) {
+ __ bkpt(0);
+ }
ASSERT(deopt_env() != NULL);
@@ -1608,7 +1612,7 @@
} else if (source.IsDoubleStackSlot()) {
if (destination.IsFpuRegister()) {
const intptr_t dest_offset = source.ToStackSlotOffset();
- DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+ const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
__ LoadDFromOffset(dst, FP, dest_offset);
} else {
ASSERT(destination.IsDoubleStackSlot());
@@ -1632,13 +1636,24 @@
}
} else {
ASSERT(source.IsConstant());
+ const Object& constant = source.constant();
if (destination.IsRegister()) {
- const Object& constant = source.constant();
__ LoadObject(destination.reg(), constant);
+ } else if (destination.IsFpuRegister()) {
+ const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+ __ LoadObject(TMP, constant);
+ __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+ __ vldrd(dst, Address(TMP, 0));
+ } else if (destination.IsDoubleStackSlot()) {
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadObject(TMP, constant);
+ __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+ __ vldrd(DTMP, Address(TMP, 0));
+ __ StoreDToOffset(DTMP, FP, dest_offset);
} else {
ASSERT(destination.IsStackSlot());
const intptr_t dest_offset = destination.ToStackSlotOffset();
- __ LoadObject(TMP, source.constant());
+ __ LoadObject(TMP, constant);
__ StoreToOffset(kWord, TMP, FP, dest_offset);
}
}
@@ -1665,7 +1680,7 @@
} else if (source.IsStackSlot() && destination.IsStackSlot()) {
Exchange(source.ToStackSlotOffset(), destination.ToStackSlotOffset());
} else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
- DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+ const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
DRegister src = EvenDRegisterOf(source.fpu_reg());
__ vmovd(DTMP, src);
__ vmovd(src, dst);
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index aa0db93..b33b5fb 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -22,6 +22,7 @@
namespace dart {
+DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
DECLARE_FLAG(int, optimization_counter_threshold);
DECLARE_FLAG(int, reoptimization_counter_threshold);
DECLARE_FLAG(bool, eliminate_type_checks);
@@ -53,14 +54,114 @@
RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
DeoptInfoBuilder* builder,
const Array& deopt_table) {
- UNIMPLEMENTED();
- return NULL;
+ if (deopt_env_ == NULL) {
+ return DeoptInfo::null();
+ }
+
+ intptr_t stack_height = compiler->StackSize();
+ AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
+
+ intptr_t slot_ix = 0;
+ Environment* current = deopt_env_;
+
+ // Emit all kMaterializeObject instructions describing objects to be
+ // materialized on the deoptimization as a prefix to the deoptimization info.
+ EmitMaterializations(deopt_env_, builder);
+
+ // The real frame starts here.
+ builder->MarkFrameStart();
+
+ // Current PP, FP, and PC.
+ builder->AddPp(current->code(), slot_ix++);
+ builder->AddPcMarker(Code::Handle(), slot_ix++);
+ builder->AddCallerFp(slot_ix++);
+ builder->AddReturnAddress(current->code(), deopt_id(), slot_ix++);
+
+ // Emit all values that are needed for materialization as a part of the
+ // expression stack for the bottom-most frame. This guarantees that GC
+ // will be able to find them during materialization.
+ slot_ix = builder->EmitMaterializationArguments(slot_ix);
+
+ // For the innermost environment, set outgoing arguments and the locals.
+ for (intptr_t i = current->Length() - 1;
+ i >= current->fixed_parameter_count();
+ i--) {
+ builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
+ }
+
+ Environment* previous = current;
+ current = current->outer();
+ while (current != NULL) {
+ // PP, FP, and PC.
+ builder->AddPp(current->code(), slot_ix++);
+ builder->AddPcMarker(previous->code(), slot_ix++);
+ builder->AddCallerFp(slot_ix++);
+
+ // For any outer environment the deopt id is that of the call instruction
+ // which is recorded in the outer environment.
+ builder->AddReturnAddress(current->code(),
+ Isolate::ToDeoptAfter(current->deopt_id()),
+ slot_ix++);
+
+ // The values of outgoing arguments can be changed from the inlined call so
+ // we must read them from the previous environment.
+ for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+ builder->AddCopy(previous->ValueAt(i),
+ previous->LocationAt(i),
+ slot_ix++);
+ }
+
+ // Set the locals, note that outgoing arguments are not in the environment.
+ for (intptr_t i = current->Length() - 1;
+ i >= current->fixed_parameter_count();
+ i--) {
+ builder->AddCopy(current->ValueAt(i),
+ current->LocationAt(i),
+ slot_ix++);
+ }
+
+ // Iterate on the outer environment.
+ previous = current;
+ current = current->outer();
+ }
+ // The previous pointer is now the outermost environment.
+ ASSERT(previous != NULL);
+
+ // For the outermost environment, set caller PC, caller PP, and caller FP.
+ builder->AddCallerPp(slot_ix++);
+ // PC marker.
+ builder->AddPcMarker(previous->code(), slot_ix++);
+ builder->AddCallerFp(slot_ix++);
+ builder->AddCallerPc(slot_ix++);
+
+ // For the outermost environment, set the incoming arguments.
+ for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+ builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
+ }
+
+ const DeoptInfo& deopt_info =
+ DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
+ return deopt_info.raw();
}
void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
intptr_t stub_ix) {
- UNIMPLEMENTED();
+ // Calls do not need stubs, they share a deoptimization trampoline.
+ ASSERT(reason() != ICData::kDeoptAtCall);
+ Assembler* assem = compiler->assembler();
+#define __ assem->
+ __ Comment("Deopt stub for id %" Pd "", deopt_id());
+ __ Bind(entry_label());
+ if (FLAG_trap_on_deoptimization) {
+ __ hlt(0);
+ }
+
+ ASSERT(deopt_env() != NULL);
+
+ __ BranchLink(&StubCode::DeoptimizeLabel(), PP);
+ set_pc_offset(assem->CodeSize());
+#undef __
}
@@ -432,12 +533,87 @@
}
+// If instanceof type test cannot be performed successfully at compile time and
+// therefore eliminated, optimize it by adding inlined tests for:
+// - NULL -> return false.
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+// Inputs:
+// - R0: object.
+// - R1: instantiator type arguments or raw_null.
+// - R2: instantiator or raw_null.
+// Returns:
+// - true or false in R0.
void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
intptr_t deopt_id,
const AbstractType& type,
bool negate_result,
LocationSummary* locs) {
- UNIMPLEMENTED();
+ ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+
+ // Preserve instantiator (R2) and its type arguments (R1).
+ __ Push(R2);
+ __ Push(R1);
+
+ Label is_instance, is_not_instance;
+ // If type is instantiated and non-parameterized, we can inline code
+ // checking whether the tested instance is a Smi.
+ if (type.IsInstantiated()) {
+ // A null object is only an instance of Object and dynamic, which has
+ // already been checked above (if the type is instantiated). So we can
+ // return false here if the instance is null (and if the type is
+ // instantiated).
+ // We can only inline this null check if the type is instantiated at compile
+ // time, since an uninstantiated type at compile time could be Object or
+ // dynamic at run time.
+ __ CompareObject(R0, Object::null_object(), PP);
+ __ b(&is_not_instance, EQ);
+ }
+
+ // Generate inline instanceof test.
+ SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
+ test_cache = GenerateInlineInstanceof(token_pos, type,
+ &is_instance, &is_not_instance);
+
+ // test_cache is null if there is no fall-through.
+ Label done;
+ if (!test_cache.IsNull()) {
+ // Generate runtime call.
+ // Load instantiator (R2) and its type arguments (R1).
+ __ ldr(R1, Address(SP, 0 * kWordSize));
+ __ ldr(R2, Address(SP, 1 * kWordSize));
+ __ PushObject(Object::ZoneHandle(), PP); // Make room for the result.
+ __ Push(R0); // Push the instance.
+ __ PushObject(type, PP); // Push the type.
+ // Push instantiator (R2) and its type arguments (R1).
+ __ Push(R2);
+ __ Push(R1);
+ __ LoadObject(R0, test_cache, PP);
+ __ Push(R0);
+ GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 5, locs);
+ // Pop the parameters supplied to the runtime entry. The result of the
+ // instanceof runtime call will be left as the result of the operation.
+ __ Drop(5);
+ if (negate_result) {
+ __ Pop(R1);
+ __ LoadObject(R0, Bool::True(), PP);
+ __ CompareRegisters(R1, R0);
+ __ b(&done, NE);
+ __ LoadObject(R0, Bool::False(), PP);
+ } else {
+ __ Pop(R0);
+ }
+ __ b(&done);
+ }
+ __ Bind(&is_not_instance);
+ __ LoadObject(R0, Bool::Get(negate_result), PP);
+ __ b(&done);
+
+ __ Bind(&is_instance);
+ __ LoadObject(R0, Bool::Get(!negate_result), PP);
+ __ Bind(&done);
+ // Remove instantiator (R2) and its type arguments (R1).
+ __ Drop(2);
}
@@ -726,7 +902,7 @@
Isolate::kNoDeoptId, kNumArgsChecked));
__ LoadObject(R5, ic_data, PP);
__ LeaveDartFrame(); // The arguments are still on the stack.
- __ Branch(&StubCode::CallNoSuchMethodFunctionLabel(), PP);
+ __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
// The noSuchMethod call may return to the caller, but not here.
__ hlt(0);
} else if (check_correct_named_args) {
@@ -757,12 +933,27 @@
void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
- UNIMPLEMENTED();
+ // LR: return address.
+ // SP: receiver.
+ // Sequence node has one return node, its input is load field node.
+ __ Comment("Inlined Getter");
+ __ LoadFromOffset(R0, SP, 0 * kWordSize);
+ __ LoadFromOffset(R0, R0, offset - kHeapObjectTag);
+ __ ret();
}
void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
- UNIMPLEMENTED();
+ // LR: return address.
+ // SP+1: receiver.
+ // SP+0: value.
+ // Sequence node has one store node and one return NULL node.
+ __ Comment("Inlined Setter");
+ __ LoadFromOffset(R0, SP, 1 * kWordSize); // Receiver.
+ __ LoadFromOffset(R1, SP, 0 * kWordSize); // Value.
+ __ StoreIntoObject(R0, FieldAddress(R0, offset), R1);
+ __ LoadObject(R0, Object::null_object(), PP);
+ __ ret();
}
@@ -806,6 +997,7 @@
// may be patched at the AddCurrentDescriptor below.
new_pp = R13;
+ // Set up pool pointer in new_pp.
__ LoadPoolPointer(new_pp);
AddCurrentDescriptor(PcDescriptors::kEntryPatch,
@@ -883,7 +1075,7 @@
Isolate::kNoDeoptId, kNumArgsChecked));
__ LoadObject(R5, ic_data, PP);
__ LeaveDartFrame(); // The arguments are still on the stack.
- __ Branch(&StubCode::CallNoSuchMethodFunctionLabel(), PP);
+ __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
// The noSuchMethod call may return to the caller, but not here.
__ hlt(0);
} else {
@@ -916,9 +1108,7 @@
AddCurrentDescriptor(PcDescriptors::kPatchCode,
Isolate::kNoDeoptId,
0); // No token position.
- // This is patched up to a point in FrameEntry where the PP for the
- // current function is in R13 instead of PP.
- __ BranchPatchable(&StubCode::FixCallersTargetLabel(), R13);
+ __ BranchFixed(&StubCode::FixCallersTargetLabel());
AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
Isolate::kNoDeoptId,
@@ -1006,7 +1196,22 @@
intptr_t deopt_id,
intptr_t token_pos,
LocationSummary* locs) {
- UNIMPLEMENTED();
+ ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
+ // Each ICData propagated from unoptimized to optimized code contains the
+ // function that corresponds to the Dart function of that IC call. Due
+ // to inlining in optimized code, that function may not correspond to the
+ // top-level function (parsed_function().function()) which could be
+ // reoptimized and which counter needs to be incremented.
+ // Pass the function explicitly, it is used in IC stub.
+
+ __ LoadObject(R6, parsed_function().function(), PP);
+ __ LoadObject(R5, ic_data, PP);
+ GenerateDartCall(deopt_id,
+ token_pos,
+ target_label,
+ PcDescriptors::kIcCall,
+ locs);
+ __ Drop(argument_count);
}
@@ -1033,7 +1238,68 @@
intptr_t deopt_id,
intptr_t token_pos,
LocationSummary* locs) {
- UNIMPLEMENTED();
+ MegamorphicCacheTable* table = Isolate::Current()->megamorphic_cache_table();
+ const String& name = String::Handle(ic_data.target_name());
+ const Array& arguments_descriptor =
+ Array::ZoneHandle(ic_data.arguments_descriptor());
+ ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
+ const MegamorphicCache& cache =
+ MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
+ Label not_smi, load_cache;
+ __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize);
+ __ tsti(R0, kSmiTagMask);
+ __ b(¬_smi, NE);
+ __ LoadImmediate(R0, Smi::RawValue(kSmiCid), PP);
+ __ b(&load_cache);
+
+ __ Bind(¬_smi);
+ __ LoadClassId(R0, R0);
+ __ SmiTag(R0);
+
+ // R0: class ID of the receiver (smi).
+ __ Bind(&load_cache);
+ __ LoadObject(R1, cache, PP);
+ __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset());
+ __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset());
+ // R2: cache buckets array.
+ // R1: mask.
+ __ mov(R3, R0);
+
+ Label loop, update, call_target_function;
+ __ b(&loop);
+
+ __ Bind(&update);
+ __ add(R3, R3, Operand(Smi::RawValue(1)));
+ __ Bind(&loop);
+ __ and_(R3, R3, Operand(R1));
+ const intptr_t base = Array::data_offset();
+ // R3 is smi tagged, but table entries are 8 bytes, so LSL 2.
+ __ add(TMP, R2, Operand(R3, LSL, 2));
+ __ LoadFieldFromOffset(R4, TMP, base);
+
+ ASSERT(kIllegalCid == 0);
+ __ tst(R4, Operand(R4));
+ __ b(&call_target_function, EQ);
+ __ CompareRegisters(R4, R0);
+ __ b(&update, NE);
+
+ __ Bind(&call_target_function);
+ // Call the target found in the cache. For a class id match, this is a
+ // proper target for the given name and arguments descriptor. If the
+ // illegal class id was found, the target is a cache miss handler that can
+ // be invoked as a normal Dart function.
+ __ add(TMP, R2, Operand(R3, LSL, 2));
+ __ LoadFieldFromOffset(R0, TMP, base + kWordSize);
+ __ LoadFieldFromOffset(R1, R0, Function::code_offset());
+ __ LoadFieldFromOffset(R1, R1, Code::instructions_offset());
+ __ LoadObject(R5, ic_data, PP);
+ __ LoadObject(R4, arguments_descriptor, PP);
+ __ AddImmediate(R1, R1, Instructions::HeaderSize() - kHeapObjectTag, PP);
+ __ blr(R1);
+ AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+ RecordSafepoint(locs);
+ AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
+ __ Drop(argument_count);
}
@@ -1085,7 +1351,16 @@
intptr_t deopt_id,
intptr_t token_pos,
LocationSummary* locs) {
- UNIMPLEMENTED();
+ __ LoadObject(R4, arguments_descriptor, PP);
+ // Do not use the code from the function, but let the code be patched so that
+ // we can record the outgoing edges to other code.
+ GenerateDartCall(deopt_id,
+ token_pos,
+ &StubCode::CallStaticFunctionLabel(),
+ PcDescriptors::kOptStaticCall,
+ locs);
+ AddStaticCallTarget(function);
+ __ Drop(argument_count);
}
@@ -1093,7 +1368,28 @@
const Object& obj,
bool needs_number_check,
intptr_t token_pos) {
- UNIMPLEMENTED();
+ if (needs_number_check) {
+ ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
+ __ Push(reg);
+ __ PushObject(obj, PP);
+ if (is_optimizing()) {
+ __ BranchLinkPatchable(
+ &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+ } else {
+ __ BranchLinkPatchable(
+ &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+ }
+ if (token_pos != Scanner::kNoSourcePos) {
+ AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+ Isolate::kNoDeoptId,
+ token_pos);
+ }
+ __ Drop(1); // Discard constant.
+ __ Pop(reg); // Restore 'reg'.
+ return;
+ }
+
+ __ CompareObject(reg, obj, PP);
}
@@ -1128,7 +1424,20 @@
// This function must be in sync with FlowGraphCompiler::RecordSafepoint and
// FlowGraphCompiler::SlowPathEnvironmentFor.
void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
- // TODO(zra): Save live FPU Registers.
+ // TODO(vegorov): consider saving only caller save (volatile) registers.
+ const intptr_t fpu_regs_count = locs->live_registers()->FpuRegisterCount();
+ if (fpu_regs_count > 0) {
+ // Store fpu registers with the lowest register number at the lowest
+ // address.
+ for (intptr_t reg_idx = kNumberOfVRegisters - 1;
+ reg_idx >= 0; --reg_idx) {
+ VRegister fpu_reg = static_cast<VRegister>(reg_idx);
+ if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
+ // TODO(zra): Save the whole V register.
+ __ PushDouble(fpu_reg);
+ }
+ }
+ }
// Store general purpose registers with the highest register number at the
// lowest address.
@@ -1151,7 +1460,17 @@
}
}
- // TODO(zra): Restore live FPU registers.
+ const intptr_t fpu_regs_count = locs->live_registers()->FpuRegisterCount();
+ if (fpu_regs_count > 0) {
+ // Fpu registers have the lowest register number at the lowest address.
+ for (intptr_t reg_idx = 0; reg_idx < kNumberOfVRegisters; ++reg_idx) {
+ VRegister fpu_reg = static_cast<VRegister>(reg_idx);
+ if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
+ // TODO(zra): Restore the whole V register.
+ __ PopDouble(fpu_reg);
+ }
+ }
+ }
}
@@ -1163,7 +1482,43 @@
intptr_t deopt_id,
intptr_t token_index,
LocationSummary* locs) {
- UNIMPLEMENTED();
+ ASSERT(is_optimizing());
+ ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+ Label match_found;
+ const intptr_t len = ic_data.NumberOfChecks();
+ GrowableArray<CidTarget> sorted(len);
+ SortICDataByCount(ic_data, &sorted);
+ ASSERT(class_id_reg != R4);
+ ASSERT(len > 0); // Why bother otherwise.
+ const Array& arguments_descriptor =
+ Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+ argument_names));
+ __ LoadObject(R4, arguments_descriptor, PP);
+ for (intptr_t i = 0; i < len; i++) {
+ const bool is_last_check = (i == (len - 1));
+ Label next_test;
+ __ CompareImmediate(class_id_reg, sorted[i].cid, PP);
+ if (is_last_check) {
+ __ b(deopt, NE);
+ } else {
+ __ b(&next_test, NE);
+ }
+ // Do not use the code from the function, but let the code be patched so
+ // that we can record the outgoing edges to other code.
+ GenerateDartCall(deopt_id,
+ token_index,
+ &StubCode::CallStaticFunctionLabel(),
+ PcDescriptors::kOptStaticCall,
+ locs);
+ const Function& function = *sorted[i].target;
+ AddStaticCallTarget(function);
+ __ Drop(argument_count);
+ if (!is_last_check) {
+ __ b(&match_found);
+ }
+ __ Bind(&next_test);
+ }
+ __ Bind(&match_found);
}
@@ -1210,12 +1565,156 @@
void ParallelMoveResolver::EmitMove(int index) {
- UNIMPLEMENTED();
+ MoveOperands* move = moves_[index];
+ const Location source = move->src();
+ const Location destination = move->dest();
+
+ if (source.IsRegister()) {
+ if (destination.IsRegister()) {
+ __ mov(destination.reg(), source.reg());
+ } else {
+ ASSERT(destination.IsStackSlot());
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ StoreToOffset(source.reg(), FP, dest_offset);
+ }
+ } else if (source.IsStackSlot()) {
+ if (destination.IsRegister()) {
+ const intptr_t source_offset = source.ToStackSlotOffset();
+ __ LoadFromOffset(destination.reg(), FP, source_offset);
+ } else {
+ ASSERT(destination.IsStackSlot());
+ const intptr_t source_offset = source.ToStackSlotOffset();
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadFromOffset(TMP, FP, source_offset);
+ __ StoreToOffset(TMP, FP, dest_offset);
+ }
+ } else if (source.IsFpuRegister()) {
+ if (destination.IsFpuRegister()) {
+ __ fmovdd(destination.fpu_reg(), source.fpu_reg());
+ } else {
+ if (destination.IsDoubleStackSlot()) {
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ VRegister src = source.fpu_reg();
+ __ StoreDToOffset(src, FP, dest_offset);
+ } else {
+ ASSERT(destination.IsQuadStackSlot());
+ UNIMPLEMENTED();
+ }
+ }
+ } else if (source.IsDoubleStackSlot()) {
+ if (destination.IsFpuRegister()) {
+ const intptr_t dest_offset = source.ToStackSlotOffset();
+ const VRegister dst = destination.fpu_reg();
+ __ LoadDFromOffset(dst, FP, dest_offset);
+ } else {
+ ASSERT(destination.IsDoubleStackSlot());
+ const intptr_t source_offset = source.ToStackSlotOffset();
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadDFromOffset(VTMP, FP, source_offset);
+ __ StoreDToOffset(VTMP, FP, dest_offset);
+ }
+ } else if (source.IsQuadStackSlot()) {
+ UNIMPLEMENTED();
+ } else {
+ ASSERT(source.IsConstant());
+ const Object& constant = source.constant();
+ if (destination.IsRegister()) {
+ __ LoadObject(destination.reg(), constant, PP);
+ } else if (destination.IsFpuRegister()) {
+ const VRegister dst = destination.fpu_reg();
+ __ LoadObject(TMP, constant, PP);
+ __ LoadDFieldFromOffset(dst, TMP, Double::value_offset());
+ } else if (destination.IsDoubleStackSlot()) {
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadObject(TMP, constant, PP);
+ __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset());
+ __ StoreDToOffset(VTMP, FP, dest_offset);
+ } else {
+ ASSERT(destination.IsStackSlot());
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadObject(TMP, constant, PP);
+ __ StoreToOffset(TMP, FP, dest_offset);
+ }
+ }
+
+ move->Eliminate();
}
void ParallelMoveResolver::EmitSwap(int index) {
- UNIMPLEMENTED();
+ MoveOperands* move = moves_[index];
+ const Location source = move->src();
+ const Location destination = move->dest();
+
+ if (source.IsRegister() && destination.IsRegister()) {
+ ASSERT(source.reg() != TMP);
+ ASSERT(destination.reg() != TMP);
+ __ mov(TMP, source.reg());
+ __ mov(source.reg(), destination.reg());
+ __ mov(destination.reg(), TMP);
+ } else if (source.IsRegister() && destination.IsStackSlot()) {
+ Exchange(source.reg(), destination.ToStackSlotOffset());
+ } else if (source.IsStackSlot() && destination.IsRegister()) {
+ Exchange(destination.reg(), source.ToStackSlotOffset());
+ } else if (source.IsStackSlot() && destination.IsStackSlot()) {
+ Exchange(source.ToStackSlotOffset(), destination.ToStackSlotOffset());
+ } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
+ const VRegister dst = destination.fpu_reg();
+ const VRegister src = source.fpu_reg();
+ __ fmovdd(VTMP, src);
+ __ fmovdd(src, dst);
+ __ fmovdd(dst, VTMP);
+ } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
+ ASSERT(destination.IsDoubleStackSlot() ||
+ destination.IsQuadStackSlot() ||
+ source.IsDoubleStackSlot() ||
+ source.IsQuadStackSlot());
+ bool double_width = destination.IsDoubleStackSlot() ||
+ source.IsDoubleStackSlot();
+ VRegister reg = source.IsFpuRegister() ? source.fpu_reg()
+ : destination.fpu_reg();
+ const intptr_t slot_offset = source.IsFpuRegister()
+ ? destination.ToStackSlotOffset()
+ : source.ToStackSlotOffset();
+
+ if (double_width) {
+ __ LoadDFromOffset(VTMP, FP, slot_offset);
+ __ StoreDToOffset(reg, FP, slot_offset);
+ __ fmovdd(reg, VTMP);
+ } else {
+ UNIMPLEMENTED();
+ }
+ } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
+ const intptr_t source_offset = source.ToStackSlotOffset();
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+
+ ScratchFpuRegisterScope ensure_scratch(this, VTMP);
+ VRegister scratch = ensure_scratch.reg();
+ __ LoadDFromOffset(VTMP, FP, source_offset);
+ __ LoadDFromOffset(scratch, FP, dest_offset);
+ __ StoreDToOffset(VTMP, FP, dest_offset);
+ __ StoreDToOffset(scratch, FP, source_offset);
+ } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
+ UNIMPLEMENTED();
+ } else {
+ UNREACHABLE();
+ }
+
+ // The swap of source and destination has executed a move from source to
+ // destination.
+ move->Eliminate();
+
+ // Any unperformed (including pending) move with a source of either
+ // this move's source or destination needs to have their source
+ // changed to reflect the state of affairs after the swap.
+ for (int i = 0; i < moves_.length(); ++i) {
+ const MoveOperands& other_move = *moves_[i];
+ if (other_move.Blocks(source)) {
+ moves_[i]->set_src(destination);
+ } else if (other_move.Blocks(destination)) {
+ moves_[i]->set_src(source);
+ }
+ }
}
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 5ed4715..518f15b 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -12,6 +12,7 @@
#include "vm/cpu.h"
#include "vm/dart_entry.h"
#include "vm/deopt_instructions.h"
+#include "vm/flow_graph_builder.h"
#include "vm/il_printer.h"
#include "vm/locations.h"
#include "vm/object_store.h"
@@ -61,7 +62,9 @@
RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
DeoptInfoBuilder* builder,
const Array& deopt_table) {
- if (deopt_env_ == NULL) return DeoptInfo::null();
+ if (deopt_env_ == NULL) {
+ return DeoptInfo::null();
+ }
intptr_t stack_height = compiler->StackSize();
AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -1649,6 +1652,30 @@
} else {
__ LoadObjectSafely(destination.reg(), constant);
}
+ } else if (destination.IsFpuRegister()) {
+ const Double& constant = Double::Cast(source.constant());
+ uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
+ if (addr == 0) {
+ __ pushl(EAX);
+ __ LoadObject(EAX, constant);
+ __ movsd(destination.fpu_reg(),
+ FieldAddress(EAX, Double::value_offset()));
+ __ popl(EAX);
+ } else {
+ __ movsd(destination.fpu_reg(), Address::Absolute(addr));
+ }
+ } else if (destination.IsDoubleStackSlot()) {
+ const Double& constant = Double::Cast(source.constant());
+ uword addr = FlowGraphBuilder::FindDoubleConstant(constant.value());
+ if (addr == 0) {
+ __ pushl(EAX);
+ __ LoadObject(EAX, constant);
+ __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
+ __ popl(EAX);
+ } else {
+ __ movsd(XMM0, Address::Absolute(addr));
+ }
+ __ movsd(destination.ToStackSlotAddress(), XMM0);
} else {
ASSERT(destination.IsStackSlot());
StoreObject(destination.ToStackSlotAddress(), source.constant());
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 508a760..5b272c0 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -55,7 +55,9 @@
RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
DeoptInfoBuilder* builder,
const Array& deopt_table) {
- if (deopt_env_ == NULL) return DeoptInfo::null();
+ if (deopt_env_ == NULL) {
+ return DeoptInfo::null();
+ }
intptr_t stack_height = compiler->StackSize();
AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -157,7 +159,9 @@
#define __ assem->
__ Comment("Deopt stub for id %" Pd "", deopt_id());
__ Bind(entry_label());
- if (FLAG_trap_on_deoptimization) __ break_(0);
+ if (FLAG_trap_on_deoptimization) {
+ __ break_(0);
+ }
ASSERT(deopt_env() != NULL);
@@ -1684,13 +1688,22 @@
UNIMPLEMENTED();
} else {
ASSERT(source.IsConstant());
+ const Object& constant = source.constant();
if (destination.IsRegister()) {
- const Object& constant = source.constant();
__ LoadObject(destination.reg(), constant);
+ } else if (destination.IsFpuRegister()) {
+ __ LoadObject(TMP, constant);
+ __ LoadDFromOffset(destination.fpu_reg(), TMP,
+ Double::value_offset() - kHeapObjectTag);
+ } else if (destination.IsDoubleStackSlot()) {
+ const intptr_t dest_offset = destination.ToStackSlotOffset();
+ __ LoadObject(TMP, constant);
+ __ LoadDFromOffset(DTMP, TMP, Double::value_offset() - kHeapObjectTag);
+ __ StoreDToOffset(DTMP, FP, dest_offset);
} else {
ASSERT(destination.IsStackSlot());
const intptr_t dest_offset = destination.ToStackSlotOffset();
- __ LoadObject(TMP, source.constant());
+ __ LoadObject(TMP, constant);
__ StoreToOffset(TMP, FP, dest_offset);
}
}
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index c434a90..66bd6cd 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -58,7 +58,9 @@
RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
DeoptInfoBuilder* builder,
const Array& deopt_table) {
- if (deopt_env_ == NULL) return DeoptInfo::null();
+ if (deopt_env_ == NULL) {
+ return DeoptInfo::null();
+ }
intptr_t stack_height = compiler->StackSize();
AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
@@ -155,7 +157,9 @@
#define __ assem->
__ Comment("Deopt stub for id %" Pd "", deopt_id());
__ Bind(entry_label());
- if (FLAG_trap_on_deoptimization) __ int3();
+ if (FLAG_trap_on_deoptimization) {
+ __ int3();
+ }
ASSERT(deopt_env() != NULL);
@@ -1677,16 +1681,24 @@
}
} else {
ASSERT(source.IsConstant());
+ const Object& constant = source.constant();
if (destination.IsRegister()) {
- const Object& constant = source.constant();
if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
__ xorq(destination.reg(), destination.reg());
} else {
__ LoadObject(destination.reg(), constant, PP);
}
+ } else if (destination.IsFpuRegister()) {
+ __ LoadObject(TMP, constant, PP);
+ __ movsd(destination.fpu_reg(),
+ FieldAddress(TMP, Double::value_offset()));
+ } else if (destination.IsDoubleStackSlot()) {
+ __ LoadObject(TMP, constant, PP);
+ __ movsd(XMM0, FieldAddress(TMP, Double::value_offset()));
+ __ movsd(destination.ToStackSlotAddress(), XMM0);
} else {
ASSERT(destination.IsStackSlot());
- StoreObject(destination.ToStackSlotAddress(), source.constant());
+ StoreObject(destination.ToStackSlotAddress(), constant);
}
}
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 6309034..f8a5494 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -395,6 +395,7 @@
}
+// Tries to merge MathUnary operations, in this case sinus and cosinus.
void FlowGraphOptimizer::TryMergeMathUnary(
GrowableArray<MathUnaryInstr*>* merge_candidates) {
if (!FlowGraphCompiler::SupportsSinCos()) {
@@ -411,8 +412,8 @@
continue;
}
const intptr_t kind = curr_instr->kind();
- ASSERT((kind == MethodRecognizer::kMathSin) ||
- (kind == MethodRecognizer::kMathCos));
+ ASSERT((kind == MathUnaryInstr::kSin) ||
+ (kind == MathUnaryInstr::kCos));
// Check if there is sin/cos binop with same inputs.
const intptr_t other_kind = (kind == MethodRecognizer::kMathSin) ?
MethodRecognizer::kMathCos : MethodRecognizer::kMathSin;
@@ -488,8 +489,8 @@
}
} else if (it.Current()->IsMathUnary()) {
MathUnaryInstr* math_unary = it.Current()->AsMathUnary();
- if ((math_unary->kind() == MethodRecognizer::kMathSin) ||
- (math_unary->kind() == MethodRecognizer::kMathCos)) {
+ if ((math_unary->kind() == MathUnaryInstr::kSin) ||
+ (math_unary->kind() == MathUnaryInstr::kCos)) {
if (math_unary->HasUses()) {
sin_cos_merge.Add(math_unary);
}
@@ -4100,11 +4101,24 @@
void FlowGraphOptimizer::VisitStaticCall(StaticCallInstr* call) {
MethodRecognizer::Kind recognized_kind =
MethodRecognizer::RecognizeKind(call->function());
- if ((recognized_kind == MethodRecognizer::kMathSqrt) ||
- (recognized_kind == MethodRecognizer::kMathSin) ||
- (recognized_kind == MethodRecognizer::kMathCos)) {
+ MathUnaryInstr::MathUnaryKind unary_kind;
+ switch (recognized_kind) {
+ case MethodRecognizer::kMathSqrt:
+ unary_kind = MathUnaryInstr::kSqrt;
+ break;
+ case MethodRecognizer::kMathSin:
+ unary_kind = MathUnaryInstr::kSin;
+ break;
+ case MethodRecognizer::kMathCos:
+ unary_kind = MathUnaryInstr::kCos;
+ break;
+ default:
+ unary_kind = MathUnaryInstr::kIllegal;
+ break;
+ }
+ if (unary_kind != MathUnaryInstr::kIllegal) {
MathUnaryInstr* math_unary =
- new MathUnaryInstr(recognized_kind,
+ new MathUnaryInstr(unary_kind,
new Value(call->ArgumentAt(0)),
call->deopt_id());
ReplaceCall(call, math_unary);
@@ -4365,7 +4379,8 @@
void ConstrainValueAfterBranch(Definition* defn, Value* use);
void ConstrainValueAfterCheckArrayBound(Definition* defn,
- CheckArrayBoundInstr* check);
+ CheckArrayBoundInstr* check,
+ intptr_t use_index);
// Replace uses of the definition def that are dominated by instruction dom
// with uses of other definition.
@@ -4657,19 +4672,28 @@
} else if (use->instruction()->IsCheckArrayBound()) {
ConstrainValueAfterCheckArrayBound(
defn,
- use->instruction()->AsCheckArrayBound());
+ use->instruction()->AsCheckArrayBound(),
+ use->use_index());
}
}
}
void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
- Definition* defn, CheckArrayBoundInstr* check) {
- Definition* length = check->length()->definition();
-
- Range* constraint_range = new Range(
- RangeBoundary::FromConstant(0),
- RangeBoundary::FromDefinition(length, -1));
+ Definition* defn, CheckArrayBoundInstr* check, intptr_t use_index) {
+ Range* constraint_range = NULL;
+ if (use_index == CheckArrayBoundInstr::kIndexPos) {
+ Definition* length = check->length()->definition();
+ constraint_range = new Range(
+ RangeBoundary::FromConstant(0),
+ RangeBoundary::FromDefinition(length, -1));
+ } else {
+ ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
+ Definition* index = check->index()->definition();
+ constraint_range = new Range(
+ RangeBoundary::FromDefinition(index, 1),
+ RangeBoundary::MaxSmi());
+ }
InsertConstraintFor(defn, constraint_range, check);
}
@@ -7159,6 +7183,7 @@
cp.Analyze();
cp.VisitBranches();
cp.Transform();
+ cp.EliminateRedundantBranches();
}
@@ -7594,6 +7619,9 @@
Integer::Cast(left),
Integer::Cast(right));
SetValue(instr, Bool::Get(result));
+ } else if (left.IsDouble() && right.IsDouble()) {
+ // TODO(srdjan): Implement.
+ SetValue(instr, non_constant_);
} else {
SetValue(instr, non_constant_);
}
@@ -8062,6 +8090,11 @@
}
+void ConstantPropagator::VisitUnboxedConstant(UnboxedConstantInstr* instr) {
+ SetValue(instr, instr->value());
+}
+
+
void ConstantPropagator::VisitConstraint(ConstraintInstr* instr) {
// Should not be used outside of range analysis.
UNREACHABLE();
@@ -8433,6 +8466,85 @@
}
+static bool IsEmptyBlock(BlockEntryInstr* block) {
+ return block->next()->IsGoto() &&
+ (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
+}
+
+
+// Traverses a chain of empty blocks and returns the first reachable non-empty
+// block that is not dominated by the start block. The empty blocks are added
+// to the supplied bit vector.
+static BlockEntryInstr* FindFirstNonEmptySuccessor(
+ TargetEntryInstr* block,
+ BitVector* empty_blocks) {
+ BlockEntryInstr* current = block;
+ while (IsEmptyBlock(current) && block->Dominates(current)) {
+ ASSERT(!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL));
+ empty_blocks->Add(current->preorder_number());
+ current = current->next()->AsGoto()->successor();
+ }
+ return current;
+}
+
+
+void ConstantPropagator::EliminateRedundantBranches() {
+ // Canonicalize branches that have no side-effects and where true- and
+ // false-targets are the same.
+ bool changed = false;
+ BitVector* empty_blocks = new BitVector(graph_->preorder().length());
+ for (BlockIterator b = graph_->postorder_iterator();
+ !b.Done();
+ b.Advance()) {
+ BlockEntryInstr* block = b.Current();
+ BranchInstr* branch = block->last_instruction()->AsBranch();
+ empty_blocks->Clear();
+ if ((branch != NULL) && branch->Effects().IsNone()) {
+ ASSERT(branch->previous() != NULL); // Not already eliminated.
+ BlockEntryInstr* if_true =
+ FindFirstNonEmptySuccessor(branch->true_successor(), empty_blocks);
+ BlockEntryInstr* if_false =
+ FindFirstNonEmptySuccessor(branch->false_successor(), empty_blocks);
+ if (if_true == if_false) {
+ // Replace the branch with a jump to the common successor.
+ // Drop the comparison, which does not have side effects
+ JoinEntryInstr* join = if_true->AsJoinEntry();
+ if (join->phis() == NULL) {
+ GotoInstr* jump = new GotoInstr(if_true->AsJoinEntry());
+ jump->InheritDeoptTarget(branch);
+
+ Instruction* previous = branch->previous();
+ branch->set_previous(NULL);
+ previous->LinkTo(jump);
+
+ // Remove uses from branch and all the empty blocks that
+ // are now unreachable.
+ branch->UnuseAllInputs();
+ for (BitVector::Iterator it(empty_blocks); !it.Done(); it.Advance()) {
+ BlockEntryInstr* empty_block = graph_->preorder()[it.Current()];
+ empty_block->ClearAllInstructions();
+ }
+
+ changed = true;
+
+ if (FLAG_trace_constant_propagation) {
+ OS::Print("Eliminated branch in B%" Pd " common target B%" Pd "\n",
+ block->block_id(), join->block_id());
+ }
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ graph_->DiscoverBlocks();
+ // TODO(fschneider): Update dominator tree in place instead of recomputing.
+ GrowableArray<BitVector*> dominance_frontier;
+ graph_->ComputeDominators(&dominance_frontier);
+ }
+}
+
+
void ConstantPropagator::Transform() {
if (FLAG_trace_constant_propagation) {
OS::Print("\n==== Before constant propagation ====\n");
@@ -8450,24 +8562,16 @@
!b.Done();
b.Advance()) {
BlockEntryInstr* block = b.Current();
- JoinEntryInstr* join = block->AsJoinEntry();
if (!reachable_->Contains(block->preorder_number())) {
if (FLAG_trace_constant_propagation) {
OS::Print("Unreachable B%" Pd "\n", block->block_id());
}
// Remove all uses in unreachable blocks.
- if (join != NULL) {
- for (PhiIterator it(join); !it.Done(); it.Advance()) {
- it.Current()->UnuseAllInputs();
- }
- }
- block->UnuseAllInputs();
- for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
- it.Current()->UnuseAllInputs();
- }
+ block->ClearAllInstructions();
continue;
}
+ JoinEntryInstr* join = block->AsJoinEntry();
if (join != NULL) {
// Remove phi inputs corresponding to unreachable predecessor blocks.
// Predecessors will be recomputed (in block id order) after removing
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 838c6b8..c6deefc 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -297,8 +297,16 @@
static void Optimize(FlowGraph* graph);
- // Only visit branches to optimize away unreachable blocks discovered
- // by range analysis.
+ // (1) Visit branches to optimize away unreachable blocks discovered by range
+ // analysis.
+ // (2) Eliminate branches that have the same true- and false-target: For
+ // example, this occurs after expressions like
+ //
+ // if (a == null || b == null) {
+ // ...
+ // }
+ //
+ // where b is known to be null.
static void OptimizeBranches(FlowGraph* graph);
// Used to initialize the abstract value of definitions.
@@ -308,6 +316,7 @@
void Analyze();
void VisitBranches();
void Transform();
+ void EliminateRedundantBranches();
void SetReachable(BlockEntryInstr* block);
void SetValue(Definition* definition, const Object& value);
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index d815b4f5..193d4b7 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -2,10 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
#include "vm/dart_api_impl.h"
#include "vm/dart_api_state.h"
#include "vm/intermediate_language.h"
@@ -274,5 +270,3 @@
}
} // namespace dart
-
-#endif // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/handles.cc b/runtime/vm/handles.cc
index a7564db..5093be5 100644
--- a/runtime/vm/handles.cc
+++ b/runtime/vm/handles.cc
@@ -80,7 +80,7 @@
}
-HandleScope::HandleScope(BaseIsolate* isolate) : StackResource(isolate) {
+HandleScope::HandleScope(Isolate* isolate) : StackResource(isolate) {
ASSERT(isolate->no_handle_scope_depth() == 0);
VMHandles* handles = isolate->current_zone()->handles();
ASSERT(handles != NULL);
@@ -109,7 +109,7 @@
#if defined(DEBUG)
-NoHandleScope::NoHandleScope(BaseIsolate* isolate) : StackResource(isolate) {
+NoHandleScope::NoHandleScope(Isolate* isolate) : StackResource(isolate) {
isolate->IncrementNoHandleScopeDepth();
}
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index d12fc4b..8a216ff 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -297,7 +297,7 @@
// }
class HandleScope : public StackResource {
public:
- explicit HandleScope(BaseIsolate* isolate);
+ explicit HandleScope(Isolate* isolate);
~HandleScope();
private:
@@ -329,7 +329,7 @@
#if defined(DEBUG)
class NoHandleScope : public StackResource {
public:
- explicit NoHandleScope(BaseIsolate* isolate);
+ explicit NoHandleScope(Isolate* isolate);
NoHandleScope();
~NoHandleScope();
@@ -339,7 +339,7 @@
#else // defined(DEBUG)
class NoHandleScope : public ValueObject {
public:
- explicit NoHandleScope(BaseIsolate* isolate) { }
+ explicit NoHandleScope(Isolate* isolate) { }
NoHandleScope() { }
~NoHandleScope() { }
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 7f2310a..57ded04 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -156,6 +156,9 @@
// Protect access to the heap.
void WriteProtect(bool read_only);
+ void WriteProtectCode(bool read_only) {
+ old_space_->WriteProtectCode(read_only);
+ }
// Accessors for inlined allocation in generated code.
uword TopAddress();
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 8ff354c4..db27a46 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -584,7 +584,7 @@
void MathUnaryInstr::PrintOperandsTo(BufferFormatter* f) const {
- f->Print("'%s', ", MethodRecognizer::KindToCString(kind()));
+ f->Print("'%s', ", MathUnaryInstr::KindToCString(kind()));
value()->PrintTo(f);
}
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index a9ba3fb..cd41415 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -325,6 +325,14 @@
}
+UnboxedConstantInstr::UnboxedConstantInstr(const Object& value)
+ : ConstantInstr(value), constant_address_(0) {
+ // Only doubles supported for now.
+ ASSERT(value.IsDouble());
+ constant_address_ =
+ FlowGraphBuilder::FindDoubleConstant(Double::Cast(value).value());
+}
+
// Returns true if the value represents a constant.
bool Value::BindsToConstant() const {
return definition()->IsConstant();
@@ -1060,6 +1068,22 @@
}
+void BlockEntryInstr::ClearAllInstructions() {
+ JoinEntryInstr* join = this->AsJoinEntry();
+ if (join != NULL) {
+ for (PhiIterator it(join); !it.Done(); it.Advance()) {
+ it.Current()->UnuseAllInputs();
+ }
+ }
+ UnuseAllInputs();
+ for (ForwardInstructionIterator it(this);
+ !it.Done();
+ it.Advance()) {
+ it.Current()->UnuseAllInputs();
+ }
+}
+
+
void JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) {
// Lazily initialize the array of phis.
// Currently, phis are stored in a sparse array that holds the phi
@@ -1224,7 +1248,6 @@
return ToIntegerConstant(value->definition()->AsUnboxDouble()->value(),
result);
}
-
return false;
}
@@ -1339,22 +1362,32 @@
Definition* BinaryDoubleOpInstr::Canonicalize(FlowGraph* flow_graph) {
+ if (!HasUses()) return NULL;
+
Definition* result = NULL;
result = CanonicalizeCommutativeArithmetic(op_kind(),
kDoubleCid,
left(),
right());
+ if (result == NULL) {
+ result = CanonicalizeCommutativeArithmetic(op_kind(),
+ kDoubleCid,
+ right(),
+ left());
+ }
if (result != NULL) {
return result;
}
- result = CanonicalizeCommutativeArithmetic(op_kind(),
- kDoubleCid,
- right(),
- left());
- if (result != NULL) {
- return result;
+ if ((op_kind() == Token::kMUL) &&
+ (left()->definition() == right()->definition())) {
+ MathUnaryInstr* math_unary =
+ new MathUnaryInstr(MathUnaryInstr::kDoubleSquare,
+ new Value(left()->definition()),
+ DeoptimizationTarget());
+ flow_graph->InsertBefore(this, math_unary, env(), Definition::kValue);
+ return math_unary;
}
return this;
@@ -1601,9 +1634,21 @@
Definition* UnboxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
+ if (!HasUses()) return NULL;
// Fold away UnboxDouble(BoxDouble(v)).
- BoxDoubleInstr* defn = value()->definition()->AsBoxDouble();
- return (defn != NULL) ? defn->value()->definition() : this;
+ BoxDoubleInstr* box_defn = value()->definition()->AsBoxDouble();
+ if (box_defn != NULL) {
+ return box_defn->value()->definition();
+ }
+
+ ConstantInstr* c = value()->definition()->AsConstant();
+ if ((c != NULL) && c->value().IsDouble()) {
+ UnboxedConstantInstr* uc = new UnboxedConstantInstr(c->value());
+ flow_graph->InsertBefore(this, uc, NULL, Definition::kValue);
+ return uc;
+ }
+
+ return this;
}
@@ -3298,9 +3343,9 @@
const RuntimeEntry& MathUnaryInstr::TargetFunction() const {
switch (kind()) {
- case MethodRecognizer::kMathSin:
+ case MathUnaryInstr::kSin:
return kSinRuntimeEntry;
- case MethodRecognizer::kMathCos:
+ case MathUnaryInstr::kCos:
return kCosRuntimeEntry;
default:
UNREACHABLE();
@@ -3309,6 +3354,19 @@
}
+const char* MathUnaryInstr::KindToCString(MathUnaryKind kind) {
+ switch (kind) {
+ case kIllegal: return "illegal";
+ case kSin: return "sin";
+ case kCos: return "cos";
+ case kSqrt: return "sqrt";
+ case kDoubleSquare: return "double-square";
+ }
+ UNREACHABLE();
+ return "";
+}
+
+
MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
intptr_t original_deopt_id,
MergedMathInstr::Kind kind)
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 699231d..1b4b7d8 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -721,6 +721,7 @@
M(CheckClass) \
M(CheckSmi) \
M(Constant) \
+ M(UnboxedConstant) \
M(CheckEitherNonSmi) \
M(BinaryDoubleOp) \
M(MathUnary) \
@@ -1385,6 +1386,10 @@
void set_block_id(intptr_t block_id) { block_id_ = block_id; }
+ // For all instruction in this block: Remove all inputs (including in the
+ // environment) from their definition's use lists for all instructions.
+ void ClearAllInstructions();
+
protected:
BlockEntryInstr(intptr_t block_id, intptr_t try_index)
: block_id_(block_id),
@@ -2745,6 +2750,29 @@
};
+// Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr.
+// TODO(srdjan): Implemented currently for doubles only, should implement
+// for other unboxing instructions.
+class UnboxedConstantInstr : public ConstantInstr {
+ public:
+ explicit UnboxedConstantInstr(const Object& value);
+
+ virtual Representation representation() const {
+ return kUnboxedDouble;
+ }
+
+ // Either NULL or the address of the unboxed constant.
+ uword constant_address() const { return constant_address_; }
+
+ DECLARE_INSTRUCTION(UnboxedConstant)
+
+ private:
+ uword constant_address_; // Either NULL or points to the untagged constant.
+
+ DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr);
+};
+
+
class AssertAssignableInstr : public TemplateDefinition<3> {
public:
AssertAssignableInstr(intptr_t token_pos,
@@ -5041,14 +5069,21 @@
class MathUnaryInstr : public TemplateDefinition<1> {
public:
- MathUnaryInstr(MethodRecognizer::Kind kind, Value* value, intptr_t deopt_id)
+ enum MathUnaryKind {
+ kIllegal,
+ kSin,
+ kCos,
+ kSqrt,
+ kDoubleSquare,
+ };
+ MathUnaryInstr(MathUnaryKind kind, Value* value, intptr_t deopt_id)
: kind_(kind) {
SetInputAt(0, value);
deopt_id_ = deopt_id;
}
Value* value() const { return inputs_[0]; }
- MethodRecognizer::Kind kind() const { return kind_; }
+ MathUnaryKind kind() const { return kind_; }
const RuntimeEntry& TargetFunction() const;
virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -5084,8 +5119,10 @@
Definition* Canonicalize(FlowGraph* flow_graph);
+ static const char* KindToCString(MathUnaryKind kind);
+
private:
- const MethodRecognizer::Kind kind_;
+ const MathUnaryKind kind_;
DISALLOW_COPY_AND_ASSIGN(MathUnaryInstr);
};
@@ -7685,13 +7722,13 @@
virtual bool MayThrow() const { return false; }
- private:
// Give a name to the location/input indices.
enum {
kLengthPos = 0,
kIndexPos = 1
};
+ private:
DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr);
};
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 321fe04..2d4b5ba 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -276,6 +276,32 @@
}
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+ const intptr_t kNumInputs = 0;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_out(0, Location::RequiresFpuRegister());
+ locs->set_temp(0, Location::RequiresRegister());
+ return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ // The register allocator drops constant definitions that have no uses.
+ if (!locs()->out(0).IsInvalid()) {
+ if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+ const QRegister dst = locs()->out(0).fpu_reg();
+ __ veorq(dst, dst, dst);
+ } else {
+ const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
+ const Register temp = locs()->temp(0).reg();
+ __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
+ }
+ }
+}
+
+
LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 0;
@@ -3290,7 +3316,8 @@
void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t value_cid = value()->Type()->ToCid();
+ CompileType* value_type = value()->Type();
+ const intptr_t value_cid = value_type->ToCid();
const Register value = locs()->in(0).reg();
const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
@@ -3304,19 +3331,29 @@
Label* deopt = compiler->AddDeoptStub(deopt_id_,
ICData::kDeoptBinaryDoubleOp);
Register temp = locs()->temp(0).reg();
- Label is_smi, done;
- __ tst(value, ShifterOperand(kSmiTagMask));
- __ b(&is_smi, EQ);
- __ CompareClassId(value, kDoubleCid, temp);
- __ b(deopt, NE);
- __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
- __ b(&done);
- __ Bind(&is_smi);
- // TODO(regis): Why do we preserve value here but not above?
- __ mov(IP, ShifterOperand(value, ASR, 1)); // Copy and untag.
- __ vmovsr(STMP, IP);
- __ vcvtdi(result, STMP);
- __ Bind(&done);
+ if (value_type->is_nullable() &&
+ (value_type->ToNullableCid() == kDoubleCid)) {
+ __ CompareImmediate(value, reinterpret_cast<intptr_t>(Object::null()));
+ __ b(deopt, EQ);
+ // It must be double now.
+ __ LoadDFromOffset(result, value,
+ Double::value_offset() - kHeapObjectTag);
+ } else {
+ Label is_smi, done;
+ __ tst(value, ShifterOperand(kSmiTagMask));
+ __ b(&is_smi, EQ);
+ __ CompareClassId(value, kDoubleCid, temp);
+ __ b(deopt, NE);
+ __ LoadDFromOffset(result, value,
+ Double::value_offset() - kHeapObjectTag);
+ __ b(&done);
+ __ Bind(&is_smi);
+ // TODO(regis): Why do we preserve value here but not above?
+ __ mov(IP, ShifterOperand(value, ASR, 1)); // Copy and untag.
+ __ vmovsr(STMP, IP);
+ __ vcvtdi(result, STMP);
+ __ Bind(&done);
+ }
}
}
@@ -3572,9 +3609,9 @@
void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
- DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
- DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+ const DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
+ const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
+ const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
switch (op_kind()) {
case Token::kADD: __ vaddd(result, left, right); break;
case Token::kSUB: __ vsubd(result, left, right); break;
@@ -4705,8 +4742,7 @@
LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
- if ((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos)) {
+ if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -4721,7 +4757,8 @@
#endif
return summary;
}
- // Sqrt.
+ ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+ (kind() == MathUnaryInstr::kDoubleSquare));
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -4733,11 +4770,17 @@
void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- if (kind() == MethodRecognizer::kMathSqrt) {
+ if (kind() == MathUnaryInstr::kSqrt) {
DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
__ vsqrtd(result, val);
+ } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+ DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
+ DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+ __ vmuld(result, val, val);
} else {
+ ASSERT((kind() == MathUnaryInstr::kSin) ||
+ (kind() == MathUnaryInstr::kCos));
#if defined(ARM_FLOAT_ABI_HARD)
__ CallRuntime(TargetFunction(), InputCount());
#else
@@ -5444,13 +5487,6 @@
Location index_loc = locs()->in(kIndexPos);
if (length_loc.IsConstant() && index_loc.IsConstant()) {
- // TODO(srdjan): remove this code once failures are fixed.
- if ((Smi::Cast(length_loc.constant()).Value() >
- Smi::Cast(index_loc.constant()).Value()) &&
- (Smi::Cast(index_loc.constant()).Value() >= 0)) {
- // This CheckArrayBoundInstr should have been eliminated.
- return;
- }
ASSERT((Smi::Cast(length_loc.constant()).Value() <=
Smi::Cast(index_loc.constant()).Value()) ||
(Smi::Cast(index_loc.constant()).Value() < 0));
@@ -5767,8 +5803,8 @@
__ SmiUntag(shift);
// vshlq takes the shift value from low byte. Deopt if shift is
- // outside of [0, 127].
- __ CompareImmediate(shift, 127);
+ // outside of [0, 63].
+ __ CompareImmediate(shift, 63);
__ b(deopt, GT);
__ CompareImmediate(shift, 0);
__ b(deopt, LT);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index db122d2..bcec0ae 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -97,14 +97,85 @@
}
+static Condition NegateCondition(Condition condition) {
+ switch (condition) {
+ case EQ: return NE;
+ case NE: return EQ;
+ case LT: return GE;
+ case LE: return GT;
+ case GT: return LE;
+ case GE: return LT;
+ case CC: return CS;
+ case LS: return HI;
+ case HI: return LS;
+ case CS: return CC;
+ default:
+ UNREACHABLE();
+ return EQ;
+ }
+}
+
+
+// Detect pattern when one value is zero and another is a power of 2.
+static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) {
+ return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) ||
+ (Utils::IsPowerOfTwo(v2) && (v1 == 0));
+}
+
+
LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ comparison()->InitializeLocationSummary(opt);
+ return comparison()->locs();
}
void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ const Register result = locs()->out(0).reg();
+
+ Location left = locs()->in(0);
+ Location right = locs()->in(1);
+ ASSERT(!left.IsConstant() || !right.IsConstant());
+
+ // Emit comparison code. This must not overwrite the result register.
+ BranchLabels labels = { NULL, NULL, NULL };
+ Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
+
+ const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_);
+
+ intptr_t true_value = if_true_;
+ intptr_t false_value = if_false_;
+
+ if (is_power_of_two_kind) {
+ if (true_value == 0) {
+ // We need to have zero in result on true_condition.
+ true_condition = NegateCondition(true_condition);
+ }
+ } else {
+ if (true_value == 0) {
+ // Swap values so that false_value is zero.
+ intptr_t temp = true_value;
+ true_value = false_value;
+ false_value = temp;
+ } else {
+ true_condition = NegateCondition(true_condition);
+ }
+ }
+
+ __ cset(result, true_condition);
+
+ if (is_power_of_two_kind) {
+ const intptr_t shift =
+ Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
+ __ Lsl(result, result, shift + kSmiTagSize);
+ } else {
+ __ sub(result, result, Operand(1));
+ const int32_t val =
+ Smi::RawValue(true_value) - Smi::RawValue(false_value);
+ __ AndImmediate(result, result, val, PP);
+ if (false_value != 0) {
+ __ AddImmediate(result, result, Smi::RawValue(false_value), PP);
+ }
+ }
}
@@ -202,6 +273,22 @@
}
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+ const intptr_t kNumInputs = 0;
+ return LocationSummary::Make(kNumInputs,
+ Location::RequiresFpuRegister(),
+ LocationSummary::kNoCall);
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ if (!locs()->out(0).IsInvalid()) {
+ const VRegister dst = locs()->out(0).fpu_reg();
+ __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+ }
+}
+
+
LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 0;
@@ -261,50 +348,219 @@
}
+static Condition TokenKindToSmiCondition(Token::Kind kind) {
+ switch (kind) {
+ case Token::kEQ: return EQ;
+ case Token::kNE: return NE;
+ case Token::kLT: return LT;
+ case Token::kGT: return GT;
+ case Token::kLTE: return LE;
+ case Token::kGTE: return GE;
+ default:
+ UNREACHABLE();
+ return VS;
+ }
+}
+
+
+static Condition FlipCondition(Condition condition) {
+ switch (condition) {
+ case EQ: return EQ;
+ case NE: return NE;
+ case LT: return GT;
+ case LE: return GE;
+ case GT: return LT;
+ case GE: return LE;
+ case CC: return HI;
+ case LS: return CS;
+ case HI: return CC;
+ case CS: return LS;
+ default:
+ UNREACHABLE();
+ return EQ;
+ }
+}
+
+
+static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
+ Condition true_condition,
+ BranchLabels labels) {
+ if (labels.fall_through == labels.false_label) {
+ // If the next block is the false successor we will fall through to it.
+ __ b(labels.true_label, true_condition);
+ } else {
+ // If the next block is not the false successor we will branch to it.
+ Condition false_condition = NegateCondition(true_condition);
+ __ b(labels.false_label, false_condition);
+
+ // Fall through or jump to the true successor.
+ if (labels.fall_through != labels.true_label) {
+ __ b(labels.true_label);
+ }
+ }
+}
+
+
+static Condition EmitSmiComparisonOp(FlowGraphCompiler* compiler,
+ LocationSummary* locs,
+ Token::Kind kind) {
+ Location left = locs->in(0);
+ Location right = locs->in(1);
+ ASSERT(!left.IsConstant() || !right.IsConstant());
+
+ Condition true_condition = TokenKindToSmiCondition(kind);
+
+ if (left.IsConstant()) {
+ __ CompareObject(right.reg(), left.constant(), PP);
+ true_condition = FlipCondition(true_condition);
+ } else if (right.IsConstant()) {
+ __ CompareObject(left.reg(), right.constant(), PP);
+ } else {
+ __ CompareRegisters(left.reg(), right.reg());
+ }
+ return true_condition;
+}
+
+
LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
+ const intptr_t kNumInputs = 2;
+ if (operation_cid() == kDoubleCid) {
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresFpuRegister());
+ locs->set_in(1, Location::RequiresFpuRegister());
+ locs->set_out(0, Location::RequiresRegister());
+ return locs;
+ }
+ if (operation_cid() == kSmiCid) {
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RegisterOrConstant(left()));
+ // Only one input can be a constant operand. The case of two constant
+ // operands should be handled by constant propagation.
+ // Only right can be a stack slot.
+ locs->set_in(1, locs->in(0).IsConstant()
+ ? Location::RequiresRegister()
+ : Location::RegisterOrConstant(right()));
+ locs->set_out(0, Location::RequiresRegister());
+ return locs;
+ }
+ UNREACHABLE();
return NULL;
}
+static Condition TokenKindToDoubleCondition(Token::Kind kind) {
+ switch (kind) {
+ case Token::kEQ: return EQ;
+ case Token::kNE: return NE;
+ case Token::kLT: return LT;
+ case Token::kGT: return GT;
+ case Token::kLTE: return LE;
+ case Token::kGTE: return GE;
+ default:
+ UNREACHABLE();
+ return VS;
+ }
+}
+
+
+static Condition EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
+ LocationSummary* locs,
+ Token::Kind kind) {
+ VRegister left = locs->in(0).fpu_reg();
+ VRegister right = locs->in(1).fpu_reg();
+ __ fcmpd(left, right);
+ Condition true_condition = TokenKindToDoubleCondition(kind);
+ return true_condition;
+}
+
+
Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
BranchLabels labels) {
- UNIMPLEMENTED();
- return VS;
+ if (operation_cid() == kSmiCid) {
+ return EmitSmiComparisonOp(compiler, locs(), kind());
+ } else {
+ ASSERT(operation_cid() == kDoubleCid);
+ return EmitDoubleComparisonOp(compiler, locs(), kind());
+ }
}
void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
+
+ Label is_true, is_false;
+ BranchLabels labels = { &is_true, &is_false, &is_false };
+ Condition true_condition = EmitComparisonCode(compiler, labels);
+ EmitBranchOnCondition(compiler, true_condition, labels);
+
+ // TODO(zra): instead of branching, use the csel instruction to get
+ // True or False into result.
+ Register result = locs()->out(0).reg();
+ Label done;
+ __ Bind(&is_false);
+ __ LoadObject(result, Bool::False(), PP);
+ __ b(&done);
+ __ Bind(&is_true);
+ __ LoadObject(result, Bool::True(), PP);
+ __ Bind(&done);
}
void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
BranchInstr* branch) {
- UNIMPLEMENTED();
+ ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+ BranchLabels labels = compiler->CreateBranchLabels(branch);
+ Condition true_condition = EmitComparisonCode(compiler, labels);
+ EmitBranchOnCondition(compiler, true_condition, labels);
}
LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
+ // Only one input can be a constant operand. The case of two constant
+ // operands should be handled by constant propagation.
+ locs->set_in(1, Location::RegisterOrConstant(right()));
+ return locs;
}
Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
BranchLabels labels) {
- UNIMPLEMENTED();
- return VS;
+ Register left = locs()->in(0).reg();
+ Location right = locs()->in(1);
+ if (right.IsConstant()) {
+ ASSERT(right.constant().IsSmi());
+ const int32_t imm =
+ reinterpret_cast<int64_t>(right.constant().raw());
+ __ TestImmediate(left, imm, PP);
+ } else {
+ __ tst(left, Operand(right.reg()));
+ }
+ Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
+ return true_condition;
}
+
void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ // Never emitted outside of the BranchInstr.
+ UNREACHABLE();
}
void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
BranchInstr* branch) {
- UNIMPLEMENTED();
+ BranchLabels labels = compiler->CreateBranchLabels(branch);
+ Condition true_condition = EmitComparisonCode(compiler, labels);
+ EmitBranchOnCondition(compiler, true_condition, labels);
}
@@ -322,43 +578,125 @@
Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
BranchLabels labels) {
- UNIMPLEMENTED();
+ ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+ Register val_reg = locs()->in(0).reg();
+ Register cid_reg = locs()->temp(0).reg();
+
+ Label* deopt = CanDeoptimize() ?
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+ const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+ const ZoneGrowableArray<intptr_t>& data = cid_results();
+ ASSERT(data[0] == kSmiCid);
+ bool result = data[1] == true_result;
+ __ tsti(val_reg, kSmiTagMask);
+ __ b(result ? labels.true_label : labels.false_label, EQ);
+ __ LoadClassId(cid_reg, val_reg);
+
+ for (intptr_t i = 2; i < data.length(); i += 2) {
+ const intptr_t test_cid = data[i];
+ ASSERT(test_cid != kSmiCid);
+ result = data[i + 1] == true_result;
+ __ CompareImmediate(cid_reg, test_cid, PP);
+ __ b(result ? labels.true_label : labels.false_label, EQ);
+ }
+ // No match found, deoptimize or false.
+ if (deopt == NULL) {
+ Label* target = result ? labels.false_label : labels.true_label;
+ if (target != labels.fall_through) {
+ __ b(target);
+ }
+ } else {
+ __ b(deopt);
+ }
+ // Dummy result as the last instruction is a jump, any conditional
+ // branch using the result will therefore be skipped.
return EQ;
}
void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
BranchInstr* branch) {
- UNIMPLEMENTED();
+ BranchLabels labels = compiler->CreateBranchLabels(branch);
+ EmitComparisonCode(compiler, labels);
}
void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register result_reg = locs()->out(0).reg();
+ Label is_true, is_false, done;
+ BranchLabels labels = { &is_true, &is_false, &is_false };
+ EmitComparisonCode(compiler, labels);
+ // TODO(zra): instead of branching, use the csel instruction to get
+ // True or False into result.
+ __ Bind(&is_false);
+ __ LoadObject(result_reg, Bool::False(), PP);
+ __ b(&done);
+ __ Bind(&is_true);
+ __ LoadObject(result_reg, Bool::True(), PP);
+ __ Bind(&done);
}
LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ if (operation_cid() == kDoubleCid) {
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_in(1, Location::RequiresFpuRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+ }
+ ASSERT(operation_cid() == kSmiCid);
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RegisterOrConstant(left()));
+ // Only one input can be a constant operand. The case of two constant
+ // operands should be handled by constant propagation.
+ summary->set_in(1, summary->in(0).IsConstant()
+ ? Location::RequiresRegister()
+ : Location::RegisterOrConstant(right()));
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
}
Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
BranchLabels labels) {
- UNIMPLEMENTED();
- return VS;
+ if (operation_cid() == kSmiCid) {
+ return EmitSmiComparisonOp(compiler, locs(), kind());
+ } else {
+ UNIMPLEMENTED();
+ return VS;
+ }
}
void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Label is_true, is_false;
+ BranchLabels labels = { &is_true, &is_false, &is_false };
+ Condition true_condition = EmitComparisonCode(compiler, labels);
+ EmitBranchOnCondition(compiler, true_condition, labels);
+ // TODO(zra): instead of branching, use the csel instruction to get
+ // True or False into result.
+ Register result = locs()->out(0).reg();
+ Label done;
+ __ Bind(&is_false);
+ __ LoadObject(result, Bool::False(), PP);
+ __ b(&done);
+ __ Bind(&is_true);
+ __ LoadObject(result, Bool::True(), PP);
+ __ Bind(&done);
}
void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
BranchInstr* branch) {
- UNIMPLEMENTED();
+ BranchLabels labels = compiler->CreateBranchLabels(branch);
+ Condition true_condition = EmitComparisonCode(compiler, labels);
+ EmitBranchOnCondition(compiler, true_condition, labels);
}
@@ -424,24 +762,45 @@
LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ // TODO(fschneider): Allow immediate operands for the char code.
+ return LocationSummary::Make(kNumInputs,
+ Location::RequiresRegister(),
+ LocationSummary::kNoCall);
}
void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register char_code = locs()->in(0).reg();
+ Register result = locs()->out(0).reg();
+ __ LoadImmediate(result,
+ reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
+ __ AddImmediate(
+ result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP);
+ __ Asr(TMP, char_code, kSmiTagShift); // Untag to use scaled adress mode.
+ __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
}
LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ return LocationSummary::Make(kNumInputs,
+ Location::RequiresRegister(),
+ LocationSummary::kNoCall);
}
void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ ASSERT(cid_ == kOneByteStringCid);
+ Register str = locs()->in(0).reg();
+ Register result = locs()->out(0).reg();
+ __ LoadFieldFromOffset(result, str, String::length_offset());
+ __ CompareImmediate(result, Smi::RawValue(1), PP);
+ __ LoadImmediate(TMP, Smi::RawValue(-1), PP);
+ __ ldr(TMP2, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
+ __ csel(result, TMP, result, NE);
+ __ csel(result, TMP2, result, EQ);
+ __ SmiTag(result);
}
@@ -506,25 +865,205 @@
CompileType LoadIndexedInstr::ComputeType() const {
- UNIMPLEMENTED();
- return CompileType::Dynamic();
+ switch (class_id_) {
+ case kArrayCid:
+ case kImmutableArrayCid:
+ return CompileType::Dynamic();
+
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid:
+ return CompileType::FromCid(kDoubleCid);
+ case kTypedDataFloat32x4ArrayCid:
+ return CompileType::FromCid(kFloat32x4Cid);
+ case kTypedDataInt32x4ArrayCid:
+ return CompileType::FromCid(kInt32x4Cid);
+ case kTypedDataFloat64x2ArrayCid:
+ return CompileType::FromCid(kFloat64x2Cid);
+
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
+ return CompileType::FromCid(kSmiCid);
+
+ default:
+ UNIMPLEMENTED();
+ return CompileType::Dynamic();
+ }
}
Representation LoadIndexedInstr::representation() const {
- UNIMPLEMENTED();
- return kTagged;
+ switch (class_id_) {
+ case kArrayCid:
+ case kImmutableArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
+ return kTagged;
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid:
+ return kUnboxedDouble;
+ case kTypedDataInt32x4ArrayCid:
+ return kUnboxedInt32x4;
+ case kTypedDataFloat32x4ArrayCid:
+ return kUnboxedFloat32x4;
+ case kTypedDataFloat64x2ArrayCid:
+ return kUnboxedFloat64x2;
+ default:
+ UNIMPLEMENTED();
+ return kTagged;
+ }
}
LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
+ // The smi index is either untagged (element size == 1), or it is left smi
+ // tagged (for all element sizes > 1).
+ // TODO(regis): Revisit and see if the index can be immediate.
+ locs->set_in(1, Location::WritableRegister());
+ if ((representation() == kUnboxedDouble) ||
+ (representation() == kUnboxedFloat32x4) ||
+ (representation() == kUnboxedInt32x4) ||
+ (representation() == kUnboxedFloat64x2)) {
+ locs->set_out(0, Location::RequiresFpuRegister());
+ } else {
+ locs->set_out(0, Location::RequiresRegister());
+ }
+ return locs;
}
void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register array = locs()->in(0).reg();
+ Location index = locs()->in(1);
+
+ Address element_address(kNoRegister, 0);
+ ASSERT(index.IsRegister()); // TODO(regis): Revisit.
+ // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+ // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+ // index is expected to be untagged before accessing.
+ ASSERT(kSmiTagShift == 1);
+ switch (index_scale()) {
+ case 1: {
+ __ SmiUntag(index.reg());
+ break;
+ }
+ case 2: {
+ break;
+ }
+ case 4: {
+ __ Lsl(index.reg(), index.reg(), 1);
+ break;
+ }
+ case 8: {
+ __ Lsl(index.reg(), index.reg(), 2);
+ break;
+ }
+ case 16: {
+ __ Lsl(index.reg(), index.reg(), 3);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+
+ if (!IsExternal()) {
+ ASSERT(this->array()->definition()->representation() == kTagged);
+ __ AddImmediate(index.reg(), index.reg(),
+ FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag, PP);
+ }
+ element_address = Address(array, index.reg(), UXTX, Address::Unscaled);
+
+ if ((representation() == kUnboxedDouble) ||
+ (representation() == kUnboxedMint) ||
+ (representation() == kUnboxedFloat32x4) ||
+ (representation() == kUnboxedInt32x4) ||
+ (representation() == kUnboxedFloat64x2)) {
+ const VRegister result = locs()->out(0).fpu_reg();
+ switch (class_id()) {
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
+ // TODO(zra): Add when we have simd.
+ UNIMPLEMENTED();
+ break;
+ case kTypedDataFloat32ArrayCid:
+ // Load single precision float.
+ // TODO(zra): Add when we add single precision floats.
+ UNIMPLEMENTED();
+ break;
+ case kTypedDataFloat64ArrayCid:
+ // Load double precision float.
+ __ fldrd(result, element_address);
+ break;
+ case kTypedDataFloat64x2ArrayCid:
+ case kTypedDataInt32x4ArrayCid:
+ case kTypedDataFloat32x4ArrayCid:
+ // TODO(zra): Add when we have simd.
+ UNIMPLEMENTED();
+ break;
+ }
+ return;
+ }
+
+ Register result = locs()->out(0).reg();
+ switch (class_id()) {
+ case kTypedDataInt8ArrayCid:
+ ASSERT(index_scale() == 1);
+ __ ldr(result, element_address, kByte);
+ __ SmiTag(result);
+ break;
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kOneByteStringCid:
+ ASSERT(index_scale() == 1);
+ __ ldr(result, element_address, kUnsignedByte);
+ __ SmiTag(result);
+ break;
+ case kTypedDataInt16ArrayCid:
+ __ ldr(result, element_address, kHalfword);
+ __ SmiTag(result);
+ break;
+ case kTypedDataUint16ArrayCid:
+ case kTwoByteStringCid:
+ __ ldr(result, element_address, kUnsignedHalfword);
+ __ SmiTag(result);
+ break;
+ case kTypedDataInt32ArrayCid:
+ __ ldr(result, element_address, kWord);
+ __ SmiTag(result);
+ break;
+ case kTypedDataUint32ArrayCid:
+ __ ldr(result, element_address, kUnsignedWord);
+ __ SmiTag(result);
+ break;
+ default:
+ ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+ __ ldr(result, element_address);
+ break;
+ }
}
@@ -597,16 +1136,21 @@
if (value()->IsSmiValue()) {
locs->set_in(2, Location::WritableRegister());
} else {
- // TODO(zra): Implement when we add fpu loads and stores.
+ // TODO(zra): Implement when we add simd loads and stores.
UNIMPLEMENTED();
}
break;
case kTypedDataFloat32ArrayCid:
+ // TODO(zra): Implement when we add float store.
+ UNIMPLEMENTED();
+ break;
case kTypedDataFloat64ArrayCid: // TODO(srdjan): Support Float64 constants.
+ locs->set_in(2, Location::RequiresFpuRegister());
+ break;
case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid:
case kTypedDataFloat64x2ArrayCid:
- // TODO(zra): Implement when we add fpu loads and stores.
+ // TODO(zra): Implement when we add simd loads and stores.
UNIMPLEMENTED();
break;
default:
@@ -729,17 +1273,25 @@
__ SmiUntag(value);
__ str(value, element_address);
} else {
- // TODO(zra): Implement when we add fpu loads and stores.
+ // TODO(zra): Implement when we add simd loads and stores.
UNIMPLEMENTED();
}
break;
}
case kTypedDataFloat32ArrayCid:
- case kTypedDataFloat64ArrayCid:
+ // TODO(zra): Implement when we add float store.
+ UNIMPLEMENTED();
+ break;
+ case kTypedDataFloat64ArrayCid: {
+ VRegister in2 = locs()->in(2).fpu_reg();
+ __ add(index.reg(), index.reg(), Operand(array));
+ __ StoreDToOffset(in2, index.reg(), 0);
+ break;
+ }
case kTypedDataFloat64x2ArrayCid:
case kTypedDataInt32x4ArrayCid:
case kTypedDataFloat32x4ArrayCid: {
- // TODO(zra): Implement when we add fpu loads and stores.
+ // TODO(zra): Implement when we add simd loads and stores.
UNIMPLEMENTED();
break;
}
@@ -880,7 +1432,8 @@
__ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid, PP);
// Could still be a regular array.
__ b(&check_array, LT);
- __ LoadFromOffset(temp_reg, value_reg, TypedData::length_offset());
+ __ LoadFieldFromOffset(
+ temp_reg, value_reg, TypedData::length_offset());
__ ldr(TMP, field_length_operand);
__ CompareRegisters(temp_reg, TMP);
__ b(&length_compared);
@@ -1129,14 +1682,17 @@
summary->set_in(0, Location::RequiresRegister());
if (IsUnboxedStore() && opt) {
- // TODO(zra): Implement when we add fpu loads and stores.
- UNIMPLEMENTED();
+ summary->set_in(1, Location::RequiresFpuRegister());
+ summary->AddTemp(Location::RequiresRegister());
+ summary->AddTemp(Location::RequiresRegister());
} else if (IsPotentialUnboxedStore()) {
summary->set_in(1, ShouldEmitStoreBarrier()
? Location::WritableRegister()
: Location::RequiresRegister());
summary->AddTemp(Location::RequiresRegister());
summary->AddTemp(Location::RequiresRegister());
+ summary->AddTemp(opt ? Location::RequiresFpuRegister()
+ : Location::FpuRegisterLocation(V1));
} else {
summary->set_in(1, ShouldEmitStoreBarrier()
? Location::WritableRegister()
@@ -1152,12 +1708,64 @@
Register instance_reg = locs()->in(0).reg();
if (IsUnboxedStore() && compiler->is_optimizing()) {
- UNIMPLEMENTED();
+ const VRegister value = locs()->in(1).fpu_reg();
+ const Register temp = locs()->temp(0).reg();
+ const Register temp2 = locs()->temp(1).reg();
+ const intptr_t cid = field().UnboxedFieldCid();
+
+ if (is_initialization_) {
+ const Class* cls = NULL;
+ switch (cid) {
+ case kDoubleCid:
+ cls = &compiler->double_class();
+ break;
+ // TODO(zra): Implement these when we add fpu loads and stores.
+ case kFloat32x4Cid:
+ case kFloat64x2Cid:
+ UNIMPLEMENTED();
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ StoreInstanceFieldSlowPath* slow_path =
+ new StoreInstanceFieldSlowPath(this, *cls);
+ compiler->AddSlowPathCode(slow_path);
+
+ __ TryAllocate(*cls,
+ slow_path->entry_label(),
+ temp,
+ temp2,
+ PP);
+ __ Bind(slow_path->exit_label());
+ __ mov(temp2, temp);
+ __ StoreIntoObject(instance_reg,
+ FieldAddress(instance_reg, offset_in_bytes_),
+ temp2);
+ } else {
+ __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+ }
+ switch (cid) {
+ case kDoubleCid:
+ __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
+ __ StoreDFieldToOffset(value, temp, Double::value_offset());
+ break;
+ case kFloat32x4Cid:
+ case kFloat64x2Cid:
+ UNIMPLEMENTED();
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ return;
}
if (IsPotentialUnboxedStore()) {
+ const Register value_reg = locs()->in(1).reg();
const Register temp = locs()->temp(0).reg();
const Register temp2 = locs()->temp(1).reg();
+ const VRegister fpu_temp = locs()->temp(2).fpu_reg();
Label store_pointer;
Label store_double;
@@ -1195,12 +1803,34 @@
locs()->live_registers()->Add(locs()->in(1));
}
- // TODO(zra): Implement these when we add fpu loads and stores.
{
__ Bind(&store_double);
- __ hlt(0); // Unimplemented.
+ Label copy_double;
+ StoreInstanceFieldSlowPath* slow_path =
+ new StoreInstanceFieldSlowPath(this, compiler->double_class());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+ __ CompareObject(temp, Object::null_object(), PP);
+ __ b(©_double, NE);
+
+ __ TryAllocate(compiler->double_class(),
+ slow_path->entry_label(),
+ temp,
+ temp2,
+ PP);
+ __ Bind(slow_path->exit_label());
+ __ mov(temp2, temp);
+ __ StoreIntoObject(instance_reg,
+ FieldAddress(instance_reg, offset_in_bytes_),
+ temp2);
+ __ Bind(©_double);
+ __ LoadDFieldFromOffset(fpu_temp, value_reg, Double::value_offset());
+ __ StoreDFieldToOffset(fpu_temp, temp, Double::value_offset());
+ __ b(&skip_store);
}
+ // TODO(zra): Implement these when we add simd loads and stores.
{
__ Bind(&store_float32x4);
__ hlt(0); // Unimplemented.
@@ -1284,13 +1914,29 @@
LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 3;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ summary->set_in(0, Location::RegisterLocation(R0));
+ summary->set_in(1, Location::RegisterLocation(R2));
+ summary->set_in(2, Location::RegisterLocation(R1));
+ summary->set_out(0, Location::RegisterLocation(R0));
+ return summary;
}
void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ ASSERT(locs()->in(0).reg() == R0); // Value.
+ ASSERT(locs()->in(1).reg() == R2); // Instantiator.
+ ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments.
+
+ compiler->GenerateInstanceOf(token_pos(),
+ deopt_id(),
+ type(),
+ negate_result(),
+ locs());
+ ASSERT(locs()->out(0).reg() == R0);
}
@@ -1318,6 +1964,38 @@
}
+class BoxDoubleSlowPath : public SlowPathCode {
+ public:
+ explicit BoxDoubleSlowPath(Instruction* instruction)
+ : instruction_(instruction) { }
+
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+ __ Comment("BoxDoubleSlowPath");
+ __ Bind(entry_label());
+ const Class& double_class = compiler->double_class();
+ const Code& stub =
+ Code::Handle(StubCode::GetAllocationStubForClass(double_class));
+ const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+
+ LocationSummary* locs = instruction_->locs();
+ locs->live_registers()->Remove(locs->out(0));
+
+ compiler->SaveLiveRegisters(locs);
+ compiler->GenerateCall(Scanner::kNoSourcePos, // No token position.
+ &label,
+ PcDescriptors::kOther,
+ locs);
+ __ mov(locs->out(0).reg(), R0);
+ compiler->RestoreLiveRegisters(locs);
+
+ __ b(exit_label());
+ }
+
+ private:
+ Instruction* instruction_;
+};
+
+
LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
@@ -1331,9 +2009,10 @@
locs->set_in(0, Location::RequiresRegister());
if (IsUnboxedLoad() && opt) {
- // TODO(zra): Implement when we add fpu loads and stores.
- UNIMPLEMENTED();
+ locs->AddTemp(Location::RequiresRegister());
} else if (IsPotentialUnboxedLoad()) {
+ locs->AddTemp(opt ? Location::RequiresFpuRegister()
+ : Location::FpuRegisterLocation(V1));
locs->AddTemp(Location::RequiresRegister());
}
locs->set_out(0, Location::RequiresRegister());
@@ -1344,13 +2023,30 @@
void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
Register instance_reg = locs()->in(0).reg();
if (IsUnboxedLoad() && compiler->is_optimizing()) {
- UNIMPLEMENTED();
+ const VRegister result = locs()->out(0).fpu_reg();
+ const Register temp = locs()->temp(0).reg();
+ __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+ const intptr_t cid = field()->UnboxedFieldCid();
+ switch (cid) {
+ case kDoubleCid:
+ __ Comment("UnboxedDoubleLoadFieldInstr");
+ __ LoadDFieldFromOffset(result, temp, Double::value_offset());
+ break;
+ case kFloat32x4Cid:
+ case kFloat64x2Cid:
+ UNIMPLEMENTED();
+ break;
+ default:
+ UNREACHABLE();
+ }
+ return;
}
Label done;
Register result_reg = locs()->out(0).reg();
if (IsPotentialUnboxedLoad()) {
- const Register temp = locs()->temp(0).reg();
+ const Register temp = locs()->temp(1).reg();
+ const VRegister value = locs()->temp(0).fpu_reg();
Label load_pointer;
Label load_double;
@@ -1386,12 +2082,24 @@
locs()->live_registers()->Add(locs()->in(0));
}
- // TODO(zra): Implement these when we add fpu loads and stores.
{
__ Bind(&load_double);
- __ hlt(0); // Unimplemented.
+ BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
+ compiler->AddSlowPathCode(slow_path);
+
+ __ TryAllocate(compiler->double_class(),
+ slow_path->entry_label(),
+ result_reg,
+ temp,
+ PP);
+ __ Bind(slow_path->exit_label());
+ __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+ __ LoadDFieldFromOffset(value, temp, Double::value_offset());
+ __ StoreDFieldToOffset(value, result_reg, Double::value_offset());
+ __ b(&done);
}
+ // TODO(zra): Implement these when we add simd loads and stores.
{
__ Bind(&load_float32x4);
__ hlt(0); // Unimplemented.
@@ -1404,20 +2112,39 @@
__ Bind(&load_pointer);
}
- __ LoadFromOffset(
- result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
+ __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes());
__ Bind(&done);
}
LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(0, Location::RegisterLocation(R0));
+ locs->set_out(0, Location::RegisterLocation(R0));
+ return locs;
}
void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register instantiator_reg = locs()->in(0).reg();
+ Register result_reg = locs()->out(0).reg();
+
+ // 'instantiator_reg' is the instantiator TypeArguments object (or null).
+ // A runtime call to instantiate the type is required.
+ __ PushObject(Object::ZoneHandle(), PP); // Make room for the result.
+ __ PushObject(type(), PP);
+ __ Push(instantiator_reg); // Push instantiator type arguments.
+ compiler->GenerateRuntimeCall(token_pos(),
+ deopt_id(),
+ kInstantiateTypeRuntimeEntry,
+ 2,
+ locs());
+ __ Drop(2); // Drop instantiator and uninstantiated type.
+ __ Pop(result_reg); // Pop instantiated type.
+ ASSERT(instantiator_reg == result_reg);
}
@@ -1668,47 +2395,537 @@
}
+static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
+ BinarySmiOpInstr* shift_left) {
+ const bool is_truncating = shift_left->is_truncating();
+ const LocationSummary& locs = *shift_left->locs();
+ Register left = locs.in(0).reg();
+ Register result = locs.out(0).reg();
+ Label* deopt = shift_left->CanDeoptimize() ?
+ compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+ : NULL;
+ if (locs.in(1).IsConstant()) {
+ const Object& constant = locs.in(1).constant();
+ ASSERT(constant.IsSmi());
+ // Immediate shift operation takes 6 bits for the count.
+ const intptr_t kCountLimit = 0x3F;
+ const intptr_t value = Smi::Cast(constant).Value();
+ if (value == 0) {
+ __ mov(result, left);
+ } else if ((value < 0) || (value >= kCountLimit)) {
+ // This condition may not be known earlier in some cases because
+ // of constant propagation, inlining, etc.
+ if ((value >= kCountLimit) && is_truncating) {
+ __ mov(result, ZR);
+ } else {
+ // Result is Mint or exception.
+ __ b(deopt);
+ }
+ } else {
+ if (!is_truncating) {
+ // Check for overflow (preserve left).
+ __ Lsl(TMP, left, value);
+ __ cmp(left, Operand(TMP, ASR, value));
+ __ b(deopt, NE); // Overflow.
+ }
+ // Shift for result now we know there is no overflow.
+ __ Lsl(result, left, value);
+ }
+ return;
+ }
+
+ // Right (locs.in(1)) is not constant.
+ Register right = locs.in(1).reg();
+ Range* right_range = shift_left->right()->definition()->range();
+ if (shift_left->left()->BindsToConstant() && !is_truncating) {
+ // TODO(srdjan): Implement code below for is_truncating().
+ // If left is constant, we know the maximal allowed size for right.
+ const Object& obj = shift_left->left()->BoundConstant();
+ if (obj.IsSmi()) {
+ const intptr_t left_int = Smi::Cast(obj).Value();
+ if (left_int == 0) {
+ __ CompareRegisters(right, ZR);
+ __ b(deopt, MI);
+ __ mov(result, ZR);
+ return;
+ }
+ const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
+ const bool right_needs_check =
+ (right_range == NULL) ||
+ !right_range->IsWithin(0, max_right - 1);
+ if (right_needs_check) {
+ __ CompareImmediate(right,
+ reinterpret_cast<int64_t>(Smi::New(max_right)), PP);
+ __ b(deopt, CS);
+ }
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into TMP.
+ __ lslv(result, left, TMP);
+ }
+ return;
+ }
+
+ const bool right_needs_check =
+ (right_range == NULL) || !right_range->IsWithin(0, (Smi::kBits - 1));
+ if (is_truncating) {
+ if (right_needs_check) {
+ const bool right_may_be_negative =
+ (right_range == NULL) ||
+ !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+ if (right_may_be_negative) {
+ ASSERT(shift_left->CanDeoptimize());
+ __ CompareRegisters(right, ZR);
+ __ b(deopt, MI);
+ }
+
+ __ CompareImmediate(
+ right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
+ __ csel(result, ZR, result, CS);
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into TMP.
+ __ lslv(TMP, left, TMP);
+ __ csel(result, TMP, result, CC);
+ } else {
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into TMP.
+ __ lslv(result, left, TMP);
+ }
+ } else {
+ if (right_needs_check) {
+ ASSERT(shift_left->CanDeoptimize());
+ __ CompareImmediate(
+ right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
+ __ b(deopt, CS);
+ }
+ // Left is not a constant.
+ // Check if count too large for handling it inlined.
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into IP.
+ // Overflow test (preserve left, right, and IP);
+ Register temp = locs.temp(0).reg();
+ __ lslv(temp, left, TMP);
+ __ asrv(TMP2, temp, TMP);
+ __ CompareRegisters(left, TMP2);
+ __ b(deopt, NE); // Overflow.
+ // Shift for result now we know there is no overflow.
+ __ lslv(result, left, TMP);
+ }
+}
+
+
LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ if (op_kind() == Token::kTRUNCDIV) {
+ summary->set_in(0, Location::RequiresRegister());
+ if (RightIsPowerOfTwoConstant()) {
+ ConstantInstr* right_constant = right()->definition()->AsConstant();
+ summary->set_in(1, Location::Constant(right_constant->value()));
+ } else {
+ summary->set_in(1, Location::RequiresRegister());
+ }
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+ }
+ if (op_kind() == Token::kMOD) {
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+ }
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+ if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+ (op_kind() == Token::kSHR)) {
+ summary->AddTemp(Location::RequiresRegister());
+ }
+ // We make use of 3-operand instructions by not requiring result register
+ // to be identical to first input register as on Intel.
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
}
void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ if (op_kind() == Token::kSHL) {
+ EmitSmiShiftLeft(compiler, this);
+ return;
+ }
+
+ ASSERT(!is_truncating());
+ const Register left = locs()->in(0).reg();
+ const Register result = locs()->out(0).reg();
+ Label* deopt = NULL;
+ if (CanDeoptimize()) {
+ deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+ }
+
+ if (locs()->in(1).IsConstant()) {
+ const Object& constant = locs()->in(1).constant();
+ ASSERT(constant.IsSmi());
+ int64_t imm = reinterpret_cast<int64_t>(constant.raw());
+ switch (op_kind()) {
+ case Token::kSUB: {
+ imm = -imm; // TODO(regis): What if deopt != NULL && imm == 0x80000000?
+ // Fall through.
+ }
+ case Token::kADD: {
+ if (deopt == NULL) {
+ __ AddImmediate(result, left, imm, PP);
+ } else {
+ __ AddImmediateSetFlags(result, left, imm, PP);
+ __ b(deopt, VS); }
+ break;
+ }
+ case Token::kMUL: {
+ // Keep left value tagged and untag right value.
+ const intptr_t value = Smi::Cast(constant).Value();
+ if (deopt == NULL) {
+ if (value == 2) {
+ __ Lsl(result, left, 1);
+ } else {
+ __ LoadImmediate(TMP, value, PP);
+ __ mul(result, left, TMP);
+ }
+ } else {
+ if (value == 2) {
+ __ Asr(TMP, left, 63); // TMP = sign of left.
+ __ Lsl(result, left, 1);
+ // TMP: result bits 32..63.
+ __ cmp(TMP, Operand(result, ASR, 63));
+ __ b(deopt, NE);
+ } else {
+ __ LoadImmediate(TMP, value, PP);
+ __ mul(result, left, TMP);
+ __ smulh(TMP, left, TMP);
+ // TMP: result bits 64..127.
+ __ cmp(TMP, Operand(result, ASR, 63));
+ __ b(deopt, NE);
+ }
+ }
+ break;
+ }
+ case Token::kTRUNCDIV: {
+ const intptr_t value = Smi::Cast(constant).Value();
+ if (value == 1) {
+ __ mov(result, left);
+ break;
+ } else if (value == -1) {
+ // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+ // case we cannot negate the result.
+ __ CompareImmediate(left, 0x8000000000000000LL, kNoPP);
+ __ b(deopt, EQ);
+ __ sub(result, ZR, Operand(left));
+ break;
+ }
+ ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
+ const intptr_t shift_count =
+ Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
+ ASSERT(kSmiTagSize == 1);
+ __ Asr(TMP, left, 63);
+ ASSERT(shift_count > 1); // 1, -1 case handled above.
+ const Register temp = TMP2;
+ __ add(temp, left, Operand(TMP, LSR, 64 - shift_count));
+ ASSERT(shift_count > 0);
+ __ Asr(result, temp, shift_count);
+ if (value < 0) {
+ __ sub(result, ZR, Operand(result));
+ }
+ __ SmiTag(result);
+ break;
+ }
+ case Token::kBIT_AND:
+ // No overflow check.
+ __ AndImmediate(result, left, imm, PP);
+ break;
+ case Token::kBIT_OR:
+ // No overflow check.
+ __ OrImmediate(result, left, imm, PP);
+ break;
+ case Token::kBIT_XOR:
+ // No overflow check.
+ __ XorImmediate(result, left, imm, PP);
+ break;
+ case Token::kSHR: {
+ // Asr operation masks the count to 6 bits.
+ const intptr_t kCountLimit = 0x3F;
+ intptr_t value = Smi::Cast(constant).Value();
+
+ if (value == 0) {
+ // TODO(vegorov): should be handled outside.
+ __ mov(result, left);
+ break;
+ } else if (value < 0) {
+ // TODO(vegorov): should be handled outside.
+ __ b(deopt);
+ break;
+ }
+
+ value = value + kSmiTagSize;
+ if (value >= kCountLimit) {
+ value = kCountLimit;
+ }
+
+ __ Asr(result, left, value);
+ __ SmiTag(result);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ break;
+ }
+ return;
+ }
+
+ Register right = locs()->in(1).reg();
+ Range* right_range = this->right()->definition()->range();
+ switch (op_kind()) {
+ case Token::kADD: {
+ if (deopt == NULL) {
+ __ add(result, left, Operand(right));
+ } else {
+ __ adds(result, left, Operand(right));
+ __ b(deopt, VS);
+ }
+ break;
+ }
+ case Token::kSUB: {
+ if (deopt == NULL) {
+ __ sub(result, left, Operand(right));
+ } else {
+ __ subs(result, left, Operand(right));
+ __ b(deopt, VS);
+ }
+ break;
+ }
+ case Token::kMUL: {
+ __ Asr(TMP, left, kSmiTagSize); // SmiUntag left into TMP.
+ if (deopt == NULL) {
+ __ mul(result, TMP, right);
+ } else {
+ __ mul(result, TMP, right);
+ __ smulh(TMP, TMP, right);
+ // TMP: result bits 64..127.
+ __ cmp(TMP, Operand(result, ASR, 63));
+ __ b(deopt, NE);
+ }
+ break;
+ }
+ case Token::kBIT_AND: {
+ // No overflow check.
+ __ and_(result, left, Operand(right));
+ break;
+ }
+ case Token::kBIT_OR: {
+ // No overflow check.
+ __ orr(result, left, Operand(right));
+ break;
+ }
+ case Token::kBIT_XOR: {
+ // No overflow check.
+ __ eor(result, left, Operand(right));
+ break;
+ }
+ case Token::kTRUNCDIV: {
+ if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
+ // Handle divide by zero in runtime.
+ __ CompareRegisters(right, ZR);
+ __ b(deopt, EQ);
+ }
+ const Register temp = TMP2;
+ __ Asr(temp, left, kSmiTagSize); // SmiUntag left into temp.
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into IP.
+
+ __ sdiv(result, temp, TMP);
+
+ // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+ // case we cannot tag the result.
+ __ CompareImmediate(result, 0x4000000000000000LL, kNoPP);
+ __ b(deopt, EQ);
+ __ SmiTag(result);
+ break;
+ }
+ case Token::kMOD: {
+ if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
+ // Handle divide by zero in runtime.
+ __ CompareRegisters(right, ZR);
+ __ b(deopt, EQ);
+ }
+ const Register temp = TMP2;
+ __ Asr(temp, left, kSmiTagSize); // SmiUntag left into temp.
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into IP.
+
+ __ sdiv(result, temp, TMP);
+
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into IP.
+ __ msub(result, TMP, result, temp); // result <- left - right * result
+ __ SmiTag(result);
+ // res = left % right;
+ // if (res < 0) {
+ // if (right < 0) {
+ // res = res - right;
+ // } else {
+ // res = res + right;
+ // }
+ // }
+ Label done;
+ __ CompareRegisters(result, ZR);
+ __ b(&done, GE);
+ // Result is negative, adjust it.
+ __ CompareRegisters(right, ZR);
+ __ sub(TMP, result, Operand(right));
+ __ add(result, result, Operand(right));
+ __ csel(result, TMP, result, LT);
+ __ Bind(&done);
+ break;
+ }
+ case Token::kSHR: {
+ if (CanDeoptimize()) {
+ __ CompareRegisters(right, ZR);
+ __ b(deopt, LT);
+ }
+ __ Asr(TMP, right, kSmiTagSize); // SmiUntag right into TMP.
+ // sarl operation masks the count to 6 bits.
+ const intptr_t kCountLimit = 0x3F;
+ if ((right_range == NULL) ||
+ !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+ __ LoadImmediate(TMP2, kCountLimit, PP);
+ __ CompareRegisters(TMP, TMP2);
+ __ csel(TMP, TMP2, TMP, GT);
+ }
+ Register temp = locs()->temp(0).reg();
+ __ Asr(temp, left, kSmiTagSize); // SmiUntag left into temp.
+ __ Asr(result, temp, TMP);
+ __ SmiTag(result);
+ break;
+ }
+ case Token::kDIV: {
+ // Dispatches to 'Double./'.
+ // TODO(srdjan): Implement as conversion to double and double division.
+ UNREACHABLE();
+ break;
+ }
+ case Token::kOR:
+ case Token::kAND: {
+ // Flow graph builder has dissected this operation to guarantee correct
+ // behavior (short-circuit evaluation).
+ UNREACHABLE();
+ break;
+ }
+ default:
+ UNREACHABLE();
+ break;
+ }
}
LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ intptr_t left_cid = left()->Type()->ToCid();
+ intptr_t right_cid = right()->Type()->ToCid();
+ ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RequiresRegister());
+ return summary;
}
void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Label* deopt = compiler->AddDeoptStub(deopt_id(),
+ ICData::kDeoptBinaryDoubleOp);
+ intptr_t left_cid = left()->Type()->ToCid();
+ intptr_t right_cid = right()->Type()->ToCid();
+ Register left = locs()->in(0).reg();
+ Register right = locs()->in(1).reg();
+ if (left_cid == kSmiCid) {
+ __ tsti(right, kSmiTagMask);
+ } else if (right_cid == kSmiCid) {
+ __ tsti(left, kSmiTagMask);
+ } else {
+ __ orr(TMP, left, Operand(right));
+ __ tsti(TMP, kSmiTagMask);
+ }
+ __ b(deopt, EQ);
}
LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs,
+ kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_temp(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
}
void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
+ compiler->AddSlowPathCode(slow_path);
+
+ const Register out_reg = locs()->out(0).reg();
+ const VRegister value = locs()->in(0).fpu_reg();
+
+ __ TryAllocate(compiler->double_class(),
+ slow_path->entry_label(),
+ out_reg,
+ locs()->temp(0).reg(),
+ PP);
+ __ Bind(slow_path->exit_label());
+ __ StoreDFieldToOffset(value, out_reg, Double::value_offset());
}
LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresFpuRegister());
+ return summary;
}
void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ CompileType* value_type = value()->Type();
+ const intptr_t value_cid = value_type->ToCid();
+ const Register value = locs()->in(0).reg();
+ const VRegister result = locs()->out(0).fpu_reg();
+
+ if (value_cid == kDoubleCid) {
+ __ LoadDFieldFromOffset(result, value, Double::value_offset());
+ } else if (value_cid == kSmiCid) {
+ __ Asr(TMP, value, kSmiTagSize); // Untag input before conversion.
+ __ scvtfd(result, TMP);
+ } else {
+ Label* deopt = compiler->AddDeoptStub(deopt_id_,
+ ICData::kDeoptBinaryDoubleOp);
+ if (value_type->is_nullable() &&
+ (value_type->ToNullableCid() == kDoubleCid)) {
+ __ CompareObject(value, Object::null_object(), PP);
+ __ b(deopt, EQ);
+ // It must be double now.
+ __ LoadDFieldFromOffset(result, value, Double::value_offset());
+ } else {
+ Label is_smi, done;
+ __ tsti(value, kSmiTagMask);
+ __ b(&is_smi, EQ);
+ __ CompareClassId(value, kDoubleCid);
+ __ b(deopt, NE);
+ __ LoadDFieldFromOffset(result, value, Double::value_offset());
+ __ b(&done);
+ __ Bind(&is_smi);
+ __ Asr(TMP, value, kSmiTagSize); // Copy and untag.
+ __ scvtfd(result, TMP);
+ __ Bind(&done);
+ }
+ }
}
@@ -1779,13 +2996,28 @@
LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresFpuRegister());
+ summary->set_in(1, Location::RequiresFpuRegister());
+ summary->set_out(0, Location::RequiresFpuRegister());
+ return summary;
}
void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ const VRegister left = locs()->in(0).fpu_reg();
+ const VRegister right = locs()->in(1).fpu_reg();
+ const VRegister result = locs()->out(0).fpu_reg();
+ switch (op_kind()) {
+ case Token::kADD: __ faddd(result, left, right); break;
+ case Token::kSUB: __ fsubd(result, left, right); break;
+ case Token::kMUL: __ fmuld(result, left, right); break;
+ case Token::kDIV: __ fdivd(result, left, right); break;
+ default: UNREACHABLE();
+ }
}
@@ -2147,13 +3379,36 @@
LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ // We make use of 3-operand instructions by not requiring result register
+ // to be identical to first input register as on Intel.
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
}
void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register value = locs()->in(0).reg();
+ Register result = locs()->out(0).reg();
+ switch (op_kind()) {
+ case Token::kNEGATE: {
+ Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+ __ subs(result, ZR, Operand(value));
+ __ b(deopt, VS);
+ break;
+ }
+ case Token::kBIT_NOT:
+ __ mvn(result, value);
+ // Remove inverted smi-tag.
+ __ andi(result, result, ~kSmiTagMask);
+ break;
+ default:
+ UNREACHABLE();
+ }
}
@@ -2246,13 +3501,51 @@
LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ // Only use this instruction in optimized code.
+ ASSERT(opt);
+ const intptr_t kNumInputs = 1;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+ if (representation() == kUnboxedDouble) {
+ if (index() == 0) {
+ summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+ Location::Any()));
+ } else {
+ ASSERT(index() == 1);
+ summary->set_in(0, Location::Pair(Location::Any(),
+ Location::RequiresFpuRegister()));
+ }
+ summary->set_out(0, Location::RequiresFpuRegister());
+ } else {
+ ASSERT(representation() == kTagged);
+ if (index() == 0) {
+ summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+ Location::Any()));
+ } else {
+ ASSERT(index() == 1);
+ summary->set_in(0, Location::Pair(Location::Any(),
+ Location::RequiresRegister()));
+ }
+ summary->set_out(0, Location::RequiresRegister());
+ }
+ return summary;
}
void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ ASSERT(locs()->in(0).IsPairLocation());
+ PairLocation* pair = locs()->in(0).AsPairLocation();
+ Location in_loc = pair->At(index());
+ if (representation() == kUnboxedDouble) {
+ VRegister out = locs()->out(0).fpu_reg();
+ VRegister in = in_loc.fpu_reg();
+ __ fmovdd(out, in);
+ } else {
+ ASSERT(representation() == kTagged);
+ Register out = locs()->out(0).reg();
+ Register in = in_loc.reg();
+ __ mov(out, in);
+ }
}
@@ -2269,13 +3562,45 @@
LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ return MakeCallSummary();
}
void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Label* deopt = compiler->AddDeoptStub(
+ deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
+ if (ic_data().NumberOfChecks() == 0) {
+ __ b(deopt);
+ return;
+ }
+ ASSERT(ic_data().NumArgsTested() == 1);
+ if (!with_checks()) {
+ ASSERT(ic_data().HasOneTarget());
+ const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
+ compiler->GenerateStaticCall(deopt_id(),
+ instance_call()->token_pos(),
+ target,
+ instance_call()->ArgumentCount(),
+ instance_call()->argument_names(),
+ locs());
+ return;
+ }
+
+ // Load receiver into R0.
+ __ LoadFromOffset(
+ R0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize);
+
+ LoadValueCid(compiler, R2, R0,
+ (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
+
+ compiler->EmitTestAndCall(ic_data(),
+ R2, // Class id register.
+ instance_call()->ArgumentCount(),
+ instance_call()->argument_names(),
+ deopt,
+ deopt_id(),
+ instance_call()->token_pos(),
+ locs());
}
@@ -2293,35 +3618,127 @@
LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ if (!IsNullCheck()) {
+ summary->AddTemp(Location::RequiresRegister());
+ }
+ return summary;
}
void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+ ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
+ if (IsNullCheck()) {
+ Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
+ __ CompareObject(locs()->in(0).reg(), Object::null_object(), PP);
+ __ b(deopt, EQ);
+ return;
+ }
+
+ ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) ||
+ (unary_checks().NumberOfChecks() > 1));
+ Register value = locs()->in(0).reg();
+ Register temp = locs()->temp(0).reg();
+ Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
+ Label is_ok;
+ intptr_t cix = 0;
+ if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
+ __ tsti(value, kSmiTagMask);
+ __ b(&is_ok, EQ);
+ cix++; // Skip first check.
+ } else {
+ __ tsti(value, kSmiTagMask);
+ __ b(deopt, EQ);
+ }
+ __ LoadClassId(temp, value);
+ const intptr_t num_checks = unary_checks().NumberOfChecks();
+ for (intptr_t i = cix; i < num_checks; i++) {
+ ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+ __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i), PP);
+ if (i == (num_checks - 1)) {
+ __ b(deopt, NE);
+ } else {
+ __ b(&is_ok, EQ);
+ }
+ }
+ __ Bind(&is_ok);
}
LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ return summary;
}
void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register value = locs()->in(0).reg();
+ Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
+ __ tsti(value, kSmiTagMask);
+ __ b(deopt, NE);
}
LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
+ locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+ return locs;
}
void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Label* deopt = compiler->AddDeoptStub(deopt_id(),
+ ICData::kDeoptCheckArrayBound);
+
+ Location length_loc = locs()->in(kLengthPos);
+ Location index_loc = locs()->in(kIndexPos);
+
+ if (length_loc.IsConstant() && index_loc.IsConstant()) {
+ // TODO(srdjan): remove this code once failures are fixed.
+ if ((Smi::Cast(length_loc.constant()).Value() >
+ Smi::Cast(index_loc.constant()).Value()) &&
+ (Smi::Cast(index_loc.constant()).Value() >= 0)) {
+ // This CheckArrayBoundInstr should have been eliminated.
+ return;
+ }
+ ASSERT((Smi::Cast(length_loc.constant()).Value() <=
+ Smi::Cast(index_loc.constant()).Value()) ||
+ (Smi::Cast(index_loc.constant()).Value() < 0));
+ // Unconditionally deoptimize for constant bounds checks because they
+ // only occur only when index is out-of-bounds.
+ __ b(deopt);
+ return;
+ }
+
+ if (index_loc.IsConstant()) {
+ Register length = length_loc.reg();
+ const Smi& index = Smi::Cast(index_loc.constant());
+ __ CompareImmediate(length, reinterpret_cast<int64_t>(index.raw()), PP);
+ __ b(deopt, LS);
+ } else if (length_loc.IsConstant()) {
+ const Smi& length = Smi::Cast(length_loc.constant());
+ Register index = index_loc.reg();
+ __ CompareImmediate(index, reinterpret_cast<int64_t>(length.raw()), PP);
+ __ b(deopt, CS);
+ } else {
+ Register length = length_loc.reg();
+ Register index = index_loc.reg();
+ __ CompareRegisters(index, length);
+ __ b(deopt, CS);
+ }
}
@@ -2477,44 +3894,6 @@
}
-static Condition NegateCondition(Condition condition) {
- switch (condition) {
- case EQ: return NE;
- case NE: return EQ;
- case LT: return GE;
- case LE: return GT;
- case GT: return LE;
- case GE: return LT;
- case CC: return CS;
- case LS: return HI;
- case HI: return LS;
- case CS: return CC;
- default:
- UNREACHABLE();
- return EQ;
- }
-}
-
-
-static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
- Condition true_condition,
- BranchLabels labels) {
- if (labels.fall_through == labels.false_label) {
- // If the next block is the false successor we will fall through to it.
- __ b(labels.true_label, true_condition);
- } else {
- // If the next block is not the false successor we will branch to it.
- Condition false_condition = NegateCondition(true_condition);
- __ b(labels.false_label, false_condition);
-
- // Fall through or jump to the true successor.
- if (labels.fall_through != labels.true_label) {
- __ b(labels.true_label);
- }
- }
-}
-
-
LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index b362d88..8a4c801 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -146,6 +146,36 @@
}
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+ const intptr_t kNumInputs = 0;
+ const intptr_t kNumTemps = (constant_address() == 0) ? 1 : 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_out(0, Location::RequiresFpuRegister());
+ if (kNumTemps == 1) {
+ locs->set_temp(0, Location::RequiresRegister());
+ }
+ return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ // The register allocator drops constant definitions that have no uses.
+ if (!locs()->out(0).IsInvalid()) {
+ XmmRegister result = locs()->out(0).fpu_reg();
+ if (constant_address() == 0) {
+ Register boxed = locs()->temp(0).reg();
+ __ LoadObjectSafely(boxed, value());
+ __ movsd(result, FieldAddress(boxed, Double::value_offset()));
+ } else if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+ __ xorps(result, result);
+ } else {
+ __ movsd(result, Address::Absolute(constant_address()));
+ }
+ }
+}
+
+
LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 0;
@@ -3260,7 +3290,8 @@
void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t value_cid = value()->Type()->ToCid();
+ CompileType* value_type = value()->Type();
+ const intptr_t value_cid = value_type->ToCid();
const Register value = locs()->in(0).reg();
const XmmRegister result = locs()->out(0).fpu_reg();
@@ -3273,18 +3304,28 @@
Label* deopt = compiler->AddDeoptStub(deopt_id_,
ICData::kDeoptBinaryDoubleOp);
Register temp = locs()->temp(0).reg();
- Label is_smi, done;
- __ testl(value, Immediate(kSmiTagMask));
- __ j(ZERO, &is_smi);
- __ CompareClassId(value, kDoubleCid, temp);
- __ j(NOT_EQUAL, deopt);
- __ movsd(result, FieldAddress(value, Double::value_offset()));
- __ jmp(&done);
- __ Bind(&is_smi);
- __ movl(temp, value);
- __ SmiUntag(temp);
- __ cvtsi2sd(result, temp);
- __ Bind(&done);
+ if (value_type->is_nullable() &&
+ (value_type->ToNullableCid() == kDoubleCid)) {
+ const Immediate& raw_null =
+ Immediate(reinterpret_cast<intptr_t>(Object::null()));
+ __ cmpl(value, raw_null);
+ __ j(EQUAL, deopt);
+ // It must be double now.
+ __ movsd(result, FieldAddress(value, Double::value_offset()));
+ } else {
+ Label is_smi, done;
+ __ testl(value, Immediate(kSmiTagMask));
+ __ j(ZERO, &is_smi);
+ __ CompareClassId(value, kDoubleCid, temp);
+ __ j(NOT_EQUAL, deopt);
+ __ movsd(result, FieldAddress(value, Double::value_offset()));
+ __ jmp(&done);
+ __ Bind(&is_smi);
+ __ movl(temp, value);
+ __ SmiUntag(temp);
+ __ cvtsi2sd(result, temp);
+ __ Bind(&done);
+ }
}
}
@@ -4499,8 +4540,7 @@
LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
- if ((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos)) {
+ if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 1;
LocationSummary* summary =
@@ -4512,23 +4552,32 @@
summary->set_out(0, Location::FpuRegisterLocation(XMM1));
return summary;
}
- ASSERT(kind() == MethodRecognizer::kMathSqrt);
+ ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+ (kind() == MathUnaryInstr::kDoubleSquare));
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
summary->set_in(0, Location::RequiresFpuRegister());
- summary->set_out(0, Location::RequiresFpuRegister());
+ if (kind() == MathUnaryInstr::kDoubleSquare) {
+ summary->set_out(0, Location::SameAsFirstInput());
+ } else {
+ summary->set_out(0, Location::RequiresFpuRegister());
+ }
return summary;
}
void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- if (kind() == MethodRecognizer::kMathSqrt) {
+ if (kind() == MathUnaryInstr::kSqrt) {
__ sqrtsd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+ } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+ XmmRegister value_reg = locs()->in(0).fpu_reg();
+ __ mulsd(value_reg, value_reg);
+ ASSERT(value_reg == locs()->out(0).fpu_reg());
} else {
- ASSERT((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos));
+ ASSERT((kind() == MathUnaryInstr::kSin) ||
+ (kind() == MathUnaryInstr::kCos));
// Save ESP.
__ movl(locs()->temp(0).reg(), ESP);
__ ReserveAlignedFrameSpace(kDoubleSize * InputCount());
@@ -5279,13 +5328,6 @@
Location index_loc = locs()->in(kIndexPos);
if (length_loc.IsConstant() && index_loc.IsConstant()) {
- // TODO(srdjan): remove this code once failures are fixed.
- if ((Smi::Cast(length_loc.constant()).Value() >
- Smi::Cast(index_loc.constant()).Value()) &&
- (Smi::Cast(index_loc.constant()).Value() >= 0)) {
- // This CheckArrayBoundInstr should have been eliminated.
- return;
- }
ASSERT((Smi::Cast(length_loc.constant()).Value() <=
Smi::Cast(index_loc.constant()).Value()) ||
(Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 8ace94f..7f3f531 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -299,6 +299,30 @@
}
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+ const intptr_t kNumInputs = 0;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_out(0, Location::RequiresFpuRegister());
+ locs->set_temp(0, Location::RequiresRegister());
+ return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ // The register allocator drops constant definitions that have no uses.
+ if (!locs()->out(0).IsInvalid()) {
+ ASSERT(value().IsDouble());
+ const Register const_value = locs()->temp(0).reg();
+ const DRegister result = locs()->out(0).fpu_reg();
+ __ LoadObject(const_value, value());
+ __ LoadDFromOffset(result, const_value,
+ Double::value_offset() - kHeapObjectTag);
+ }
+}
+
+
LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 0;
@@ -3018,7 +3042,8 @@
void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t value_cid = value()->Type()->ToCid();
+ CompileType* value_type = value()->Type();
+ const intptr_t value_cid = value_type->ToCid();
const Register value = locs()->in(0).reg();
const DRegister result = locs()->out(0).fpu_reg();
@@ -3031,20 +3056,29 @@
} else {
Label* deopt = compiler->AddDeoptStub(deopt_id_,
ICData::kDeoptBinaryDoubleOp);
- Label is_smi, done;
+ if (value_type->is_nullable() &&
+ (value_type->ToNullableCid() == kDoubleCid)) {
+ __ BranchEqual(value, reinterpret_cast<int32_t>(Object::null()), deopt);
+ // It must be double now.
+ __ LoadDFromOffset(result, value,
+ Double::value_offset() - kHeapObjectTag);
+ } else {
+ Label is_smi, done;
- __ andi(CMPRES1, value, Immediate(kSmiTagMask));
- __ beq(CMPRES1, ZR, &is_smi);
- __ LoadClassId(CMPRES1, value);
- __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
- __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
- __ b(&done);
- __ Bind(&is_smi);
- // TODO(regis): Why do we preserve value here but not above?
- __ sra(TMP, value, 1);
- __ mtc1(TMP, STMP1);
- __ cvtdw(result, STMP1);
- __ Bind(&done);
+ __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+ __ beq(CMPRES1, ZR, &is_smi);
+ __ LoadClassId(CMPRES1, value);
+ __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
+ __ LoadDFromOffset(result, value,
+ Double::value_offset() - kHeapObjectTag);
+ __ b(&done);
+ __ Bind(&is_smi);
+ // TODO(regis): Why do we preserve value here but not above?
+ __ sra(TMP, value, 1);
+ __ mtc1(TMP, STMP1);
+ __ cvtdw(result, STMP1);
+ __ Bind(&done);
+ }
}
}
@@ -3478,8 +3512,7 @@
LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
- if ((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos)) {
+ if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3488,6 +3521,8 @@
summary->set_out(0, Location::FpuRegisterLocation(D0));
return summary;
}
+ ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+ (kind() == MathUnaryInstr::kDoubleSquare));
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
@@ -3499,8 +3534,12 @@
void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- if (kind() == MethodRecognizer::kMathSqrt) {
+ if (kind() == MathUnaryInstr::kSqrt) {
__ sqrtd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+ } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+ DRegister val = locs()->in(0).fpu_reg();
+ DRegister result = locs()->out(0).fpu_reg();
+ __ muld(result, val, val);
} else {
__ CallRuntime(TargetFunction(), InputCount());
}
@@ -4163,13 +4202,6 @@
Location index_loc = locs()->in(kIndexPos);
if (length_loc.IsConstant() && index_loc.IsConstant()) {
- // TODO(srdjan): remove this code once failures are fixed.
- if ((Smi::Cast(length_loc.constant()).Value() >
- Smi::Cast(index_loc.constant()).Value()) &&
- (Smi::Cast(index_loc.constant()).Value() >= 0)) {
- // This CheckArrayBoundInstr should have been eliminated.
- return;
- }
ASSERT((Smi::Cast(length_loc.constant()).Value() <=
Smi::Cast(index_loc.constant()).Value()) ||
(Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 57a4583..3574404 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -228,6 +228,30 @@
}
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+ const intptr_t kNumInputs = 0;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_out(0, Location::RequiresFpuRegister());
+ return locs;
+}
+
+
+void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ // The register allocator drops constant definitions that have no uses.
+ if (!locs()->out(0).IsInvalid()) {
+ XmmRegister result = locs()->out(0).fpu_reg();
+ if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+ __ xorps(result, result);
+ } else {
+ __ LoadObject(TMP, value(), PP);
+ __ movsd(result, FieldAddress(TMP, Double::value_offset()));
+ }
+ }
+}
+
+
LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
const intptr_t kNumInputs = 3;
const intptr_t kNumTemps = 0;
@@ -3145,7 +3169,8 @@
void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t value_cid = value()->Type()->ToCid();
+ CompileType* value_type = value()->Type();
+ const intptr_t value_cid = value_type->ToCid();
const Register value = locs()->in(0).reg();
const XmmRegister result = locs()->out(0).fpu_reg();
@@ -3157,17 +3182,27 @@
} else {
Label* deopt = compiler->AddDeoptStub(deopt_id_,
ICData::kDeoptBinaryDoubleOp);
- Label is_smi, done;
- __ testq(value, Immediate(kSmiTagMask));
- __ j(ZERO, &is_smi);
- __ CompareClassId(value, kDoubleCid);
- __ j(NOT_EQUAL, deopt);
- __ movsd(result, FieldAddress(value, Double::value_offset()));
- __ jmp(&done);
- __ Bind(&is_smi);
- __ SmiUntag(value);
- __ cvtsi2sd(result, value);
- __ Bind(&done);
+ if (value_type->is_nullable() &&
+ (value_type->ToNullableCid() == kDoubleCid)) {
+ const Immediate& raw_null =
+ Immediate(reinterpret_cast<intptr_t>(Object::null()));
+ __ cmpq(value, raw_null);
+ __ j(EQUAL, deopt);
+ // It must be double now.
+ __ movsd(result, FieldAddress(value, Double::value_offset()));
+ } else {
+ Label is_smi, done;
+ __ testq(value, Immediate(kSmiTagMask));
+ __ j(ZERO, &is_smi);
+ __ CompareClassId(value, kDoubleCid);
+ __ j(NOT_EQUAL, deopt);
+ __ movsd(result, FieldAddress(value, Double::value_offset()));
+ __ jmp(&done);
+ __ Bind(&is_smi);
+ __ SmiUntag(value);
+ __ cvtsi2sd(result, value);
+ __ Bind(&done);
+ }
}
}
@@ -4376,8 +4411,7 @@
LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
- if ((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos)) {
+ if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
// Calling convention on x64 uses XMM0 and XMM1 to pass the first two
// double arguments and XMM0 to return the result. Unfortunately
// currently we can't specify these registers because ParallelMoveResolver
@@ -4393,23 +4427,32 @@
summary->set_out(0, Location::FpuRegisterLocation(XMM1));
return summary;
}
- ASSERT(kind() == MethodRecognizer::kMathSqrt);
+ ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+ (kind() == MathUnaryInstr::kDoubleSquare));
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
LocationSummary* summary =
new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
summary->set_in(0, Location::RequiresFpuRegister());
- summary->set_out(0, Location::RequiresFpuRegister());
+ if (kind() == MathUnaryInstr::kDoubleSquare) {
+ summary->set_out(0, Location::SameAsFirstInput());
+ } else {
+ summary->set_out(0, Location::RequiresFpuRegister());
+ }
return summary;
}
void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- if (kind() == MethodRecognizer::kMathSqrt) {
+ if (kind() == MathUnaryInstr::kSqrt) {
__ sqrtsd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg());
+ } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+ XmmRegister value_reg = locs()->in(0).fpu_reg();
+ __ mulsd(value_reg, value_reg);
+ ASSERT(value_reg == locs()->out(0).fpu_reg());
} else {
- ASSERT((kind() == MethodRecognizer::kMathSin) ||
- (kind() == MethodRecognizer::kMathCos));
+ ASSERT((kind() == MathUnaryInstr::kSin) ||
+ (kind() == MathUnaryInstr::kCos));
// Save RSP.
__ movq(locs()->temp(0).reg(), RSP);
__ ReserveAlignedFrameSpace(0);
@@ -5217,13 +5260,6 @@
Location index_loc = locs()->in(kIndexPos);
if (length_loc.IsConstant() && index_loc.IsConstant()) {
- // TODO(srdjan): remove this code once failures are fixed.
- if ((Smi::Cast(length_loc.constant()).Value() >
- Smi::Cast(index_loc.constant()).Value()) &&
- (Smi::Cast(index_loc.constant()).Value() >= 0)) {
- // This CheckArrayBoundInstr should have been eliminated.
- return;
- }
ASSERT((Smi::Cast(length_loc.constant()).Value() <=
Smi::Cast(index_loc.constant()).Value()) ||
(Smi::Cast(index_loc.constant()).Value() < 0));
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 9f36db3..69ca15d 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -136,8 +136,8 @@
#define PROFILER_LIB_INTRINSIC_LIST(V) \
V(_UserTag, makeCurrent, UserTag_makeCurrent, 1038211262) \
+ V(::, _getDefaultTag, UserTag_defaultTag, 624228668) \
V(::, _getCurrentTag, Profiler_getCurrentTag, 1559793589) \
- V(::, _clearCurrentTag, Profiler_clearCurrentTag, 874694572) \
// TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
// _FixedSizeArrayIterator, moveNext.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 69dd647..0af28a0 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1723,23 +1723,33 @@
// R1: Isolate.
Isolate* isolate = Isolate::Current();
__ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
- // R0: UserTag.
- __ ldr(R0, Address(SP, + 0 * kWordSize));
+ // R0: Current user tag.
+ __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
+ // R2: UserTag.
+ __ ldr(R2, Address(SP, + 0 * kWordSize));
// Set Isolate::current_tag_.
- __ str(R0, Address(R1, Isolate::current_tag_offset()));
- // R0: UserTag's tag.
- __ ldr(R0, FieldAddress(R0, UserTag::tag_offset()));
+ __ str(R2, Address(R1, Isolate::current_tag_offset()));
+ // R2: UserTag's tag.
+ __ ldr(R2, FieldAddress(R2, UserTag::tag_offset()));
// Set Isolate::user_tag_.
- __ str(R0, Address(R1, Isolate::user_tag_offset()));
- // Set return value.
- const int32_t raw_null = reinterpret_cast<int32_t>(Object::null());
- __ LoadImmediate(R0, raw_null);
+ __ str(R2, Address(R1, Isolate::user_tag_offset()));
+ __ Ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+ Isolate* isolate = Isolate::Current();
+ // Set return value to default tag address.
+ __ LoadImmediate(R0,
+ reinterpret_cast<uword>(isolate->object_store()) +
+ ObjectStore::default_tag_offset());
+ __ ldr(R0, Address(R0, 0));
__ Ret();
}
void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
- // R1: Isolate.
+ // R1: Default tag address.
Isolate* isolate = Isolate::Current();
__ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
// Set return value to Isolate::current_tag_.
@@ -1747,23 +1757,6 @@
__ Ret();
}
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
- // R1: Isolate.
- Isolate* isolate = Isolate::Current();
- __ LoadImmediate(R1, reinterpret_cast<uword>(isolate));
- // Set return value to Isolate::current_tag_.
- __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
- // Clear Isolate::current_tag_.
- const int32_t raw_null = reinterpret_cast<int32_t>(UserTag::null());
- __ LoadImmediate(R2, raw_null);
- __ str(R2, Address(R1, Isolate::current_tag_offset()));
- // Clear Isolate::user_tag_.
- __ eor(R2, R2, ShifterOperand(R2));
- __ str(R2, Address(R1, Isolate::user_tag_offset()));
- __ Ret();
-}
-
} // namespace dart
#endif // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index be92d60..8bf6c6a 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -413,7 +413,7 @@
}
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
return;
}
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 958e6ce..6e27c85 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1749,18 +1749,28 @@
const Address user_tag_addr =
Address::Absolute(reinterpret_cast<uword>(isolate) +
Isolate::user_tag_offset());
+ // EAX: Current user tag.
+ __ movl(EAX, current_tag_addr);
// EAX: UserTag.
- __ movl(EAX, Address(ESP, + 1 * kWordSize));
+ __ movl(EBX, Address(ESP, + 1 * kWordSize));
// Set Isolate::current_tag_.
- __ movl(current_tag_addr, EAX);
+ __ movl(current_tag_addr, EBX);
// EAX: UserTag's tag.
- __ movl(EAX, FieldAddress(EAX, UserTag::tag_offset()));
+ __ movl(EBX, FieldAddress(EBX, UserTag::tag_offset()));
// Set Isolate::user_tag_.
- __ movl(user_tag_addr, EAX);
+ __ movl(user_tag_addr, EBX);
+ __ ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+ Isolate* isolate = Isolate::Current();
+ const Address default_tag_addr =
+ Address::Absolute(
+ reinterpret_cast<uword>(isolate->object_store()) +
+ ObjectStore::default_tag_offset());
// Set return value.
- const Immediate& raw_null =
- Immediate(reinterpret_cast<int32_t>(Object::null()));
- __ movl(EAX, raw_null);
+ __ movl(EAX, default_tag_addr);
__ ret();
}
@@ -1775,26 +1785,6 @@
__ ret();
}
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
- Isolate* isolate = Isolate::Current();
- const Address current_tag_addr =
- Address::Absolute(reinterpret_cast<uword>(isolate) +
- Isolate::current_tag_offset());
- const Address user_tag_addr =
- Address::Absolute(reinterpret_cast<uword>(isolate) +
- Isolate::user_tag_offset());
- // Set return value to Isolate::current_tag_.
- __ movl(EAX, current_tag_addr);
- // Clear Isolate::current_tag_.
- const Immediate& raw_null =
- Immediate(reinterpret_cast<int32_t>(UserTag::null()));
- __ movl(current_tag_addr, raw_null);
- // Clear Isolate::user_tag_.
- __ movl(user_tag_addr, Immediate(0));
- __ ret();
-}
-
#undef __
} // namespace dart
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 263514d..ce9b0ab 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1783,17 +1783,29 @@
// T1: Isolate.
Isolate* isolate = Isolate::Current();
__ LoadImmediate(T1, reinterpret_cast<uword>(isolate));
- // V0: UserTag.
- __ lw(V0, Address(SP, + 0 * kWordSize));
+ // V0: Current user tag.
+ __ lw(V0, Address(T1, Isolate::current_tag_offset()));
+ // T2: UserTag.
+ __ lw(T2, Address(SP, + 0 * kWordSize));
// Set Isolate::current_tag_.
- __ sw(V0, Address(T1, Isolate::current_tag_offset()));
- // V0: UserTag's tag.
- __ lw(V0, FieldAddress(V0, UserTag::tag_offset()));
+ __ sw(T2, Address(T1, Isolate::current_tag_offset()));
+ // T2: UserTag's tag.
+ __ lw(T2, FieldAddress(T2, UserTag::tag_offset()));
// Set Isolate::user_tag_.
- __ sw(V0, Address(T1, Isolate::user_tag_offset()));
- // Set return value.
+ __ sw(T2, Address(T1, Isolate::user_tag_offset()));
__ Ret();
- __ delay_slot()->LoadImmediate(V0, reinterpret_cast<int32_t>(Object::null()));
+ __ delay_slot()->sw(T2, Address(T1, Isolate::user_tag_offset()));
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+ Isolate* isolate = Isolate::Current();
+ // V0: Address of default tag.
+ __ LoadImmediate(V0,
+ reinterpret_cast<uword>(isolate->object_store()) +
+ ObjectStore::default_tag_offset());
+ __ Ret();
+ __ delay_slot()->lw(V0, Address(V0, 0));
}
@@ -1806,22 +1818,6 @@
__ delay_slot()->lw(V0, Address(V0, Isolate::current_tag_offset()));
}
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
- // T1: Isolate.
- Isolate* isolate = Isolate::Current();
- __ LoadImmediate(T1, reinterpret_cast<uword>(isolate));
- // Set return value to Isolate::current_tag_.
- __ lw(V0, Address(T1, Isolate::current_tag_offset()));
- // Clear Isolate::current_tag_.
- const int32_t raw_null = reinterpret_cast<int32_t>(UserTag::null());
- __ LoadImmediate(T0, raw_null);
- __ sw(T0, Address(T1, Isolate::current_tag_offset()));
- // Clear Isolate::user_tag_.
- __ Ret();
- __ delay_slot()->sw(ZR, Address(T1, Isolate::user_tag_offset()));
-}
-
} // namespace dart
#endif // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index c0bbba5..243d4a5 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1655,16 +1655,29 @@
const Immediate& isolate_address =
Immediate(reinterpret_cast<int64_t>(isolate));
__ movq(RBX, isolate_address);
- // RAX: UserTag.
- __ movq(RAX, Address(RSP, + 1 * kWordSize));
+ // RAX: Current user tag.
+ __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
+ // R10: UserTag.
+ __ movq(R10, Address(RSP, + 1 * kWordSize));
// Set Isolate::current_tag_.
- __ movq(Address(RBX, Isolate::current_tag_offset()), RAX);
- // RAX: UserTag's tag.
- __ movq(RAX, FieldAddress(RAX, UserTag::tag_offset()));
+ __ movq(Address(RBX, Isolate::current_tag_offset()), R10);
+ // R10: UserTag's tag.
+ __ movq(R10, FieldAddress(R10, UserTag::tag_offset()));
// Set Isolate::user_tag_.
- __ movq(Address(RBX, Isolate::user_tag_offset()), RAX);
+ __ movq(Address(RBX, Isolate::user_tag_offset()), R10);
+ __ ret();
+}
+
+
+void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
+ // RBX: Address of default tag.
+ Isolate* isolate = Isolate::Current();
+ const Immediate& default_tag_addr =
+ Immediate(reinterpret_cast<int64_t>(isolate->object_store()) +
+ ObjectStore::default_tag_offset());
+ __ movq(RBX, default_tag_addr);
// Set return value.
- __ LoadObject(RAX, Object::null_object(), PP);
+ __ movq(RAX, Address(RBX, 0));
__ ret();
}
@@ -1680,23 +1693,6 @@
__ ret();
}
-
-void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
- // RBX: Isolate.
- Isolate* isolate = Isolate::Current();
- const Immediate& isolate_address =
- Immediate(reinterpret_cast<int64_t>(isolate));
- __ movq(RBX, isolate_address);
- // Set return value to Isolate::current_tag_.
- __ movq(RAX, Address(RBX, Isolate::current_tag_offset()));
- // Clear Isolate::current_tag_.
- __ LoadObject(RCX, Object::null_object(), PP);
- __ movq(Address(RBX, Isolate::current_tag_offset()), RCX);
- // Clear Isolate::user_tag_.
- __ movq(Address(RBX, Isolate::user_tag_offset()), Immediate(0));
- __ ret();
-}
-
#undef __
} // namespace dart
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3bcc306..d185883 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -343,7 +343,7 @@
REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
reusable_handles_() {
set_vm_tag(VMTag::kIdleTagId);
- set_user_tag(UserTags::kNoUserTag);
+ set_user_tag(UserTags::kDefaultUserTag);
}
#undef REUSABLE_HANDLE_SCOPE_INIT
#undef REUSABLE_HANDLE_INITIALIZERS
@@ -968,6 +968,19 @@
typeargsRef.AddProperty("id", "typearguments");
typeargsRef.AddProperty("name", "canonical type arguments");
}
+ {
+ const GrowableObjectArray& libs =
+ GrowableObjectArray::Handle(object_store()->libraries());
+ intptr_t num_libs = libs.Length();
+ Library &lib = Library::Handle();
+
+ JSONArray lib_array(&jsobj, "libraries");
+ for (intptr_t i = 0; i < num_libs; i++) {
+ lib ^= libs.At(i);
+ ASSERT(!lib.IsNull());
+ lib_array.AddValue(lib);
+ }
+ }
}
@@ -1000,12 +1013,6 @@
}
-void Isolate::clear_current_tag() {
- set_user_tag(UserTags::kNoUserTag);
- current_tag_ = UserTag::null();
-}
-
-
void Isolate::VisitIsolates(IsolateVisitor* visitor) {
if (visitor == NULL) {
return;
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 1f03df3..309b3ed 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -24,6 +24,7 @@
class ApiState;
class Array;
class Class;
+class Code;
class CodeIndexTable;
class Debugger;
class DeoptContext;
@@ -39,6 +40,7 @@
class IsolateProfilerData;
class IsolateSpawnState;
class InterruptableThreadState;
+class Library;
class LongJumpScope;
class MessageHandler;
class Mutex;
@@ -80,16 +82,19 @@
};
#define REUSABLE_HANDLE_LIST(V) \
+ V(AbstractType) \
V(Array) \
V(Class) \
+ V(Code) \
V(Error) \
V(Field) \
V(Function) \
+ V(GrowableObjectArray) \
V(Instance) \
+ V(Library) \
V(Object) \
V(String) \
V(TypeArguments) \
- V(AbstractType) \
V(TypeParameter) \
class Isolate : public BaseIsolate {
@@ -490,7 +495,6 @@
RawUserTag* current_tag() const { return current_tag_; }
void set_current_tag(const UserTag& tag);
- void clear_current_tag();
#if defined(DEBUG)
#define REUSABLE_HANDLE_SCOPE_ACCESSORS(object) \
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 7fce0e9..ce565cf 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -9,6 +9,7 @@
#include "vm/dart_api_impl.h"
#include "vm/dart_api_state.h"
#include "vm/object_store.h"
+#include "vm/reusable_handles.h"
#include "vm/tags.h"
@@ -45,24 +46,26 @@
const uint8_t* NativeEntry::ResolveSymbolInLibrary(const Library& library,
uword pc) {
- if (library.native_entry_symbol_resolver() == 0) {
+ Dart_NativeEntrySymbol symbol_resolver =
+ library.native_entry_symbol_resolver();
+ if (symbol_resolver == 0) {
// Cannot reverse lookup native entries.
return NULL;
}
- Dart_NativeEntrySymbol symbol_resolver =
- library.native_entry_symbol_resolver();
return symbol_resolver(reinterpret_cast<Dart_NativeFunction>(pc));
}
const uint8_t* NativeEntry::ResolveSymbol(uword pc) {
Isolate* isolate = Isolate::Current();
- const GrowableObjectArray& libs =
- GrowableObjectArray::Handle(isolate->object_store()->libraries());
+ REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(isolate);
+ GrowableObjectArray& libs = reused_growable_object_array_handle.Handle();
+ libs ^= isolate->object_store()->libraries();
ASSERT(!libs.IsNull());
intptr_t num_libs = libs.Length();
- Library& lib = Library::Handle();
for (intptr_t i = 0; i < num_libs; i++) {
+ REUSABLE_LIBRARY_HANDLESCOPE(isolate);
+ Library& lib = reused_library_handle.Handle();
lib ^= libs.At(i);
ASSERT(!lib.IsNull());
const uint8_t* r = ResolveSymbolInLibrary(lib, pc);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0c43c65..eacee90 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1634,6 +1634,11 @@
}
+RawString* Class::PrettyName() const {
+ return GeneratePrettyName();
+}
+
+
RawString* Class::UserVisibleName() const {
ASSERT(raw_ptr()->user_name_ != String::null());
return raw_ptr()->user_name_;
@@ -3031,6 +3036,16 @@
}
+RawString* Class::GeneratePrettyName() const {
+ if (!IsCanonicalSignatureClass()) {
+ const String& name = String::Handle(Name());
+ return String::IdentifierPrettyName(name);
+ } else {
+ return Name();
+ }
+}
+
+
RawString* Class::GenerateUserVisibleName() const {
if (FLAG_show_internal_names) {
return Name();
@@ -3909,12 +3924,12 @@
return;
}
const char* internal_class_name = String::Handle(Name()).ToCString();
- const char* user_visible_class_name =
- String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_class_name =
+ String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("type", JSONType(ref));
jsobj.AddPropertyF("id", "classes/%" Pd "", id());
jsobj.AddProperty("name", internal_class_name);
- jsobj.AddProperty("user_name", user_visible_class_name);
+ jsobj.AddProperty("user_name", pretty_class_name);
if (ref) {
return;
}
@@ -3998,8 +4013,7 @@
typesRef.AddProperty("type", "@TypeList");
typesRef.AddPropertyF("id", "classes/%" Pd "/types", id());
jsobj.AddPropertyF("name", "canonical types of %s", internal_class_name);
- jsobj.AddPropertyF("user_name", "canonical types of %s",
- user_visible_class_name);
+ jsobj.AddPropertyF("user_name", "canonical types of %s", pretty_class_name);
}
}
@@ -4252,9 +4266,9 @@
jsobj.AddProperty("type", JSONType(ref));
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
const char* name = String::Handle(Name()).ToCString();
- const char* user_name = String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name = String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("name", name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
jsobj.AddProperty("length", Length());
jsobj.AddProperty("num_instantiations", NumInstantiations());
if (ref) {
@@ -6265,12 +6279,41 @@
}
-RawString* Function::UserVisibleName() const {
+RawString* Function::PrettyName() const {
const String& str = String::Handle(name());
return String::IdentifierPrettyName(str);
}
+RawString* Function::UserVisibleName() const {
+ return PrettyName();
+}
+
+
+RawString* Function::QualifiedPrettyName() const {
+ String& tmp = String::Handle();
+ const Class& cls = Class::Handle(Owner());
+
+ if (IsClosureFunction()) {
+ if (IsLocalFunction() && !IsImplicitClosureFunction()) {
+ const Function& parent = Function::Handle(parent_function());
+ tmp = parent.QualifiedPrettyName();
+ } else {
+ return PrettyName();
+ }
+ } else {
+ if (cls.IsTopLevel()) {
+ return PrettyName();
+ } else {
+ tmp = cls.PrettyName();
+ }
+ }
+ tmp = String::Concat(tmp, Symbols::Dot());
+ const String& suffix = String::Handle(PrettyName());
+ return String::Concat(tmp, suffix);
+}
+
+
RawString* Function::QualifiedUserVisibleName() const {
String& tmp = String::Handle();
const Class& cls = Class::Handle(Owner());
@@ -6436,8 +6479,8 @@
void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
const char* internal_name = String::Handle(name()).ToCString();
- const char* user_name =
- String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name =
+ String::Handle(PrettyName()).ToCString();
Class& cls = Class::Handle(Owner());
ASSERT(!cls.IsNull());
Error& err = Error::Handle();
@@ -6472,7 +6515,7 @@
jsobj.AddPropertyF("id", "classes/%" Pd "/%s/%" Pd "", cid, selector, id);
}
jsobj.AddProperty("name", internal_name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
if (cls.IsTopLevel()) {
const Library& library = Library::Handle(cls.library());
jsobj.AddProperty("owner", library);
@@ -6733,12 +6776,17 @@
}
-RawString* Field::UserVisibleName() const {
+RawString* Field::PrettyName() const {
const String& str = String::Handle(name());
return String::IdentifierPrettyName(str);
}
+RawString* Field::UserVisibleName() const {
+ return PrettyName();
+}
+
+
intptr_t Field::guarded_list_length() const {
return Smi::Value(raw_ptr()->guarded_list_length_);
}
@@ -6787,7 +6835,7 @@
void Field::PrintJSONImpl(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
const char* internal_field_name = String::Handle(name()).ToCString();
- const char* field_name = String::Handle(UserVisibleName()).ToCString();
+ const char* field_name = String::Handle(PrettyName()).ToCString();
Class& cls = Class::Handle(owner());
intptr_t id = cls.FindFieldIndex(*this);
ASSERT(id >= 0);
@@ -9068,6 +9116,8 @@
const String& native_flds_lib_url = Symbols::DartNativeWrappers();
const Library& native_flds_lib = Library::Handle(
Library::NewLibraryHelper(native_flds_lib_url, false));
+ const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
+ native_flds_lib.SetName(native_flds_lib_name);
native_flds_lib.Register();
isolate->object_store()->set_native_wrappers_library(native_flds_lib);
static const char* const kNativeWrappersClass = "NativeFieldWrapperClass";
@@ -9282,11 +9332,11 @@
jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
jsobj.AddProperty("user_name", library_name);
jsobj.AddProperty("name", library_name);
+ const char* library_url = String::Handle(url()).ToCString();
+ jsobj.AddProperty("url", library_url);
if (ref) {
return;
}
- const char* library_url = String::Handle(url()).ToCString();
- jsobj.AddProperty("url", library_url);
{
JSONArray jsarr(&jsobj, "classes");
ClassDictionaryIterator class_iter(*this);
@@ -10244,43 +10294,98 @@
}
-const char* LocalVarDescriptors::ToCString() const {
- intptr_t len = 1; // Trailing '\0'.
- const char* kFormat =
- "%2" Pd " kind=%d scope=0x%04x begin=%" Pd " end=%" Pd " name=%s\n";
- for (intptr_t i = 0; i < Length(); i++) {
- String& var_name = String::Handle(GetName(i));
- if (var_name.IsNull()) {
- var_name = Symbols::Empty().raw();
- }
- RawLocalVarDescriptors::VarInfo info;
- GetInfo(i, &info);
- len += OS::SNPrint(NULL, 0, kFormat,
+static const char* VarKindString(int kind) {
+ switch (kind) {
+ case RawLocalVarDescriptors::kStackVar:
+ return "StackVar";
+ break;
+ case RawLocalVarDescriptors::kContextVar:
+ return "ContextVar";
+ break;
+ case RawLocalVarDescriptors::kContextLevel:
+ return "ContextLevel";
+ break;
+ case RawLocalVarDescriptors::kSavedEntryContext:
+ return "SavedEntryCtx";
+ break;
+ case RawLocalVarDescriptors::kSavedCurrentContext:
+ return "SavedCurrentCtx";
+ break;
+ default:
+ UNREACHABLE();
+ return "Unknown";
+ }
+}
+
+
+static int PrintVarInfo(char* buffer, int len,
+ intptr_t i,
+ const String& var_name,
+ const RawLocalVarDescriptors::VarInfo& info) {
+ if (info.kind == RawLocalVarDescriptors::kContextLevel) {
+ return OS::SNPrint(buffer, len,
+ "%2" Pd " %-13s level=%-3" Pd " scope=%-3d"
+ " begin=%-3" Pd " end=%" Pd "\n",
i,
- info.kind,
+ VarKindString(info.kind),
+ info.index,
info.scope_id,
info.begin_pos,
+ info.end_pos);
+ } else if (info.kind == RawLocalVarDescriptors::kContextVar) {
+ return OS::SNPrint(buffer, len,
+ "%2" Pd " %-13s level=%-3d index=%-3" Pd ""
+ " begin=%-3" Pd " end=%-3" Pd " name=%s\n",
+ i,
+ VarKindString(info.kind),
+ info.scope_id,
+ info.index,
+ info.begin_pos,
+ info.end_pos,
+ var_name.ToCString());
+ } else {
+ return OS::SNPrint(buffer, len,
+ "%2" Pd " %-13s scope=%-3d index=%-3" Pd ""
+ " begin=%-3" Pd " end=%-3" Pd " name=%s\n",
+ i,
+ VarKindString(info.kind),
+ info.scope_id,
+ info.index,
+ info.begin_pos,
info.end_pos,
var_name.ToCString());
}
- char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
- intptr_t num_chars = 0;
+}
+
+
+const char* LocalVarDescriptors::ToCString() const {
+ if (IsNull()) {
+ return "LocalVarDescriptors(NULL)";
+ }
+ intptr_t len = 1; // Trailing '\0'.
+ String& var_name = String::Handle();
for (intptr_t i = 0; i < Length(); i++) {
- String& var_name = String::Handle(GetName(i));
+ RawLocalVarDescriptors::VarInfo info;
+ var_name = GetName(i);
if (var_name.IsNull()) {
var_name = Symbols::Empty().raw();
}
- RawLocalVarDescriptors::VarInfo info;
GetInfo(i, &info);
- num_chars += OS::SNPrint((buffer + num_chars),
- (len - num_chars),
- kFormat,
- i,
- info.kind,
- info.scope_id,
- info.begin_pos,
- info.end_pos,
- var_name.ToCString());
+ len += PrintVarInfo(NULL, 0, i, var_name, info);
+ }
+ char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+ buffer[0] = '\0';
+ intptr_t num_chars = 0;
+ for (intptr_t i = 0; i < Length(); i++) {
+ RawLocalVarDescriptors::VarInfo info;
+ var_name = GetName(i);
+ if (var_name.IsNull()) {
+ var_name = Symbols::Empty().raw();
+ }
+ GetInfo(i, &info);
+ num_chars += PrintVarInfo((buffer + num_chars),
+ (len - num_chars),
+ i, var_name, info);
}
return buffer;
}
@@ -11605,7 +11710,7 @@
}
-RawString* Code::UserName() const {
+RawString* Code::PrettyName() const {
const Object& obj = Object::Handle(owner());
if (obj.IsNull()) {
// Regular stub.
@@ -11622,7 +11727,7 @@
} else {
ASSERT(obj.IsFunction());
// Dart function.
- return Function::Cast(obj).QualifiedUserVisibleName();
+ return Function::Cast(obj).QualifiedPrettyName();
}
}
@@ -11634,14 +11739,13 @@
EntryPoint());
jsobj.AddPropertyF("start", "%" Px "", EntryPoint());
jsobj.AddPropertyF("end", "%" Px "", EntryPoint() + Size());
- jsobj.AddProperty("is_optimized", is_optimized());
- jsobj.AddProperty("is_alive", is_alive());
+ jsobj.AddProperty("isOptimized", is_optimized());
+ jsobj.AddProperty("isAlive", is_alive());
jsobj.AddProperty("kind", "Dart");
const String& name = String::Handle(Name());
- const String& user_name = String::Handle(UserName());
- const char* name_prefix = is_optimized() ? "*" : "";
- jsobj.AddPropertyF("name", "%s%s", name_prefix, name.ToCString());
- jsobj.AddPropertyF("user_name", "%s%s", name_prefix, user_name.ToCString());
+ const String& pretty_name = String::Handle(PrettyName());
+ jsobj.AddProperty("name", name.ToCString());
+ jsobj.AddProperty("user_name", pretty_name.ToCString());
const Object& obj = Object::Handle(owner());
if (obj.IsFunction()) {
jsobj.AddProperty("function", obj);
@@ -11651,7 +11755,7 @@
func.AddProperty("type", "@Function");
func.AddProperty("kind", "Stub");
func.AddPropertyF("id", "functions/stub-%" Pd "", EntryPoint());
- func.AddProperty("user_name", user_name.ToCString());
+ func.AddProperty("user_name", pretty_name.ToCString());
func.AddProperty("name", name.ToCString());
}
if (ref) {
@@ -13176,7 +13280,9 @@
if (IsBoundedType()) {
const AbstractType& type = AbstractType::Handle(
BoundedType::Cast(*this).type());
- if (name_visibility == kUserVisibleName) {
+ if (name_visibility == kPrettyName) {
+ return type.BuildName(kPrettyName);
+ } else if (name_visibility == kUserVisibleName) {
return type.BuildName(kUserVisibleName);
}
String& type_name = String::Handle(type.BuildName(kInternalName));
@@ -13221,6 +13327,8 @@
}
if (name_visibility == kInternalName) {
class_name = cls.Name();
+ } else if (name_visibility == kPrettyName) {
+ class_name = cls.PrettyName();
} else {
ASSERT(name_visibility == kUserVisibleName);
// Map internal types to their corresponding public interfaces.
@@ -14067,9 +14175,9 @@
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
}
const char* name = String::Handle(Name()).ToCString();
- const char* user_name = String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name = String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("name", name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
if (ref) {
return;
}
@@ -14231,9 +14339,9 @@
const intptr_t id = ring->GetIdForObject(raw());
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
const char* name = String::Handle(Name()).ToCString();
- const char* user_name = String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name = String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("name", name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
if (ref) {
return;
}
@@ -14448,9 +14556,9 @@
const intptr_t id = ring->GetIdForObject(raw());
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
const char* name = String::Handle(Name()).ToCString();
- const char* user_name = String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name = String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("name", name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
const Class& param_cls = Class::Handle(parameterized_class());
jsobj.AddProperty("parameterized_class", param_cls);
if (ref) {
@@ -14652,9 +14760,9 @@
const intptr_t id = ring->GetIdForObject(raw());
jsobj.AddPropertyF("id", "objects/%" Pd "", id);
const char* name = String::Handle(Name()).ToCString();
- const char* user_name = String::Handle(UserVisibleName()).ToCString();
+ const char* pretty_name = String::Handle(PrettyName()).ToCString();
jsobj.AddProperty("name", name);
- jsobj.AddProperty("user_name", user_name);
+ jsobj.AddProperty("user_name", pretty_name);
if (ref) {
return;
}
@@ -18558,13 +18666,6 @@
}
-void UserTag::ClearActive() {
- Isolate* isolate = Isolate::Current();
- ASSERT(isolate != NULL);
- isolate->clear_current_tag();
-}
-
-
RawUserTag* UserTag::New(const String& label, Heap::Space space) {
Isolate* isolate = Isolate::Current();
ASSERT(isolate->tag_table() != GrowableObjectArray::null());
@@ -18596,6 +18697,23 @@
}
+RawUserTag* UserTag::DefaultTag() {
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate != NULL);
+ ASSERT(isolate->object_store() != NULL);
+ if (isolate->object_store()->default_tag() != UserTag::null()) {
+ // Already created.
+ return isolate->object_store()->default_tag();
+ }
+ // Create default tag.
+ const UserTag& result = UserTag::Handle(isolate,
+ UserTag::New(Symbols::Default()));
+ ASSERT(result.tag() == UserTags::kDefaultUserTag);
+ isolate->object_store()->set_default_tag(result);
+ return result.raw();
+}
+
+
RawUserTag* UserTag::FindTagInIsolate(Isolate* isolate, const String& label) {
ASSERT(isolate->tag_table() != GrowableObjectArray::null());
const GrowableObjectArray& tag_table = GrowableObjectArray::Handle(
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 055c396..9054e18 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -495,7 +495,41 @@
// Different kinds of name visibility.
enum NameVisibility {
+ // Internal names are the true names of classes, fields,
+ // etc. inside the vm. These names include privacy suffixes,
+ // getter prefixes, and trailing dots on unnamed constructors.
+ //
+ // The names of core implementation classes (like _OneByteString)
+ // are preserved as well.
+ //
+ // e.g.
+ // private getter - get:foo@6be832b
+ // private constructor - _MyClass@6b3832b.
+ // private named constructor - _MyClass@6b3832b.named
+ // core impl class name shown - _OneByteString
kInternalName = 0,
+
+ // Pretty names drop privacy suffixes, getter prefixes, and
+ // trailing dots on unnamed constructors. These names are used in
+ // the vm service.
+ //
+ // e.g.
+ // get:foo@6be832b -> foo
+ // _MyClass@6b3832b. -> _MyClass
+ // _MyClass@6b3832b.named -> _MyClass.named
+ // _OneByteString -> _OneByteString (not remapped)
+ kPrettyName,
+
+ // User visible names are appropriate for reporting type errors
+ // directly to programmers. The names have been "prettied" and
+ // the names of core implementation classes are remapped to their
+ // public interface names.
+ //
+ // e.g.
+ // get:foo@6be832b -> foo
+ // _MyClass@6b3832b. -> _MyClass
+ // _MyClass@6b3832b.named -> _MyClass.named
+ // _OneByteString -> String (remapped)
kUserVisibleName
};
@@ -705,6 +739,7 @@
}
RawString* Name() const;
+ RawString* PrettyName() const;
RawString* UserVisibleName() const;
virtual RawString* DictionaryName() const { return Name(); }
@@ -1155,7 +1190,9 @@
class CycleFreeBit : public BitField<bool, kCycleFreeBit, 1> {};
void set_name(const String& value) const;
+ void set_pretty_name(const String& value) const;
void set_user_name(const String& value) const;
+ RawString* GeneratePrettyName() const;
RawString* GenerateUserVisibleName() const;
void set_signature_function(const Function& value) const;
void set_signature_type(const AbstractType& value) const;
@@ -1273,6 +1310,12 @@
return SubvectorName(0, Length(), kInternalName);
}
+ // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
+ // Names of internal classes are not mapped to their public interfaces.
+ RawString* PrettyName() const {
+ return SubvectorName(0, Length(), kPrettyName);
+ }
+
// The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>".
// Names of internal classes are mapped to their public interfaces.
RawString* UserVisibleName() const {
@@ -1463,7 +1506,9 @@
class Function : public Object {
public:
RawString* name() const { return raw_ptr()->name_; }
+ RawString* PrettyName() const;
RawString* UserVisibleName() const;
+ RawString* QualifiedPrettyName() const;
RawString* QualifiedUserVisibleName() const;
virtual RawString* DictionaryName() const { return name(); }
@@ -1477,6 +1522,12 @@
return BuildSignature(instantiate, kInternalName, TypeArguments::Handle());
}
+ RawString* PrettySignature() const {
+ const bool instantiate = false;
+ return BuildSignature(
+ instantiate, kPrettyName, TypeArguments::Handle());
+ }
+
// Build a string of the form '(T, {b: B, c: C}) => R' representing the
// user visible signature of the given function. In this example, T and R are
// type parameters of class C, the owner of the function.
@@ -2095,6 +2146,7 @@
class Field : public Object {
public:
RawString* name() const { return raw_ptr()->name_; }
+ RawString* PrettyName() const;
RawString* UserVisibleName() const;
virtual RawString* DictionaryName() const { return name(); }
@@ -3610,7 +3662,7 @@
RawArray* ExtractTypeFeedbackArray() const;
RawString* Name() const;
- RawString* UserName() const;
+ RawString* PrettyName() const;
int64_t compile_timestamp() const {
return raw_ptr()->compile_timestamp_;
@@ -4296,6 +4348,10 @@
return BuildName(kInternalName);
}
+ virtual RawString* PrettyName() const {
+ return BuildName(kPrettyName);
+ }
+
// The name of this type, including the names of its type arguments, if any.
// Names of internal classes are mapped to their public interfaces.
virtual RawString* UserVisibleName() const {
@@ -4795,16 +4851,8 @@
class Number : public Instance {
public:
// TODO(iposva): Fill in a useful Number interface.
- virtual bool IsZero() const {
- // Number is an abstract class.
- UNREACHABLE();
- return false;
- }
- virtual bool IsNegative() const {
- // Number is an abstract class.
- UNREACHABLE();
- return false;
- }
+
+ private:
OBJECT_IMPLEMENTATION(Number, Instance);
friend class Class;
};
@@ -4824,6 +4872,16 @@
Heap::Space space = Heap::kNew,
const bool silent = false);
+ // Integer is an abstract class.
+ virtual bool IsZero() const {
+ UNREACHABLE();
+ return false;
+ }
+ virtual bool IsNegative() const {
+ // Number is an abstract class.
+ UNREACHABLE();
+ return false;
+ }
virtual double AsDoubleValue() const;
virtual int64_t AsInt64Value() const;
virtual uint32_t AsTruncatedUint32Value() const;
@@ -6818,7 +6876,6 @@
}
void MakeActive() const;
- static void ClearActive();
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(RawUserTag));
@@ -6826,6 +6883,7 @@
static RawUserTag* New(const String& label,
Heap::Space space = Heap::kOld);
+ static RawUserTag* DefaultTag();
static bool TagTableIsFull(Isolate* isolate);
static RawUserTag* FindTagById(uword tag_id);
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
new file mode 100644
index 0000000..f4c3c0e
--- /dev/null
+++ b/runtime/vm/object_graph.cc
@@ -0,0 +1,210 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/object_graph.h"
+
+#include "vm/dart.h"
+#include "vm/growable_array.h"
+#include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/raw_object.h"
+#include "vm/visitor.h"
+
+namespace dart {
+
+// The state of a pre-order, depth-first traversal of an object graph.
+// When a node is visited, *all* its children are pushed to the stack at once.
+// We insert a sentinel between the node and its children on the stack, to
+// remember that the node has been visited. The node is kept on the stack while
+// its children are processed, to give the visitor a complete chain of parents.
+//
+// TODO(koda): Potential optimizations:
+// - Linked chunks instead of std::vector.
+// - Use smi/heap tag bit instead of full-word sentinel.
+// - Extend RawObject with incremental iteration (one child at a time).
+class ObjectGraph::Stack : public ObjectPointerVisitor {
+ public:
+ explicit Stack(Isolate* isolate)
+ : ObjectPointerVisitor(isolate), data_(kInitialCapacity) { }
+
+ // Marks and pushes. Used to initialize this stack with roots.
+ virtual void VisitPointers(RawObject** first, RawObject** last) {
+ for (RawObject** current = first; current <= last; ++current) {
+ if ((*current)->IsHeapObject() && !(*current)->IsMarked()) {
+ (*current)->SetMarkBit();
+ data_.Add(*current);
+ }
+ }
+ }
+
+ // Traverses the object graph from the current state.
+ void TraverseGraph(ObjectGraph::Visitor* visitor) {
+ while (!data_.is_empty()) {
+ RawObject* obj = data_.Last();
+ if (obj == kSentinel) {
+ data_.RemoveLast();
+ // The node below the sentinel has already been visited.
+ data_.RemoveLast();
+ continue;
+ }
+ ASSERT(obj->IsHeapObject());
+ data_.Add(kSentinel);
+ StackIterator it(this, data_.length() - 2);
+ switch (visitor->VisitObject(&it)) {
+ case ObjectGraph::Visitor::kProceed:
+ obj->VisitPointers(this);
+ break;
+ case ObjectGraph::Visitor::kBacktrack:
+ break;
+ case ObjectGraph::Visitor::kAbort:
+ return;
+ }
+ }
+ }
+
+ private:
+ static RawObject* const kSentinel;
+ static const intptr_t kInitialCapacity = 1024;
+ GrowableArray<RawObject*> data_;
+ friend class StackIterator;
+ DISALLOW_COPY_AND_ASSIGN(Stack);
+};
+
+
+// We only visit heap objects, so any Smi works as the sentinel.
+RawObject* const ObjectGraph::Stack::kSentinel = Smi::New(0);
+
+
+RawObject* ObjectGraph::StackIterator::Get() const {
+ return stack_->data_[index_];
+}
+
+
+bool ObjectGraph::StackIterator::MoveToParent() {
+ // The parent is just below the next sentinel.
+ for (int i = index_; i >= 1; --i) {
+ if (stack_->data_[i] == Stack::kSentinel) {
+ index_ = i - 1;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+class Unmarker : public ObjectVisitor {
+ public:
+ explicit Unmarker(Isolate* isolate) : ObjectVisitor(isolate) { }
+
+ void VisitObject(RawObject* obj) {
+ if (obj->IsMarked()) {
+ obj->ClearMarkBit();
+ }
+ }
+
+ static void UnmarkAll(Isolate* isolate) {
+ Unmarker unmarker(isolate);
+ isolate->heap()->IterateObjects(&unmarker);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Unmarker);
+};
+
+
+ObjectGraph::ObjectGraph(Isolate* isolate)
+ : StackResource(isolate) {
+ // The VM isolate has all its objects pre-marked, so iterating over it
+ // would be a no-op.
+ ASSERT(isolate != Dart::vm_isolate());
+ isolate->heap()->WriteProtectCode(false);
+}
+
+
+ObjectGraph::~ObjectGraph() {
+ isolate()->heap()->WriteProtectCode(true);
+}
+
+
+void ObjectGraph::IterateObjects(ObjectGraph::Visitor* visitor) {
+ NoGCScope no_gc_scope_;
+ Stack stack(isolate());
+ isolate()->VisitObjectPointers(&stack, false, false);
+ stack.TraverseGraph(visitor);
+ Unmarker::UnmarkAll(isolate());
+}
+
+
+void ObjectGraph::IterateObjectsFrom(const Object& root,
+ ObjectGraph::Visitor* visitor) {
+ NoGCScope no_gc_scope_;
+ Stack stack(isolate());
+ RawObject* root_raw = root.raw();
+ stack.VisitPointer(&root_raw);
+ stack.TraverseGraph(visitor);
+ // TODO(koda): Optimize if we only visited a small subgraph.
+ Unmarker::UnmarkAll(isolate());
+}
+
+
+class SizeVisitor : public ObjectGraph::Visitor {
+ public:
+ SizeVisitor() : size_(0) { }
+ intptr_t size() const { return size_; }
+ virtual bool ShouldSkip(RawObject* obj) const { return false; }
+ virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+ RawObject* obj = it->Get();
+ if (ShouldSkip(obj)) {
+ return kBacktrack;
+ }
+ size_ += obj->Size();
+ return kProceed;
+ }
+ private:
+ intptr_t size_;
+};
+
+
+class SizeExcludingObjectVisitor : public SizeVisitor {
+ public:
+ explicit SizeExcludingObjectVisitor(const Object& skip) : skip_(skip) { }
+ virtual bool ShouldSkip(RawObject* obj) const { return obj == skip_.raw(); }
+ private:
+ const Object& skip_;
+};
+
+
+class SizeExcludingClassVisitor : public SizeVisitor {
+ public:
+ explicit SizeExcludingClassVisitor(intptr_t skip) : skip_(skip) { }
+ virtual bool ShouldSkip(RawObject* obj) const {
+ return obj->GetClassId() == skip_;
+ }
+ private:
+ const intptr_t skip_;
+};
+
+
+intptr_t ObjectGraph::SizeRetainedByInstance(const Object& obj) {
+ SizeVisitor total;
+ IterateObjects(&total);
+ intptr_t size_total = total.size();
+ SizeExcludingObjectVisitor excluding_obj(obj);
+ IterateObjects(&excluding_obj);
+ intptr_t size_excluding_obj = excluding_obj.size();
+ return size_total - size_excluding_obj;
+}
+
+
+intptr_t ObjectGraph::SizeRetainedByClass(intptr_t class_id) {
+ SizeVisitor total;
+ IterateObjects(&total);
+ intptr_t size_total = total.size();
+ SizeExcludingClassVisitor excluding_class(class_id);
+ IterateObjects(&excluding_class);
+ intptr_t size_excluding_class = excluding_class.size();
+ return size_total - size_excluding_class;
+}
+
+} // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
new file mode 100644
index 0000000..8547421
--- /dev/null
+++ b/runtime/vm/object_graph.h
@@ -0,0 +1,77 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for 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_OBJECT_GRAPH_H_
+#define VM_OBJECT_GRAPH_H_
+
+#include "vm/allocation.h"
+#include "vm/object.h"
+
+namespace dart {
+
+class Isolate;
+
+// Utility to traverse the object graph in an ordered fashion.
+// Example uses:
+// - find a retaining path from the isolate roots to a particular object, or
+// - determine how much memory is retained by some particular object(s).
+class ObjectGraph : public StackResource {
+ public:
+ class Stack;
+
+ // Allows climbing the search tree all the way to the root.
+ class StackIterator {
+ public:
+ // The object this iterator currently points to.
+ RawObject* Get() const;
+ // Returns false if there is no parent.
+ bool MoveToParent();
+ private:
+ StackIterator(const Stack* stack, intptr_t index)
+ : stack_(stack), index_(index) { }
+ const Stack* stack_;
+ intptr_t index_;
+ friend class ObjectGraph::Stack;
+ DISALLOW_IMPLICIT_CONSTRUCTORS(StackIterator);
+ };
+
+ class Visitor {
+ public:
+ // Directs how the search should continue after visiting an object.
+ enum Direction {
+ kProceed, // Recurse on this object's pointers.
+ kBacktrack, // Ignore this object's pointers.
+ kAbort, // Terminate the entire search immediately.
+ };
+ virtual ~Visitor() { }
+ // Visits the object pointed to by *it. The iterator is only valid
+ // during this call. This method must not allocate from the heap or
+ // trigger GC in any way.
+ virtual Direction VisitObject(StackIterator* it) = 0;
+ };
+
+ explicit ObjectGraph(Isolate* isolate);
+ ~ObjectGraph();
+
+ // Visits all strongly reachable objects in the isolate's heap, in a
+ // pre-order, depth first traversal.
+ void IterateObjects(Visitor* visitor);
+
+ // Like 'IterateObjects', but restricted to objects reachable from 'root'
+ // (including 'root' itself).
+ void IterateObjectsFrom(const Object& root, Visitor* visitor);
+
+ // The number of bytes retained by 'obj'.
+ intptr_t SizeRetainedByInstance(const Object& obj);
+
+ // The number of bytes retained by the set of all objects of the given class.
+ intptr_t SizeRetainedByClass(intptr_t class_id);
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
+};
+
+} // namespace dart
+
+#endif // VM_OBJECT_GRAPH_H_
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
new file mode 100644
index 0000000..8ee5e66
--- /dev/null
+++ b/runtime/vm/object_graph_test.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/object_graph.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+class Counter : public ObjectGraph::Visitor {
+ public:
+ // Records the number of objects and total size visited, excluding 'skip'
+ // and any objects only reachable through 'skip'.
+ Counter(RawObject* skip, RawObject* expected_parent)
+ : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) { }
+
+ virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+ RawObject* obj = it->Get();
+ if (obj == skip_) {
+ EXPECT(it->MoveToParent());
+ EXPECT_EQ(expected_parent_, it->Get());
+ return kBacktrack;
+ }
+ ++count_;
+ size_ += obj->Size();
+ return kProceed;
+ }
+
+ int count() const { return count_; }
+ int size() const { return size_; }
+
+ private:
+ int count_;
+ intptr_t size_;
+ RawObject* skip_;
+ RawObject* expected_parent_;
+};
+
+
+TEST_CASE(ObjectGraph) {
+ Isolate* isolate = Isolate::Current();
+ // Create a simple object graph with objects a, b, c, d:
+ // a+->b+->c
+ // + +
+ // | v
+ // +-->d
+ Array& a = Array::Handle(Array::New(2, Heap::kNew));
+ Array& b = Array::Handle(Array::New(2, Heap::kOld));
+ Array& c = Array::Handle(Array::New(0, Heap::kOld));
+ Array& d = Array::Handle(Array::New(0, Heap::kOld));
+ a.SetAt(0, b);
+ b.SetAt(0, c);
+ b.SetAt(1, d);
+ a.SetAt(1, d);
+ intptr_t a_size = a.raw()->Size();
+ intptr_t b_size = b.raw()->Size();
+ intptr_t c_size = c.raw()->Size();
+ intptr_t d_size = d.raw()->Size();
+ {
+ // No more allocation; raw pointers ahead.
+ NoGCScope no_gc_scope;
+ RawObject* b_raw = b.raw();
+ // Clear handles to cut unintended retained paths.
+ b = Array::null();
+ c = Array::null();
+ d = Array::null();
+ ObjectGraph graph(isolate);
+ {
+ // Compare count and size when 'b' is/isn't skipped.
+ Counter with(Object::null(), Object::null());
+ graph.IterateObjectsFrom(a, &with);
+ Counter without(b_raw, a.raw());
+ graph.IterateObjectsFrom(a, &without);
+ // Only 'b' and 'c' were cut off.
+ EXPECT_EQ(2, with.count() - without.count());
+ EXPECT_EQ(b_size + c_size,
+ with.size() - without.size());
+ }
+ {
+ // Like above, but iterate over the entire isolate. The counts and sizes
+ // are thus larger, but the difference should still be just 'b' and 'c'.
+ Counter with(Object::null(), Object::null());
+ graph.IterateObjects(&with);
+ Counter without(b_raw, a.raw());
+ graph.IterateObjects(&without);
+ EXPECT_EQ(2, with.count() - without.count());
+ EXPECT_EQ(b_size + c_size,
+ with.size() - without.size());
+ }
+ EXPECT_EQ(a_size + b_size + c_size + d_size,
+ graph.SizeRetainedByInstance(a));
+ }
+}
+
+} // namespace dart
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index af2faeb..1c779f5 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -72,7 +72,8 @@
out_of_memory_(Instance::null()),
preallocated_stack_trace_(Stacktrace::null()),
lookup_port_handler_(Function::null()),
- handle_message_function_(Function::null()) {
+ handle_message_function_(Function::null()),
+ default_tag_(UserTag::null()) {
}
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 2cafe52..dbd6122 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -397,6 +397,19 @@
handle_message_function_ = function.raw();
}
+ RawUserTag* default_tag() const {
+ return default_tag_;
+ }
+ void set_default_tag(const UserTag& tag) {
+ // Only set once.
+ ASSERT(default_tag_ == UserTag::null());
+ ASSERT(!tag.IsNull());
+ default_tag_ = tag.raw();
+ }
+ static intptr_t default_tag_offset() {
+ return OFFSET_OF(ObjectStore, default_tag_);
+ }
+
// Visit all object pointers.
void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -480,6 +493,7 @@
RawStacktrace* preallocated_stack_trace_;
RawFunction* lookup_port_handler_;
RawFunction* handle_message_function_;
+ RawUserTag* default_tag_;
RawObject** to() {
return reinterpret_cast<RawObject**>(&handle_message_function_);
}
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 33e6c05..45cef4d 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2361,15 +2361,18 @@
const int first_frame_index = -1;
LocalScope* loop_owner = parent_scope;
LocalScope* context_owner = NULL; // No context allocated yet.
+ bool found_captured_vars = false;
int next_frame_index = parent_scope->AllocateVariables(first_parameter_index,
num_parameters,
first_frame_index,
loop_owner,
- &context_owner);
+ &context_owner,
+ &found_captured_vars);
EXPECT_EQ(first_frame_index, next_frame_index); // a and c not in frame.
EXPECT_EQ(parent_scope, context_owner); // parent_scope allocated a context.
const intptr_t parent_scope_context_level = 1;
EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
+ EXPECT(found_captured_vars);
const intptr_t local_scope_context_level = 5;
const ContextScope& context_scope = ContextScope::Handle(
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index c4a5546..57c0efe 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -296,15 +296,7 @@
if (page->Contains(addr)) {
return true;
}
- page = page->next();
- }
-
- page = large_pages_;
- while (page != NULL) {
- if (page->Contains(addr)) {
- return true;
- }
- page = page->next();
+ page = NextPageAnySize(page);
}
return false;
}
@@ -316,15 +308,7 @@
if ((page->type() == type) && page->Contains(addr)) {
return true;
}
- page = page->next();
- }
-
- page = large_pages_;
- while (page != NULL) {
- if ((page->type() == type) && page->Contains(addr)) {
- return true;
- }
- page = page->next();
+ page = NextPageAnySize(page);
}
return false;
}
@@ -334,11 +318,7 @@
ASSERT(pages_ != NULL || large_pages_ != NULL);
*start = static_cast<uword>(~0);
*end = 0;
- for (HeapPage* page = pages_; page != NULL; page = page->next()) {
- *start = Utils::Minimum(*start, page->object_start());
- *end = Utils::Maximum(*end, page->object_end());
- }
- for (HeapPage* page = large_pages_; page != NULL; page = page->next()) {
+ for (HeapPage* page = pages_; page != NULL; page = NextPageAnySize(page)) {
*start = Utils::Minimum(*start, page->object_start());
*end = Utils::Maximum(*end, page->object_end());
}
@@ -351,13 +331,7 @@
HeapPage* page = pages_;
while (page != NULL) {
page->VisitObjects(visitor);
- page = page->next();
- }
-
- page = large_pages_;
- while (page != NULL) {
- page->VisitObjects(visitor);
- page = page->next();
+ page = NextPageAnySize(page);
}
}
@@ -366,13 +340,7 @@
HeapPage* page = pages_;
while (page != NULL) {
page->VisitObjectPointers(visitor);
- page = page->next();
- }
-
- page = large_pages_;
- while (page != NULL) {
- page->VisitObjectPointers(visitor);
- page = page->next();
+ page = NextPageAnySize(page);
}
}
@@ -388,18 +356,7 @@
return obj;
}
}
- page = page->next();
- }
-
- page = large_pages_;
- while (page != NULL) {
- if (page->type() == type) {
- RawObject* obj = page->FindObject(visitor);
- if (obj != Object::null()) {
- return obj;
- }
- }
- page = page->next();
+ page = NextPageAnySize(page);
}
return Object::null();
}
@@ -409,12 +366,7 @@
HeapPage* page = pages_;
while (page != NULL) {
page->WriteProtect(read_only);
- page = page->next();
- }
- page = large_pages_;
- while (page != NULL) {
- page->WriteProtect(read_only);
- page = page->next();
+ page = NextPageAnySize(page);
}
}
@@ -493,6 +445,20 @@
}
+void PageSpace::WriteProtectCode(bool read_only) {
+ // TODO(koda): Is this flag still useful?
+ if (FLAG_write_protect_code) {
+ HeapPage* current_page = pages_;
+ while (current_page != NULL) {
+ if (current_page->type() == HeapPage::kExecutable) {
+ current_page->WriteProtect(read_only);
+ }
+ current_page = NextPageAnySize(current_page);
+ }
+ }
+}
+
+
void PageSpace::MarkSweep(bool invoke_api_callbacks) {
// MarkSweep is not reentrant. Make sure that is the case.
ASSERT(!sweeping_);
@@ -516,23 +482,8 @@
const int64_t start = OS::GetCurrentTimeMicros();
- if (FLAG_write_protect_code) {
- // Make code pages writable.
- HeapPage* current_page = pages_;
- while (current_page != NULL) {
- if (current_page->type() == HeapPage::kExecutable) {
- current_page->WriteProtect(false);
- }
- current_page = current_page->next();
- }
- current_page = large_pages_;
- while (current_page != NULL) {
- if (current_page->type() == HeapPage::kExecutable) {
- current_page->WriteProtect(false);
- }
- current_page = current_page->next();
- }
- }
+ // Make code pages writable.
+ WriteProtectCode(false);
// Save old value before GCMarker visits the weak persistent handles.
SpaceUsage usage_before = usage_;
@@ -584,23 +535,8 @@
page = next_page;
}
- if (FLAG_write_protect_code) {
- // Make code pages read-only.
- HeapPage* current_page = pages_;
- while (current_page != NULL) {
- if (current_page->type() == HeapPage::kExecutable) {
- current_page->WriteProtect(true);
- }
- current_page = current_page->next();
- }
- current_page = large_pages_;
- while (current_page != NULL) {
- if (current_page->type() == HeapPage::kExecutable) {
- current_page->WriteProtect(true);
- }
- current_page = current_page->next();
- }
- }
+ // Make code pages read-only.
+ WriteProtectCode(true);
int64_t end = OS::GetCurrentTimeMicros();
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index e3b777e..ba57eaa 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -250,7 +250,9 @@
return UsedInWords() + ExternalInWords() > max_capacity_in_words_;
}
+ // TODO(koda): Unify protection handling.
void WriteProtect(bool read_only);
+ void WriteProtectCode(bool read_only);
void AddGCTime(int64_t micros) {
gc_time_micros_ += micros;
@@ -296,6 +298,10 @@
HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
void FreeLargePage(HeapPage* page, HeapPage* previous_page);
void FreePages(HeapPage* pages);
+ HeapPage* NextPageAnySize(HeapPage* page) const {
+ ASSERT(pages_tail_ == NULL || pages_tail_->next() == NULL);
+ return page == pages_tail_ ? large_pages_ : page->next();
+ }
static intptr_t LargePageSizeInWordsFor(intptr_t size);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index b7ff5d3..b019d06 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -167,21 +167,29 @@
// Allocate parameters and local variables, either in the local frame or
// in the context(s).
LocalScope* context_owner = NULL; // No context needed yet.
+ bool found_captured_variables = false;
int next_free_frame_index =
scope->AllocateVariables(first_parameter_index_,
num_params,
first_stack_local_index_,
scope,
- &context_owner);
+ &context_owner,
+ &found_captured_variables);
- // If this function allocates context variables, but none of its enclosing
- // functions do, the context on entry is not linked as parent of the allocated
- // context but saved on entry and restored on exit as to prevent memory leaks.
- // Add and allocate a local variable to this purpose.
- if (context_owner != NULL) {
+ // We save the entry context for a function when...
+ //
+ // - some variable in the function is captured by nested functions, and
+ // - the function does not capture any variables from parent functions.
+ //
+ // We used to link to the parent context in these cases, but this
+ // had the effect of unintentionally retaining parent contexts which
+ // would never be accessed. By breaking the context chain at this
+ // point, we allow these outer contexts to be collected.
+ if (found_captured_variables) {
const ContextScope& context_scope =
ContextScope::Handle(function().context_scope());
if (context_scope.IsNull() || (context_scope.num_variables() == 0)) {
+ // Allocate a local variable for saving the entry context.
LocalVariable* context_var =
new LocalVariable(function().token_pos(),
Symbols::SavedEntryContextVar(),
@@ -863,8 +871,7 @@
}
if (!parser.current_function().IsLocalFunction() ||
((instantiator != NULL) && instantiator->is_captured())) {
- parsed_function->set_instantiator(
- new LoadLocalNode(node_sequence->token_pos(), instantiator));
+ parsed_function->set_instantiator(instantiator);
}
}
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index c65dff6..ab5bdb4 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -61,8 +61,8 @@
SequenceNode* node_sequence() const { return node_sequence_; }
void SetNodeSequence(SequenceNode* node_sequence);
- AstNode* instantiator() const { return instantiator_; }
- void set_instantiator(AstNode* instantiator) {
+ LocalVariable* instantiator() const { return instantiator_; }
+ void set_instantiator(LocalVariable* instantiator) {
// May be NULL.
instantiator_ = instantiator;
}
@@ -124,7 +124,7 @@
const Function& function_;
Code& code_;
SequenceNode* node_sequence_;
- AstNode* instantiator_;
+ LocalVariable* instantiator_;
Array& default_parameter_values_;
LocalVariable* saved_current_context_var_;
LocalVariable* saved_entry_context_var_;
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index c594fcb..e509383 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -5,6 +5,7 @@
#include "vm/ast_printer.h"
#include "vm/class_finalizer.h"
+#include "vm/debugger.h"
#include "vm/longjump.h"
#include "vm/object.h"
#include "vm/parser.h"
@@ -13,6 +14,8 @@
namespace dart {
+DECLARE_FLAG(bool, show_invisible_frames);
+
void DumpFunction(const Library& lib, const char* cname, const char* fname) {
const String& classname = String::Handle(Symbols::New(cname));
@@ -162,4 +165,383 @@
DumpFunction(lib, "B", "bam");
}
+
+// TODO(zra): Remove after porting relevant arm64 features.
+#if !defined(TARGET_ARCH_ARM64)
+
+const char* saved_vars = NULL;
+
+
+char* SkipIndex(const char* input) {
+ char* output_buffer = new char[strlen(input)];
+ char* output = output_buffer;
+
+ while (input[0] != '\0') {
+ const char* index_pos = strstr(input, "index=");
+ if (index_pos == NULL) {
+ while (input[0] != '\0') {
+ *output++ = *input++;
+ }
+ break;
+ }
+
+ // Copy prefix until "index="
+ while (input < index_pos) {
+ *output++ = *input++;
+ }
+
+ // Skip until space.
+ input += strcspn(input, " ");
+ // Skip until next non-space.
+ input += strspn(input, " ");
+ }
+
+ output[0] = '\0';
+ return output_buffer;
+}
+
+
+// Saves the var descriptors for all frames on the stack as a string.
+static void SaveVars(Dart_IsolateId isolate_id,
+ intptr_t bp_id,
+ const Dart_CodeLocation& loc) {
+ DebuggerStackTrace* stack =
+ Isolate::Current()->debugger()->StackTrace();
+ intptr_t num_frames = stack->Length();
+ const int kBufferLen = 2048;
+ char* buffer = new char[kBufferLen];
+ char* pos = buffer;
+ LocalVarDescriptors& var_desc = LocalVarDescriptors::Handle();
+ for (intptr_t i = 0; i < num_frames; i++) {
+ ActivationFrame* frame = stack->FrameAt(i);
+ var_desc = frame->code().var_descriptors();
+ const char* var_str = SkipIndex(var_desc.ToCString());
+ pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)),
+ "%s\n%s",
+ frame->function().ToQualifiedCString(),
+ var_str);
+ delete [] var_str;
+ }
+ pos[0] = '\0';
+ saved_vars = buffer;
+}
+
+
+// Uses the debugger to pause the program and capture the variable
+// descriptors for all frames on the stack.
+static const char* CaptureVarsAtLine(Dart_Handle lib,
+ const char* entry,
+ int line) {
+ EXPECT(ClassFinalizer::ProcessPendingClasses());
+ bool saved_flag = FLAG_show_invisible_frames;
+ FLAG_show_invisible_frames = true;
+ Isolate* isolate = Isolate::Current();
+ Debugger* debugger = isolate->debugger();
+ const String& url = String::Handle(String::New(TestCase::url()));
+ Dart_SetPausedEventHandler(SaveVars);
+ debugger->SetBreakpointAtLine(url, line);
+ saved_vars = NULL;
+ EXPECT_VALID(Dart_Invoke(lib, NewString(entry), 0, NULL));
+ const char* tmp = saved_vars;
+ saved_vars = NULL;
+ FLAG_show_invisible_frames = saved_flag;
+ return tmp;
+}
+
+
+TEST_CASE(Parser_AllocateVariables_CapturedVar) {
+ const char* kScriptChars =
+ "int main() {\n"
+ " var value = 11;\n"
+ " int f(var param) {\n"
+ " return param + value;\n" // line 4
+ " }\n"
+ " return f(22);\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ // function f uses one ctx var at (0); doesn't save ctx.
+ "::.main_f\n"
+ " 0 ContextVar level=0 begin=14 end=28 name=value\n"
+ " 1 StackVar scope=1 begin=16 end=28 name=param\n"
+
+ // Closure call saves current context.
+ "(dynamic, dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // function main uses one ctx var at (1); saves caller ctx.
+ "::.main\n"
+ " 0 ContextLevel level=1 scope=1 begin=2 end=37\n"
+ " 1 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 2 ContextVar level=1 begin=7 end=37 name=value\n"
+ " 3 StackVar scope=2 begin=12 end=37 name=f\n",
+ CaptureVarsAtLine(lib, "main", 4));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) {
+ const char* kScriptChars =
+ "int a() {\n"
+ " int b() {\n"
+ " var value = 11;\n"
+ " int c() {\n"
+ " return value;\n" // line 5
+ " }\n"
+ " return c();\n"
+ " }\n"
+ " return b();\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ // Innermost function uses captured variable 'value' from middle
+ // function.
+ "::.a_b_c\n"
+ " 0 ContextVar level=0 begin=20 end=30 name=value\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // Middle function saves the entry context. Notice that this
+ // happens here and not in the outermost function. We always
+ // save the entry context at the last possible moment.
+ "::.a_b\n"
+ " 0 ContextLevel level=1 scope=1 begin=8 end=38\n"
+ " 1 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 2 ContextVar level=1 begin=13 end=38 name=value\n"
+ " 3 StackVar scope=2 begin=18 end=38 name=c\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // Outermost function neglects to save the entry context. We
+ // don't save the entry context if the function has no captured
+ // variables.
+ "::.a\n"
+ " 0 StackVar scope=2 begin=6 end=46 name=b\n",
+ CaptureVarsAtLine(lib, "a", 5));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_TwoChains) {
+ const char* kScriptChars =
+ "int a() {\n"
+ " var value1 = 11;\n"
+ " int b() {\n"
+ " int aa() {\n"
+ " var value2 = 12;\n"
+ " int bb() {\n"
+ " return value2;\n" // line 7
+ " }\n"
+ " return bb();\n"
+ " }\n"
+ " return value1 + aa();\n"
+ " }\n"
+ " return b();\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ // bb captures only value2 from aa. No others.
+ "::.a_b_aa_bb\n"
+ " 0 ContextVar level=0 begin=32 end=42 name=value2\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // aa shares value2. Notice that we save the entry ctx instead
+ // of chaining from b. This keeps us from holding onto closures
+ // that we would never access.
+ "::.a_b_aa\n"
+ " 0 ContextLevel level=1 scope=1 begin=20 end=50\n"
+ " 1 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 2 ContextVar level=1 begin=25 end=50 name=value2\n"
+ " 3 StackVar scope=2 begin=30 end=50 name=bb\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // b captures value1 from a.
+ "::.a_b\n"
+ " 0 ContextVar level=0 begin=14 end=60 name=value1\n"
+ " 1 StackVar scope=2 begin=18 end=60 name=aa\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // a shares value1, saves entry ctx.
+ "::.a\n"
+ " 0 ContextLevel level=1 scope=1 begin=2 end=68\n"
+ " 1 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 2 ContextVar level=1 begin=7 end=68 name=value1\n"
+ " 3 StackVar scope=2 begin=12 end=68 name=b\n",
+ CaptureVarsAtLine(lib, "a", 7));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_Issue7681) {
+ // This is a distilled version of the program from Issue 7681.
+ //
+ // When we create the closure at line 11, we need to make sure to
+ // save the entry context instead of chaining to the parent context.
+ //
+ // This test is somewhat redundant with CapturedVarChain but
+ // included for good measure.
+ const char* kScriptChars =
+ "class X {\n"
+ " Function onX;\n"
+ "}\n"
+ "\n"
+ "class Y {\n"
+ " Function onY;\n"
+ "}\n"
+ "\n"
+ "void doIt() {\n"
+ " var x = new X();\n"
+ " x.onX = (y) {\n"
+ " y.onY = () {\n" // line 12
+ " return y;\n"
+ " };\n"
+ " };\n"
+ " x.onX(new Y());\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ // This frame saves the entry context instead of chaining. Good.
+ "::.doIt_<anonymous closure>\n"
+ " 0 ContextLevel level=1 scope=1 begin=41 end=62\n"
+ " 1 ContextVar level=1 begin=42 end=62 name=y\n"
+ " 2 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+
+ // Closure call saves current context.
+ "(dynamic, dynamic) => dynamic.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ "X.onX\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+
+ // No context is saved here since no vars are captured.
+ "::.doIt\n"
+ " 0 StackVar scope=2 begin=29 end=77 name=x\n",
+ CaptureVarsAtLine(lib, "doIt", 12));
+}
+
+
+TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) {
+ // This test verifies that...
+ //
+ // https://code.google.com/p/dart/issues/detail?id=18561
+ //
+ // ...stays fixed.
+ const char* kScriptChars =
+ "int outer() {\n"
+ " for(int i = 0; i < 1; i++) {\n"
+ " var value = 11 + i;\n"
+ " int inner() {\n"
+ " return value;\n" // line 5
+ " }\n"
+ " return inner();\n"
+ " }\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ // inner function captures variable value. That's fine.
+ "::.outer_inner\n"
+ " 0 ContextVar level=0 begin=32 end=42 name=value\n"
+
+ // Closure call saves current context.
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // The outer function saves the entry context, even though the
+ // captured variable is in a loop. Good.
+ "::.outer\n"
+ " 0 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 1 StackVar scope=3 begin=9 end=50 name=i\n"
+ " 2 ContextLevel level=1 scope=4 begin=20 end=50\n"
+ " 3 ContextVar level=1 begin=23 end=50 name=value\n"
+ " 4 StackVar scope=4 begin=30 end=50 name=inner\n",
+ CaptureVarsAtLine(lib, "outer", 5));
+}
+
+TEST_CASE(Parser_AllocateVariables_MiddleChain) {
+ const char* kScriptChars =
+ "a() {\n"
+ " int x = 11;\n"
+ " b() {\n"
+ " for (int i = 0; i < 1; i++) {\n"
+ " int d() {\n"
+ " return i;\n"
+ " }\n"
+ " }\n"
+ " int c() {\n"
+ " return x + 1;\n" // line 10
+ " }\n"
+ " return c();\n"
+ " }\n"
+ " return b();\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ EXPECT_STREQ(
+ "::.a_b_c\n"
+ " 0 ContextVar level=0 begin=48 end=60 name=x\n"
+ "(dynamic) => int.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ // Doesn't save the entry context. Chains to parent instead.
+ "::.a_b\n"
+ " 0 ContextVar level=0 begin=12 end=68 name=x\n"
+ " 1 StackVar scope=2 begin=46 end=68 name=c\n"
+ " 2 ContextLevel level=1 scope=3 begin=18 end=46\n"
+ " 3 ContextVar level=1 begin=19 end=46 name=i\n"
+ " 4 StackVar scope=4 begin=32 end=46 name=d\n"
+
+ "(dynamic) => dynamic.call\n"
+ " 0 StackVar scope=1 begin=0 end=0 name=this\n"
+ " 1 SavedCurrentCtx scope=0 begin=0 end=0"
+ " name=:saved_current_context_var\n"
+
+ "::.a\n"
+ " 0 ContextLevel level=1 scope=1 begin=1 end=76\n"
+ " 1 SavedEntryCtx scope=0 begin=0 end=0"
+ " name=:saved_entry_context_var\n"
+ " 2 ContextVar level=1 begin=6 end=76 name=x\n"
+ " 3 StackVar scope=2 begin=11 end=76 name=b\n",
+ CaptureVarsAtLine(lib, "a", 10));
+}
+#endif
+
} // namespace dart
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index d8ec5da..49df08a 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -13,6 +13,7 @@
#include "vm/object.h"
#include "vm/os.h"
#include "vm/profiler.h"
+#include "vm/reusable_handles.h"
#include "vm/signal_handler.h"
#include "vm/simulator.h"
#include "vm/stack_frame.h"
@@ -910,6 +911,98 @@
};
+class FixTopFrameVisitor : public SampleVisitor {
+ public:
+ explicit FixTopFrameVisitor(Isolate* isolate)
+ : SampleVisitor(isolate),
+ vm_isolate_(Dart::vm_isolate()) {
+ }
+
+ void VisitSample(Sample* sample) {
+ if (sample->processed()) {
+ // Already processed.
+ return;
+ }
+ REUSABLE_CODE_HANDLESCOPE(isolate());
+ // Mark that we've processed this sample.
+ sample->set_processed(true);
+ // Lookup code object for leaf frame.
+ Code& code = reused_code_handle.Handle();
+ code = FindCodeForPC(sample->At(0));
+ sample->set_leaf_frame_is_dart(!code.IsNull());
+ if (sample->pc_marker() == 0) {
+ // No pc marker. Nothing to do.
+ return;
+ }
+ if (!code.IsNull() && (code.compile_timestamp() > sample->timestamp())) {
+ // Code compiled after sample. Ignore.
+ return;
+ }
+ if (sample->leaf_frame_is_dart()) {
+ CheckForMissingDartFrame(code, sample);
+ }
+ }
+
+ private:
+ void CheckForMissingDartFrame(const Code& code, Sample* sample) const {
+ // Some stubs (and intrinsics) do not push a frame onto the stack leaving
+ // the frame pointer in the caller.
+ //
+ // PC -> STUB
+ // FP -> DART3 <-+
+ // DART2 <-| <- TOP FRAME RETURN ADDRESS.
+ // DART1 <-|
+ // .....
+ //
+ // In this case, traversing the linked stack frames will not collect a PC
+ // inside DART3. The stack will incorrectly be: STUB, DART2, DART1.
+ // In Dart code, after pushing the FP onto the stack, an IP in the current
+ // function is pushed onto the stack as well. This stack slot is called
+ // the PC marker. We can use the PC marker to insert DART3 into the stack
+ // so that it will correctly be: STUB, DART3, DART2, DART1. Note the
+ // inserted PC may not accurately reflect the true return address from STUB.
+ ASSERT(!code.IsNull());
+ if (sample->sp() == sample->fp()) {
+ // Haven't pushed pc marker yet.
+ return;
+ }
+ uword pc_marker = sample->pc_marker();
+ if (code.ContainsInstructionAt(pc_marker)) {
+ // PC marker is in the same code as pc, no missing frame.
+ return;
+ }
+ if (!ContainedInDartCodeHeaps(pc_marker)) {
+ // Not a valid PC marker.
+ return;
+ }
+ sample->InsertCallerForTopFrame(pc_marker);
+ }
+
+ bool ContainedInDartCodeHeaps(uword pc) const {
+ return isolate()->heap()->CodeContains(pc) ||
+ vm_isolate()->heap()->CodeContains(pc);
+ }
+
+ Isolate* vm_isolate() const {
+ return vm_isolate_;
+ }
+
+ RawCode* FindCodeForPC(uword pc) const {
+ // Check current isolate for pc.
+ if (isolate()->heap()->CodeContains(pc)) {
+ return Code::LookupCode(pc);
+ }
+ // Check VM isolate for pc.
+ if (vm_isolate()->heap()->CodeContains(pc)) {
+ return Code::LookupCodeInVmIsolate(pc);
+ }
+ return Code::null();
+ }
+
+ Isolate* vm_isolate_;
+};
+
+
class CodeRegionTableBuilder : public SampleVisitor {
public:
CodeRegionTableBuilder(Isolate* isolate,
@@ -1356,6 +1449,12 @@
&dead_code_table,
&tag_code_table);
{
+ // Preprocess samples and fix the caller when the top PC is in a
+ // stub or intrinsic without a frame.
+ FixTopFrameVisitor fixTopFrame(isolate);
+ sample_buffer->VisitSamples(&fixTopFrame);
+ }
+ {
// Build CodeRegion tables.
ScopeStopwatch sw("CodeRegionTableBuilder");
sample_buffer->VisitSamples(&builder);
@@ -1600,6 +1699,8 @@
// the isolates stack limit.
lower_bound_ = original_sp_;
}
+ // Store the PC marker for the top frame.
+ sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
int i = 0;
for (; i < FLAG_profile_depth; i++) {
if (FLAG_profile_verify_stack_walk) {
@@ -1662,6 +1763,13 @@
return reinterpret_cast<uword*>(*(fp + kSavedCallerFpSlotFromFp));
}
+ uword GetCurrentFramePcMarker(uword* fp) const {
+ if (!ValidFramePointer(fp)) {
+ return 0;
+ }
+ return *(fp + kPcMarkerSlotFromFp);
+ }
+
bool ValidFramePointer(uword* fp) const {
if (fp == NULL) {
return false;
@@ -1672,7 +1780,6 @@
return r;
}
-
Sample* sample_;
const uword stack_upper_;
const uword original_pc_;
@@ -1705,6 +1812,8 @@
sample->Init(isolate, OS::GetCurrentTimeMicros(), state.tid);
sample->set_vm_tag(isolate->vm_tag());
sample->set_user_tag(isolate->user_tag());
+ sample->set_sp(state.sp);
+ sample->set_fp(state.fp);
if (FLAG_profile_native_stack) {
// Collect native and Dart frames.
uword stack_lower = 0;
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 0b681c4..0602b27 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -83,7 +83,7 @@
};
-class SampleVisitor {
+class SampleVisitor : public ValueObject {
public:
explicit SampleVisitor(Isolate* isolate) : isolate_(isolate), visited_(0) { }
virtual ~SampleVisitor() {}
@@ -119,8 +119,12 @@
timestamp_ = timestamp;
tid_ = tid;
isolate_ = isolate;
+ pc_marker_ = 0;
vm_tag_ = VMTag::kInvalidTagId;
- user_tag_ = UserTags::kNoUserTag;
+ user_tag_ = UserTags::kDefaultUserTag;
+ sp_ = 0;
+ fp_ = 0;
+ state_ = 0;
for (intptr_t i = 0; i < kSampleFramesSize; i++) {
pcs_[i] = 0;
}
@@ -165,12 +169,73 @@
user_tag_ = tag;
}
+ uword pc_marker() const {
+ return pc_marker_;
+ }
+
+ void set_pc_marker(uword pc_marker) {
+ pc_marker_ = pc_marker;
+ }
+
+ uword sp() const {
+ return sp_;
+ }
+
+ void set_sp(uword sp) {
+ sp_ = sp;
+ }
+
+ uword fp() const {
+ return fp_;
+ }
+
+ void set_fp(uword fp) {
+ fp_ = fp;
+ }
+
+ void InsertCallerForTopFrame(uword pc) {
+ // The caller for the top frame is store at index 1.
+ // Shift all entries down by one.
+ for (intptr_t i = kSampleFramesSize - 1; i >= 2; i--) {
+ pcs_[i] = pcs_[i - 1];
+ }
+ // Insert caller for top frame.
+ pcs_[1] = pc;
+ }
+
+ bool processed() const {
+ return ProcessedBit::decode(state_);
+ }
+
+ void set_processed(bool processed) {
+ state_ = ProcessedBit::update(processed, state_);
+ }
+
+ bool leaf_frame_is_dart() const {
+ return LeafFrameIsDart::decode(state_);
+ }
+
+ void set_leaf_frame_is_dart(bool leaf_frame_is_dart) {
+ state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_);
+ }
+
private:
+ enum StateBits {
+ kProcessedBit = 0,
+ kLeafFrameIsDartBit = 1,
+ };
+ class ProcessedBit : public BitField<bool, kProcessedBit, 1> {};
+ class LeafFrameIsDart : public BitField<bool, kLeafFrameIsDartBit, 1> {};
+
int64_t timestamp_;
ThreadId tid_;
Isolate* isolate_;
+ uword pc_marker_;
uword vm_tag_;
uword user_tag_;
+ uword sp_;
+ uword fp_;
+ uword state_;
uword pcs_[kSampleFramesSize];
};
@@ -207,25 +272,23 @@
void VisitSamples(SampleVisitor* visitor) {
ASSERT(visitor != NULL);
- Sample sample;
const intptr_t length = capacity();
for (intptr_t i = 0; i < length; i++) {
- // Copy the sample.
- sample = *At(i);
- if (sample.isolate() != visitor->isolate()) {
+ Sample* sample = At(i);
+ if (sample->isolate() != visitor->isolate()) {
// Another isolate.
continue;
}
- if (sample.timestamp() == 0) {
+ if (sample->timestamp() == 0) {
// Empty.
continue;
}
- if (sample.At(0) == 0) {
+ if (sample->At(0) == 0) {
// No frames.
continue;
}
visitor->IncrementVisited();
- visitor->VisitSample(&sample);
+ visitor->VisitSample(sample);
}
}
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index c511c48..5d394f6 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -456,6 +456,7 @@
friend class RawTypedData;
friend class Scavenger;
friend class ScavengerVisitor;
+ friend class SizeExcludingClassVisitor; // GetClassId
friend class SnapshotReader;
friend class SnapshotWriter;
friend class String;
@@ -1629,6 +1630,7 @@
uword tag_;
friend class SnapshotReader;
+ friend class Object;
public:
uword tag() const { return tag_; }
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 952bcc2..d2ce0df 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1026,6 +1026,11 @@
reader->Read<Dart_NativeEntryResolver>();
ASSERT(resolver == NULL);
library.set_native_entry_resolver(resolver);
+ // The symbol resolver is not serialized.
+ Dart_NativeEntrySymbol symbol_resolver =
+ reader->Read<Dart_NativeEntrySymbol>();
+ ASSERT(symbol_resolver == NULL);
+ library.set_native_entry_symbol_resolver(symbol_resolver);
// The cache of loaded scripts is not serialized.
library.raw_ptr()->loaded_scripts_ = Array::null();
@@ -1074,6 +1079,9 @@
// We do not serialize the native resolver over, this needs to be explicitly
// set after deserialization.
writer->Write<Dart_NativeEntryResolver>(NULL);
+ // We do not serialize the native entry symbol, this needs to be explicitly
+ // set after deserialization.
+ writer->Write<Dart_NativeEntrySymbol>(NULL);
// We do not write the loaded_scripts_ cache to the snapshot. It gets
// set to NULL when reading the library from the snapshot, and will
// be rebuilt lazily.
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index db2752e..2f82687 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -11,19 +11,24 @@
namespace dart {
-// The class ReusableHandleScope is used in regions of the
-// virtual machine where isolate specific reusable handles are used.
-// This class asserts that we do not add code that will result in recursive
-// uses of reusable handles.
-// It is used as follows:
+// Classes registered in REUSABLE_HANDLE_LIST have an isolate specific reusable
+// handle. A guard class (Reusable*ClassName*HandleScope) should be used in
+// regions of the virtual machine where the isolate specific reusable handle
+// of that type is used. The class asserts that we do not add code that will
+// result in recursive uses of the class's reusable handle.
+//
+// Below is an example of a reusable array handle via the
+// REUSABLE_*CLASSNAME*_HANDLESCOPE macro:
+//
// {
-// ReusableHandleScope reused_handles(isolate);
+// REUSABLE_ARRAY_HANDLESCOPE(isolate);
// ....
-// .....
-// code that uses isolate specific reusable handles.
-// Array& funcs = reused_handles.ArrayHandle();
+// ....
+// Array& funcs = reused_array_handle.Handle();
+// code that uses funcs
// ....
// }
+//
#if defined(DEBUG)
#define REUSABLE_SCOPE(name) \
@@ -76,28 +81,36 @@
REUSABLE_HANDLE_LIST(REUSABLE_SCOPE)
#undef REUSABLE_SCOPE
-#define REUSABLE_OBJECT_HANDLESCOPE(isolate) \
- ReusableObjectHandleScope reused_object_handle(isolate);
-#define REUSABLE_ERROR_HANDLESCOPE(isolate) \
- ReusableErrorHandleScope reused_error_handle(isolate);
-#define REUSABLE_ARRAY_HANDLESCOPE(isolate) \
- ReusableArrayHandleScope reused_array_handle(isolate);
-#define REUSABLE_STRING_HANDLESCOPE(isolate) \
- ReusableStringHandleScope reused_string_handle(isolate);
-#define REUSABLE_INSTANCE_HANDLESCOPE(isolate) \
- ReusableInstanceHandleScope reused_instance_handle(isolate);
-#define REUSABLE_FUNCTION_HANDLESCOPE(isolate) \
- ReusableFunctionHandleScope reused_function_handle(isolate);
-#define REUSABLE_FIELD_HANDLESCOPE(isolate) \
- ReusableFieldHandleScope reused_field_handle(isolate);
-#define REUSABLE_CLASS_HANDLESCOPE(isolate) \
- ReusableClassHandleScope reused_class_handle(isolate);
#define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(isolate) \
ReusableAbstractTypeHandleScope reused_abstract_type(isolate);
-#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate) \
- ReusableTypeParameterHandleScope reused_type_parameter(isolate);
+#define REUSABLE_ARRAY_HANDLESCOPE(isolate) \
+ ReusableArrayHandleScope reused_array_handle(isolate);
+#define REUSABLE_CLASS_HANDLESCOPE(isolate) \
+ ReusableClassHandleScope reused_class_handle(isolate);
+#define REUSABLE_CODE_HANDLESCOPE(isolate) \
+ ReusableCodeHandleScope reused_code_handle(isolate);
+#define REUSABLE_ERROR_HANDLESCOPE(isolate) \
+ ReusableErrorHandleScope reused_error_handle(isolate);
+#define REUSABLE_FIELD_HANDLESCOPE(isolate) \
+ ReusableFieldHandleScope reused_field_handle(isolate);
+#define REUSABLE_FUNCTION_HANDLESCOPE(isolate) \
+ ReusableFunctionHandleScope reused_function_handle(isolate);
+#define REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(isolate) \
+ ReusableGrowableObjectArrayHandleScope \
+ reused_growable_object_array_handle(isolate)
+#define REUSABLE_INSTANCE_HANDLESCOPE(isolate) \
+ ReusableInstanceHandleScope reused_instance_handle(isolate);
+#define REUSABLE_LIBRARY_HANDLESCOPE(isolate) \
+ ReusableLibraryHandleScope reused_library_handle(isolate);
+#define REUSABLE_OBJECT_HANDLESCOPE(isolate) \
+ ReusableObjectHandleScope reused_object_handle(isolate);
+#define REUSABLE_STRING_HANDLESCOPE(isolate) \
+ ReusableStringHandleScope reused_string_handle(isolate);
#define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate) \
ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate);
+#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate) \
+ ReusableTypeParameterHandleScope reused_type_parameter(isolate);
+
} // namespace dart
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 38e83b1..b6a6064 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -152,7 +152,8 @@
int num_parameters,
int first_frame_index,
LocalScope* loop_owner,
- LocalScope** context_owner) {
+ LocalScope** context_owner,
+ bool* found_captured_variables) {
// We should not allocate variables of nested functions while compiling an
// enclosing function.
ASSERT(function_level() == 0);
@@ -177,6 +178,7 @@
// context allocation index.
frame_index--;
loop_owner->AllocateContextVariable(parameter, context_owner);
+ *found_captured_variables = true;
} else {
parameter->set_index(frame_index--);
}
@@ -190,6 +192,7 @@
if (variable->owner() == this) {
if (variable->is_captured()) {
loop_owner->AllocateContextVariable(variable, context_owner);
+ *found_captured_variables = true;
} else {
variable->set_index(frame_index--);
}
@@ -206,7 +209,8 @@
num_parameters_in_child,
frame_index,
loop_owner,
- &child_context_owner);
+ &child_context_owner,
+ found_captured_variables);
if (child_frame_index < min_frame_index) {
min_frame_index = child_frame_index;
}
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 3836a21..6bd93ac 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -302,7 +302,8 @@
int num_parameters,
int first_frame_index,
LocalScope* loop_owner,
- LocalScope** context_owner);
+ LocalScope** context_owner,
+ bool* found_captured_variables);
// Creates variable info for the scope and all its nested scopes.
// Must be called after AllocateVariables() has been called.
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 05109e1..eef5f05 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -19,6 +19,7 @@
#include "vm/native_entry.h"
#include "vm/native_arguments.h"
#include "vm/object.h"
+#include "vm/object_graph.h"
#include "vm/object_id_ring.h"
#include "vm/object_store.h"
#include "vm/port.h"
@@ -888,6 +889,12 @@
Array::empty_array()));
result.PrintJSON(js, true);
return true;
+ } else if (strcmp(action, "retained") == 0) {
+ ObjectGraph graph(isolate);
+ intptr_t retained_size = graph.SizeRetainedByInstance(obj);
+ const Object& result = Object::Handle(Integer::New(retained_size));
+ result.PrintJSON(js, true);
+ return true;
}
PrintError(js, "unrecognized action '%s'\n", action);
@@ -1059,6 +1066,20 @@
}
+static bool HandleClassesRetained(Isolate* isolate, const Class& cls,
+ JSONStream* js) {
+ if (js->num_arguments() != 3) {
+ PrintError(js, "Command too long");
+ return true;
+ }
+ ObjectGraph graph(isolate);
+ intptr_t retained_size = graph.SizeRetainedByClass(cls.id());
+ const Object& result = Object::Handle(Integer::New(retained_size));
+ result.PrintJSON(js, true);
+ return true;
+}
+
+
static bool HandleClasses(Isolate* isolate, JSONStream* js) {
if (js->num_arguments() == 1) {
ClassTable* table = isolate->class_table();
@@ -1097,6 +1118,8 @@
return HandleClassesDispatchers(isolate, cls, js);
} else if (!strcmp(second, "types")) {
return HandleClassesTypes(isolate, cls, js);
+ } else if (!strcmp(second, "retained")) {
+ return HandleClassesRetained(isolate, cls, js);
} else {
PrintError(js, "Invalid sub collection %s", second);
return true;
@@ -1299,7 +1322,7 @@
JSONArray members(&jsobj, "members");
const GrowableObjectArray& libs =
GrowableObjectArray::Handle(isolate->object_store()->libraries());
- int num_libs = libs.Length();
+ intptr_t num_libs = libs.Length();
Library &lib = Library::Handle();
Script& script = Script::Handle();
for (intptr_t i = 0; i < num_libs; i++) {
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 9719f0c..2001ff5 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -360,9 +360,14 @@
EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
ObjectIdRing* ring = isolate->object_id_ring();
- const String& str = String::Handle(String::New("value"));
- intptr_t str_id = ring->GetIdForObject(str.raw());
- Dart_Handle valid_id = Dart_NewInteger(str_id);
+ const Array& arr = Array::Handle(Array::New(1, Heap::kOld));
+ {
+ HANDLESCOPE(isolate);
+ const String& str = String::Handle(String::New("value", Heap::kOld));
+ arr.SetAt(0, str);
+ }
+ intptr_t arr_id = ring->GetIdForObject(arr.raw());
+ Dart_Handle valid_id = Dart_NewInteger(arr_id);
EXPECT_VALID(valid_id);
EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id));
@@ -447,7 +452,7 @@
EXPECT_STREQ(
"{\"type\":\"Smi\","
"\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
- "\"user_name\":\"int\"},"
+ "\"user_name\":\"_Smi\"},"
"\"fields\":[],"
"\"id\":\"objects\\/int-123\","
"\"valueAsString\":\"123\"}",
@@ -461,10 +466,15 @@
handler.filterMsg("size");
handler.filterMsg("id");
EXPECT_STREQ(
- "{\"type\":\"String\","
- "\"class\":{\"type\":\"@Class\","
- "\"user_name\":\"String\"},\"fields\":[],"
- "\"valueAsString\":\"\\\"value\\\"\"}",
+ "{\"type\":\"Array\","
+ "\"class\":{\"type\":\"@Class\",\"user_name\":\"_List\"},"
+ "\"fields\":[],"
+ "\"length\":1,"
+ "\"elements\":[{"
+ "\"index\":0,"
+ "\"value\":{\"type\":\"@String\","
+ "\"class\":{\"type\":\"@Class\",\"user_name\":\"_OneByteString\"},"
+ "\"valueAsString\":\"\\\"value\\\"\"}}]}",
handler.msg());
// object id ring / invalid => expired
@@ -499,7 +509,7 @@
EXPECT_STREQ(
"{\"type\":\"@Smi\","
"\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
- "\"user_name\":\"int\"},"
+ "\"user_name\":\"_Smi\"},"
"\"id\":\"objects\\/int-222\","
"\"valueAsString\":\"222\"}",
handler.msg());
@@ -542,6 +552,16 @@
"\"request\":{\"arguments\":[\"objects\",\"int-123\",\"eval\",\"foo\"],"
"\"option_keys\":[\"expr\"],\"option_values\":[\"this+99\"]}}",
handler.msg());
+
+ // Retained by single instance.
+ service_msg = Eval(lib,
+ "[port, ['objects', '$validId', 'retained'], [], []]");
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ handler.filterMsg("name");
+ ExpectSubstringF(handler.msg(),
+ "\"id\":\"objects\\/int-%" Pd "\"",
+ arr.raw()->Size() + arr.At(0)->Size());
}
@@ -598,7 +618,7 @@
EXPECT_STREQ(
"{\"type\":\"@Smi\","
"\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
- "\"user_name\":\"int\"},\"id\":\"objects\\/int-54320\","
+ "\"user_name\":\"_Smi\"},\"id\":\"objects\\/int-54320\","
"\"valueAsString\":\"54320\"}",
handler.msg());
}
@@ -617,10 +637,12 @@
" return d;\n"
" }\n"
"}\n"
+ "class B { static int i = 42; }\n"
"main() {\n"
" var z = new A();\n"
" var x = z.c();\n"
" x();\n"
+ " ++B.i;\n"
"}";
Isolate* isolate = Isolate::Current();
@@ -672,7 +694,7 @@
EXPECT_STREQ(
"{\"type\":\"@Smi\","
"\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
- "\"user_name\":\"int\"},"
+ "\"user_name\":\"_Smi\"},"
"\"id\":\"objects\\/int-111235\","
"\"valueAsString\":\"111235\"}",
handler.msg());
@@ -750,6 +772,19 @@
"\"request\":"
"{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"],"
"\"option_keys\":[],\"option_values\":[]}}", cid);
+
+ // Retained size of all instances of class B.
+ const Class& class_b = Class::Handle(GetClass(lib, "B"));
+ EXPECT(!class_b.IsNull());
+ const Instance& b0 = Instance::Handle(Instance::New(class_b));
+ const Instance& b1 = Instance::Handle(Instance::New(class_b));
+ service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'retained'],"
+ "[], []]", class_b.id());
+ Service::HandleIsolateMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ ExpectSubstringF(handler.msg(),
+ "\"id\":\"objects\\/int-%" Pd "\"",
+ b0.raw()->Size() + b1.raw()->Size());
}
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 7ef0248..e7e97cf 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -93,7 +93,7 @@
Simulator* sim_;
bool GetValue(char* desc, int64_t* value);
- // TODO(zra): GetVValue for doubles.
+ bool GetDValue(char* desc, int64_t* value);
// TODO(zra): Breakpoints.
};
@@ -143,6 +143,16 @@
}
+static VRegister LookupVRegisterByName(const char* name) {
+ int reg_nr = -1;
+ bool ok = SScanF(name, "v%d", ®_nr);
+ if (ok && (0 <= reg_nr) && (reg_nr < kNumberOfVRegisters)) {
+ return static_cast<VRegister>(reg_nr);
+ }
+ return kNoVRegister;
+}
+
+
bool SimulatorDebugger::GetValue(char* desc, int64_t* value) {
Register reg = LookupCpuRegisterByName(desc);
if (reg != kNoRegister) {
@@ -175,6 +185,26 @@
}
+bool SimulatorDebugger::GetDValue(char* desc, int64_t* value) {
+ VRegister vreg = LookupVRegisterByName(desc);
+ if (vreg != kNoVRegister) {
+ *value = sim_->get_vregisterd(vreg);
+ return true;
+ }
+ if (desc[0] == '*') {
+ int64_t addr;
+ if (GetValue(desc + 1, &addr)) {
+ if (Simulator::IsIllegalAddress(addr)) {
+ return false;
+ }
+ *value = *(reinterpret_cast<int64_t*>(addr));
+ return true;
+ }
+ }
+ return false;
+}
+
+
void SimulatorDebugger::Debug() {
intptr_t last_pc = -1;
bool done = false;
@@ -225,9 +255,11 @@
" disasm <address>\n"
" disasm <address> <number_of_instructions>\n"
" by default 10 instrs are disassembled\n"
+ "flags -- print flag values\n"
"gdb -- transfer control to gdb\n"
"h/help -- print this help string\n"
"p/print <reg or value or *addr> -- print integer value\n"
+ "pd/printdouble <dreg or *addr> -- print double value\n"
"po/printobject <*reg or *addr> -- print object\n"
"si/stepi -- single step an instruction\n"
"q/quit -- Quit the debugger and exit the program\n");
@@ -252,6 +284,20 @@
} else {
OS::Print("print <reg or value or *addr>\n");
}
+ } else if ((strcmp(cmd, "pd") == 0) ||
+ (strcmp(cmd, "printdouble") == 0)) {
+ if (args == 2) {
+ int64_t long_value;
+ if (GetDValue(arg1, &long_value)) {
+ double dvalue = bit_cast<double, int64_t>(long_value);
+ OS::Print("%s: %"Pu64" 0x%"Px64" %.8g\n",
+ arg1, long_value, long_value, dvalue);
+ } else {
+ OS::Print("%s unrecognized\n", arg1);
+ }
+ } else {
+ OS::Print("printdouble <dreg or *addr>\n");
+ }
} else if ((strcmp(cmd, "po") == 0) ||
(strcmp(cmd, "printobject") == 0)) {
if (args == 2) {
@@ -307,6 +353,12 @@
}
}
Disassembler::Disassemble(start, end);
+ } else if (strcmp(cmd, "flags") == 0) {
+ OS::Print("APSR: ");
+ OS::Print("N flag: %d; ", sim_->n_flag_);
+ OS::Print("Z flag: %d; ", sim_->z_flag_);
+ OS::Print("C flag: %d; ", sim_->c_flag_);
+ OS::Print("V flag: %d\n", sim_->v_flag_);
} else if (strcmp(cmd, "gdb") == 0) {
OS::Print("relinquishing control to gdb\n");
OS::DebugBreak();
@@ -418,6 +470,11 @@
c_flag_ = false;
v_flag_ = false;
+ for (int i = 0; i < kNumberOfVRegisters; i++) {
+ vregisters_[i].lo = 0;
+ vregisters_[i].hi = 0;
+ }
+
// The sp is initialized to point to the bottom (high address) of the
// allocated stack area.
registers_[R31] = StackTop();
@@ -559,6 +616,19 @@
}
+int64_t Simulator::get_vregisterd(VRegister reg) {
+ ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+ return vregisters_[reg].lo;
+}
+
+
+void Simulator::set_vregisterd(VRegister reg, int64_t value) {
+ ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+ vregisters_[reg].lo = value;
+ vregisters_[reg].hi = 0;
+}
+
+
// Raw access to the PC register.
void Simulator::set_pc(int64_t value) {
pc_modified_ = true;
@@ -843,7 +913,7 @@
const int hw = instr->HWField();
const int64_t shift = hw << 4;
const int64_t shifted_imm =
- static_cast<uint64_t>(instr->Imm16Field()) << shift;
+ static_cast<int64_t>(instr->Imm16Field()) << shift;
if (instr->SFField()) {
if (instr->Bits(29, 2) == 0) {
@@ -1322,16 +1392,10 @@
void Simulator::DecodeLoadStoreReg(Instr* instr) {
- // TODO(zra): SIMD loads and stores have bit 26 (V) set.
- // (bit 25 is never set for loads and stores).
- if (instr->Bits(25, 2) != 0) {
- UnimplementedInstruction(instr);
- return;
- }
-
// Calculate the address.
const Register rn = instr->RnField();
const Register rt = instr->RtField();
+ const VRegister vt = instr->VtField();
const int64_t rn_val = get_register(rn, R31IsSP);
const uint32_t size = instr->SzField();
uword address = 0;
@@ -1372,6 +1436,7 @@
address = rn_val + offset;
} else {
UnimplementedInstruction(instr);
+ return;
}
// Check the address.
@@ -1382,86 +1447,106 @@
// Do access.
if (instr->Bits(22, 2) == 0) {
- // Format(instr, "str'sz 'rt, 'memop");
- int32_t rt_val32 = get_wregister(rt, R31IsZR);
- switch (size) {
- case 0: {
- uint8_t val = static_cast<uint8_t>(rt_val32);
- WriteB(address, val);
- break;
+ if (instr->Bit(26) == 1) {
+ // Format(instr, "vstrd 'vt, 'memop");
+ if (size != 3) {
+ UnimplementedInstruction(instr);
+ return;
}
- case 1: {
- uint16_t val = static_cast<uint16_t>(rt_val32);
- WriteH(address, val, instr);
- break;
+ const int64_t vt_val = get_vregisterd(vt);
+ WriteX(address, vt_val, instr);
+ } else {
+ // Format(instr, "str'sz 'rt, 'memop");
+ const int32_t rt_val32 = get_wregister(rt, R31IsZR);
+ switch (size) {
+ case 0: {
+ const uint8_t val = static_cast<uint8_t>(rt_val32);
+ WriteB(address, val);
+ break;
+ }
+ case 1: {
+ const uint16_t val = static_cast<uint16_t>(rt_val32);
+ WriteH(address, val, instr);
+ break;
+ }
+ case 2: {
+ const uint32_t val = static_cast<uint32_t>(rt_val32);
+ WriteW(address, val, instr);
+ break;
+ }
+ case 3: {
+ const int64_t val = get_register(rt, R31IsZR);
+ WriteX(address, val, instr);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ break;
}
- case 2: {
- uint32_t val = static_cast<uint32_t>(rt_val32);
- WriteW(address, val, instr);
- break;
- }
- case 3: {
- int64_t val = get_register(rt, R31IsZR);
- WriteX(address, val, instr);
- break;
- }
- default:
- UNREACHABLE();
- break;
}
} else {
- // Format(instr, "ldr'sz 'rt, 'memop");
- // Undefined case.
- if ((size == 3) && (instr->Bits(22, 0) == 3)) {
- UnimplementedInstruction(instr);
- return;
- }
-
- // Read the value.
- const bool signd = instr->Bit(23) == 1;
- // Write the W register for signed values when size < 2.
- // Write the W register for unsigned values when size == 2.
- const bool use_w =
- (signd && (instr->Bit(22) == 1)) || (!signd && (size == 2));
- int64_t val = 0; // Sign extend into an int64_t.
- switch (size) {
- case 0: {
- if (signd) {
- val = static_cast<int64_t>(ReadB(address));
- } else {
- val = static_cast<int64_t>(ReadBU(address));
- }
- break;
+ if (instr->Bit(26) == 1) {
+ // Format(instr, "ldrd 'vt, 'memop");
+ if ((size != 3) || (instr->Bit(23) != 0)) {
+ UnimplementedInstruction(instr);
+ return;
}
- case 1: {
- if (signd) {
- val = static_cast<int64_t>(ReadH(address, instr));
- } else {
- val = static_cast<int64_t>(ReadHU(address, instr));
- }
- break;
- }
- case 2: {
- if (signd) {
- val = static_cast<int64_t>(ReadW(address, instr));
- } else {
- val = static_cast<int64_t>(ReadWU(address, instr));
- }
- break;
- }
- case 3:
- val = ReadX(address, instr);
- break;
- default:
- UNREACHABLE();
- break;
- }
-
- // Write to register.
- if (use_w) {
- set_wregister(rt, static_cast<int32_t>(val), R31IsZR);
+ const int64_t val = ReadX(address, instr);
+ set_vregisterd(vt, val);
} else {
- set_register(rt, val, R31IsZR);
+ // Format(instr, "ldr'sz 'rt, 'memop");
+ // Undefined case.
+ if ((size == 3) && (instr->Bits(22, 2) == 3)) {
+ UnimplementedInstruction(instr);
+ return;
+ }
+
+ // Read the value.
+ const bool signd = instr->Bit(23) == 1;
+ // Write the W register for signed values when size < 2.
+ // Write the W register for unsigned values when size == 2.
+ const bool use_w =
+ (signd && (instr->Bit(22) == 1)) || (!signd && (size == 2));
+ int64_t val = 0; // Sign extend into an int64_t.
+ switch (size) {
+ case 0: {
+ if (signd) {
+ val = static_cast<int64_t>(ReadB(address));
+ } else {
+ val = static_cast<int64_t>(ReadBU(address));
+ }
+ break;
+ }
+ case 1: {
+ if (signd) {
+ val = static_cast<int64_t>(ReadH(address, instr));
+ } else {
+ val = static_cast<int64_t>(ReadHU(address, instr));
+ }
+ break;
+ }
+ case 2: {
+ if (signd) {
+ val = static_cast<int64_t>(ReadW(address, instr));
+ } else {
+ val = static_cast<int64_t>(ReadWU(address, instr));
+ }
+ break;
+ }
+ case 3:
+ val = ReadX(address, instr);
+ break;
+ default:
+ UNREACHABLE();
+ break;
+ }
+
+ // Write to register.
+ if (use_w) {
+ set_wregister(rt, static_cast<int32_t>(val), R31IsZR);
+ } else {
+ set_register(rt, val, R31IsZR);
+ }
}
}
@@ -1821,13 +1906,13 @@
void Simulator::DecodeMiscDP3Source(Instr* instr) {
+ const Register rd = instr->RdField();
+ const Register rn = instr->RnField();
+ const Register rm = instr->RmField();
+ const Register ra = instr->RaField();
if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
(instr->Bit(15) == 0)) {
// Format(instr, "madd'sf 'rd, 'rn, 'rm, 'ra");
- const Register rd = instr->RdField();
- const Register rn = instr->RnField();
- const Register rm = instr->RmField();
- const Register ra = instr->RaField();
if (instr->SFField() == 1) {
const int64_t rn_val = get_register(rn, R31IsZR);
const int64_t rm_val = get_register(rm, R31IsZR);
@@ -1841,6 +1926,31 @@
const int32_t alu_out = ra_val + (rn_val * rm_val);
set_wregister(rd, alu_out, R31IsZR);
}
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 0) &&
+ (instr->Bit(15) == 1)) {
+ // Format(instr, "msub'sf 'rd, 'rn, 'rm, 'ra");
+ if (instr->SFField() == 1) {
+ const int64_t rn_val = get_register(rn, R31IsZR);
+ const int64_t rm_val = get_register(rm, R31IsZR);
+ const int64_t ra_val = get_register(ra, R31IsZR);
+ const int64_t alu_out = ra_val - (rn_val * rm_val);
+ set_register(rd, alu_out, R31IsZR);
+ } else {
+ const int32_t rn_val = get_wregister(rn, R31IsZR);
+ const int32_t rm_val = get_wregister(rm, R31IsZR);
+ const int32_t ra_val = get_wregister(ra, R31IsZR);
+ const int32_t alu_out = ra_val - (rn_val * rm_val);
+ set_wregister(rd, alu_out, R31IsZR);
+ }
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 2) &&
+ (instr->Bit(15) == 0)) {
+ // Format(instr, "smulh 'rd, 'rn, 'rm");
+ const int64_t rn_val = get_register(rn, R31IsZR);
+ const int64_t rm_val = get_register(rm, R31IsZR);
+ const __int128 res =
+ static_cast<__int128>(rn_val) * static_cast<__int128>(rm_val);
+ const int64_t alu_out = static_cast<int64_t>(res >> 64);
+ set_register(rd, alu_out, R31IsZR);
} else {
UnimplementedInstruction(instr);
}
@@ -1848,31 +1958,41 @@
void Simulator::DecodeConditionalSelect(Instr* instr) {
+ const Register rd = instr->RdField();
+ const Register rn = instr->RnField();
+ const Register rm = instr->RmField();
+ const int64_t rm_val64 = get_register(rm, R31IsZR);
+ const int32_t rm_val32 = get_wregister(rm, R31IsZR);
+ const int64_t rn_val64 = get_register(rn, instr->RnMode());
+ const int32_t rn_val32 = get_wregister(rn, instr->RnMode());
+ int64_t result64 = 0;
+ int32_t result32 = 0;
+
if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
// Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
- const Register rd = instr->RdField();
- const Register rn = instr->RnField();
- const Register rm = instr->RmField();
- if (instr->SFField() == 1) {
- int64_t res = 0;
- if (ConditionallyExecute(instr)) {
- res = get_register(rn, instr->RnMode());
- } else {
- res = get_register(rm, R31IsZR);
- }
- set_register(rd, res, instr->RdMode());
- } else {
- int32_t res = 0;
- if (ConditionallyExecute(instr)) {
- res = get_wregister(rn, instr->RnMode());
- } else {
- res = get_wregister(rm, R31IsZR);
- }
- set_wregister(rd, res, instr->RdMode());
+ result64 = rm_val64;
+ result32 = rm_val32;
+ if (ConditionallyExecute(instr)) {
+ result64 = rn_val64;
+ result32 = rn_val32;
}
-
+ } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
+ // Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
+ result64 = rm_val64 + 1;
+ result32 = rm_val32 + 1;
+ if (ConditionallyExecute(instr)) {
+ result64 = rn_val64;
+ result32 = rn_val32;
+ }
} else {
UnimplementedInstruction(instr);
+ return;
+ }
+
+ if (instr->SFField() == 1) {
+ set_register(rd, result64, instr->RdMode());
+ } else {
+ set_wregister(rd, result32, instr->RdMode());
}
}
@@ -1899,8 +2019,178 @@
}
+void Simulator::DecodeFPImm(Instr* instr) {
+ if ((instr->Bit(31) != 0) || (instr->Bit(29) != 0) || (instr->Bit(23) != 0) ||
+ (instr->Bits(5, 5) != 0)) {
+ UnimplementedInstruction(instr);
+ return;
+ }
+ if (instr->Bit(22) == 1) {
+ // Double.
+ // Format(instr, "fmovd 'vd, #'immd");
+ const VRegister vd = instr->VdField();
+ const int64_t immd = Instr::VFPExpandImm(instr->Imm8Field());
+ set_vregisterd(vd, immd);
+ } else {
+ // Single.
+ UnimplementedInstruction(instr);
+ }
+}
+
+
+void Simulator::DecodeFPIntCvt(Instr* instr) {
+ const VRegister vd = instr->VdField();
+ const VRegister vn = instr->VnField();
+ const Register rd = instr->RdField();
+ const Register rn = instr->RnField();
+
+ if ((instr->SFField() != 1) || (instr->Bit(29) != 0) ||
+ (instr->Bits(22, 2) != 1)) {
+ UnimplementedInstruction(instr);
+ return;
+ }
+ if (instr->Bits(16, 5) == 2) {
+ // Format(instr, "scvtfd 'vd, 'vn");
+ const int64_t rn_val = get_register(rn, instr->RnMode());
+ const double vn_dbl = static_cast<double>(rn_val);
+ set_vregisterd(vd, bit_cast<int64_t, double>(vn_dbl));
+ } else if (instr->Bits(16, 5) == 6) {
+ // Format(instr, "fmovrd 'rd, 'vn");
+ const int64_t vn_val = get_vregisterd(vn);
+ set_register(rd, vn_val, R31IsZR);
+ } else if (instr->Bits(16, 5) == 7) {
+ // Format(instr, "fmovdr 'vd, 'rn");
+ const int64_t rn_val = get_register(rn, R31IsZR);
+ set_vregisterd(vd, rn_val);
+ } else if (instr->Bits(16, 5) == 24) {
+ // Format(instr, "fcvtzds 'rd, 'vn");
+ const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn));
+ set_register(rd, static_cast<int64_t>(vn_val), instr->RdMode());
+ } else {
+ UnimplementedInstruction(instr);
+ }
+}
+
+
+void Simulator::DecodeFPOneSource(Instr* instr) {
+ const int opc = instr->Bits(15, 2);
+ const VRegister vd = instr->VdField();
+ const VRegister vn = instr->VnField();
+ switch (opc) {
+ case 0:
+ // Format("fmovdd 'vd, 'vn");
+ set_vregisterd(vd, get_vregisterd(vn));
+ break;
+ default:
+ UnimplementedInstruction(instr);
+ break;
+ }
+}
+
+
+void Simulator::DecodeFPTwoSource(Instr* instr) {
+ if (instr->Bits(22, 2) != 1) {
+ UnimplementedInstruction(instr);
+ return;
+ }
+ const VRegister vd = instr->VdField();
+ const VRegister vn = instr->VnField();
+ const VRegister vm = instr->VmField();
+ const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn));
+ const double vm_val = bit_cast<double, int64_t>(get_vregisterd(vm));
+ const int opc = instr->Bits(12, 4);
+ double result;
+
+ switch (opc) {
+ case 0:
+ // Format(instr, "fmuld 'vd, 'vn, 'vm");
+ result = vn_val * vm_val;
+ break;
+ case 1:
+ // Format(instr, "fdivd 'vd, 'vn, 'vm");
+ result = vn_val / vm_val;
+ break;
+ case 2:
+ // Format(instr, "faddd 'vd, 'vn, 'vm");
+ result = vn_val + vm_val;
+ break;
+ case 3:
+ // Format(instr, "fsubd 'vd, 'vn, 'vm");
+ result = vn_val - vm_val;
+ break;
+ default:
+ // Unknown(instr);
+ break;
+ }
+
+ set_vregisterd(vd, bit_cast<int64_t, double>(result));
+}
+
+
+void Simulator::DecodeFPCompare(Instr* instr) {
+ const VRegister vn = instr->VnField();
+ const VRegister vm = instr->VmField();
+ const double vn_val = get_vregisterd(vn);
+ double vm_val;
+
+ if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 0)) {
+ // Format(instr, "fcmpd 'vn, 'vm");
+ vm_val = get_vregisterd(vm);
+ } else if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 1)) {
+ if (instr->VmField() == V0) {
+ // Format(instr, "fcmpd 'vn, #0.0");
+ vm_val = 0.0;
+ } else {
+ UnimplementedInstruction(instr);
+ return;
+ }
+ } else {
+ UnimplementedInstruction(instr);
+ return;
+ }
+
+ n_flag_ = false;
+ z_flag_ = false;
+ c_flag_ = false;
+ v_flag_ = false;
+
+ if (isnan(vn_val) || isnan(vm_val)) {
+ c_flag_ = true;
+ v_flag_ = true;
+ } else if (vn_val == vm_val) {
+ z_flag_ = true;
+ c_flag_ = true;
+ } else if (vn_val < vm_val) {
+ n_flag_ = true;
+ } else {
+ c_flag_ = true;
+ }
+}
+
+
+void Simulator::DecodeFP(Instr* instr) {
+ if (instr->IsFPImmOp()) {
+ DecodeFPImm(instr);
+ } else if (instr->IsFPIntCvtOp()) {
+ DecodeFPIntCvt(instr);
+ } else if (instr->IsFPOneSourceOp()) {
+ DecodeFPOneSource(instr);
+ } else if (instr->IsFPTwoSourceOp()) {
+ DecodeFPTwoSource(instr);
+ } else if (instr->IsFPCompareOp()) {
+ DecodeFPCompare(instr);
+ } else {
+ UnimplementedInstruction(instr);
+ }
+}
+
+
void Simulator::DecodeDPSimd2(Instr* instr) {
- UnimplementedInstruction(instr);
+ if (instr->IsFPOp()) {
+ DecodeFP(instr);
+ } else {
+ UnimplementedInstruction(instr);
+ }
}
@@ -1977,15 +2267,24 @@
int64_t parameter0,
int64_t parameter1,
int64_t parameter2,
- int64_t parameter3) {
+ int64_t parameter3,
+ bool fp_return,
+ bool fp_args) {
// Save the SP register before the call so we can restore it.
intptr_t sp_before_call = get_register(R31, R31IsSP);
// Setup parameters.
- set_register(R0, parameter0);
- set_register(R1, parameter1);
- set_register(R2, parameter2);
- set_register(R3, parameter3);
+ if (fp_args) {
+ set_vregisterd(V0, parameter0);
+ set_vregisterd(V1, parameter1);
+ set_vregisterd(V2, parameter2);
+ set_vregisterd(V3, parameter3);
+ } else {
+ set_register(R0, parameter0);
+ set_register(R1, parameter1);
+ set_register(R2, parameter2);
+ set_register(R3, parameter3);
+ }
// Make sure the activation frames are properly aligned.
intptr_t stack_pointer = sp_before_call;
@@ -2002,67 +2301,50 @@
// the LR the simulation stops when returning to this call point.
set_register(LR, kEndSimulatingPC);
- // Remember the values of callee-saved registers.
- int64_t r19_val = get_register(R19);
- int64_t r20_val = get_register(R20);
- int64_t r21_val = get_register(R21);
- int64_t r22_val = get_register(R22);
- int64_t r23_val = get_register(R23);
- int64_t r24_val = get_register(R24);
- int64_t r25_val = get_register(R25);
- int64_t r26_val = get_register(R26);
- int64_t r27_val = get_register(R27);
- int64_t r28_val = get_register(R28);
- int64_t r29_val = get_register(R29);
-
- // Setup the callee-saved registers with a known value. To be able to check
- // that they are preserved properly across dart execution.
+ // Remember the values of callee-saved registers, and set them up with a
+ // known value so that we are able to check that they are preserved
+ // properly across Dart execution.
+ int64_t preserved_vals[kAbiPreservedCpuRegCount];
int64_t callee_saved_value = icount_;
- set_register(R19, callee_saved_value);
- set_register(R20, callee_saved_value);
- set_register(R21, callee_saved_value);
- set_register(R22, callee_saved_value);
- set_register(R23, callee_saved_value);
- set_register(R24, callee_saved_value);
- set_register(R25, callee_saved_value);
- set_register(R26, callee_saved_value);
- set_register(R27, callee_saved_value);
- set_register(R28, callee_saved_value);
- set_register(R29, callee_saved_value);
+ for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
+ const Register r = static_cast<Register>(i);
+ preserved_vals[i - kAbiFirstPreservedCpuReg] = get_register(r);
+ set_register(r, callee_saved_value);
+ }
+
+ // Only the bottom half of the V registers must be preserved.
+ int64_t preserved_dvals[kAbiPreservedFpuRegCount];
+ for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+ const VRegister r = static_cast<VRegister>(i);
+ preserved_dvals[i - kAbiFirstPreservedFpuReg] = get_vregisterd(r);
+ set_vregisterd(r, callee_saved_value);
+ }
// Start the simulation
Execute();
- // Check that the callee-saved registers have been preserved.
- ASSERT(callee_saved_value == get_register(R19));
- ASSERT(callee_saved_value == get_register(R20));
- ASSERT(callee_saved_value == get_register(R21));
- ASSERT(callee_saved_value == get_register(R22));
- ASSERT(callee_saved_value == get_register(R23));
- ASSERT(callee_saved_value == get_register(R24));
- ASSERT(callee_saved_value == get_register(R25));
- ASSERT(callee_saved_value == get_register(R26));
- ASSERT(callee_saved_value == get_register(R27));
- ASSERT(callee_saved_value == get_register(R28));
- ASSERT(callee_saved_value == get_register(R29));
+ // Check that the callee-saved registers have been preserved,
+ // and restore them with the original value
+ for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
+ const Register r = static_cast<Register>(i);
+ ASSERT(callee_saved_value == get_register(r));
+ set_register(r, preserved_vals[i - kAbiFirstPreservedCpuReg]);
+ }
- // Restore callee-saved registers with the original value.
- set_register(R19, r19_val);
- set_register(R20, r20_val);
- set_register(R21, r21_val);
- set_register(R22, r22_val);
- set_register(R23, r23_val);
- set_register(R24, r24_val);
- set_register(R25, r25_val);
- set_register(R26, r26_val);
- set_register(R27, r27_val);
- set_register(R28, r28_val);
- set_register(R29, r29_val);
+ for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+ const VRegister r = static_cast<VRegister>(i);
+ ASSERT(callee_saved_value == get_vregisterd(r));
+ set_vregisterd(r, preserved_dvals[i - kAbiFirstPreservedFpuReg]);
+ }
// Restore the SP register and return R0.
set_register(R31, sp_before_call, R31IsSP);
int64_t return_value;
- return_value = get_register(R0);
+ if (fp_return) {
+ return_value = get_vregisterd(V0);
+ } else {
+ return_value = get_register(R0);
+ }
return return_value;
}
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index e089813..f5fc3ea 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -24,6 +24,11 @@
class Isolate;
class SimulatorSetjmpBuffer;
+typedef struct {
+ int64_t lo;
+ int64_t hi;
+} simd_value_t;
+
class Simulator {
public:
static const uword kSimulatorStackUnderflowSize = 64;
@@ -46,6 +51,11 @@
void set_wregister(Register reg, int32_t value, R31Type r31t = R31IsSP);
int32_t get_wregister(Register reg, R31Type r31t = R31IsSP) const;
+ // Get and set a V register in double ('d') mode. Setting clears the high
+ // 64 bits of the V register. Getting ignores the high 64 bits.
+ int64_t get_vregisterd(VRegister reg);
+ void set_vregisterd(VRegister reg, int64_t value);
+
int64_t get_pc() const;
int64_t get_last_pc() const;
void set_pc(int64_t pc);
@@ -70,7 +80,9 @@
int64_t parameter0,
int64_t parameter1,
int64_t parameter2,
- int64_t parameter3);
+ int64_t parameter3,
+ bool fp_return = false,
+ bool fp_args = false);
// Runtime and native call support.
enum CallKind {
@@ -107,6 +119,8 @@
bool c_flag_;
bool v_flag_;
+ simd_value_t vregisters_[kNumberOfVRegisters];
+
// Simulator support.
int64_t last_pc_;
int64_t pc_;
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index df0c467..491b8f2 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -44,9 +44,9 @@
static const int kSavedAboveReturnAddress = 3; // Saved above return address.
// Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -14;
-static const int kExitLinkSlotFromEntryFp = -13;
-static const int kSavedVMTagSlotFromEntryFp = -12;
+static const int kSavedContextSlotFromEntryFp = -22;
+static const int kExitLinkSlotFromEntryFp = -21;
+static const int kSavedVMTagSlotFromEntryFp = -20;
} // namespace dart
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 6fc6310..1b86c58 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -24,6 +24,7 @@
DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
DEFINE_FLAG(bool, use_slow_path, false,
"Set to true for debugging & verifying the slow paths.");
+DECLARE_FLAG(bool, trace_optimized_ic_calls);
// Input parameters:
// LR : return address.
@@ -353,28 +354,252 @@
}
+// Input parameters:
+// R4: arguments descriptor array.
void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
- __ Stop("GenerateCallStaticFunctionStub");
+ // Create a stub frame as we are pushing some objects on the stack before
+ // calling into the runtime.
+ __ EnterStubFrame();
+ // Setup space on stack for return value and preserve arguments descriptor.
+ __ Push(R4);
+ __ PushObject(Object::null_object(), PP);
+ __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
+ // Get Code object result and restore arguments descriptor array.
+ __ Pop(R0);
+ __ Pop(R4);
+ // Remove the stub frame.
+ __ LeaveStubFrame();
+ // Jump to the dart function.
+ __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+ __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+ __ br(R0);
}
+// Called from a static call only when an invalid code has been entered
+// (invalid because its function was optimized or deoptimized).
+// R4: arguments descriptor array.
void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
- __ Stop("GenerateFixCallersTargetStub");
+ // Create a stub frame as we are pushing some objects on the stack before
+ // calling into the runtime.
+ __ EnterStubFrame();
+ // Setup space on stack for return value and preserve arguments descriptor.
+ __ Push(R4);
+ __ PushObject(Object::null_object(), PP);
+ __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
+ // Get Code object result and restore arguments descriptor array.
+ __ Pop(R0);
+ __ Pop(R4);
+ // Remove the stub frame.
+ __ LeaveStubFrame();
+ // Jump to the dart function.
+ __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+ __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+ __ br(R0);
+}
+
+
+// Input parameters:
+// R2: smi-tagged argument count, may be zero.
+// FP[kParamEndSlotFromFp + 1]: last argument.
+static void PushArgumentsArray(Assembler* assembler) {
+ // Allocate array to store arguments of caller.
+ __ LoadObject(R1, Object::null_object(), PP);
+ // R1: null element type for raw Array.
+ // R2: smi-tagged argument count, may be zero.
+ __ BranchLink(&StubCode::AllocateArrayLabel(), PP);
+ // R0: newly allocated array.
+ // R2: smi-tagged argument count, may be zero (was preserved by the stub).
+ __ Push(R0); // Array is in R0 and on top of stack.
+ __ add(R1, FP, Operand(R2, LSL, 2));
+ __ AddImmediate(R1, R1, kParamEndSlotFromFp * kWordSize, PP);
+ __ AddImmediate(R3, R0, Array::data_offset() - kHeapObjectTag, PP);
+ // R1: address of first argument on stack.
+ // R3: address of first argument in array.
+
+ Label loop, loop_exit;
+ __ CompareRegisters(R2, ZR);
+ __ b(&loop_exit, LE);
+ __ Bind(&loop);
+ __ ldr(R7, Address(R1));
+ __ AddImmediate(R1, R1, -kWordSize, PP);
+ __ AddImmediate(R3, R3, kWordSize, PP);
+ __ AddImmediateSetFlags(R2, R2, -Smi::RawValue(1), PP);
+ __ str(R7, Address(R3, -kWordSize));
+ __ b(&loop, GE);
+ __ Bind(&loop_exit);
+}
+
+
+DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
+ intptr_t deopt_reason,
+ uword saved_registers_address);
+
+DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp);
+
+
+// Used by eager and lazy deoptimization. Preserve result in RAX if necessary.
+// This stub translates optimized frame into unoptimized frame. The optimized
+// frame can contain values in registers and on stack, the unoptimized
+// frame contains all values on stack.
+// Deoptimization occurs in following steps:
+// - Push all registers that can contain values.
+// - Call C routine to copy the stack and saved registers into temporary buffer.
+// - Adjust caller's frame to correct unoptimized frame size.
+// - Fill the unoptimized frame.
+// - Materialize objects that require allocation (e.g. Double instances).
+// GC can occur only after frame is fully rewritten.
+// Stack after TagAndPushPP() below:
+// +------------------+
+// | Saved PP | <- PP
+// +------------------+
+// | PC marker | <- TOS
+// +------------------+
+// | Saved FP | <- FP of stub
+// +------------------+
+// | return-address | (deoptimization point)
+// +------------------+
+// | ... | <- SP of optimized frame
+//
+// Parts of the code cannot GC, part of the code can GC.
+static void GenerateDeoptimizationSequence(Assembler* assembler,
+ bool preserve_result) {
+ // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+ // is no need to set the correct PC marker or load PP, since they get patched.
+ __ EnterFrame(0);
+ __ Push(ZR);
+ __ TagAndPushPP();
+
+ // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
+ // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
+ const intptr_t saved_result_slot_from_fp =
+ kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
+ // Result in R0 is preserved as part of pushing all registers below.
+
+ // Push registers in their enumeration order: lowest register number at
+ // lowest address.
+ for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) {
+ const Register r = static_cast<Register>(i);
+ __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
+ }
+
+ for (intptr_t reg_idx = kNumberOfVRegisters - 1; reg_idx >= 0; reg_idx--) {
+ VRegister vreg = static_cast<VRegister>(reg_idx);
+ // TODO(zra): Save whole V registers. For now, push twice.
+ __ PushDouble(vreg);
+ __ PushDouble(vreg);
+ }
+
+ __ mov(R0, SP); // Pass address of saved registers block.
+ __ ReserveAlignedFrameSpace(0);
+ __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+ // Result (R0) is stack-size (FP - SP) in bytes.
+
+ if (preserve_result) {
+ // Restore result into R1 temporarily.
+ __ LoadFromOffset(R1, FP, saved_result_slot_from_fp * kWordSize);
+ }
+
+ // There is a Dart Frame on the stack. We must restore PP and leave frame.
+ __ LeaveDartFrame();
+ __ sub(TMP, FP, Operand(R0));
+ __ mov(SP, TMP);
+
+ // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
+ // is no need to set the correct PC marker or load PP, since they get patched.
+ __ EnterFrame(0);
+ __ Push(ZR);
+ __ TagAndPushPP();
+
+ if (preserve_result) {
+ __ Push(R1); // Preserve result as first local.
+ }
+ __ ReserveAlignedFrameSpace(0);
+ __ mov(R0, FP); // Pass last FP as parameter in R0.
+ __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
+ if (preserve_result) {
+ // Restore result into R1.
+ __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize);
+ }
+ // Code above cannot cause GC.
+ // There is a Dart Frame on the stack. We must restore PP and leave frame.
+ __ LeaveDartFrame();
+
+ // Frame is fully rewritten at this point and it is safe to perform a GC.
+ // Materialize any objects that were deferred by FillFrame because they
+ // require allocation.
+ __ EnterStubFrame();
+ if (preserve_result) {
+ __ Push(ZR); // Workaround for dropped stack slot during GC.
+ __ Push(R1); // Preserve result, it will be GC-d here.
+ }
+ __ Push(ZR); // Space for the result.
+ __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
+ // Result tells stub how many bytes to remove from the expression stack
+ // of the bottom-most frame. They were used as materialization arguments.
+ __ Pop(R1);
+ __ SmiUntag(R1);
+ if (preserve_result) {
+ __ Pop(R0); // Restore result.
+ __ Drop(1); // Workaround for dropped stack slot during GC.
+ }
+ __ LeaveStubFrame();
+ // Remove materialization arguments.
+ __ add(TMP, SP, Operand(R1, UXTX, 0));
+ __ mov(SP, TMP);
+ __ ret();
}
void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
- __ Stop("GenerateDeoptimizeLazyStub");
+ // Correct return address to point just after the call that is being
+ // deoptimized.
+ __ AddImmediate(LR, LR, -CallPattern::kLengthInBytes, kNoPP);
+ GenerateDeoptimizationSequence(assembler, true); // Preserve R0.
}
void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
- __ Stop("GenerateDeoptimizeStub");
+ GenerateDeoptimizationSequence(assembler, false); // Don't preserve R0.
}
void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
- __ Stop("GenerateMegamorphicMissStub");
+ __ EnterStubFrame();
+
+ // Load the receiver.
+ __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+ __ add(TMP, FP, Operand(R2, LSL, 2)); // R2 is Smi.
+ __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+
+ // Preserve IC data and arguments descriptor.
+ __ Push(R5);
+ __ Push(R4);
+
+ // Push space for the return value.
+ // Push the receiver.
+ // Push IC data object.
+ // Push arguments descriptor array.
+ __ PushObject(Object::null_object(), PP);
+ __ Push(R6);
+ __ Push(R5);
+ __ Push(R4);
+ __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
+ // Remove arguments.
+ __ Drop(3);
+ __ Pop(R0); // Get result into R0 (target function).
+
+ // Restore IC data and arguments descriptor.
+ __ Pop(R4);
+ __ Pop(R5);
+
+ __ LeaveStubFrame();
+
+ // Tail-call to target function.
+ __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+ __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+ __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
+ __ br(R2);
}
@@ -530,12 +755,12 @@
// 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) * kWordSize;
+ -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
// const intptr_t kPreservedRegSpace =
// kWordSize * (kAbiPreservedCpuRegCount + kPreservedContextSlots);
// Save the callee-saved registers.
- for (int i = R19; i <= R28; i++) {
+ for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
const Register r = static_cast<Register>(i);
// We use str instead of the Push macro because we will be pushing the PP
// register when it is not holding a pool-pointer since we are coming from
@@ -543,8 +768,11 @@
__ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
}
- // TODO(zra): Save the bottom 64-bits of callee-saved floating point
- // registers.
+ // Save the bottom 64-bits of callee-saved V registers.
+ for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
+ const VRegister r = static_cast<VRegister>(i);
+ __ PushDouble(r);
+ }
// Push new context.
__ Push(R3);
@@ -567,7 +795,7 @@
__ LoadFieldFromOffset(R5, CTX, Context::isolate_offset());
// Save the current VMTag on the stack.
- ASSERT(kSavedVMTagSlotFromEntryFp == -12);
+ ASSERT(kSavedVMTagSlotFromEntryFp == -20);
__ LoadFromOffset(R4, R5, Isolate::vm_tag_offset());
__ Push(R4);
@@ -589,8 +817,8 @@
// The constants kSavedContextSlotFromEntryFp and
// kExitLinkSlotFromEntryFp must be kept in sync with the code below.
- ASSERT(kExitLinkSlotFromEntryFp == -13);
- ASSERT(kSavedContextSlotFromEntryFp == -14);
+ ASSERT(kExitLinkSlotFromEntryFp == -21);
+ ASSERT(kSavedContextSlotFromEntryFp == -22);
__ Push(R6);
__ Push(R4);
@@ -650,8 +878,14 @@
__ Pop(R3);
__ Pop(R4);
+ // Restore the bottom 64-bits of callee-saved V registers.
+ for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
+ const VRegister r = static_cast<VRegister>(i);
+ __ PushDouble(r);
+ }
+
// Restore C++ ABI callee-saved registers.
- for (int i = R28; i >= R19; i--) {
+ for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) {
Register r = static_cast<Register>(i);
// We use ldr instead of the Pop macro because we will be popping the PP
// register when it is not holding a pool-pointer since we are returning to
@@ -659,8 +893,6 @@
__ ldr(r, Address(SP, 1 * kWordSize, Address::PostIndex));
}
- // TODO(zra): Restore callee-saved fpu registers.
-
// Restore the frame pointer and return.
__ LeaveFrame();
__ ret();
@@ -966,7 +1198,7 @@
__ Push(R1);
} else {
// Push null type arguments.
- __ Push(R2);
+ __ PushObject(Object::null_object(), PP);
}
__ CallRuntime(kAllocateObjectRuntimeEntry, 2); // Allocate object.
__ Drop(2); // Pop arguments.
@@ -978,13 +1210,65 @@
}
+// Called for invoking "dynamic noSuchMethod(Invocation invocation)" function
+// from the entry code of a dart function after an error in passed argument
+// name or number is detected.
+// Input parameters:
+// LR : return address.
+// SP : address of last argument.
+// R5: inline cache data object.
+// R4: arguments descriptor array.
void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
- __ Stop("GenerateCallNoSuchMethodFunctionStub");
+ __ EnterStubFrame(true);
+
+ // Load the receiver.
+ __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+ __ add(TMP, FP, Operand(R2, LSL, 2)); // R2 is Smi.
+ __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+
+ // Push space for the return value.
+ // Push the receiver.
+ // Push IC data object.
+ // Push arguments descriptor array.
+ __ PushObject(Object::null_object(), PP);
+ __ Push(R6);
+ __ Push(R5);
+ __ Push(R4);
+
+ // R2: Smi-tagged arguments array length.
+ PushArgumentsArray(assembler);
+
+ __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
+ // Remove arguments.
+ __ Drop(4);
+ __ Pop(R0); // Get result into R0.
+ __ LeaveStubFrame();
+ __ ret();
}
+// R6: function object.
+// R5: inline cache data object.
+// Cannot use function object from ICData as it may be the inlined
+// function and not the top-scope function.
void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
- __ Stop("GenerateOptimizedUsageCounterIncrement");
+ Register ic_reg = R5;
+ Register func_reg = R6;
+ if (FLAG_trace_optimized_ic_calls) {
+ __ EnterStubFrame();
+ __ Push(R6); // Preserve.
+ __ Push(R5); // Preserve.
+ __ Push(ic_reg); // Argument.
+ __ Push(func_reg); // Argument.
+ __ CallRuntime(kTraceICCallRuntimeEntry, 2);
+ __ Drop(2); // Discard argument;
+ __ Pop(R5); // Restore.
+ __ Pop(R6); // Restore.
+ __ LeaveStubFrame();
+ }
+ __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset());
+ __ add(R7, R7, Operand(1));
+ __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset());
}
@@ -1035,7 +1319,7 @@
Label not_stepping;
__ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
__ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
- __ CompareImmediate(R6, 0, kNoPP);
+ __ CompareRegisters(R6, ZR);
__ b(¬_stepping, EQ);
__ EnterStubFrame();
__ Push(R5); // Preserve IC data.
@@ -1235,19 +1519,25 @@
void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
Assembler* assembler) {
- __ Stop("GenerateOneArgOptimizedCheckInlineCacheStub");
+ GenerateOptimizedUsageCounterIncrement(assembler);
+ GenerateNArgsCheckInlineCacheStub(
+ assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
}
void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
Assembler* assembler) {
- __ Stop("GenerateTwoArgsOptimizedCheckInlineCacheStub");
+ GenerateOptimizedUsageCounterIncrement(assembler);
+ GenerateNArgsCheckInlineCacheStub(
+ assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
}
void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
Assembler* assembler) {
- __ Stop("GenerateThreeArgsOptimizedCheckInlineCacheStub");
+ GenerateOptimizedUsageCounterIncrement(assembler);
+ GenerateNArgsCheckInlineCacheStub(
+ assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
}
@@ -1487,8 +1777,24 @@
}
+// Calls to the runtime to optimize the given function.
+// R6: function to be re-optimized.
+// R4: argument descriptor (preserved).
void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
- __ Stop("GenerateOptimizeFunctionStub");
+ __ EnterStubFrame();
+ __ Push(R4);
+ // Setup space on stack for the return value.
+ __ PushObject(Object::null_object(), PP);
+ __ Push(R6);
+ __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
+ __ Pop(R0); // Discard argument.
+ __ Pop(R0); // Get Code object
+ __ Pop(R4); // Restore argument descriptor.
+ __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+ __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
+ __ LeaveStubFrame();
+ __ br(R0);
+ __ hlt(0);
}
@@ -1585,9 +1891,20 @@
}
+// Called from optimized code only.
+// LR: return address.
+// SP + 4: left operand.
+// SP + 0: right operand.
+// Return Zero condition flag set if equal.
void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
Assembler* assembler) {
- __ Stop("GenerateOptimizedIdenticalWithNumberCheckStub");
+ const Register temp = R2;
+ const Register left = R1;
+ const Register right = R0;
+ __ LoadFromOffset(left, SP, 1 * kWordSize);
+ __ LoadFromOffset(right, SP, 0 * kWordSize);
+ GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
+ __ ret();
}
} // namespace dart
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 149a9b6..77c0455 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -279,6 +279,7 @@
V(DartScheme, "dart:") \
V(DartSchemePrivate, "dart:_") \
V(DartNativeWrappers, "dart:nativewrappers") \
+ V(DartNativeWrappersLibName, "dart.nativewrappers") \
V(DartAsync, "dart:async") \
V(DartCore, "dart:core") \
V(DartCollection, "dart:collection") \
@@ -317,6 +318,7 @@
V(TempParam, ":temp_param") \
V(UserTag, "UserTag") \
V(_UserTag, "_UserTag") \
+ V(Default, "Default") \
V(StubPrefix, "[Stub] ") \
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index f24f5a3..5d5394c 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -83,10 +83,10 @@
class UserTags : public AllStatic {
public:
- static const uword kNoUserTag = 0;
// UserTag id space: [kUserTagIdOffset, kUserTagIdOffset + kMaxUserTags).
static const intptr_t kMaxUserTags = 64;
static const uword kUserTagIdOffset = 0x4096;
+ static const uword kDefaultUserTag = kUserTagIdOffset;
static const char* TagName(uword tag_id);
static bool IsUserTag(uword tag_id) {
return (tag_id >= kUserTagIdOffset) &&
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 1e7ef1d..50bd533 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -135,7 +135,7 @@
// }
class TimerScope : public StackResource {
public:
- TimerScope(bool flag, Timer* timer, BaseIsolate* isolate = NULL)
+ TimerScope(bool flag, Timer* timer, Isolate* isolate = NULL)
: StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
if (flag_) {
if (!timer_->running()) {
@@ -165,7 +165,7 @@
class PauseTimerScope : public StackResource {
public:
- PauseTimerScope(bool flag, Timer* timer, BaseIsolate* isolate = NULL)
+ PauseTimerScope(bool flag, Timer* timer, Isolate* isolate = NULL)
: StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
if (flag_) {
if (timer_->running()) {
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 8b4a317..2e370e2 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -155,10 +155,16 @@
#define EXECUTE_TEST_CODE_INT64(name, entry) \
static_cast<int64_t>(Simulator::Current()->Call( \
bit_cast<int64_t, uword>(entry), 0, 0, 0, 0))
+#define EXECUTE_TEST_CODE_DOUBLE(name, entry) \
+ bit_cast<double, int64_t>(Simulator::Current()->Call( \
+ bit_cast<int64_t, uword>(entry), 0, 0, 0, 0, true))
#else
#define EXECUTE_TEST_CODE_INT32(name, entry) \
static_cast<int32_t>(Simulator::Current()->Call( \
bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
+#define EXECUTE_TEST_CODE_DOUBLE(name, entry) \
+ bit_cast<double, int64_t>(Simulator::Current()->Call( \
+ bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
#endif
#define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1) \
static_cast<int64_t>(Simulator::Current()->Call( \
@@ -170,9 +176,6 @@
#define EXECUTE_TEST_CODE_FLOAT(name, entry) \
bit_cast<float, int32_t>(Simulator::Current()->Call( \
bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
-#define EXECUTE_TEST_CODE_DOUBLE(name, entry) \
- bit_cast<double, int64_t>(Simulator::Current()->Call( \
- bit_cast<int32_t, uword>(entry), 0, 0, 0, 0, true))
#define EXECUTE_TEST_CODE_INT32_F(name, entry, float_arg) \
static_cast<int32_t>(Simulator::Current()->Call( \
bit_cast<int32_t, uword>(entry), \
diff --git a/runtime/vm/utils_test.cc b/runtime/vm/utils_test.cc
index a287172..97385a6 100644
--- a/runtime/vm/utils_test.cc
+++ b/runtime/vm/utils_test.cc
@@ -219,4 +219,13 @@
EXPECT_EQ(0x0, reinterpret_cast<uint8_t*>(&value64le)[7]);
}
+
+UNIT_TEST_CASE(DoublesBitEqual) {
+ EXPECT(Utils::DoublesBitEqual(1.0, 1.0));
+ EXPECT(!Utils::DoublesBitEqual(1.0, -1.0));
+ EXPECT(Utils::DoublesBitEqual(0.0, 0.0));
+ EXPECT(!Utils::DoublesBitEqual(0.0, -0.0));
+ EXPECT(Utils::DoublesBitEqual(NAN, NAN));
+}
+
} // namespace dart
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index ea66f04..18a871b 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -275,6 +275,9 @@
'object.h',
'object_arm_test.cc',
'object_arm64_test.cc',
+ 'object_graph.cc',
+ 'object_graph.h',
+ 'object_graph_test.cc',
'object_ia32_test.cc',
'object_id_ring.cc',
'object_id_ring.h',
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index ff53c21..fea44c9 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -157,7 +157,7 @@
class StackZone : public StackResource {
public:
// Create an empty zone and set is at the current zone for the Isolate.
- explicit StackZone(BaseIsolate* isolate)
+ explicit StackZone(Isolate* isolate)
: StackResource(isolate),
zone_() {
#ifdef DEBUG
@@ -167,14 +167,16 @@
reinterpret_cast<intptr_t>(&zone_));
}
#endif
- zone_.Link(isolate->current_zone());
- isolate->set_current_zone(&zone_);
+ BaseIsolate* base_isolate = reinterpret_cast<BaseIsolate*>(isolate);
+ zone_.Link(base_isolate->current_zone());
+ base_isolate->set_current_zone(&zone_);
}
// Delete all memory associated with the zone.
~StackZone() {
- ASSERT(isolate()->current_zone() == &zone_);
- isolate()->set_current_zone(zone_.previous_);
+ BaseIsolate* base_isolate = reinterpret_cast<BaseIsolate*>(isolate());
+ ASSERT(base_isolate->current_zone() == &zone_);
+ base_isolate->set_current_zone(zone_.previous_);
#ifdef DEBUG
if (FLAG_trace_zones) {
OS::PrintErr("*** Deleting Stack zone 0x%" Px "(0x%" Px ")\n",
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 5209eb4..31c2153 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -4,6 +4,24 @@
*/
library dart.dom._blink;
+import 'dart:async';
+import 'dart:collection';
+import 'dart:html';
+import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:html_common';
+import 'dart:indexed_db';
+import 'dart:isolate';
+import "dart:convert";
+import 'dart:math';
+import 'dart:mirrors';
+import 'dart:nativewrappers';
+import 'dart:typed_data';
+import 'dart:web_gl' as gl;
+import 'dart:web_sql';
+import 'dart:svg' as svg;
+import 'dart:svg' show Matrix;
+import 'dart:svg' show SvgSvgElement;
+import 'dart:web_audio' show AudioNode, AudioParam;
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@@ -11,6 +29,12 @@
// DO NOT EDIT
// Auto-generated dart:_blink library.
+// TODO(leafp) These are mostly copied over from dart:html. When
+// we shift dart:blink generation over to dartium, this dependency
+// should go away, or at least be reconsidered.
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
+// Not actually used, but imported since dart:html can generate these objects.
@@ -46,6 +70,19 @@
Native_AudioNode_numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
+ // Generated overload resolver
+Native_AudioNode__connect(mthis, destination, output, input) {
+ if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
+ Native_AudioNode__connect_1_Callback(mthis, destination, output, input);
+ return;
+ }
+ if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
+ Native_AudioNode__connect_2_Callback(mthis, destination, output);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode__connect_1_Callback";
Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode__connect_2_Callback";
@@ -98,6 +135,20 @@
Native_TimedItem_startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+ // Generated overload resolver
+Native_Animation_Animation(target, keyframes, timingInput) {
+ if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+ return Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
+ }
+ if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
+ return Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
+ }
+ if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
+ return Native_Animation__create_3constructorCallback(target, keyframes);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation__create_1constructorCallback";
Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation__create_2constructorCallback";
@@ -222,6 +273,24 @@
Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback";
+ // Generated overload resolver
+Native_AudioBufferSourceNode_start(mthis, when, grainOffset, grainDuration) {
+ if (grainDuration != null) {
+ Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration);
+ return;
+ }
+ if (grainOffset != null) {
+ Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset);
+ return;
+ }
+ if (when != null) {
+ Native_AudioBufferSourceNode__start_3_Callback(mthis, when);
+ return;
+ }
+ Native_AudioBufferSourceNode__start_4_Callback(mthis);
+ return;
+ }
+
Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode__start_1_Callback";
Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode__start_2_Callback";
@@ -230,10 +299,25 @@
Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode__start_4_Callback";
+ // Generated overload resolver
+Native_AudioBufferSourceNode_stop(mthis, when) {
+ if (when != null) {
+ Native_AudioBufferSourceNode__stop_1_Callback(mthis, when);
+ return;
+ }
+ Native_AudioBufferSourceNode__stop_2_Callback(mthis);
+ return;
+ }
+
Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode__stop_1_Callback";
Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode__stop_2_Callback";
+ // Generated overload resolver
+Native_AudioContext_AudioContext() {
+ return Native_AudioContext__create_1constructorCallback();
+ }
+
Native_AudioContext__create_1constructorCallback() native "AudioContext__create_1constructorCallback";
Native_AudioContext_activeSourceCount_Getter(mthis) native "AudioContext_activeSourceCount_Getter";
@@ -256,20 +340,52 @@
Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback";
+ // Generated overload resolver
+Native_AudioContext_createChannelMerger(mthis, numberOfInputs) {
+ if (numberOfInputs != null) {
+ return Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs);
+ }
+ return Native_AudioContext__createChannelMerger_2_Callback(mthis);
+ }
+
Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext__createChannelMerger_1_Callback";
Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext__createChannelMerger_2_Callback";
+ // Generated overload resolver
+Native_AudioContext_createChannelSplitter(mthis, numberOfOutputs) {
+ if (numberOfOutputs != null) {
+ return Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs);
+ }
+ return Native_AudioContext__createChannelSplitter_2_Callback(mthis);
+ }
+
Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext__createChannelSplitter_1_Callback";
Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext__createChannelSplitter_2_Callback";
Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback";
+ // Generated overload resolver
+Native_AudioContext_createDelay(mthis, maxDelayTime) {
+ if (maxDelayTime != null) {
+ return Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime);
+ }
+ return Native_AudioContext__createDelay_2_Callback(mthis);
+ }
+
Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelay_1_Callback";
Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext__createDelay_2_Callback";
+ // Generated overload resolver
+Native_AudioContext_createDelayNode(mthis, maxDelayTime) {
+ if (maxDelayTime != null) {
+ return Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime);
+ }
+ return Native_AudioContext__createDelayNode_2_Callback(mthis);
+ }
+
Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelayNode_1_Callback";
Native_AudioContext__createDelayNode_2_Callback(mthis) native "AudioContext__createDelayNode_2_Callback";
@@ -280,6 +396,17 @@
Native_AudioContext_createGainNode_Callback(mthis) native "AudioContext_createGainNode_Callback";
+ // Generated overload resolver
+Native_AudioContext_createJavaScriptNode(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+ if (numberOfOutputChannels != null) {
+ return Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+ }
+ if (numberOfInputChannels != null) {
+ return Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels);
+ }
+ return Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize);
+ }
+
Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createJavaScriptNode_1_Callback";
Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createJavaScriptNode_2_Callback";
@@ -298,6 +425,20 @@
Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback";
+ // Generated overload resolver
+Native_AudioContext_createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+ if (numberOfOutputChannels != null) {
+ return Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+ }
+ if (numberOfInputChannels != null) {
+ return Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
+ }
+ if (bufferSize != null) {
+ return Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize);
+ }
+ return Native_AudioContext__createScriptProcessor_4_Callback(mthis);
+ }
+
Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createScriptProcessor_1_Callback";
Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createScriptProcessor_2_Callback";
@@ -424,6 +565,20 @@
Native_Blob_type_Getter(mthis) native "Blob_type_Getter";
+ // Generated overload resolver
+Native_Blob_slice(mthis, start, end, contentType) {
+ if (contentType != null) {
+ return Native_Blob__slice_1_Callback(mthis, start, end, contentType);
+ }
+ if (end != null) {
+ return Native_Blob__slice_2_Callback(mthis, start, end);
+ }
+ if (start != null) {
+ return Native_Blob__slice_3_Callback(mthis, start);
+ }
+ return Native_Blob__slice_4_Callback(mthis);
+ }
+
Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob__slice_1_Callback";
Native_Blob__slice_2_Callback(mthis, start, end) native "Blob__slice_2_Callback";
@@ -580,12 +735,28 @@
Native_CSSStyleSheet_rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
+ // Generated overload resolver
+Native_CSSStyleSheet_addRule(mthis, selector, style, index) {
+ if (index != null) {
+ return Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index);
+ }
+ return Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style);
+ }
+
Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet__addRule_1_Callback";
Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet__addRule_2_Callback";
Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback";
+ // Generated overload resolver
+Native_CSSStyleSheet_insertRule(mthis, rule, index) {
+ if (index != null) {
+ return Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index);
+ }
+ return Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule);
+ }
+
Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet__insertRule_1_Callback";
Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet__insertRule_2_Callback";
@@ -704,6 +875,16 @@
Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_clip(mthis, winding) {
+ if (winding != null) {
+ Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding);
+ return;
+ }
+ Native_CanvasRenderingContext2D__clip_2_Callback(mthis);
+ return;
+ }
+
Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D__clip_1_Callback";
Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D__clip_2_Callback";
@@ -724,6 +905,59 @@
Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D__drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
+ if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+ return;
+ }
+ if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+ return;
+ }
+ if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+ Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+ return;
+ }
+ if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+ return;
+ }
+ if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+ return;
+ }
+ if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+ Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+ return;
+ }
+ if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+ return;
+ }
+ if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+ return;
+ }
+ if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+ Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+ return;
+ }
+ if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+ return;
+ }
+ if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+ Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+ return;
+ }
+ if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+ Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
@@ -752,12 +986,32 @@
Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_fill(mthis, winding) {
+ if (winding != null) {
+ Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding);
+ return;
+ }
+ Native_CanvasRenderingContext2D__fill_2_Callback(mthis);
+ return;
+ }
+
Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D__fill_1_Callback";
Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D__fill_2_Callback";
Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_fillText(mthis, text, x, y, maxWidth) {
+ if (maxWidth != null) {
+ Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth);
+ return;
+ }
+ Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y);
+ return;
+ }
+
Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";
Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";
@@ -768,6 +1022,14 @@
Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_isPointInPath(mthis, x, y, winding) {
+ if (winding != null) {
+ return Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding);
+ }
+ return Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y);
+ }
+
Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";
Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";
@@ -780,6 +1042,19 @@
Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+ if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+ Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy);
+ return;
+ }
+ if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
+ Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";
Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";
@@ -806,6 +1081,16 @@
Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_strokeText(mthis, text, x, y, maxWidth) {
+ if (maxWidth != null) {
+ Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth);
+ return;
+ }
+ Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y);
+ return;
+ }
+
Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";
Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";
@@ -816,6 +1101,19 @@
Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
+ // Generated overload resolver
+Native_CanvasRenderingContext2D_putImageDataHD(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+ if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+ Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy);
+ return;
+ }
+ if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
+ Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";
Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";
@@ -852,6 +1150,16 @@
Native_Clipboard_types_Getter(mthis) native "Clipboard_types_Getter";
+ // Generated overload resolver
+Native_Clipboard_clearData(mthis, type) {
+ if (type != null) {
+ Native_Clipboard__clearData_1_Callback(mthis, type);
+ return;
+ }
+ Native_Clipboard__clearData_2_Callback(mthis);
+ return;
+ }
+
Native_Clipboard__clearData_1_Callback(mthis, type) native "Clipboard__clearData_1_Callback";
Native_Clipboard__clearData_2_Callback(mthis) native "Clipboard__clearData_2_Callback";
@@ -868,6 +1176,11 @@
Native_CloseEvent_wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+ // Generated overload resolver
+Native_Comment_Comment(data) {
+ return Native_Comment__create_1constructorCallback(data);
+ }
+
Native_Comment__create_1constructorCallback(data) native "Comment__create_1constructorCallback";
Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
@@ -1000,6 +1313,11 @@
Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback";
+ // Generated overload resolver
+Native_DOMParser_DomParser() {
+ return Native_DOMParser__create_1constructorCallback();
+ }
+
Native_DOMParser__create_1constructorCallback() native "DOMParser__create_1constructorCallback";
Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback";
@@ -1012,6 +1330,14 @@
Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback";
+ // Generated overload resolver
+Native_DOMTokenList_toggle(mthis, token, force) {
+ if (force != null) {
+ return Native_DOMTokenList__toggle_1_Callback(mthis, token, force);
+ }
+ return Native_DOMTokenList__toggle_2_Callback(mthis, token);
+ }
+
Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList__toggle_1_Callback";
Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList__toggle_2_Callback";
@@ -1030,14 +1356,49 @@
Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback";
+ // Generated overload resolver
+Native_DOMStringMap___delete__(mthis, index_OR_name) {
+ if ((index_OR_name is int || index_OR_name == null)) {
+ return Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name);
+ }
+ if ((index_OR_name is String || index_OR_name == null)) {
+ return Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap____delete___1_Callback";
Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap____delete___2_Callback";
+ // Generated overload resolver
+Native_DOMStringMap___getter__(mthis, index_OR_name) {
+ if ((index_OR_name is int || index_OR_name == null)) {
+ return Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name);
+ }
+ if ((index_OR_name is String || index_OR_name == null)) {
+ return Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap____getter___1_Callback";
Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap____getter___2_Callback";
+ // Generated overload resolver
+Native_DOMStringMap___setter__(mthis, index_OR_name, value) {
+ if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
+ Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value);
+ return;
+ }
+ if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
+ Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___1_Callback";
Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___2_Callback";
@@ -1056,6 +1417,17 @@
Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback";
+ // Generated overload resolver
+Native_DataTransferItemList_add(mthis, data_OR_file, type) {
+ if ((data_OR_file is File || data_OR_file == null) && type == null) {
+ return Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file);
+ }
+ if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
+ return Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList__add_1_Callback";
Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList__add_2_Callback";
@@ -1190,6 +1562,16 @@
Native_Entry_name_Getter(mthis) native "Entry_name_Getter";
+ // Generated overload resolver
+Native_Entry__copyTo(mthis, parent, name, successCallback, errorCallback) {
+ if (name != null) {
+ Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+ return;
+ }
+ Native_Entry__copyTo_2_Callback(mthis, parent);
+ return;
+ }
+
Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";
Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry__copyTo_2_Callback";
@@ -1198,6 +1580,16 @@
Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback";
+ // Generated overload resolver
+Native_Entry__moveTo(mthis, parent, name, successCallback, errorCallback) {
+ if (name != null) {
+ Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+ return;
+ }
+ Native_Entry__moveTo_2_Callback(mthis, parent);
+ return;
+ }
+
Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";
Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry__moveTo_2_Callback";
@@ -1294,10 +1686,29 @@
Native_Document_createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
+ // Generated overload resolver
+Native_Document__createEvent(mthis, eventType) {
+ if (eventType != null) {
+ return Native_Document__createEvent_1_Callback(mthis, eventType);
+ }
+ return Native_Document__createEvent_2_Callback(mthis);
+ }
+
Native_Document__createEvent_1_Callback(mthis, eventType) native "Document__createEvent_1_Callback";
Native_Document__createEvent_2_Callback(mthis) native "Document__createEvent_2_Callback";
+ // Generated overload resolver
+Native_Document__createNodeIterator(mthis, root, whatToShow, filter) {
+ if (filter != null) {
+ return Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
+ }
+ if (whatToShow != null) {
+ return Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow);
+ }
+ return Native_Document__createNodeIterator_3_Callback(mthis, root);
+ }
+
Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document__createNodeIterator_1_Callback";
Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document__createNodeIterator_2_Callback";
@@ -1310,6 +1721,17 @@
Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback";
+ // Generated overload resolver
+Native_Document__createTreeWalker(mthis, root, whatToShow, filter) {
+ if (filter != null) {
+ return Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
+ }
+ if (whatToShow != null) {
+ return Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow);
+ }
+ return Native_Document__createTreeWalker_3_Callback(mthis, root);
+ }
+
Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document__createTreeWalker_1_Callback";
Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document__createTreeWalker_2_Callback";
@@ -1330,6 +1752,14 @@
Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback";
+ // Generated overload resolver
+Native_Document_importNode(mthis, node, deep) {
+ if (deep != null) {
+ return Native_Document__importNode_1_Callback(mthis, node, deep);
+ }
+ return Native_Document__importNode_2_Callback(mthis, node);
+ }
+
Native_Document__importNode_1_Callback(mthis, node, deep) native "Document__importNode_1_Callback";
Native_Document__importNode_2_Callback(mthis, node) native "Document__importNode_2_Callback";
@@ -1438,6 +1868,20 @@
Native_Element_tagName_Getter(mthis) native "Element_tagName_Getter";
+ // Generated overload resolver
+Native_Element_animate(mthis, keyframes, timingInput) {
+ if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
+ return Native_Element__animate_1_Callback(mthis, keyframes, timingInput);
+ }
+ if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
+ return Native_Element__animate_2_Callback(mthis, keyframes, timingInput);
+ }
+ if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
+ return Native_Element__animate_3_Callback(mthis, keyframes);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element__animate_1_Callback";
Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element__animate_2_Callback";
@@ -1488,10 +1932,30 @@
Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback";
+ // Generated overload resolver
+Native_Element__scrollIntoView(mthis, alignWithTop) {
+ if (alignWithTop != null) {
+ Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop);
+ return;
+ }
+ Native_Element__scrollIntoView_2_Callback(mthis);
+ return;
+ }
+
Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element__scrollIntoView_1_Callback";
Native_Element__scrollIntoView_2_Callback(mthis) native "Element__scrollIntoView_2_Callback";
+ // Generated overload resolver
+Native_Element__scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
+ if (centerIfNeeded != null) {
+ Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
+ return;
+ }
+ Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis);
+ return;
+ }
+
Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";
Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element__scrollIntoViewIfNeeded_2_Callback";
@@ -1528,6 +1992,11 @@
Native_ErrorEvent_message_Getter(mthis) native "ErrorEvent_message_Getter";
+ // Generated overload resolver
+Native_EventSource_EventSource(url, eventSourceInit) {
+ return Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+ }
+
Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource__create_1constructorCallback";
Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
@@ -1564,6 +2033,11 @@
Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback";
+ // Generated overload resolver
+Native_FileReader_FileReader() {
+ return Native_FileReader__create_1constructorCallback();
+ }
+
Native_FileReader__create_1constructorCallback() native "FileReader__create_1constructorCallback";
Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
@@ -1578,6 +2052,16 @@
Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback";
+ // Generated overload resolver
+Native_FileReader_readAsText(mthis, blob, encoding) {
+ if (encoding != null) {
+ Native_FileReader__readAsText_1_Callback(mthis, blob, encoding);
+ return;
+ }
+ Native_FileReader__readAsText_2_Callback(mthis, blob);
+ return;
+ }
+
Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader__readAsText_1_Callback";
Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader__readAsText_2_Callback";
@@ -1588,6 +2072,11 @@
Native_FileReader_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_removeEventListener_Callback";
+ // Generated overload resolver
+Native_FileReaderSync__FileReaderSync() {
+ return Native_FileReaderSync__create_1constructorCallback();
+ }
+
Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync__create_1constructorCallback";
Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
@@ -1614,6 +2103,11 @@
Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+ // Generated overload resolver
+Native_FontFace_FontFace(family, source, descriptors) {
+ return Native_FontFace__create_1constructorCallback(family, source, descriptors);
+ }
+
Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace__create_1constructorCallback";
Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
@@ -1660,6 +2154,16 @@
Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback";
+ // Generated overload resolver
+Native_FontFaceSet_forEach(mthis, callback, thisArg) {
+ if (thisArg != null) {
+ Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg);
+ return;
+ }
+ Native_FontFaceSet__forEach_2_Callback(mthis, callback);
+ return;
+ }
+
Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet__forEach_1_Callback";
Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet__forEach_2_Callback";
@@ -2008,6 +2512,17 @@
Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+ // Generated overload resolver
+Native_HTMLMediaElement_addTextTrack(mthis, kind, label, language) {
+ if (language != null) {
+ return Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language);
+ }
+ if (label != null) {
+ return Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label);
+ }
+ return Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind);
+ }
+
Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";
Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";
@@ -2024,16 +2539,41 @@
Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
+ // Generated overload resolver
+Native_HTMLMediaElement_addKey(mthis, keySystem, key, initData, sessionId) {
+ if (initData != null) {
+ Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
+ return;
+ }
+ Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key);
+ return;
+ }
+
Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";
Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";
Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+ // Generated overload resolver
+Native_HTMLMediaElement_generateKeyRequest(mthis, keySystem, initData) {
+ if (initData != null) {
+ Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
+ return;
+ }
+ Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
+ return;
+ }
+
Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";
Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
+ // Generated overload resolver
+Native_HTMLAudioElement_AudioElement(src) {
+ return Native_HTMLAudioElement__create_1constructorCallback(src);
+ }
+
Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement__create_1constructorCallback";
Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
@@ -2500,18 +3040,61 @@
Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback";
+ // Generated overload resolver
+Native_HTMLInputElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+ if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
+ Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement);
+ return;
+ }
+ if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
+ Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement__setRangeText_1_Callback";
Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
+ // Generated overload resolver
+Native_HTMLInputElement_setSelectionRange(mthis, start, end, direction) {
+ if (direction != null) {
+ Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+ return;
+ }
+ Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end);
+ return;
+ }
+
Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
+ // Generated overload resolver
+Native_HTMLInputElement_stepDown(mthis, n) {
+ if (n != null) {
+ Native_HTMLInputElement__stepDown_1_Callback(mthis, n);
+ return;
+ }
+ Native_HTMLInputElement__stepDown_2_Callback(mthis);
+ return;
+ }
+
Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement__stepDown_1_Callback";
Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement__stepDown_2_Callback";
+ // Generated overload resolver
+Native_HTMLInputElement_stepUp(mthis, n) {
+ if (n != null) {
+ Native_HTMLInputElement__stepUp_1_Callback(mthis, n);
+ return;
+ }
+ Native_HTMLInputElement__stepUp_2_Callback(mthis);
+ return;
+ }
+
Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement__stepUp_1_Callback";
Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement__stepUp_2_Callback";
@@ -2712,6 +3295,11 @@
Native_HTMLOptGroupElement_label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+ // Generated overload resolver
+Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected) {
+ return Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+ }
+
Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";
Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
@@ -3072,10 +3660,33 @@
Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback";
+ // Generated overload resolver
+Native_HTMLTextAreaElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+ if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
+ Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement);
+ return;
+ }
+ if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
+ Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";
Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
+ // Generated overload resolver
+Native_HTMLTextAreaElement_setSelectionRange(mthis, start, end, direction) {
+ if (direction != null) {
+ Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+ return;
+ }
+ Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end);
+ return;
+ }
+
Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";
Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";
@@ -3182,6 +3793,20 @@
Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback";
+ // Generated overload resolver
+Native_IDBDatabase_transaction(mthis, storeName_OR_storeNames, mode) {
+ if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
+ return Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
+ }
+ if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
+ return Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
+ }
+ if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
+ return Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_1_Callback";
Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_2_Callback";
@@ -3204,6 +3829,14 @@
Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback";
+ // Generated overload resolver
+Native_IDBFactory__open(mthis, name, version) {
+ if (version != null) {
+ return Native_IDBFactory__open_1_Callback(mthis, name, version);
+ }
+ return Native_IDBFactory__open_2_Callback(mthis, name);
+ }
+
Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory__open_1_Callback";
Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory__open_2_Callback";
@@ -3262,6 +3895,17 @@
Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback";
+ // Generated overload resolver
+Native_IDBObjectStore__createIndex(mthis, name, keyPath, options) {
+ if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
+ return Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options);
+ }
+ if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
+ return Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_1_Callback";
Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
@@ -3462,10 +4106,25 @@
Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+ // Generated overload resolver
+Native_MIDIOutput_send(mthis, data, timestamp) {
+ if (timestamp != null) {
+ Native_MIDIOutput__send_1_Callback(mthis, data, timestamp);
+ return;
+ }
+ Native_MIDIOutput__send_2_Callback(mthis, data);
+ return;
+ }
+
Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput__send_1_Callback";
Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput__send_2_Callback";
+ // Generated overload resolver
+Native_MediaController_MediaController() {
+ return Native_MediaController__create_1constructorCallback();
+ }
+
Native_MediaController__create_1constructorCallback() native "MediaController__create_1constructorCallback";
Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
@@ -3558,6 +4217,11 @@
Native_MediaKeySession_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_removeEventListener_Callback";
+ // Generated overload resolver
+Native_MediaKeys_MediaKeys(keySystem) {
+ return Native_MediaKeys__create_1constructorCallback(keySystem);
+ }
+
Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys__create_1constructorCallback";
Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
@@ -3580,6 +4244,11 @@
Native_MediaQueryList_media_Getter(mthis) native "MediaQueryList_media_Getter";
+ // Generated overload resolver
+Native_MediaSource_MediaSource() {
+ return Native_MediaSource__create_1constructorCallback();
+ }
+
Native_MediaSource__create_1constructorCallback() native "MediaSource__create_1constructorCallback";
Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
@@ -3594,6 +4263,16 @@
Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback";
+ // Generated overload resolver
+Native_MediaSource_endOfStream(mthis, error) {
+ if (error != null) {
+ Native_MediaSource__endOfStream_1_Callback(mthis, error);
+ return;
+ }
+ Native_MediaSource__endOfStream_2_Callback(mthis);
+ return;
+ }
+
Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource__endOfStream_1_Callback";
Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource__endOfStream_2_Callback";
@@ -3608,6 +4287,20 @@
Native_MediaSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_removeEventListener_Callback";
+ // Generated overload resolver
+Native_MediaStream_MediaStream(stream_OR_tracks) {
+ if (stream_OR_tracks == null) {
+ return Native_MediaStream__create_1constructorCallback();
+ }
+ if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
+ return Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
+ }
+ if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
+ return Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_MediaStream__create_1constructorCallback() native "MediaStream__create_1constructorCallback";
Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream__create_2constructorCallback";
@@ -3898,6 +4591,11 @@
Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback";
+ // Generated overload resolver
+Native_Notification_Notification(title, options) {
+ return Native_Notification__create_1constructorCallback(title, options);
+ }
+
Native_Notification__create_1constructorCallback(title, options) native "Notification__create_1constructorCallback";
Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
@@ -3934,6 +4632,11 @@
Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+ // Generated overload resolver
+Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
+ return Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+ }
+
Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext__create_1constructorCallback";
Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
@@ -3952,10 +4655,30 @@
Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
+ // Generated overload resolver
+Native_OscillatorNode_start(mthis, when) {
+ if (when != null) {
+ Native_OscillatorNode__start_1_Callback(mthis, when);
+ return;
+ }
+ Native_OscillatorNode__start_2_Callback(mthis);
+ return;
+ }
+
Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode__start_1_Callback";
Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode__start_2_Callback";
+ // Generated overload resolver
+Native_OscillatorNode_stop(mthis, when) {
+ if (when != null) {
+ Native_OscillatorNode__stop_1_Callback(mthis, when);
+ return;
+ }
+ Native_OscillatorNode__stop_2_Callback(mthis);
+ return;
+ }
+
Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode__stop_1_Callback";
Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode__stop_2_Callback";
@@ -4006,6 +4729,20 @@
Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback";
+ // Generated overload resolver
+Native_Path_Path(path_OR_text) {
+ if (path_OR_text == null) {
+ return Native_Path__create_1constructorCallback();
+ }
+ if ((path_OR_text is Path || path_OR_text == null)) {
+ return Native_Path__create_2constructorCallback(path_OR_text);
+ }
+ if ((path_OR_text is String || path_OR_text == null)) {
+ return Native_Path__create_3constructorCallback(path_OR_text);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Path__create_1constructorCallback() native "Path__create_1constructorCallback";
Native_Path__create_2constructorCallback(path_OR_text) native "Path__create_2constructorCallback";
@@ -4222,6 +4959,20 @@
Native_RTCDTMFSender_track_Getter(mthis) native "RTCDTMFSender_track_Getter";
+ // Generated overload resolver
+Native_RTCDTMFSender_insertDtmf(mthis, tones, duration, interToneGap) {
+ if (interToneGap != null) {
+ Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
+ return;
+ }
+ if (duration != null) {
+ Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration);
+ return;
+ }
+ Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones);
+ return;
+ }
+
Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";
Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";
@@ -4262,6 +5013,27 @@
Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback";
+ // Generated overload resolver
+Native_RTCDataChannel_send(mthis, data) {
+ if ((data is TypedData || data == null)) {
+ Native_RTCDataChannel__send_1_Callback(mthis, data);
+ return;
+ }
+ if ((data is ByteBuffer || data == null)) {
+ Native_RTCDataChannel__send_2_Callback(mthis, data);
+ return;
+ }
+ if ((data is Blob || data == null)) {
+ Native_RTCDataChannel__send_3_Callback(mthis, data);
+ return;
+ }
+ if ((data is String || data == null)) {
+ Native_RTCDataChannel__send_4_Callback(mthis, data);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel__send_1_Callback";
Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel__send_2_Callback";
@@ -4286,6 +5058,11 @@
Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+ // Generated overload resolver
+Native_RTCIceCandidate_RtcIceCandidate(dictionary) {
+ return Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+ }
+
Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate__create_1constructorCallback";
Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
@@ -4296,6 +5073,11 @@
Native_RTCIceCandidateEvent_candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+ // Generated overload resolver
+Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints) {
+ return Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+ }
+
Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";
Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
@@ -4344,6 +5126,11 @@
Native_RTCPeerConnection_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_removeEventListener_Callback";
+ // Generated overload resolver
+Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict) {
+ return Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+ }
+
Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription__create_1constructorCallback";
Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
@@ -5908,6 +6695,17 @@
Native_Screen_width_Getter(mthis) native "Screen_width_Getter";
+ // Generated overload resolver
+Native_Screen_lockOrientation(mthis, orientation_OR_orientations) {
+ if ((orientation_OR_orientations is String || orientation_OR_orientations == null)) {
+ return Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations);
+ }
+ if ((orientation_OR_orientations is List<String> || orientation_OR_orientations == null)) {
+ return Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_1_Callback";
Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_2_Callback";
@@ -6028,6 +6826,11 @@
Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback";
+ // Generated overload resolver
+Native_SharedWorker_SharedWorker(scriptURL, name) {
+ return Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+ }
+
Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker__create_1constructorCallback";
Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
@@ -6066,6 +6869,16 @@
Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback";
+ // Generated overload resolver
+Native_SourceBuffer_appendStream(mthis, stream, maxSize) {
+ if (maxSize != null) {
+ Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize);
+ return;
+ }
+ Native_SourceBuffer__appendStream_2_Callback(mthis, stream);
+ return;
+ }
+
Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer__appendStream_1_Callback";
Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer__appendStream_2_Callback";
@@ -6100,6 +6913,11 @@
Native_SourceInfo_label_Getter(mthis) native "SourceInfo_label_Getter";
+ // Generated overload resolver
+Native_SpeechGrammar_SpeechGrammar() {
+ return Native_SpeechGrammar__create_1constructorCallback();
+ }
+
Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar__create_1constructorCallback";
Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
@@ -6110,16 +6928,41 @@
Native_SpeechGrammar_weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+ // Generated overload resolver
+Native_SpeechGrammarList_SpeechGrammarList() {
+ return Native_SpeechGrammarList__create_1constructorCallback();
+ }
+
Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList__create_1constructorCallback";
Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback";
+ // Generated overload resolver
+Native_SpeechGrammarList_addFromString(mthis, string, weight) {
+ if (weight != null) {
+ Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight);
+ return;
+ }
+ Native_SpeechGrammarList__addFromString_2_Callback(mthis, string);
+ return;
+ }
+
Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList__addFromString_1_Callback";
Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList__addFromString_2_Callback";
+ // Generated overload resolver
+Native_SpeechGrammarList_addFromUri(mthis, src, weight) {
+ if (weight != null) {
+ Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight);
+ return;
+ }
+ Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src);
+ return;
+ }
+
Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList__addFromUri_1_Callback";
Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList__addFromUri_2_Callback";
@@ -6138,6 +6981,11 @@
Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback";
+ // Generated overload resolver
+Native_SpeechRecognition_SpeechRecognition() {
+ return Native_SpeechRecognition__create_1constructorCallback();
+ }
+
Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition__create_1constructorCallback";
Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
@@ -6228,6 +7076,11 @@
Native_SpeechSynthesisEvent_name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+ // Generated overload resolver
+Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text) {
+ return Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+ }
+
Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance__create_1constructorCallback";
Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
@@ -6272,14 +7125,49 @@
Native_Storage_length_Getter(mthis) native "Storage_length_Getter";
+ // Generated overload resolver
+Native_Storage___delete__(mthis, index_OR_name) {
+ if ((index_OR_name is int || index_OR_name == null)) {
+ return Native_Storage____delete___1_Callback(mthis, index_OR_name);
+ }
+ if ((index_OR_name is String || index_OR_name == null)) {
+ return Native_Storage____delete___2_Callback(mthis, index_OR_name);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage____delete___1_Callback";
Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage____delete___2_Callback";
+ // Generated overload resolver
+Native_Storage___getter__(mthis, index_OR_name) {
+ if ((index_OR_name is int || index_OR_name == null)) {
+ return Native_Storage____getter___1_Callback(mthis, index_OR_name);
+ }
+ if ((index_OR_name is String || index_OR_name == null)) {
+ return Native_Storage____getter___2_Callback(mthis, index_OR_name);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage____getter___1_Callback";
Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage____getter___2_Callback";
+ // Generated overload resolver
+Native_Storage___setter__(mthis, index_OR_name, value) {
+ if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
+ Native_Storage____setter___1_Callback(mthis, index_OR_name, value);
+ return;
+ }
+ if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
+ Native_Storage____setter___2_Callback(mthis, index_OR_name, value);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage____setter___1_Callback";
Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage____setter___2_Callback";
@@ -6530,7 +7418,19 @@
Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback";
-Native_URL__createObjectUrlFromWebKitSource_Callback(source) native "URL__createObjectUrlFromWebKitSource_Callback";
+ // Generated overload resolver
+Native_URL_createObjectUrl(blob_OR_source_OR_stream) {
+ if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
+ return Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
+ }
+ if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+ return Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
+ }
+ if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+ return Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
@@ -6538,8 +7438,6 @@
Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
-Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_4_Callback";
-
Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectUrlFromBlob_Callback";
Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectUrlFromSource_Callback";
@@ -6610,6 +7508,11 @@
Native_URLUtilsReadOnly_toString_Callback(mthis) native "URLUtilsReadOnly_toString_Callback";
+ // Generated overload resolver
+Native_VTTCue_VttCue(startTime, endTime, text) {
+ return Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+ }
+
Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue__create_1constructorCallback";
Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
@@ -6646,6 +7549,11 @@
Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback";
+ // Generated overload resolver
+Native_VTTRegion_VttRegion() {
+ return Native_VTTRegion__create_1constructorCallback();
+ }
+
Native_VTTRegion__create_1constructorCallback() native "VTTRegion__create_1constructorCallback";
Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
@@ -6798,6 +7706,23 @@
Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferByteData_Callback";
+ // Generated overload resolver
+Native_WebGLRenderingContext_bufferData(mthis, target, data_OR_size, usage) {
+ if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage);
+ return;
+ }
+ if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage);
+ return;
+ }
+ if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";
Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";
@@ -6808,6 +7733,19 @@
Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubByteData_Callback";
+ // Generated overload resolver
+Native_WebGLRenderingContext_bufferSubData(mthis, target, offset, data) {
+ if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data);
+ return;
+ }
+ if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";
Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";
@@ -6988,6 +7926,31 @@
Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+ // Generated overload resolver
+Native_WebGLRenderingContext_texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
+ if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+ return;
+ }
+ if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";
Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";
@@ -7010,6 +7973,31 @@
Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback";
+ // Generated overload resolver
+Native_WebGLRenderingContext_texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
+ if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
+ Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+ return;
+ }
+ if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
+ Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";
Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";
@@ -7102,8 +8090,18 @@
Native_WebKitCSSFilterRule_style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+ // Generated overload resolver
+Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue) {
+ return Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+ }
+
Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
+ // Generated overload resolver
+Native_WebKitMediaSource__WebKitMediaSource() {
+ return Native_WebKitMediaSource__create_1constructorCallback();
+ }
+
Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource__create_1constructorCallback";
Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
@@ -7118,6 +8116,20 @@
Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback";
+ // Generated overload resolver
+Native_WebSocket_WebSocket(url, protocol_OR_protocols) {
+ if ((url is String || url == null) && protocol_OR_protocols == null) {
+ return Native_WebSocket__create_1constructorCallback(url);
+ }
+ if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
+ return Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
+ }
+ if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
+ return Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_WebSocket__create_1constructorCallback(url) native "WebSocket__create_1constructorCallback";
Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";
@@ -7138,6 +8150,20 @@
Native_WebSocket_url_Getter(mthis) native "WebSocket_url_Getter";
+ // Generated overload resolver
+Native_WebSocket_close(mthis, code, reason) {
+ if (reason != null) {
+ Native_WebSocket__close_1_Callback(mthis, code, reason);
+ return;
+ }
+ if (code != null) {
+ Native_WebSocket__close_2_Callback(mthis, code);
+ return;
+ }
+ Native_WebSocket__close_3_Callback(mthis);
+ return;
+ }
+
Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket__close_1_Callback";
Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket__close_2_Callback";
@@ -7276,6 +8302,17 @@
Native_Window_window_Getter(mthis) native "Window_window_Getter";
+ // Generated overload resolver
+Native_Window___getter__(mthis, index_OR_name) {
+ if ((index_OR_name is int || index_OR_name == null)) {
+ return Native_Window____getter___1_Callback(mthis, index_OR_name);
+ }
+ if ((index_OR_name is String || index_OR_name == null)) {
+ return Native_Window____getter___2_Callback(mthis, index_OR_name);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+
Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window____getter___1_Callback";
Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window____getter___2_Callback";
@@ -7354,6 +8391,11 @@
Native_Window_setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+ // Generated overload resolver
+Native_Worker_Worker(scriptUrl) {
+ return Native_Worker__create_1constructorCallback(scriptUrl);
+ }
+
Native_Worker__create_1constructorCallback(scriptUrl) native "Worker__create_1constructorCallback";
Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
@@ -7418,10 +8460,20 @@
Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback";
+ // Generated overload resolver
+Native_XMLSerializer_XmlSerializer() {
+ return Native_XMLSerializer__create_1constructorCallback();
+ }
+
Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer__create_1constructorCallback";
Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback";
+ // Generated overload resolver
+Native_XPathEvaluator_XPathEvaluator() {
+ return Native_XPathEvaluator__create_1constructorCallback();
+ }
+
Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator__create_1constructorCallback";
Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback";
@@ -7452,6 +8504,11 @@
Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback";
+ // Generated overload resolver
+Native_XSLTProcessor_XsltProcessor() {
+ return Native_XSLTProcessor__create_1constructorCallback();
+ }
+
Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor__create_1constructorCallback";
Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback";
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index a4d1f1f..f5fbcae 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -236,14 +236,17 @@
ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
tree.Builder builder = new tree.Builder(compiler);
tree.FunctionDefinition definition = builder.build(function);
- compiler.tracer.traceCompilation(element.name, null, compiler);
- compiler.tracer.traceGraph('Tree builder', definition);
- treeElements = new TreeElementMapping(element);
- tree.Unnamer unnamer = new tree.Unnamer();
- unnamer.unname(definition);
- compiler.tracer.traceGraph('Unnamer', definition);
- tree.Emitter emitter = new tree.Emitter();
- node = emitter.emit(element, treeElements, definition);
+ if (definition == null) {
+ node = element.parseNode(compiler);
+ } else {
+ compiler.tracer.traceCompilation(element.name, null, compiler);
+ compiler.tracer.traceGraph('Tree builder', definition);
+ treeElements = new TreeElementMapping(element);
+ tree.Unnamer unnamer = new tree.Unnamer();
+ unnamer.unname(definition);
+ compiler.tracer.traceGraph('Unnamer', definition);
+ node = dart_codegen.emit(element, treeElements, definition);
+ }
}
return new ElementAst(node, treeElements);
}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
index 942a55c..518c5d0 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
@@ -14,6 +14,7 @@
import 'dart_tree.dart' as tree;
import '../util/util.dart';
import '../mirror_renamer/mirror_renamer.dart';
+import 'dart_codegen.dart' as dart_codegen;
import '../scanner/scannerlib.dart' show StringToken,
Keyword,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
new file mode 100644
index 0000000..d8d7573
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -0,0 +1,171 @@
+library dart_codegen;
+
+import 'dart_tree.dart' as tree;
+import 'dart_printer.dart';
+import 'dart_tree_printer.dart' show TreePrinter;
+import '../tree/tree.dart' as frontend;
+import '../dart2jslib.dart' as dart2js;
+import '../elements/elements.dart';
+import '../dart_types.dart';
+import '../elements/modelx.dart' as modelx;
+
+/// Translates the dart_tree IR to Dart frontend AST.
+frontend.FunctionExpression emit(FunctionElement element,
+ dart2js.TreeElementMapping treeElements,
+ tree.FunctionDefinition definition) {
+ FunctionExpression fn = new ASTEmitter().emit(element, definition);
+ return new TreePrinter(treeElements).makeExpression(fn);
+}
+
+/// Translates the dart_tree IR to Dart backend AST.
+class ASTEmitter extends tree.Visitor<dynamic, Expression> {
+ /// Variables to be hoisted at the top of the current function.
+ List<VariableDeclaration> variables;
+
+ /// Statements emitted by the most recent call to [visitStatement].
+ List<Statement> statementBuffer;
+
+ /// The function currently being emitted.
+ FunctionElement functionElement;
+
+ FunctionExpression emit(FunctionElement element,
+ tree.FunctionDefinition definition) {
+ functionElement = element;
+ variables = <VariableDeclaration>[];
+ statementBuffer = <Statement>[];
+ tree.Variable.counter = 0;
+
+ Parameters parameters = emitParameters(definition.parameters);
+ visitStatement(definition.body);
+ removeTrailingReturn();
+ Statement body = new Block(statementBuffer);
+ if (variables.length > 0) {
+ Statement head = new VariableDeclarations(variables);
+ body = new Block([head, body]);
+ }
+
+ FunctionType functionType = element.type;
+
+ variables = null;
+ statementBuffer = null;
+ functionElement = null;
+
+ return new FunctionExpression(
+ parameters,
+ body,
+ name: element.name,
+ returnType: emitOptionalType(functionType.returnType))
+ ..element = element;
+ }
+
+ /// Removes a trailing "return null" from [statementBuffer].
+ void removeTrailingReturn() {
+ if (statementBuffer.isEmpty) return;
+ if (statementBuffer.last is! Return) return;
+ Return ret = statementBuffer.last;
+ Expression expr = ret.expression;
+ if (expr is Literal && expr.value is dart2js.NullConstant) {
+ statementBuffer.removeLast();
+ }
+ }
+
+ Parameter emitParameter(tree.Variable param) {
+ ParameterElement element = param.element;
+ TypeAnnotation type = emitOptionalType(element.type);
+ return new Parameter(element.name, type:type)
+ ..element = element;
+ }
+
+ Parameters emitParameters(List<tree.Variable> params) {
+ return new Parameters(params.map(emitParameter).toList(growable:false));
+ }
+
+ void visitExpressionStatement(tree.ExpressionStatement stmt) {
+ Expression e = visitExpression(stmt.expression);
+ statementBuffer.add(new ExpressionStatement(e));
+ visitStatement(stmt.next);
+ }
+
+ void visitLetVal(tree.LetVal stmt) {
+ // Synthesize an element for the variable, if necessary.
+ if (stmt.variable.element == null) {
+ stmt.variable.element = new modelx.VariableElementX.synthetic(
+ stmt.variable.name,
+ ElementKind.VARIABLE,
+ functionElement);
+ }
+ variables.add(new VariableDeclaration(stmt.variable.name));
+ Expression def = visitExpression(stmt.definition);
+ statementBuffer.add(new ExpressionStatement(new Assignment(
+ visitVariable(stmt.variable),
+ '=',
+ def)));
+ visitStatement(stmt.body);
+ }
+
+ void visitReturn(tree.Return stmt) {
+ Expression inner = visitExpression(stmt.value);
+ statementBuffer.add(new Return(inner));
+ }
+
+ Expression visitConstant(tree.Constant exp) {
+ return emitConstant(exp.value);
+ }
+
+ Expression visitInvokeStatic(tree.InvokeStatic exp) {
+ List args = exp.arguments.map(visitExpression).toList(growable:false);
+ return new CallStatic(null, exp.target.name, args)
+ ..element = exp.target;
+ }
+
+ Expression visitVariable(tree.Variable exp) {
+ return new Identifier(exp.name)
+ ..element = exp.element;
+ }
+
+ TypeAnnotation emitType(DartType type) {
+ if (type is GenericType) { // TODO(asgerf): faster Link.map
+ return new TypeAnnotation(
+ type.element.name,
+ type.typeArguments.toList(growable:false)
+ .map(emitType).toList(growable:false))
+ ..dartType = type;
+ } else if (type is VoidType) {
+ return new TypeAnnotation('void')
+ ..dartType = type;
+ } else if (type is TypeVariableType) {
+ return new TypeAnnotation(type.name)
+ ..dartType = type;
+ } else {
+ throw "Unsupported type annotation: ${type.runtimeType}";
+ }
+ }
+
+ /// Like [emitType] except the dynamic type is converted to null.
+ TypeAnnotation emitOptionalType(DartType type) {
+ if (type.isDynamic) {
+ return null;
+ } else {
+ return emitType(type);
+ }
+ }
+
+ Expression emitConstant(dart2js.Constant constant) {
+ if (constant is dart2js.PrimitiveConstant) {
+ return new Literal(constant);
+ } else if (constant is dart2js.ListConstant) {
+ return new LiteralList(constant.entries.map(emitConstant), isConst: true);
+ } else if (constant is dart2js.MapConstant) {
+ List<LiteralMapEntry> entries = <LiteralMapEntry>[];
+ for (var i = 0; i < constant.keys.length; i++) {
+ entries.add(new LiteralMapEntry(
+ emitConstant(constant.keys.entries[i]),
+ emitConstant(constant.values[i])));
+ }
+ return new LiteralMap(entries, isConst: true);
+ } else {
+ throw "Unsupported constant: ${constant.runtimeType}";
+ }
+ }
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
index 445c0de..9320905 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -22,6 +22,8 @@
import '../dart2jslib.dart' as dart2js;
import '../tree/tree.dart' as tree;
import '../util/characters.dart' as characters;
+import '../elements/elements.dart' as elements;
+import '../dart_types.dart' as types;
/// The following nodes correspond to [tree.Send] expressions:
/// [FieldExpression], [IndexExpression], [Assignment], [Increment],
@@ -64,14 +66,9 @@
final String name;
final List<TypeAnnotation> typeArguments;
- TypeAnnotation(this.name, [this.typeArguments]);
+ types.DartType dartType;
- static final TypeAnnotation NUM = new TypeAnnotation("num");
- static final TypeAnnotation INT = new TypeAnnotation("int");
- static final TypeAnnotation DOUBLE = new TypeAnnotation("double");
- static final TypeAnnotation BOOL = new TypeAnnotation("bool");
- static final TypeAnnotation STRING = new TypeAnnotation("String");
- static final TypeAnnotation DYNAMIC = new TypeAnnotation("dynamic");
+ TypeAnnotation(this.name, [this.typeArguments = const <TypeAnnotation>[]]);
}
// STATEMENTS
@@ -134,8 +131,8 @@
: this.leftHandValue = leftHandValue {
assert(leftHandValue is Identifier
|| (leftHandValue is VariableDeclarations
- && leftHandValue.definitions.length == 1
- && leftHandValue.definitions[0].initializer == null));
+ && leftHandValue.declarations.length == 1
+ && leftHandValue.declarations[0].initializer == null));
}
}
@@ -234,9 +231,9 @@
final TypeAnnotation type;
final bool isFinal;
final bool isConst;
- final List<VariableDeclaration> definitions;
+ final List<VariableDeclaration> declarations;
- VariableDeclarations(this.definitions,
+ VariableDeclarations(this.declarations,
{ this.type,
this.isFinal: false,
this.isConst: false }) {
@@ -260,9 +257,9 @@
final Statement body;
FunctionDeclaration(this.name,
- this.parameters,
- this.body,
- [ this.returnType ]);
+ this.parameters,
+ this.body,
+ [ this.returnType ]);
}
class Parameters extends Node {
@@ -295,13 +292,15 @@
/// Parameters to function parameter. Null for non-function parameters.
final Parameters parameters;
+ elements.ParameterElement element;
+
Parameter(this.name, {this.type, this.defaultValue})
: parameters = null;
Parameter.function(this.name,
TypeAnnotation returnType,
this.parameters,
- [this.defaultValue]) : type = returnType {
+ [ this.defaultValue ]) : type = returnType {
assert(parameters != null);
}
@@ -314,10 +313,20 @@
// EXPRESSIONS
class FunctionExpression extends Expression {
+ final TypeAnnotation returnType;
+ final String name;
final Parameters parameters;
final Statement body;
+
+ elements.FunctionElement element;
- FunctionExpression(this.parameters, this.body);
+ FunctionExpression(this.parameters,
+ this.body,
+ { this.name,
+ this.returnType }) {
+ // Function must have a name if it has a return type
+ assert(returnType == null || name != null);
+ }
}
class Conditional extends Expression {
@@ -334,6 +343,8 @@
/// to the proper definition.
class Identifier extends Expression {
final String name;
+
+ elements.Element element;
Identifier(this.name);
@@ -351,7 +362,7 @@
final TypeAnnotation typeArgument;
final List<Expression> values;
- LiteralList(this.values, {this.typeArgument, this.isConst: false});
+ LiteralList(this.values, { this.typeArgument, this.isConst: false });
}
class LiteralMap extends Expression {
@@ -359,7 +370,7 @@
final List<TypeAnnotation> typeArguments;
final List<LiteralMapEntry> entries;
- LiteralMap(this.entries, {this.typeArguments, this.isConst: false}) {
+ LiteralMap(this.entries, { this.typeArguments, this.isConst: false }) {
assert(this.typeArguments == null
|| this.typeArguments.length == 0
|| this.typeArguments.length == 2);
@@ -451,6 +462,8 @@
final String className;
final String methodName;
final List<Argument> arguments;
+
+ elements.FunctionElement element;
CallStatic(this.className, this.methodName, this.arguments);
}
@@ -541,13 +554,79 @@
return op == '!' || op == '-' || op == '~';
}
bool isBinaryOperator(String op) {
- return Unparser._binaryPrecedence.containsKey(op);
+ return BINARY_PRECEDENCE.containsKey(op);
}
const int NEWLINE = 10;
const int CARRIAGE_RETURN = 13;
+// Precedence levels
+const int EXPRESSION = 1;
+const int CONDITIONAL = 2;
+const int LOGICAL_OR = 3;
+const int LOGICAL_AND = 4;
+const int EQUALITY = 6;
+const int RELATIONAL = 7;
+const int BITWISE_OR = 8;
+const int BITWISE_XOR = 9;
+const int BITWISE_AND = 10;
+const int SHIFT = 11;
+const int ADDITIVE = 12;
+const int MULTIPLICATIVE = 13;
+const int UNARY = 14;
+const int POSTFIX_INCREMENT = 15;
+const int PRIMARY = 20;
+
+/// Precedence level required for the callee in a [FunctionCall].
+const int CALLEE = 21;
+
+const Map<String,int> BINARY_PRECEDENCE = const {
+ '&&': LOGICAL_AND,
+ '||': LOGICAL_OR,
+
+ '==': EQUALITY,
+ '!=': EQUALITY,
+
+ '>': RELATIONAL,
+ '>=': RELATIONAL,
+ '<': RELATIONAL,
+ '<=': RELATIONAL,
+
+ '|': BITWISE_OR,
+ '^': BITWISE_XOR,
+ '&': BITWISE_AND,
+
+ '>>': SHIFT,
+ '<<': SHIFT,
+
+ '+': ADDITIVE,
+ '-': ADDITIVE,
+
+ '*': MULTIPLICATIVE,
+ '%': MULTIPLICATIVE,
+ '/': MULTIPLICATIVE,
+ '~/': MULTIPLICATIVE,
+};
+
+/// Return true if binary operators with the given precedence level are
+/// (left) associative. False if they are non-associative.
+bool isAssociativeBinaryOperator(int precedence) {
+ return precedence != EQUALITY && precedence != RELATIONAL;
+}
+
+/// True if [x] is a letter, digit, or underscore.
+/// Such characters may not follow a shorthand string interpolation.
+bool isIdentifierPartNoDollar(dynamic x) {
+ if (x is! int) {
+ return false;
+ }
+ return (characters.$0 <= x && x <= characters.$9) ||
+ (characters.$A <= x && x <= characters.$Z) ||
+ (characters.$a <= x && x <= characters.$z) ||
+ (x == characters.$_);
+}
+
/// The unparser will apply the following syntactic rewritings:
/// Use short-hand function returns:
/// foo(){return E} ==> foo() => E;
@@ -585,64 +664,6 @@
Unparser(this.output);
- // Precedence levels
- static const EXPRESSION = 1;
- static const CONDITIONAL = 2;
- static const LOGICAL_OR = 3;
- static const LOGICAL_AND = 4;
- static const EQUALITY = 6;
- static const RELATIONAL = 7;
- static const BITWISE_OR = 8;
- static const BITWISE_XOR = 9;
- static const BITWISE_AND = 10;
- static const SHIFT = 11;
- static const ADDITIVE = 12;
- static const MULTIPLICATIVE = 13;
- static const UNARY = 14;
- static const POSTFIX_INCREMENT = 15;
- static const PRIMARY = 20;
-
- /// Precedence level required for the callee in a [FunctionCall].
- static const CALLEE = 21;
-
- static const _binaryPrecedence = const {
- '&&': LOGICAL_AND,
- '||': LOGICAL_OR,
-
- '==': EQUALITY,
- '!=': EQUALITY,
-
- '>': RELATIONAL,
- '>=': RELATIONAL,
- '<': RELATIONAL,
- '<=': RELATIONAL,
-
- '|': BITWISE_OR,
- '^': BITWISE_XOR,
- '&': BITWISE_AND,
-
- '>>': SHIFT,
- '<<': SHIFT,
-
- '+': ADDITIVE,
- '-': ADDITIVE,
-
- '*': MULTIPLICATIVE,
- '%': MULTIPLICATIVE,
- '/': MULTIPLICATIVE,
- '~/': MULTIPLICATIVE,
- };
-
- /// The type of quote used around string literals.
- static const QUOTE = "'";
- static const QUOTE_CODE = 39;
-
- /// Return true if binary operators with the given precedence level are
- /// (left) associative. False if they are non-associative.
- static bool isAssociativeBinaryOperator(int precedence) {
- return precedence != EQUALITY && precedence != RELATIONAL;
- }
-
void write(String s) {
output.write(s);
@@ -722,13 +743,30 @@
Statement stmt = unfoldBlocks(e.body);
int precedence = stmt is Return ? EXPRESSION : PRIMARY;
withPrecedence(precedence, () {
+ // A named function expression at the beginning of a statement
+ // can be mistaken for a function declaration.
+ // (Note: Functions with a return type also have a name)
+ bool needParen = beginStmt && e.name != null;
+ if (needParen) {
+ write('(');
+ }
+ if (e.returnType != null) {
+ writeType(e.returnType);
+ write(' ');
+ }
+ if (e.name != null) {
+ write(e.name);
+ }
writeParameters(e.parameters);
- if (stmt is Return) {
+ if (stmt is Return) { // TODO(asgerf): Print {} for "return null;"
write('=> '); // TODO(asgerf): Minimize use of whitespace.
writeExp(stmt.expression, EXPRESSION);
} else {
writeBlock(stmt);
}
+ if (needParen) {
+ write(')');
+ }
});
} else if (e is Conditional) {
withPrecedence(CONDITIONAL, () {
@@ -768,7 +806,7 @@
write(' const '); // TODO(asgerf): Minimize use of whitespace.
needParen = false;
}
- if (e.typeArguments != null && e.typeArguments.length > 0) {
+ if (e.typeArguments.length > 0) {
write('<');
writeEach(',', e.typeArguments, writeType);
write('>');
@@ -807,7 +845,7 @@
else if (e.operatorName == '!' &&
operand is TypeOperator && operand.operatorName == 'is') {
withPrecedence(RELATIONAL, () {
- writeExp(operand.expression, BITWISE_OR);
+ writeExp(operand.expression, BITWISE_OR, beginStmt: beginStmt);
write(' is!'); // TODO(asgerf): Minimize use of whitespace.
writeType(operand.type);
});
@@ -819,7 +857,7 @@
});
}
} else if (e is BinaryOperator) {
- int precedence = _binaryPrecedence[e.operatorName];
+ int precedence = BINARY_PRECEDENCE[e.operatorName];
withPrecedence(precedence, () {
// All binary operators are left-associative or non-associative.
// For each operand, we use either the same precedence level as
@@ -1131,7 +1169,7 @@
if (!vds.isConst && !vds.isFinal && vds.type == null) {
write('var ');
}
- writeEach(',', vds.definitions, (VariableDeclaration vd) {
+ writeEach(',', vds.declarations, (VariableDeclaration vd) {
write(vd.name);
if (vd.initializer != null) {
write('=');
@@ -1179,7 +1217,7 @@
}
}
- void writeStringLiteral(Expression node) {
+ static StringLiteralOutput analyzeStringLiteral(Expression node) {
// TODO(asgerf): This might be a bit too expensive. Benchmark.
// Flatten the StringConcat tree.
List parts = []; // Expression or int (char node)
@@ -1248,16 +1286,6 @@
}
}
- /// True if [x] is a letter, digit, or underscore.
- /// Such characters may not follow a shorthand string interpolation.
- bool isIdentifierPartNoDollar(dynamic x) {
- if (x is! int)
- return false;
- return (characters.$0 <= x && x <= characters.$9)
- || (characters.$A <= x && x <= characters.$Z)
- || (characters.$a <= x && x <= characters.$z)
- || (x == characters.$_);
- }
/// Applies additional cost to each track in [penalized], and considers
/// switching from each [penalized] to a [nonPenalized] track.
@@ -1342,6 +1370,12 @@
}
}
+ return new StringLiteralOutput(parts, bestChunk.end(parts.length));
+ }
+
+ void writeStringLiteral(Expression node) {
+ StringLiteralOutput output = analyzeStringLiteral(node);
+ List parts = output.parts;
void printChunk(StringChunk chunk) {
int startIndex;
if (chunk.previous != null) {
@@ -1411,11 +1445,21 @@
}
write(chunk.quoting.quoteChar);
}
- printChunk(bestChunk.end(parts.length));
+ printChunk(output.chunk);
}
}
+/// The contents of a string literal together with a strategy for printing it.
+class StringLiteralOutput {
+ /// Mix of [Expression] and `int`. Each expression is a string interpolation,
+ /// and each `int` is the character code of a character in a string literal.
+ final List parts;
+ final StringChunk chunk;
+
+ StringLiteralOutput(this.parts, this.chunk);
+}
+
/// Strategy for printing a prefix of a string literal.
/// A chunk represents the substring going from [:previous.endIndex:] to
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 2ba25bf..3e91bb1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -32,7 +32,6 @@
* The base class of all Tree nodes.
*/
abstract class Node {
- accept(Visitor visitor);
}
/**
@@ -40,6 +39,11 @@
*/
abstract class Expression extends Node {
bool get isPure;
+ accept(Visitor v);
+}
+
+abstract class Statement extends Node {
+ accept(Visitor v);
}
/**
@@ -51,57 +55,22 @@
static int counter = 0;
static String _newName() => 'v${counter++}';
- final Element element;
- String name;
- ast.Identifier identifier;
+ Element element;
+ String cachedName;
+
+ String get name {
+ if (cachedName != null) return cachedName;
+ return cachedName = ((element == null) ? _newName() : element.name);
+ }
Variable(this.element);
- ast.Identifier assignIdentifier() {
- assert(identifier == null);
- name = (element == null) ? _newName() : element.name;
- identifier = Emitter.makeIdentifier(name);
- return identifier;
- }
-
final bool isPure = true;
accept(Visitor visitor) => visitor.visitVariable(this);
}
/**
- * A sequence of expressions.
- */
-class Sequence extends Expression {
- final List<Expression> expressions;
-
- Sequence(this.expressions);
-
- bool get isPure => expressions.every((e) => e.isPure);
-
- accept(Visitor visitor) => visitor.visitSequence(this);
-}
-
-/**
- * A local binding of a [Variable] to an [Expression].
- *
- * In contrast to the CPS-based IR, non-primitive expressions can be named
- * with let.
- */
-class LetVal extends Expression {
- final Variable variable;
- Expression definition;
- Expression body;
- final bool hasExactlyOneUse;
-
- LetVal(this.variable, this.definition, this.body, this.hasExactlyOneUse);
-
- bool get isPure => definition.isPure && body.isPure;
-
- accept(Visitor visitor) => visitor.visitLetVal(this);
-}
-
-/**
* A call to a static target.
*
* In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
@@ -118,22 +87,6 @@
}
/**
- * A return exit from the function.
- *
- * In contrast to the CPS-based IR, the return value is an arbitrary
- * expression.
- */
-class Return extends Expression {
- Expression value;
-
- Return(this.value);
-
- final bool isPure = true;
-
- accept(Visitor visitor) => visitor.visitReturn(this);
-}
-
-/**
* A constant.
*/
class Constant extends Expression {
@@ -146,30 +99,66 @@
accept(Visitor visitor) => visitor.visitConstant(this);
}
-class FunctionDefinition extends Node {
- final List<Variable> parameters;
- Expression body;
+/**
+ * A local binding of a [Variable] to an [Expression].
+ *
+ * In contrast to the CPS-based IR, non-primitive expressions can be named
+ * with let.
+ */
+class LetVal extends Statement {
+ final Variable variable;
+ Expression definition;
+ Statement body;
+ final bool hasExactlyOneUse;
- FunctionDefinition(this.parameters, this.body);
+ LetVal(this.variable, this.definition, this.body, this.hasExactlyOneUse);
- accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
+ accept(Visitor visitor) => visitor.visitLetVal(this);
+}
+/**
+ * A return exit from the function.
+ *
+ * In contrast to the CPS-based IR, the return value is an arbitrary
+ * expression.
+ */
+class Return extends Statement {
+ Expression value;
+
+ Return(this.value);
+
+ final bool isPure = true;
+
+ accept(Visitor visitor) => visitor.visitReturn(this);
}
-abstract class Visitor<T> {
- T visit(Node node) => node.accept(this);
+class ExpressionStatement extends Statement {
+ Expression expression;
+ Statement next;
+
+ ExpressionStatement(this.expression, this.next);
+
+ accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+}
- // Abstract classes.
- T visitNode(Node node) => null;
- T visitFunctionDefinition(FunctionDefinition node) => visitNode(node);
- T visitExpression(Expression node) => visitNode(node);
- // Concrete classes.
- T visitVariable(Variable node) => visitExpression(node);
- T visitSequence(Sequence node) => visitExpression(node);
- T visitLetVal(LetVal node) => visitExpression(node);
- T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
- T visitReturn(Return node) => visitExpression(node);
- T visitConstant(Constant node) => visitExpression(node);
+
+class FunctionDefinition extends Node {
+ final List<Variable> parameters;
+ Statement body;
+
+ FunctionDefinition(this.parameters, this.body);
+}
+
+abstract class Visitor<S, E> {
+ E visitExpression(Expression e) => e.accept(this);
+ E visitVariable(Variable node);
+ E visitInvokeStatic(InvokeStatic node);
+ E visitConstant(Constant node);
+
+ S visitStatement(Statement s) => s.accept(this);
+ S visitLetVal(LetVal node);
+ S visitReturn(Return node);
+ S visitExpressionStatement(ExpressionStatement node);
}
/**
@@ -204,7 +193,7 @@
* particular, intermediate values and blocks used for local control flow are
* still all named.
*/
-class Builder extends ir.Visitor<Expression> {
+class Builder extends ir.Visitor<Node> {
final dart2js.Compiler compiler;
// Uses of IR definitions are replaced with Tree variables. This is the
@@ -216,9 +205,18 @@
Builder(this.compiler);
+ static final String _bailout = 'Bailout Tree Builder';
+
+ bailout() => throw _bailout;
+
FunctionDefinition build(ir.FunctionDefinition node) {
- visit(node);
- return function;
+ try {
+ visit(node);
+ return function;
+ } catch (e) {
+ if (e == _bailout) return null;
+ rethrow;
+ }
}
List<Expression> translateArguments(List<ir.Reference> args) {
@@ -238,7 +236,7 @@
return null;
}
- Expression visitLetPrim(ir.LetPrim node) {
+ Statement visitLetPrim(ir.LetPrim node) {
// LetPrim is translated to LetVal.
Expression definition = visit(node.primitive);
if (node.primitive.hasAtLeastOneUse) {
@@ -251,19 +249,19 @@
// values (e.g., as part of a shrinking reductions pass).
return visit(node.body);
} else {
- return new Sequence([definition, visit(node.body)]);
+ return new ExpressionStatement(definition, visit(node.body));
}
}
- Expression visitLetCont(ir.LetCont node) {
+ Statement visitLetCont(ir.LetCont node) {
// TODO(kmillikin): Allow continuations to have multiple uses. This could
// arise due to the representation of local control flow or due to
// optimization.
- assert(node.continuation.hasAtMostOneUse);
+ if (!node.continuation.hasAtMostOneUse) return bailout();
return visit(node.body);
}
- Expression visitInvokeStatic(ir.InvokeStatic node) {
+ Statement visitInvokeStatic(ir.InvokeStatic node) {
// Calls are translated to direct style.
List<Expression> arguments = translateArguments(node.arguments);
Expression invoke = new InvokeStatic(node.target, arguments);
@@ -280,16 +278,21 @@
return new LetVal(variable, invoke, cont.body.accept(this),
parameter.hasExactlyOneUse);
} else {
- return new Sequence([invoke, visit(cont.body)]);
+ return new ExpressionStatement(invoke, visit(cont.body));
}
}
}
- Expression visitInvokeContinuation(ir.InvokeContinuation node) {
+ Statement visitInvokeContinuation(ir.InvokeContinuation node) {
// TODO(kmillikin): Support non-return continuations. These could arise
// due to local control flow or due to inlining or other optimization.
- assert(node.continuation.definition == returnContinuation);
- return new Return(variables[node.argument.definition]);
+ if (node.continuation.definition != returnContinuation) return bailout();
+ assert(node.arguments.length == 1);
+ return new Return(variables[node.arguments[0].definition]);
+ }
+
+ Expression visitBranch(ir.Branch node) {
+ return bailout();
}
Expression visitConstant(ir.Constant node) {
@@ -330,14 +333,14 @@
* See [visitVariable] for the implementation of the heuristic for propagating
* a definition.
*/
-class Unnamer extends Visitor<Expression> {
+class Unnamer extends Visitor<Statement, Expression> {
// The binding environment. The rightmost element of the list is the nearest
// enclosing binding.
List<LetVal> environment;
void unname(FunctionDefinition definition) {
environment = <LetVal>[];
- definition.body = visit(definition.body);
+ definition.body = visitStatement(definition.body);
// TODO(kmillikin): Allow definitions that are not propagated. Here,
// this means rebuilding the binding with a recursively unnamed definition,
@@ -366,7 +369,7 @@
&& environment[i].hasExactlyOneUse) {
// Use the definition if it is pure or if it is the first impure
// definition (i.e., propagating past only pure expressions).
- return visit(environment.removeAt(i).definition);
+ return visitExpression(environment.removeAt(i).definition);
}
break;
} else if (!environment[i].definition.isPure) {
@@ -379,22 +382,15 @@
return node;
}
- Expression visitSequence(Sequence node) {
- for (int i = 0; i < node.expressions.length; ++i) {
- node.expressions[i] = visit(node.expressions[i]);
- }
- return node;
- }
-
- Expression visitLetVal(LetVal node) {
+ Statement visitLetVal(LetVal node) {
environment.add(node);
- Expression body = visit(node.body);
+ Statement body = visitStatement(node.body);
if (!environment.isEmpty && environment.last == node) {
// The definition could not be propagated. Residualize the let binding.
node.body = body;
environment.removeLast();
- node.definition = visit(node.definition);
+ node.definition = visitExpression(node.definition);
return node;
}
assert(!environment.contains(node));
@@ -404,368 +400,23 @@
Expression visitInvokeStatic(InvokeStatic node) {
// Process arguments right-to-left, the opposite of evaluation order.
for (int i = node.arguments.length - 1; i >= 0; --i) {
- node.arguments[i] = visit(node.arguments[i]);
+ node.arguments[i] = visitExpression(node.arguments[i]);
}
return node;
}
- Expression visitReturn(Return node) {
- node.value = visit(node.value);
+ Statement visitReturn(Return node) {
+ node.value = visitExpression(node.value);
return node;
}
- visitConstant(Constant node) {
+ Expression visitConstant(Constant node) {
return node;
}
-}
-
-/**
- * [Emitter] translates Tree to a Dart AST.
- *
- * The AST is handed off to the Dart backend for renaming and to emit Dart
- * code. Generating an AST is a temporary approach to integrating Tree into
- * the Dart backend. Ultimately, either Dart code directly will be emitted or
- * the translation will be to a backend-specific Dart AST and not the same
- * one used by the front end.
- *
- * The front end's AST is an unwieldy interface for constructing and generating
- * Dart code. AST nodes require references to tokens and the tokens will be
- * used by the unparser. This means that constructing an AST also requires
- * constructing (redundant) tokens. Unparsing AST nodes also requires a
- * mapping from nodes to elements --- so this mapping must be constructed by
- * the emitter.
- */
-class Emitter extends Visitor<ast.Node> {
- ConstantEmitter constantEmitter = new ConstantEmitter();
-
- // Accumulate a list of variables used, these are hoisted and declared on
- // entry to the function.
- List<ast.Identifier> variables = <ast.Identifier>[];
-
- // A mapping from nodes to elements, constructed while walking the input
- // tree.
- dart2js.TreeElementMapping treeElements;
-
- // Tokens needed in the AST.
- final Token openParen = new BeginGroupToken(OPEN_PAREN_INFO, -1);
- final Token closeParen = new SymbolToken(CLOSE_PAREN_INFO, -1);
- final Token openBrace = new BeginGroupToken(OPEN_CURLY_BRACKET_INFO, -1);
- final Token closeBrace = new SymbolToken(CLOSE_CURLY_BRACKET_INFO, -1);
- final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
-
- // Helper methods to construct ASTs.
- static ast.Identifier makeIdentifier(String name) {
- return new ast.Identifier(
- new StringToken.fromString(IDENTIFIER_INFO, name, -1));
- }
-
- ast.NodeList makeArgumentList(List<ast.Node> arguments) {
- return new ast.NodeList(openParen,
- new Link<ast.Node>.fromList(arguments),
- closeParen,
- ',');
- }
-
- ast.Block makeBlock(List<ast.Node> statements) {
- return new ast.Block(new ast.NodeList(
- openBrace, new Link<ast.Node>.fromList(statements), closeBrace));
- }
-
- static ast.SendSet makeAssignment(ast.Identifier identifier,
- ast.Expression expression) {
- return new ast.SendSet(
- null,
- identifier,
- new ast.Operator(new SymbolToken(EQ_INFO, -1)),
- new ast.NodeList.singleton(expression));
- }
-
- /**
- * Translate the body of a function to an AST FunctionExpression.
- */
- ast.FunctionExpression emit(FunctionElement element,
- dart2js.TreeElementMapping treeElements,
- FunctionDefinition definition) {
- // Reset the variable index. This function is not reentrant.
- Variable.counter = 0;
- this.treeElements = treeElements;
- ast.Identifier name = makeIdentifier(element.name);
-
- TypeEmitter typeEmitter = new TypeEmitter();
- FunctionSignature signature = element.functionSignature;
- ast.TypeAnnotation returnType;
- if (!signature.type.returnType.isDynamic) {
- returnType = typeEmitter.visit(signature.type.returnType, treeElements);
- }
-
- List<ast.VariableDefinitions> parameterList = <ast.VariableDefinitions>[];
- for (Variable parameter in definition.parameters) {
- ParameterElement element = parameter.element;
- parameter.assignIdentifier();
- ast.TypeAnnotation type;
- if (!element.type.isDynamic) {
- type = typeEmitter.visit(element.type, treeElements);
- }
- parameterList.add(new ast.VariableDefinitions(
- type,
- ast.Modifiers.EMPTY,
- new ast.NodeList.singleton(parameter.identifier)));
- }
- ast.NodeList parameters =
- new ast.NodeList(openParen,
- new Link<ast.Node>.fromList(parameterList),
- closeParen,
- ',');
-
- ast.Node body = visit(definition.body);
-
- if (!variables.isEmpty) {
- // Introduce hoisted definitions for all variables.
- ast.Identifier modifier =
- new ast.Identifier(new KeywordToken(Keyword.keywords['var'], -1));
- ast.VariableDefinitions definitions = new ast.VariableDefinitions(
- null,
- new ast.Modifiers(new ast.NodeList(
- null,
- new Link<ast.Node>.fromList([modifier]),
- null,
- ' ')),
- new ast.NodeList(
- null,
- new Link<ast.Node>.fromList(variables),
- semicolon,
- ','));
- body = concatenate(definitions, body);
- }
-
- if (body is ast.Return) {
- // Use a short form for bodies that are a single return.
- ast.Expression value = (body as ast.Return).expression;
- if (value is ast.LiteralNull) {
- // '{ return null; }' is '{}'.
- body = makeBlock([]);
- } else {
- // '{ return e; }' is '=> e;'.
- body = new ast.Return(new SymbolToken(FUNCTION_INFO, -1),
- semicolon,
- value);
- }
- } else if (body is ast.Block) {
- // Remove a final 'return null' that ends the body block.
- Link<ast.Node> nodes = (body as ast.Block).statements.nodes;
- ast.Node last;
- for (ast.Node n in nodes) {
- last = n;
- }
- if (last is ast.Return
- && (last as ast.Return).expression is ast.LiteralNull) {
- List<ast.Node> statements =
- (body as ast.Block).statements.nodes.toList();
- statements.removeLast();
- body = makeBlock(statements);
- }
- }
-
- return new ast.FunctionExpression(name, parameters, body, returnType,
- ast.Modifiers.EMPTY, null, null);
- }
-
- /**
- * Translate a list of arguments to an AST NodeList.
- */
- ast.NodeList translateArguments(List<Expression> args) {
- List<ast.Expression> arguments = args.map(visit).toList(growable: false);
- return makeArgumentList(arguments);
- }
-
- /**
- * Concatenate a pair of AST expressions or statements into a single Block
- * statement.
- */
- ast.Node concatenate(ast.Node first, ast.Node second) {
- // This is a convenient but very inefficient way to accumulate statements.
- // The Block and NodeList nodes are not mutable so we can't simply use a
- // Block or NodeList as an accumulator. Using a List<Node> requires
- // special casing and extra state to handle the expression/statement
- // distinction.
- // TODO(kmillikin): If we don't get rid of this Emitter, use a more
- // efficient way to accumulate nodes.
- LinkBuilder<ast.Node> statements = new LinkBuilder<ast.Node>();
-
- addStatements(ast.Node node) {
- if (node is ast.Block) {
- for (ast.Node n in node.statements.nodes) {
- statements.addLast(n);
- }
- } else if (node is ast.Expression) {
- statements.addLast(new ast.ExpressionStatement(node, semicolon));
- } else {
- statements.addLast(node);
- }
- }
-
- addStatements(first);
- addStatements(second);
-
- return new ast.Block(
- new ast.NodeList(openBrace, statements.toLink(), closeBrace));
- }
-
- ast.Node visitVariable(Variable node) {
- // The scope of variables is the body of their binding, so a name has
- // already been generated when we visit a variable.
- assert(node.identifier != null);
- return new ast.Send(null, node.identifier);
- }
-
- ast.Node visitSequence(Sequence node) {
- return node.expressions.map(visit).reduce(concatenate);
- }
-
- ast.Node visitLetVal(LetVal node) {
- // Let bindings translate into assignments.
- ast.Identifier identifier = node.variable.assignIdentifier();
- variables.add(identifier);
-
- ast.Expression expression = visit(node.definition);
- ast.Expression assignment = makeAssignment(identifier, expression);
-
- ast.Node rest = visit(node.body);
- return concatenate(assignment, rest);
- }
-
- ast.Node visitInvokeStatic(InvokeStatic node) {
- ast.Identifier name = makeIdentifier(node.target.name);
- ast.Send send =
- new ast.Send(null, name, translateArguments(node.arguments));
- treeElements[send] = node.target;
- return send;
- }
-
- ast.Node visitReturn(Return node) {
- ast.Expression expression = visit(node.value);
- return new ast.Return(
- new KeywordToken(Keyword.keywords['return'], -1),
- semicolon,
- expression);
- }
-
- ast.Node visitConstant(Constant node) {
- return node.value.accept(constantEmitter);
- }
-}
-
-class TypeEmitter extends
- DartTypeVisitor<ast.TypeAnnotation, dart2js.TreeElementMapping> {
-
- // Supported types are verified at IR construction time. The unimplemented
- // emit methods should be unreachable.
- ast.TypeAnnotation unimplemented() => throw new UnimplementedError();
-
- ast.TypeAnnotation makeSimpleAnnotation(
- DartType type,
- dart2js.TreeElementMapping treeElements) {
- ast.TypeAnnotation annotation =
- new ast.TypeAnnotation(Emitter.makeIdentifier(type.toString()), null);
- treeElements.setType(annotation, type);
- return annotation;
- }
-
- ast.TypeAnnotation visit(DartType type,
- dart2js.TreeElementMapping treeElements) {
- return type.accept(this, treeElements);
- }
-
- ast.TypeAnnotation visitType(DartType type,
- dart2js.TreeElementMapping treeElements) {
- return unimplemented();
- }
-
- ast.TypeAnnotation visitVoidType(VoidType type,
- dart2js.TreeElementMapping treeElements) {
- return makeSimpleAnnotation(type, treeElements);
- }
-
- ast.TypeAnnotation visitInterfaceType(
- InterfaceType type,
- dart2js.TreeElementMapping treeElements) {
- assert(!type.isGeneric);
- return makeSimpleAnnotation(type, treeElements);
- }
-
- ast.TypeAnnotation visitTypedefType(
- TypedefType type,
- dart2js.TreeElementMapping treeElements) {
- assert(!type.isGeneric);
- return makeSimpleAnnotation(type, treeElements);
- }
-
- ast.TypeAnnotation visitDynamicType(
- DynamicType type,
- dart2js.TreeElementMapping treeElements) {
- return unimplemented();
- }
-}
-
-class ConstantEmitter extends dart2js.ConstantVisitor<ast.Expression> {
- ast.Expression unimplemented() => throw new UnimplementedError();
-
- ast.Expression visitFunction(dart2js.FunctionConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitNull(dart2js.NullConstant constant) {
- return new ast.LiteralNull(
- new KeywordToken(Keyword.keywords['null'], -1));
- }
-
- ast.Expression visitInt(dart2js.IntConstant constant) {
- return new ast.LiteralInt(
- new StringToken.fromString(INT_INFO, constant.value.toString(), -1),
- null);
- }
-
- ast.Expression visitDouble(dart2js.DoubleConstant constant) {
- return new ast.LiteralDouble(
- new StringToken.fromString(DOUBLE_INFO, constant.value.toString(), -1),
- null);
- }
-
- ast.Expression visitTrue(dart2js.TrueConstant constant) {
- return new ast.LiteralBool(
- new KeywordToken(Keyword.keywords['true'], -1), null);
- }
-
- ast.Expression visitFalse(dart2js.FalseConstant constant) {
- return new ast.LiteralBool(
- new KeywordToken(Keyword.keywords['false'], -1), null);
- }
-
- ast.Expression visitString(dart2js.StringConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitList(dart2js.ListConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitMap(dart2js.MapConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitConstructed(dart2js.ConstructedConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitType(dart2js.TypeConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitInterceptor(dart2js.InterceptorConstant constant) {
- return unimplemented();
- }
-
- ast.Expression visitDummy(dart2js.DummyConstant constant) {
- return unimplemented();
+
+ Statement visitExpressionStatement(ExpressionStatement node) {
+ node.expression = visitExpression(node.expression);
+ node.next = visitStatement(node.next);
+ return node;
}
}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
new file mode 100644
index 0000000..e93f548
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -0,0 +1,906 @@
+library dart_tree_printer;
+
+import 'dart_printer.dart';
+import '../tree/tree.dart' as tree;
+import '../scanner/scannerlib.dart';
+import '../util/util.dart';
+import '../dart2jslib.dart' as dart2js;
+import '../util/characters.dart' as characters;
+import '../elements/elements.dart' as elements;
+import '../dart_types.dart' as types;
+
+/// Converts backend ASTs to frontend ASTs.
+class TreePrinter {
+ dart2js.TreeElementMapping treeElements;
+
+ TreePrinter([this.treeElements]);
+
+ void setElement(tree.Node node, elements.Element element) {
+ if (treeElements != null) {
+ if (element == null) {
+ throw "Missing element";
+ }
+ treeElements[node] = element;
+ }
+ }
+
+ void setType(tree.Node node, types.DartType type) {
+ if (treeElements != null) {
+ if (type == null) {
+ throw "Missing type from ${node.runtimeType}";
+ }
+ treeElements.setType(node, type);
+ }
+ }
+
+ // Group tokens: () [] {} <>
+ static BeginGroupToken makeGroup(PrecedenceInfo open, PrecedenceInfo close) {
+ BeginGroupToken openTok = new BeginGroupToken(open, -1);
+ openTok.endGroup = new SymbolToken(close, -1);
+ return openTok;
+ }
+
+ final BeginGroupToken openParen = makeGroup(OPEN_PAREN_INFO,
+ CLOSE_PAREN_INFO);
+ final BeginGroupToken openBrace = makeGroup(OPEN_CURLY_BRACKET_INFO,
+ CLOSE_CURLY_BRACKET_INFO);
+ final BeginGroupToken openBracket = makeGroup(OPEN_SQUARE_BRACKET_INFO,
+ CLOSE_SQUARE_BRACKET_INFO);
+ final BeginGroupToken lt = makeGroup(LT_INFO, GT_INFO);
+
+ Token get closeParen => openParen.endGroup;
+ Token get closeBrace => openBrace.endGroup;
+ Token get closeBracket => openBracket.endGroup;
+ Token get gt => lt.endGroup;
+
+ // Symbol tokens
+ final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
+ final Token indexToken = new SymbolToken(INDEX_INFO, -1); // "[]"
+ final Token question = new SymbolToken(QUESTION_INFO, -1);
+ final Token colon = new SymbolToken(COLON_INFO, -1);
+ final Token hash = new SymbolToken(HASH_INFO, -1);
+ final Token bang = new SymbolToken(BANG_INFO, -1);
+ final Token eq = new SymbolToken(EQ_INFO, -1);
+
+ // Keyword tokens
+ static Token makeIdToken(String text) {
+ return new StringToken.fromString(IDENTIFIER_INFO, text, -1);
+ }
+ final Token newToken = makeIdToken('new');
+ final Token constToken = makeIdToken('const');
+ final Token throwToken = makeIdToken('throw');
+ final Token rethrowToken = makeIdToken('rethrow');
+ final Token breakToken = makeIdToken('break');
+ final Token continueToken = makeIdToken('continue');
+ final Token doToken = makeIdToken('do');
+ final Token whileToken = makeIdToken('while');
+ final Token ifToken = makeIdToken('if');
+ final Token elseToken = makeIdToken('else');
+ final Token forToken = makeIdToken('for');
+ final Token inToken = makeIdToken('in');
+ final Token returnToken = makeIdToken('return');
+ final Token switchToken = makeIdToken('switch');
+ final Token caseToken = makeIdToken('case');
+ final Token defaultToken = makeIdToken('default');
+ final Token tryToken = makeIdToken('try');
+ final Token catchToken = makeIdToken('catch');
+ final Token onToken = makeIdToken('on');
+ final Token finallyToken = makeIdToken('finally');
+
+ static tree.Identifier makeIdentifier(String name) {
+ return new tree.Identifier(
+ new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+ }
+
+ // Utilities for creating NodeLists
+ Link<tree.Node> makeLink(Iterable<tree.Node> nodes) {
+ LinkBuilder builder = new LinkBuilder();
+ for (tree.Node node in nodes) {
+ builder.addLast(node);
+ }
+ return builder.toLink();
+ }
+
+ tree.NodeList blankList() {
+ return new tree.NodeList(null, makeLink([]), null, '');
+ }
+ tree.NodeList singleton(tree.Node node) {
+ return new tree.NodeList(null, makeLink([node]), null, '');
+ }
+ tree.NodeList makeList(String delimiter,
+ Iterable<tree.Node> nodes,
+ { Token open,
+ Token close }) {
+ return new tree.NodeList(open, makeLink(nodes), close, delimiter);
+ }
+ tree.NodeList parenList(String delimiter, Iterable<tree.Node> nodes) {
+ return makeList(delimiter, nodes, open: openParen, close: closeParen);
+ }
+ tree.NodeList bracketList(String delimiter, Iterable<tree.Node> nodes) {
+ return makeList(delimiter, nodes, open: openBracket, close: closeBracket);
+ }
+ tree.NodeList braceList(String delimiter, Iterable<tree.Node> nodes) {
+ return makeList(delimiter, nodes, open: openBrace, close: closeBrace);
+ }
+ tree.NodeList argList(Iterable<tree.Node> nodes) {
+ return parenList(',', nodes);
+ }
+ tree.NodeList typeArgList(Iterable<tree.Node> nodes) {
+ return makeList(',', nodes, open: lt, close: gt);
+ }
+
+ /// Converts a qualified name into nested Sends.
+ tree.Node makeName(String name) {
+ if (name == null) {
+ return null;
+ }
+ List<String> names = name.split('.').toList(growable:false);
+ tree.Node node = makeIdentifier(names[0]);
+ for (int i = 1; i < names.length; i++) {
+ node = new tree.Send(node, makeIdentifier(names[i]));
+ }
+ return node;
+ }
+
+ static Token assignmentToken(String operatorName) {
+ switch (operatorName) {
+ case '=': return new SymbolToken(EQ_INFO, -1);
+ case '+=': return new SymbolToken(PLUS_EQ_INFO, -1);
+ case '-=': return new SymbolToken(MINUS_EQ_INFO, -1);
+ case '*=': return new SymbolToken(STAR_EQ_INFO, -1);
+ case '/=': return new SymbolToken(SLASH_EQ_INFO, -1);
+ case '~/=': return new SymbolToken(TILDE_SLASH_EQ_INFO, -1);
+ case '%=': return new SymbolToken(PERCENT_EQ_INFO, -1);
+ case '&=': return new SymbolToken(AMPERSAND_EQ_INFO, -1);
+ case '^=': return new SymbolToken(CARET_EQ_INFO, -1);
+ case '|=': return new SymbolToken(BAR_EQ_INFO, -1);
+ case '>>=': return new SymbolToken(GT_GT_EQ_INFO, -1);
+ case '<<=': return new SymbolToken(LT_LT_EQ_INFO, -1);
+ default:
+ throw "Unrecognized assignment operator: $operatorName";
+ }
+ }
+
+ static Token binopToken(String operatorName) {
+ switch (operatorName) {
+ case '+': return new SymbolToken(PLUS_INFO, -1);
+ case '-': return new SymbolToken(MINUS_INFO, -1);
+ case '*': return new SymbolToken(STAR_INFO, -1);
+ case '/': return new SymbolToken(SLASH_INFO, -1);
+ case '~/': return new SymbolToken(TILDE_SLASH_INFO, -1);
+ case '%': return new SymbolToken(PERCENT_INFO, -1);
+ case '&': return new SymbolToken(AMPERSAND_INFO, -1);
+ case '^': return new SymbolToken(CARET_INFO, -1);
+ case '|': return new SymbolToken(BAR_INFO, -1);
+ case '>>': return new SymbolToken(GT_GT_INFO, -1);
+ case '<<': return new SymbolToken(LT_LT_INFO, -1);
+ case '==': return new SymbolToken(EQ_EQ_INFO, -1);
+ case '!=': return new SymbolToken(BANG_EQ_INFO, -1);
+ case '>': return new SymbolToken(GT_INFO, -1);
+ case '>=': return new SymbolToken(GT_EQ_INFO, -1);
+ case '<': return new SymbolToken(LT_INFO, -1);
+ case '<=': return new SymbolToken(LT_EQ_INFO, -1);
+ case '&&': return new SymbolToken(AMPERSAND_AMPERSAND_INFO, -1);
+ case '||': return new SymbolToken(BAR_BAR_INFO, -1);
+ default:
+ throw "Unrecognized binary operator: $operatorName";
+ }
+ }
+
+ static Token incrementToken(String operatorName) {
+ switch (operatorName) {
+ case '++': return new SymbolToken(PLUS_PLUS_INFO, -1);
+ case '--': return new SymbolToken(MINUS_MINUS_INFO, -1);
+ default:
+ throw "Unrecognized increment operator: $operatorName";
+ }
+ }
+
+ static Token typeOpToken(String operatorName) {
+ switch (operatorName) { // "is!" is not an operator in the frontend AST.
+ case 'is': return new SymbolToken(IS_INFO, -1);
+ case 'as': return new SymbolToken(AS_INFO, -1);
+ default:
+ throw 'Unrecognized type operator: $operatorName';
+ }
+ }
+
+ Token unopToken(String operatorName) {
+ switch (operatorName) {
+ case '-': return new SymbolToken(MINUS_INFO, -1);
+ case '~': return new SymbolToken(TILDE_INFO, -1);
+ case '!': return bang;
+ default:
+ throw "Unrecognized unary operator: $operatorName";
+ }
+ }
+
+ tree.Node makeArgument(Argument arg) {
+ if (arg is Expression) {
+ return makeExpression(arg);
+ } else if (arg is NamedArgument) {
+ return new tree.NamedArgument(
+ makeIdentifier(arg.name),
+ colon,
+ makeExpression(arg.expression));
+ } else {
+ throw "Unrecognized argument type: ${arg.runtimeType}";
+ }
+ }
+
+ tree.Node makeExpression(Expression exp) {
+ return makeExp(exp, EXPRESSION);
+ }
+
+ /// Converts [exp] to a [tree.Node] that unparses to an expression with
+ /// a precedence level of at least [minPrecedence]. The expression will be
+ /// wrapped in a parenthesis if necessary.
+ tree.Node makeExp(Receiver exp, int minPrecedence, {bool beginStmt: false}) {
+ tree.Node result;
+ int precedence;
+ bool needParen = false;
+ if (exp is SuperReceiver) {
+ precedence = CALLEE;
+ result = makeIdentifier('super');
+ } else if (exp is Assignment) {
+ Expression left = exp.left;
+ tree.Node receiver;
+ tree.Node selector;
+ tree.NodeList arguments;
+ elements.Element element;
+ if (left is Identifier) {
+ receiver = null;
+ selector = makeIdentifier(left.name);
+ arguments = singleton(makeExpression(exp.right));
+ element = left.element;
+ } else if (left is FieldExpression) {
+ receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
+ selector = makeIdentifier(left.fieldName);
+ arguments = singleton(makeExpression(exp.right));
+ } else if (left is IndexExpression) {
+ receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
+ selector = new tree.Operator(indexToken);
+ arguments = bracketList(',',
+ [makeExpression(left.index), makeExpression(exp.right)]);
+ } else {
+ throw "Unexpected left-hand side of assignment: ${left.runtimeType}";
+ }
+ tree.Operator op = new tree.Operator(assignmentToken(exp.operatorName));
+ result = new tree.SendSet(receiver, selector, op, arguments);
+ setElement(result, element);
+ precedence = EXPRESSION;
+ } else if (exp is BinaryOperator) {
+ precedence = BINARY_PRECEDENCE[exp.operatorName];
+ int deltaLeft = isAssociativeBinaryOperator(precedence) ? 0 : 1;
+ result = new tree.Send(
+ makeExp(exp.left, precedence + deltaLeft, beginStmt: beginStmt),
+ new tree.Operator(binopToken(exp.operatorName)),
+ singleton(makeExp(exp.right, precedence + 1)));
+ } else if (exp is CallFunction) {
+ precedence = CALLEE;
+ tree.Node selector;
+ Expression callee = exp.callee;
+ if (callee is Identifier) {
+ selector = makeIdentifier(callee.name);
+ } else {
+ selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
+ }
+ result = new tree.Send(
+ null,
+ selector,
+ argList(exp.arguments.map(makeArgument)));
+ } else if (exp is CallMethod) {
+ precedence = CALLEE;
+ result = new tree.Send(
+ makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+ makeIdentifier(exp.methodName),
+ argList(exp.arguments.map(makeArgument)));
+ } else if (exp is CallNew) {
+ precedence = CALLEE;
+ tree.Node selector = makeName(exp.type.name);
+ if (exp.type.typeArguments.length > 0) {
+ selector = new tree.TypeAnnotation(
+ selector,
+ typeArgList(exp.type.typeArguments.map(makeType)));
+ }
+ if (exp.constructorName != null) {
+ selector = new tree.Send(
+ selector,
+ makeIdentifier(exp.constructorName));
+ }
+ result = new tree.NewExpression(
+ exp.isConst ? constToken : newToken,
+ new tree.Send(
+ null,
+ selector,
+ argList(exp.arguments.map(makeArgument))));
+ } else if (exp is CallStatic) {
+ precedence = CALLEE;
+ result = new tree.Send(
+ makeName(exp.className),
+ makeIdentifier(exp.methodName),
+ argList(exp.arguments.map(makeArgument)));
+ setElement(result, exp.element);
+ } else if (exp is Conditional) {
+ precedence = CONDITIONAL;
+ result = new tree.Conditional(
+ makeExp(exp.condition, LOGICAL_OR, beginStmt: beginStmt),
+ makeExp(exp.thenExpression, EXPRESSION),
+ makeExp(exp.elseExpression, EXPRESSION),
+ question,
+ colon);
+ } else if (exp is FieldExpression) {
+ precedence = PRIMARY;
+ result = new tree.Send(
+ makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+ makeIdentifier(exp.fieldName));
+ } else if (exp is FunctionExpression) {
+ precedence = PRIMARY;
+ if (beginStmt && exp.name != null) {
+ needParen = true; // Do not mistake for function declaration.
+ }
+ result = new tree.FunctionExpression(
+ exp.name != null ? makeIdentifier(exp.name) : null,
+ makeParameters(exp.parameters),
+ makeBlock(exp.body),
+ exp.returnType != null ? makeType(exp.returnType) : null,
+ makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+ null, // initializers
+ null); // get/set
+ setElement(result, exp.element);
+ } else if (exp is Identifier) {
+ precedence = CALLEE;
+ result = new tree.Send(null, makeIdentifier(exp.name));
+ setElement(result, exp.element);
+ } else if (exp is Increment) {
+ Expression lvalue = exp.expression;
+ tree.Node receiver;
+ tree.Node selector;
+ tree.Node argument;
+ bool innerBeginStmt = beginStmt && !exp.isPrefix;
+ if (lvalue is Identifier) {
+ selector = makeIdentifier(lvalue.name);
+ } else if (lvalue is FieldExpression) {
+ receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
+ selector = makeIdentifier(lvalue.fieldName);
+ } else if (lvalue is IndexExpression) {
+ receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
+ selector = new tree.Operator(indexToken);
+ argument = makeExpression(lvalue.index);
+ } else {
+ throw "Unrecognized left-hand side: ${lvalue.runtimeType}";
+ }
+ tree.Operator op = new tree.Operator(incrementToken(exp.operatorName));
+ if (exp.isPrefix) {
+ precedence = UNARY;
+ result = new tree.SendSet.prefix(receiver, selector, op, argument);
+ } else {
+ precedence = POSTFIX_INCREMENT;
+ result = new tree.SendSet.postfix(receiver, selector, op, argument);
+ }
+ } else if (exp is IndexExpression) {
+ precedence = CALLEE;
+ result = new tree.Send(
+ makeExp(exp.object, PRIMARY, beginStmt: beginStmt),
+ new tree.Operator(indexToken),
+ bracketList(',', [makeExpression(exp.index)]));
+ } else if (exp is Literal) {
+ precedence = CALLEE;
+ dart2js.PrimitiveConstant value = exp.value;
+ Token tok = new StringToken.fromString(STRING_INFO, '${value.value}', -1);
+ if (value is dart2js.StringConstant) {
+ result = new tree.LiteralString(tok, value.value);
+ } else if (value is dart2js.IntConstant) {
+ result = new tree.LiteralInt(tok, null);
+ } else if (value is dart2js.DoubleConstant) {
+ result = new tree.LiteralDouble(tok, null);
+ } else if (value is dart2js.BoolConstant) {
+ result = new tree.LiteralBool(tok, null);
+ } else if (value is dart2js.NullConstant) {
+ result = new tree.LiteralNull(tok);
+ } else {
+ throw "Unrecognized constant: ${value.runtimeType}";
+ }
+ } else if (exp is LiteralList) {
+ precedence = PRIMARY;
+ tree.NodeList typeArgs = null;
+ if (exp.typeArgument != null) {
+ typeArgs = typeArgList([makeType(exp.typeArgument)]);
+ }
+ result = new tree.LiteralList(
+ typeArgs,
+ bracketList(',', exp.values.map(makeExpression)),
+ exp.isConst ? constToken : null);
+ } else if (exp is LiteralMap) {
+ precedence = PRIMARY;
+ if (beginStmt) {
+ // The opening brace can be confused with a block statement.
+ needParen = true;
+ }
+ tree.NodeList typeArgs = null;
+ if (exp.typeArguments != null && exp.typeArguments.length > 0) {
+ typeArgs = typeArgList(exp.typeArguments.map(makeType));
+ }
+ result = new tree.LiteralMap(
+ typeArgs,
+ braceList(',', exp.entries.map(makeLiteralMapEntry)),
+ exp.isConst ? constToken : null);
+ } else if (exp is LiteralSymbol) {
+ precedence = PRIMARY;
+ result = new tree.LiteralSymbol(
+ hash,
+ makeList('.', exp.id.split('.').map(makeIdentifier)));
+ } else if (exp is StringConcat) {
+ precedence = PRIMARY;
+ if (exp.expressions.length == 0) {
+ result = new tree.LiteralString(
+ new StringToken.fromString(STRING_INFO, '""', -1),
+ new tree.DartString.empty());
+ } else {
+ StringLiteralOutput output = Unparser.analyzeStringLiteral(exp);
+ List parts = output.parts;
+ tree.Node printStringChunk(StringChunk chunk) {
+ bool raw = chunk.quoting.raw;
+ int quoteCode = chunk.quoting.quote;
+
+ List<tree.StringInterpolationPart> literalParts = [];
+ tree.LiteralString firstLiteral;
+ tree.Node currentInterpolation;
+
+ // sb contains the current unfinished LiteralString
+ StringBuffer sb = new StringBuffer();
+ if (raw) {
+ sb.write('r');
+ }
+ for (int i = 0; i < chunk.quoting.leftQuoteCharCount; i++) {
+ sb.write(chunk.quoting.quoteChar);
+ }
+
+ // Print every character and string interpolation
+ int startIndex = chunk.previous != null ? chunk.previous.endIndex : 0;
+ for (int i = startIndex; i < chunk.endIndex; i++) {
+ var part = parts[i];
+ if (part is Expression) {
+ // Finish the previous string interpolation, if there is one.
+ tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+ if (currentInterpolation != null) {
+ literalParts.add(new tree.StringInterpolationPart(
+ currentInterpolation,
+ lit));
+ } else {
+ firstLiteral = lit;
+ }
+ sb.clear();
+ currentInterpolation = makeExpression(part);
+ } else {
+ int char = part;
+ switch (char) {
+ case characters.$$:
+ if (raw)
+ sb.write(r'$');
+ else
+ sb.write(r'\$');
+ break;
+ case characters.$BACKSLASH:
+ if (raw)
+ sb.write(r'\');
+ else
+ sb.write(r'\\');
+ break;
+ case characters.$DQ:
+ if (quoteCode == char) {
+ sb.write(r'\"');
+ } else {
+ sb.write(r'"');
+ }
+ break;
+ case characters.$SQ:
+ if (quoteCode == char) {
+ sb.write(r"\'");
+ } else {
+ sb.write(r"'");
+ }
+ break;
+ case NEWLINE:
+ sb.write(r'\n');
+ break;
+ case CARRIAGE_RETURN:
+ sb.write(r'\r');
+ break;
+ default:
+ sb.write(new String.fromCharCode(char));
+ }
+ }
+ }
+
+ // Print ending quotes
+ for (int i = 0; i < chunk.quoting.rightQuoteLength; i++) {
+ sb.write(chunk.quoting.quoteChar);
+ }
+
+ // Finish the previous string interpolation, if there is one.
+ // Then wrap everything in a StringInterpolation, if relevant.
+ tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+ tree.Node node;
+ if (firstLiteral == null) {
+ node = lit;
+ } else {
+ literalParts.add(new tree.StringInterpolationPart(
+ currentInterpolation,
+ lit));
+ node = new tree.StringInterpolation(
+ firstLiteral,
+ makeList('', literalParts));
+ }
+
+ // Juxtapose with the previous string chunks, if any.
+ if (chunk.previous != null) {
+ return new tree.StringJuxtaposition(
+ printStringChunk(chunk.previous),
+ node);
+ } else {
+ return node;
+ }
+ }
+ result = printStringChunk(output.chunk);
+ }
+ } else if (exp is This) {
+ precedence = CALLEE;
+ result = makeIdentifier('this');
+ } else if (exp is Throw) {
+ precedence = EXPRESSION; // ???
+ result = new tree.Throw(
+ makeExpression(exp.expression),
+ throwToken,
+ throwToken); // endToken not used by unparser
+ } else if (exp is TypeOperator) {
+ precedence = RELATIONAL;
+ tree.Operator operator;
+ tree.Node rightOperand = makeType(exp.type);
+ if (exp.operatorName == 'is!') {
+ operator = new tree.Operator(typeOpToken('is'));
+ rightOperand = new tree.Send(
+ rightOperand,
+ new tree.Operator(bang),
+ blankList());
+ } else {
+ operator = new tree.Operator(typeOpToken(exp.operatorName));
+ }
+ result = new tree.Send(
+ makeExp(exp.expression, BITWISE_OR, beginStmt: beginStmt),
+ operator,
+ singleton(rightOperand));
+ } else if (exp is UnaryOperator) {
+ precedence = UNARY;
+ result = new tree.Send.prefix(
+ makeExp(exp.operand, UNARY),
+ new tree.Operator(unopToken(exp.operatorName)));
+ } else {
+ throw "Unknown expression type: ${exp.runtimeType}";
+ }
+
+ needParen = needParen || precedence < minPrecedence;
+ if (needParen) {
+ result = parenthesize(result);
+ }
+ return result;
+ }
+
+ /// Creates a LiteralString with [verbatim] as the value.
+ /// No (un)quoting or (un)escaping will be performed by this method.
+ /// The [DartString] inside the literal will be set to null because the
+ /// code emitter does not use it.
+ tree.LiteralString makeVerbatimStringLiteral(String verbatim) {
+ Token tok = new StringToken.fromString(STRING_INFO, verbatim, -1);
+ return new tree.LiteralString(tok, null);
+ }
+
+ tree.LiteralMapEntry makeLiteralMapEntry(LiteralMapEntry en) {
+ return new tree.LiteralMapEntry(
+ makeExpression(en.key),
+ colon,
+ makeExpression(en.value));
+ }
+
+ /// Produces a statement in a context where only blocks are allowed.
+ tree.Node makeBlock(Statement stmt) {
+ if (stmt is Block)
+ return makeStatement(stmt);
+ else {
+ return new tree.Block(singleton(makeStatement(stmt)));
+ }
+ }
+
+ tree.Node makeStatement(Statement stmt, {bool shortIf: true}) {
+ if (stmt is Block) {
+ return new tree.Block(braceList('', stmt.statements.map(makeStatement)));
+ } else if (stmt is Break) {
+ return new tree.BreakStatement(
+ stmt.label == null ? null : makeIdentifier(stmt.label),
+ breakToken,
+ semicolon);
+ } else if (stmt is Continue) {
+ return new tree.ContinueStatement(
+ stmt.label == null ? null : makeIdentifier(stmt.label),
+ continueToken,
+ semicolon);
+ } else if (stmt is DoWhile) {
+ return new tree.DoWhile(
+ makeStatement(stmt.body, shortIf: shortIf),
+ parenthesize(makeExpression(stmt.condition)),
+ doToken,
+ whileToken,
+ semicolon);
+ } else if (stmt is EmptyStatement) {
+ return new tree.EmptyStatement(semicolon);
+ } else if (stmt is ExpressionStatement) {
+ return new tree.ExpressionStatement(
+ makeExp(stmt.expression, EXPRESSION, beginStmt: true),
+ semicolon);
+ } else if (stmt is For) {
+ tree.Node initializer;
+ if (stmt.initializer is VariableDeclarations) {
+ initializer = makeVariableDeclarations(stmt.initializer);
+ } else if (stmt.initializer is Expression) {
+ initializer = makeExpression(stmt.initializer);
+ } else {
+ initializer = null;
+ }
+ tree.Node condition;
+ if (stmt.condition != null) {
+ condition = new tree.ExpressionStatement(
+ makeExpression(stmt.condition),
+ semicolon);
+ } else {
+ condition = new tree.EmptyStatement(semicolon);
+ }
+ return new tree.For(
+ initializer,
+ condition,
+ makeList(',', stmt.updates.map(makeExpression)),
+ makeStatement(stmt.body, shortIf: shortIf),
+ forToken);
+ } else if (stmt is ForIn) {
+ tree.Node left;
+ if (stmt.leftHandValue is Identifier) {
+ left = makeExpression(stmt.leftHandValue);
+ } else {
+ left = makeVariableDeclarations(stmt.leftHandValue);
+ }
+ return new tree.ForIn(
+ left,
+ makeExpression(stmt.expression),
+ makeStatement(stmt.body, shortIf: shortIf),
+ forToken,
+ inToken);
+ } else if (stmt is FunctionDeclaration) {
+ return new tree.FunctionDeclaration(new tree.FunctionExpression(
+ stmt.name != null ? makeIdentifier(stmt.name) : null,
+ makeParameters(stmt.parameters),
+ makeBlock(stmt.body),
+ stmt.returnType != null ? makeType(stmt.returnType) : null,
+ makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+ null, // initializers
+ null)); // get/set
+ } else if (stmt is If) {
+ if (stmt.elseStatement == null) {
+ tree.Node node = new tree.If(
+ parenthesize(makeExpression(stmt.condition)),
+ makeStatement(stmt.thenStatement),
+ null, // else statement
+ ifToken,
+ null); // else token
+ if (shortIf)
+ return node;
+ else
+ return new tree.Block(braceList('', [node]));
+ } else {
+ return new tree.If(
+ parenthesize(makeExpression(stmt.condition)),
+ makeStatement(stmt.thenStatement, shortIf: false),
+ makeStatement(stmt.elseStatement, shortIf: shortIf),
+ ifToken,
+ elseToken); // else token
+ }
+ } else if (stmt is LabeledStatement) {
+ List<tree.Label> labels = [];
+ Statement inner = stmt;
+ while (inner is LabeledStatement) {
+ LabeledStatement lbl = inner as LabeledStatement;
+ labels.add(new tree.Label(makeIdentifier(lbl.label), colon));
+ inner = lbl.statement;
+ }
+ return new tree.LabeledStatement(
+ makeList('', labels),
+ makeStatement(inner, shortIf: shortIf));
+ } else if (stmt is Rethrow) {
+ return new tree.Rethrow(rethrowToken, semicolon);
+ } else if (stmt is Return) {
+ return new tree.Return(
+ returnToken,
+ semicolon,
+ stmt.expression == null ? null : makeExpression(stmt.expression));
+ } else if (stmt is Switch) {
+ return new tree.SwitchStatement(
+ parenthesize(makeExpression(stmt.expression)),
+ braceList('', stmt.cases.map(makeSwitchCase)),
+ switchToken);
+ } else if (stmt is Try) {
+ return new tree.TryStatement(
+ makeBlock(stmt.tryBlock),
+ braceList('', stmt.catchBlocks.map(makeCatchBlock)),
+ stmt.finallyBlock == null ? null : makeBlock(stmt.finallyBlock),
+ tryToken,
+ finallyToken);
+ } else if (stmt is VariableDeclarations) {
+ return makeVariableDeclarations(stmt, useVar: true, endToken: semicolon);
+ } else if (stmt is While) {
+ return new tree.While(
+ parenthesize(makeExpression(stmt.condition)),
+ makeStatement(stmt.body, shortIf: shortIf),
+ whileToken);
+ } else {
+ throw "Unrecognized statement: ${stmt.runtimeType}";
+ }
+ }
+
+ tree.Node makeVariableDeclaration(VariableDeclaration vd) {
+ if (vd.initializer == null)
+ return makeIdentifier(vd.name);
+ else {
+ return new tree.SendSet(
+ null,
+ makeIdentifier(vd.name),
+ new tree.Operator(eq),
+ singleton(makeExpression(vd.initializer)));
+ }
+ }
+
+ /// If [useVar] is true, the variable definition will use `var` as modifier
+ /// if no other modifiers are present.
+ /// [endToken] will be used to terminate the declaration list.
+ tree.Node makeVariableDeclarations(VariableDeclarations decl,
+ { bool useVar: false,
+ Token endToken: null }) {
+ return new tree.VariableDefinitions(
+ decl.type == null ? null : makeType(decl.type),
+ makeVarModifiers(isConst: decl.isConst,
+ isFinal: decl.isFinal,
+ useVar: useVar && decl.type == null),
+ makeList(',',
+ decl.declarations.map(makeVariableDeclaration),
+ close: endToken));
+ }
+
+ tree.CatchBlock makeCatchBlock(CatchBlock block) {
+ List<tree.VariableDefinitions> formals = [];
+ if (block.exceptionVar != null) {
+ formals.add(new tree.VariableDefinitions(
+ null,
+ makeEmptyModifiers(),
+ singleton(makeIdentifier(block.exceptionVar))));
+ }
+ if (block.stackVar != null) {
+ formals.add(new tree.VariableDefinitions(
+ null,
+ makeEmptyModifiers(),
+ singleton(makeIdentifier(block.stackVar))));
+ }
+ return new tree.CatchBlock(
+ block.onType == null ? null : makeType(block.onType),
+ block.exceptionVar == null ? null : argList(formals),
+ makeBlock(block.body),
+ block.onType == null ? null : onToken,
+ block.exceptionVar == null ? null : catchToken);
+ }
+
+ tree.SwitchCase makeSwitchCase(SwitchCase caze) {
+ if (caze.isDefaultCase) {
+ return new tree.SwitchCase(
+ blankList(),
+ defaultToken,
+ makeList('', caze.statements.map(makeStatement)),
+ null); // startToken unused by unparser
+ } else {
+ return new tree.SwitchCase(
+ makeList('', caze.expressions.map(makeCaseMatch)),
+ null, // defaultKeyword,
+ makeList('', caze.statements.map(makeStatement)),
+ null); // startToken unused by unparser
+ }
+ }
+
+ tree.CaseMatch makeCaseMatch(Expression exp) {
+ return new tree.CaseMatch(caseToken, makeExpression(exp), colon);
+ }
+
+ tree.TypeAnnotation makeType(TypeAnnotation type) {
+ tree.NodeList typeArgs;
+ if (type.typeArguments.length > 0) {
+ typeArgs = typeArgList(type.typeArguments.map(makeType));
+ } else {
+ typeArgs = null;
+ }
+ tree.TypeAnnotation result =
+ new tree.TypeAnnotation(makeIdentifier(type.name), typeArgs);
+ setType(result, type.dartType);
+ return result;
+ }
+
+ tree.NodeList makeParameters(Parameters params) {
+ List<tree.Node> nodes =
+ params.requiredParameters.map(makeParameter).toList();
+ if (params.hasOptionalParameters) {
+ Token assign = params.hasNamedParameters ? colon : eq;
+ Token open = params.hasNamedParameters ? openBrace : openBracket;
+ Token close = params.hasNamedParameters ? closeBrace : closeBracket;
+ List opt = params.optionalParameters.map((p) => makeParameter(p,assign));
+ nodes.add(new tree.NodeList(open, makeLink(opt), close, ','));
+ }
+ return argList(nodes);
+ }
+
+ /// [assignOperator] is used for writing the default value.
+ tree.Node makeParameter(Parameter param, [Token assignOperator]) {
+ if (param.isFunction) {
+ tree.Node definition = new tree.FunctionExpression(
+ makeIdentifier(param.name),
+ makeParameters(param.parameters),
+ null, // body
+ param.type == null ? null : makeType(param.type),
+ makeEmptyModifiers(), // TODO: Function parameter modifiers?
+ null, // initializers
+ null); // get/set
+ if (param.defaultValue != null) {
+ return new tree.SendSet(
+ null,
+ definition,
+ new tree.Operator(assignOperator),
+ singleton(makeExpression(param.defaultValue)));
+ } else {
+ return definition;
+ }
+ } else {
+ tree.Node definition;
+ if (param.defaultValue != null) {
+ definition = new tree.SendSet(
+ null,
+ makeIdentifier(param.name),
+ new tree.Operator(assignOperator),
+ singleton(makeExpression(param.defaultValue)));
+ } else {
+ definition = makeIdentifier(param.name);
+ }
+ setElement(definition, param.element);
+ return new tree.VariableDefinitions(
+ param.type == null ? null : makeType(param.type),
+ makeEmptyModifiers(), // TODO: Parameter modifiers?
+ singleton(definition));
+ }
+ }
+
+ tree.Modifiers makeEmptyModifiers() {
+ return new tree.Modifiers(blankList());
+ }
+
+ tree.Modifiers makeVarModifiers({bool isConst: false,
+ bool isFinal: false,
+ bool useVar: false}) {
+ List<tree.Node> nodes = [];
+ if (isConst) {
+ nodes.add(makeIdentifier('const'));
+ }
+ if (isFinal) {
+ nodes.add(makeIdentifier('final'));
+ }
+ if (useVar && nodes.isEmpty) {
+ nodes.add(makeIdentifier('var'));
+ }
+ return new tree.Modifiers(makeList('', nodes));
+ }
+
+ tree.Node parenthesize(tree.Node node) {
+ return new tree.ParenthesizedExpression(node, openParen);
+ }
+
+}
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 aa5b07d..2aade10 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -320,6 +320,7 @@
}
void makeElementPlaceholder(Node node, Element element) {
+ assert(node != null);
assert(element != null);
if (identical(element, entryFunction)) return;
if (identical(element.getLibrary(), coreLibrary)) return;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index 1730851..cfbf6fa 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -4,7 +4,7 @@
import '../tracer.dart';
import 'dart_tree.dart';
-class TreeTracer extends TracerUtil implements Visitor {
+class TreeTracer extends TracerUtil with Visitor {
final EventSink<String> output;
TreeTracer(this.output);
@@ -12,8 +12,6 @@
Names names;
int statementCounter;
- void visit(Node node) => node.accept(this);
-
void traceGraph(String name, FunctionDefinition function) {
names = new Names();
statementCounter = 0;
@@ -24,7 +22,7 @@
names = null;
}
- void printBlock(Expression e) {
+ void printBlock(Statement e) {
tag("block", () {
printProperty("name", "B0"); // Update when proper blocks exist
printProperty("from_bci", -1);
@@ -54,6 +52,8 @@
addIndent();
add("$bci $uses $name $contents <|@\n");
}
+
+
visitFunctionDefinition(FunctionDefinition node) {
}
@@ -62,10 +62,9 @@
printStatement(null, "dead-use ${names.varName(node)}");
}
- visitSequence(Sequence node) {
- for (Expression e in node.expressions) {
- e.accept(this);
- }
+ visitExpressionStatement(ExpressionStatement node) {
+ node.expression.accept(this);
+ node.next.accept(this);
}
visitLetVal(LetVal node) {
@@ -95,20 +94,15 @@
}
}
-class ExpressionVisitor extends Visitor<String> {
+class ExpressionVisitor extends Visitor<String, String> {
Names names;
ExpressionVisitor(this.names);
-
+
String visitVariable(Variable node) {
return names.varName(node);
}
- String visitSequence(Sequence node) {
- String exps = node.expressions.map((e) => e.accept(this)).join('; ');
- return "{ $exps }";
- }
-
String visitLetVal(LetVal node) {
String name = names.varName(node.variable);
String def = node.definition.accept(this);
@@ -129,6 +123,15 @@
String visitConstant(Constant node) {
return "${node.value}";
}
+
+ String visitExpressionStatement(ExpressionStatement node) {
+ // Note: There should not be statements in the context of expressions.
+ // However, generating a trace that shows where something went wrong is more
+ // useful than raising an exception.
+ String expr = node.expression.accept(this);
+ String body = node.next.accept(this);
+ return "{$expr; $body}";
+ }
}
/**
@@ -146,8 +149,9 @@
String varName(Variable v) {
String name = _names[v];
if (name == null) {
- if (v.identifier != null) {
- name = v.identifier.token.value;
+ name = v.name;
+ if (v.cachedName != null) {
+ name = v.cachedName;
}
while (name == null || _usedNames.contains(name)) {
name = "v${_counter++}";
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index a203ec5..2fd142a 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -247,19 +247,56 @@
FunctionElement asFunctionElement();
+ /// Is [:true:] if this element has a corresponding patch.
+ ///
+ /// If [:true:] this element has a non-null [patch] field.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
bool get isPatched;
+
+ /// Is [:true:] if this element is a patch.
+ ///
+ /// If [:true:] this element has a non-null [origin] field.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
bool get isPatch;
+
+ /// Is [:true:] if this element defines the implementation for the entity of
+ /// this element.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
bool get isImplementation;
+
+ /// Is [:true:] if this element introduces the entity of this element.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
bool get isDeclaration;
+
+ /// Returns the element which defines the implementation for the entity of
+ /// this element.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
+ Element get implementation;
+
+ /// Returns the element which introduces the entity of this element.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
+ Element get declaration;
+
+ /// Returns the patch for this element if this element is patched.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
+ Element get patch;
+
+ /// Returns the origin for this element if this element is a patch.
+ ///
+ /// See [:patch_parser.dart:] for a description of the terminology.
+ Element get origin;
+
bool get isSynthesized;
bool get isForwardingConstructor;
bool get isMixinApplication;
- Element get implementation;
- Element get declaration;
- Element get patch;
- Element get origin;
-
bool hasFixedBackendName();
String fixedBackendName();
@@ -842,8 +879,6 @@
InterfaceType computeTargetType(InterfaceType newType);
// TODO(kasperl): These are bit fishy. Do we really need them?
- void set patch(FunctionElement value);
- void set origin(FunctionElement value);
void set defaultImplementation(FunctionElement value);
/// Do not use [computeSignature] outside of the resolver; instead retrieve
@@ -915,8 +950,6 @@
// TODO(kasperl): These are bit fishy. Do we really need them?
void set supertype(DartType value);
void set interfaces(Link<DartType> value);
- void set patch(ClassElement value);
- void set origin(ClassElement value);
void set supertypeLoadState(int value);
void set resolutionState(int value);
void set nativeTagInfo(String value);
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 4a5ffb7..7fb55a0 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -5,6 +5,7 @@
library elements.modelx;
import 'elements.dart';
+import '../helpers/helpers.dart';
import '../tree/tree.dart';
import '../util/util.dart';
import '../resolution/resolution.dart';
@@ -110,59 +111,17 @@
/** See [WarnOnUseElement] for documentation. */
bool isWarnOnUse() => false;
- /**
- * Is [:true:] if this element has a corresponding patch.
- *
- * If [:true:] this element has a non-null [patch] field.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
bool get isPatched => false;
- /**
- * Is [:true:] if this element is a patch.
- *
- * If [:true:] this element has a non-null [origin] field.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
bool get isPatch => false;
- /**
- * Is [:true:] if this element defines the implementation for the entity of
- * this element.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- bool get isImplementation => !isPatched;
+ bool get isImplementation => true;
- /**
- * Is [:true:] if this element introduces the entity of this element.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- bool get isDeclaration => !isPatch;
+ bool get isDeclaration => true;
- bool get isSynthesized => false;
+ Element get implementation => this;
- bool get isForwardingConstructor => false;
-
- bool get isMixinApplication => false;
-
- /**
- * Returns the element which defines the implementation for the entity of this
- * element.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- Element get implementation => isPatched ? patch : this;
-
- /**
- * Returns the element which introduces the entity of this element.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- Element get declaration => isPatch ? origin : this;
+ Element get declaration => this;
Element get patch {
throw new UnsupportedError('patch is not supported on $this');
@@ -172,6 +131,12 @@
throw new UnsupportedError('origin is not supported on $this');
}
+ bool get isSynthesized => false;
+
+ bool get isForwardingConstructor => false;
+
+ bool get isMixinApplication => false;
+
// TODO(johnniwinther): This breaks for libraries (for which enclosing
// elements are null) and is invalid for top level variable declarations for
// which the enclosing element is a VariableDeclarations and not a compilation
@@ -350,15 +315,9 @@
bool get isRedirectingFactory => unsupported();
- setPatch(patch) => unsupported();
computeSignature(compiler) => unsupported();
- requiredParameterCount(compiler) => unsupported();
- optionalParameterCount(compiler) => unsupported();
- parameterCount(compiler) => unsupported();
// TODO(kasperl): These seem unnecessary.
- set patch(value) => unsupported();
- set origin(value) => unsupported();
set defaultImplementation(value) => unsupported();
get redirectionTarget => this;
@@ -769,7 +728,8 @@
Element operator [](String name) => importScope[name];
}
-class LibraryElementX extends ElementX with AnalyzableElement
+class LibraryElementX
+ extends ElementX with AnalyzableElement, PatchMixin<LibraryElementX>
implements LibraryElement {
final Uri canonicalUri;
CompilationUnitElement entryCompilationUnit;
@@ -782,20 +742,6 @@
final ScopeX localScope = new ScopeX();
final ImportScope importScope = new ImportScope();
- /**
- * If this library is patched, [patch] points to the patch library.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- LibraryElementX patch = null;
-
- /**
- * If this is a patch library, [origin] points to the origin library.
- *
- * See [:patch_parser.dart:] for a description of the terminology.
- */
- final LibraryElementX origin;
-
/// A mapping from an imported element to the "import" tag.
final Importers importers = new Importers();
@@ -812,22 +758,17 @@
final Map<LibraryDependency, LibraryElement> tagMapping =
new Map<LibraryDependency, LibraryElement>();
- LibraryElementX(Script script, [Uri canonicalUri, LibraryElement this.origin])
+ LibraryElementX(Script script,
+ [Uri canonicalUri, LibraryElementX origin])
: this.canonicalUri =
((canonicalUri == null) ? script.readableUri : canonicalUri),
super(script.name, ElementKind.LIBRARY, null) {
entryCompilationUnit = new CompilationUnitElementX(script, this);
- if (isPatch) {
- origin.patch = this;
+ if (origin != null) {
+ origin.applyPatch(this);
}
}
- bool get isPatched => patch != null;
- bool get isPatch => origin != null;
-
- LibraryElement get declaration => super.declaration;
- LibraryElement get implementation => super.implementation;
-
Link<MetadataAnnotation> get metadata {
return (libraryTag == null) ? super.metadata : libraryTag.metadata;
}
@@ -858,7 +799,8 @@
* Adds [element] to the import scope of this library.
*
* If an element by the same name is already in the imported scope, an
- * [ErroneousElement] will be put in the imported scope, allowing for detection of ambiguous uses of imported names.
+ * [ErroneousElement] will be put in the imported scope, allowing for
+ * detection of ambiguous uses of imported names.
*/
void addImport(Element element, Import import, DiagnosticListener listener) {
importScope.addImport(this, element, import, listener);
@@ -1034,6 +976,10 @@
}
accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
+
+ // TODO(johnniwinther): Remove these when issue 18630 is fixed.
+ LibraryElementX get patch => super.patch;
+ LibraryElementX get origin => super.origin;
}
class PrefixElementX extends ElementX implements PrefixElement {
@@ -1284,7 +1230,8 @@
/// patched with the corresponding parameter of the patch method. This is done
/// to ensure that default values on parameters are computed once (on the
/// origin parameter) but can be found through both the origin and the patch.
-class ParameterElementX extends ElementX implements ParameterElement {
+class ParameterElementX extends ElementX with PatchMixin<ParameterElement>
+ implements ParameterElement {
final VariableDefinitions definitions;
final Identifier identifier;
final Expression initializer;
@@ -1334,12 +1281,6 @@
FunctionType get functionType => type;
accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
-
- ParameterElementX patch = null;
- ParameterElementX origin = null;
-
- bool get isPatch => origin != null;
- bool get isPatched => patch != null;
}
class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
@@ -1486,7 +1427,8 @@
}
}
-class FunctionElementX extends ElementX with AnalyzableElement
+class FunctionElementX
+ extends ElementX with AnalyzableElement, PatchMixin<FunctionElement>
implements FunctionElement {
FunctionExpression cachedNode;
DartType typeCache;
@@ -1496,14 +1438,6 @@
FunctionSignature functionSignatureCache;
- /**
- * A function declaration that should be parsed instead of the current one.
- * The patch should be parsed as if it was in the current scope. Its
- * signature must match this function's signature.
- */
- FunctionElement patch = null;
- FunctionElement origin = null;
-
final bool _hasNoBody;
AbstractFieldElement abstractField;
@@ -1545,9 +1479,6 @@
defaultImplementation = this;
}
- bool get isPatched => patch != null;
- bool get isPatch => origin != null;
-
bool get isRedirectingFactory => defaultImplementation != this;
/// This field is set by the post process queue when checking for cycles.
@@ -1575,18 +1506,6 @@
return redirectionTargetType.substByContext(newType);
}
- /**
- * Applies a patch function to this function. The patch function's body
- * is used as replacement when parsing this function's body.
- * This method must not be called after the function has been parsed,
- * and it must be called at most once.
- */
- void setPatch(FunctionElement patchElement) {
- // Sanity checks. The caller must check these things before calling.
- assert(patch == null);
- this.patch = patchElement;
- }
-
bool isInstanceMember() {
return isMember()
&& !isConstructor()
@@ -1911,6 +1830,7 @@
abstract class BaseClassElementX extends ElementX
with AnalyzableElement,
TypeDeclarationElementX<InterfaceType>,
+ PatchMixin<ClassElement>,
ClassMemberMixin
implements ClassElement {
final int id;
@@ -1943,10 +1863,6 @@
super(name, ElementKind.CLASS, enclosing);
int get hashCode => id;
- ClassElement get patch => super.patch;
- ClassElement get origin => super.origin;
- ClassElement get declaration => super.declaration;
- ClassElement get implementation => super.implementation;
bool get hasBackendMembers => !backendMembers.isEmpty;
@@ -2297,13 +2213,13 @@
lookupInterfaceMember(const PublicName(Compiler.CALL_OPERATOR_NAME));
return member != null && member.isMethod ? member.type : null;
}
+
+ // TODO(johnniwinther): Remove these when issue 18630 is fixed.
+ ClassElement get patch => super.patch;
+ ClassElement get origin => super.origin;
}
abstract class ClassElementX extends BaseClassElementX {
- // Lazily applied patch of class members.
- ClassElement patch = null;
- ClassElement origin = null;
-
Link<Element> localMembers = const Link<Element>();
final ScopeX localScope = new ScopeX();
@@ -2313,8 +2229,6 @@
ClassNode parseNode(Compiler compiler);
bool get isMixinApplication => false;
- bool get isPatched => patch != null;
- bool get isPatch => origin != null;
bool get hasLocalScopeMembers => !localScope.isEmpty;
void addMember(Element element, DiagnosticListener listener) {
@@ -2393,16 +2307,9 @@
bool get hasConstructor => !constructors.isEmpty;
bool get hasLocalScopeMembers => !constructors.isEmpty;
- unsupported(message) {
- throw new UnsupportedError('$message is not supported on $this');
- }
-
get patch => null;
get origin => null;
- set patch(value) => unsupported('set patch');
- set origin(value) => unsupported('set origin');
-
Token position() => node.getBeginToken();
Node parseNode(DiagnosticListener listener) => node;
@@ -2626,3 +2533,34 @@
Token get endToken => metadata.getEndToken();
}
+/// Mixin for the implementation of patched elements.
+///
+/// See [:patch_parser.dart:] for a description of the terminology.
+abstract class PatchMixin<E extends Element> implements Element {
+ // TODO(johnniwinther): Use type variables when issue 18630 is fixed.
+ Element/*E*/ patch = null;
+ Element/*E*/ origin = null;
+
+ bool get isPatch => origin != null;
+ bool get isPatched => patch != null;
+
+ bool get isImplementation => !isPatched;
+ bool get isDeclaration => !isPatch;
+
+ Element/*E*/ get implementation => isPatched ? patch : this;
+ Element/*E*/ get declaration => isPatch ? origin : this;
+
+ /// Applies a patch to this element. This method must be called at most once.
+ void applyPatch(PatchMixin<E> patch) {
+ assert(invariant(this, this.patch == null,
+ message: "Element is patched twice."));
+ assert(invariant(this, this.origin == null,
+ message: "Origin element is a patch."));
+ assert(invariant(patch, patch.origin == null,
+ message: "Element is patched twice."));
+ assert(invariant(patch, patch.patch == null,
+ message: "Patch element is patched."));
+ this.patch = patch;
+ patch.origin = this;
+ }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 1aa3ead..171de10 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -150,10 +150,10 @@
* to the [builder] and return the last added statement for trees that represent
* an expression.
*/
-class IrBuilder extends ResolvedVisitor<ir.Definition> {
+class IrBuilder extends ResolvedVisitor<ir.Primitive> {
final SourceFile sourceFile;
- ir.Continuation returnContinuation = null;
- List<ir.Parameter> parameters = <ir.Parameter>[];
+ final ir.Continuation returnContinuation;
+ final List<ir.Parameter> parameters;
// 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.
@@ -174,18 +174,56 @@
// 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
- // definition denoting its value.
+ // We do not pass contexts as arguments or return them. Rather we use the
+ // current context (root, current) as the visitor state and mutate current.
+ // Visiting a statement returns null; visiting an expression returns the
+ // primitive denoting its value.
+
ir.Expression root = null;
ir.Expression current = null;
- Map<Element, int> variableIndex = <Element, int>{};
- List<ir.Definition> assignedVars = <ir.Definition>[];
+ // In SSA terms, join-point continuation parameters are the phis and the
+ // continuation invocation arguments are the corresponding phi inputs. To
+ // support name introduction and renaming for source level variables, we use
+ // nested (delimited) visitors for constructing subparts of the IR that will
+ // need renaming. Each source variable is assigned an index.
+ //
+ // Each nested visitor maintains a list of free variable uses in the body.
+ // These are implemented as a list of parameters, each with their own use
+ // list of references. When the delimited subexpression is plugged into the
+ // surrounding context, the free occurrences can be captured or become free
+ // occurrences in the next outer delimited subexpression.
+ //
+ // Each nested visitor maintains a list that maps indexes of variables
+ // assigned in the delimited subexpression to their reaching definition ---
+ // that is, the definition in effect at the hole in 'current'. These are
+ // used to determine if a join-point continuation needs to be passed
+ // arguments, and what the arguments are.
+ final Map<Element, int> variableIndex;
+ final List<ir.Parameter> freeVars;
+ final List<ir.Primitive> assignedVars;
+ /// Construct a top-level visitor.
IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
- : super(elements, compiler);
+ : returnContinuation = new ir.Continuation.retrn(),
+ parameters = <ir.Parameter>[],
+ variableIndex = <Element, int>{},
+ freeVars = null,
+ assignedVars = <ir.Primitive>[],
+ super(elements, compiler);
+
+ /// Construct a delimited visitor.
+ IrBuilder.delimited(IrBuilder parent)
+ : sourceFile = parent.sourceFile,
+ returnContinuation = parent.returnContinuation,
+ parameters = parent.parameters,
+ variableIndex = parent.variableIndex,
+ freeVars = new List<ir.Parameter>.generate(
+ parent.assignedVars.length, (_) => new ir.Parameter(null),
+ growable: false),
+ assignedVars = new List<ir.Primitive>.generate(
+ parent.assignedVars.length, (_) => null),
+ super(parent.elements, parent.compiler);
/**
* Builds the [ir.FunctionDefinition] for a function element. In case the
@@ -203,7 +241,6 @@
assert(!function.modifiers.isExternal());
assert(elements[function] != null);
- returnContinuation = new ir.Continuation.retrn();
root = current = null;
FunctionSignature signature = element.functionSignature;
@@ -229,9 +266,10 @@
// the new hole must be in the newly added expression---which becomes the
// new value of current.
void add(ir.Expression expr) {
+ assert(isOpen);
if (root == null) {
root = current = expr;
- } else if (current != null) {
+ } else {
current = current.plug(expr);
}
}
@@ -245,16 +283,16 @@
if (!isOpen) return;
ir.Constant constant = new ir.Constant(constantSystem.createNull());
add(new ir.LetPrim(constant));
- add(new ir.InvokeContinuation(returnContinuation, constant));
+ add(new ir.InvokeContinuation(returnContinuation, [constant]));
current = null;
}
- ir.Definition visit(ast.Node node) => node.accept(this);
+ ir.Primitive visit(ast.Node node) => node.accept(this);
// ==== Statements ====
// Build(Block(stamements), C) = C'
// where C' = statements.fold(Build, C)
- ir.Definition visitBlock(ast.Block node) {
+ ir.Primitive visitBlock(ast.Block node) {
assert(isOpen);
for (ast.Node n in node.statements.nodes) {
visit(n);
@@ -264,25 +302,128 @@
}
// Build(EmptyStatement, C) = C
- ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
+ ir.Primitive visitEmptyStatement(ast.EmptyStatement node) {
assert(isOpen);
return null;
}
// Build(ExpressionStatement(e), C) = C'
// where (C', _) = Build(e, C)
- ir.Definition visitExpressionStatement(ast.ExpressionStatement node) {
+ ir.Primitive visitExpressionStatement(ast.ExpressionStatement node) {
assert(isOpen);
visit(node.expression);
return null;
}
- ir.Definition visitIf(ast.If node) {
+ ir.Primitive visitIf(ast.If node) {
assert(isOpen);
- return giveup();
+ ir.Primitive condition = visit(node.condition);
+
+ // The then and else parts are delimited.
+ IrBuilder thenBuilder = new IrBuilder.delimited(this);
+ thenBuilder.visit(node.thenPart);
+ IrBuilder elseBuilder = new IrBuilder.delimited(this);
+ if (node.hasElsePart) elseBuilder.visit(node.elsePart);
+
+ // The free variables in the then and else parts are uses of definitions
+ // from an outer builder. Capture them or propagate them outward. The
+ // assigned variables in the then and else parts are arguments to the join
+ // point continuation if any.
+
+ // FreeVars is initially the length of assignedVars of the parent, and it
+ // does not grow. AssignedVars can grow.
+ assert(assignedVars.length == thenBuilder.freeVars.length);
+ assert(assignedVars.length == elseBuilder.freeVars.length);
+ assert(assignedVars.length <= thenBuilder.assignedVars.length);
+ assert(assignedVars.length <= elseBuilder.assignedVars.length);
+ List<ir.Parameter> parameters = <ir.Parameter>[];
+ List<ir.Primitive> thenArguments = <ir.Primitive>[];
+ List<ir.Primitive> elseArguments = <ir.Primitive>[];
+ for (int i = 0; i < assignedVars.length; ++i) {
+ // These are the last assignments, if any, in the then and else
+ // continuations respectively (if they can reach the join point). If a
+ // variable is assigned in either branch reaching the join point, it has
+ // different values that must be passed as an argument to the join point
+ // continuation.
+ ir.Definition thenAssignment =
+ thenBuilder.isOpen ? thenBuilder.assignedVars[i] : null;
+ ir.Definition elseAssignment =
+ elseBuilder.isOpen ? elseBuilder.assignedVars[i] : null;
+ if (thenAssignment != null || elseAssignment != null) {
+ // In the case that not both then and else parts can reach the join
+ // point, there will still be a join-point continuation possibly with
+ // arguments passed to it. Such singly-used continuations should be
+ // eliminated by shrinking conversions (because they can arise
+ // otherwise as the result of optimization).
+ ir.Parameter parameter = new ir.Parameter(null);
+ parameters.add(parameter);
+ thenArguments.add(thenAssignment == null
+ ? thenBuilder.freeVars[i]
+ : thenAssignment);
+ elseArguments.add(elseAssignment == null
+ ? elseBuilder.freeVars[i]
+ : elseAssignment);
+ }
+ }
+
+ // Create a then and else continuations and a join continuation if
+ // necessary. Jump to the join continuation from the exits of the then
+ // and else continuations.
+ ir.Continuation joinContinuation;
+ ir.Continuation thenContinuation = new ir.Continuation([]);
+ ir.Continuation elseContinuation = new ir.Continuation([]);
+ if (thenBuilder.isOpen || elseBuilder.isOpen) {
+ joinContinuation = new ir.Continuation(parameters);
+ if (thenBuilder.isOpen) {
+ thenBuilder.add(
+ new ir.InvokeContinuation(joinContinuation, thenArguments));
+ }
+ if (elseBuilder.isOpen) {
+ elseBuilder.add(
+ new ir.InvokeContinuation(joinContinuation, elseArguments));
+ }
+ }
+ thenContinuation.body = thenBuilder.root;
+ elseContinuation.body = elseBuilder.root;
+
+ // Capture free occurrences in the then and else bodies. This is done
+ // after creating invocations of the join continuation so free join
+ // continuation arguments are properly captured.
+ //
+ // Also add join continuation parameters as assignments for the join body.
+ // This is done last because the assigned variables are updated in place.
+ int parameterIndex = 0;
+ for (int i = 0; i < assignedVars.length; ++i) {
+ // This is the definition that reaches the then and else continuations.
+ // All free uses in either continuation are uses of this definition.
+ ir.Definition reachingDefinition =
+ assignedVars[i] == null ? freeVars[i] : assignedVars[i];
+ reachingDefinition
+ ..substituteFor(thenBuilder.freeVars[i])
+ ..substituteFor(elseBuilder.freeVars[i]);
+
+ if ((thenBuilder.isOpen && thenBuilder.assignedVars[i] != null) ||
+ (elseBuilder.isOpen && elseBuilder.assignedVars[i] != null)) {
+ assignedVars[i] = parameters[parameterIndex++];
+ }
+ }
+
+ ir.Expression branch =
+ new ir.LetCont(thenContinuation,
+ new ir.LetCont(elseContinuation,
+ new ir.Branch(new ir.IsTrue(condition),
+ thenContinuation,
+ elseContinuation)));
+ if (joinContinuation == null) {
+ add(branch);
+ current = null;
+ } else {
+ add(new ir.LetCont(joinContinuation, branch));
+ }
+ return null;
}
- ir.Definition visitVariableDefinitions(ast.VariableDefinitions node) {
+ ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
assert(isOpen);
for (ast.Node definition in node.definitions.nodes) {
Element element = elements[definition];
@@ -291,9 +432,7 @@
if (definition is ast.SendSet) {
assert(!definition.arguments.isEmpty);
assert(definition.arguments.tail.isEmpty);
- ir.Definition initialValue = visit(definition.arguments.head);
- // Do not continue adding instructions if the initializer throws.
- if (!isOpen) return null;
+ ir.Primitive initialValue = visit(definition.arguments.head);
variableIndex[element] = assignedVars.length;
assignedVars.add(initialValue);
} else {
@@ -313,19 +452,18 @@
// where (C', x) = Build(e, C)
//
// Return without a subexpression is translated as if it were return null.
- ir.Definition visitReturn(ast.Return node) {
+ ir.Primitive visitReturn(ast.Return node) {
assert(isOpen);
// TODO(lry): support native returns.
if (node.beginToken.value == 'native') return giveup();
- ir.Definition value;
+ ir.Primitive value;
if (node.expression == null) {
value = new ir.Constant(constantSystem.createNull());
add(new ir.LetPrim(value));
} else {
value = visit(node.expression);
- if (!isOpen) return null;
}
- add(new ir.InvokeContinuation(returnContinuation, value));
+ add(new ir.InvokeContinuation(returnContinuation, [value]));
current = null;
return null;
}
@@ -333,7 +471,7 @@
// ==== Expressions ====
// For all simple literals:
// Build(Literal(c), C) = C[let val x = Constant(c) in [], x]
- ir.Definition visitLiteralBool(ast.LiteralBool node) {
+ ir.Primitive visitLiteralBool(ast.LiteralBool node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createBool(node.value));
@@ -341,7 +479,7 @@
return constant;
}
- ir.Definition visitLiteralDouble(ast.LiteralDouble node) {
+ ir.Primitive visitLiteralDouble(ast.LiteralDouble node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createDouble(node.value));
@@ -349,7 +487,7 @@
return constant;
}
- ir.Definition visitLiteralInt(ast.LiteralInt node) {
+ ir.Primitive visitLiteralInt(ast.LiteralInt node) {
assert(isOpen);
ir.Constant constant =
new ir.Constant(constantSystem.createInt(node.value));
@@ -358,7 +496,7 @@
}
- ir.Definition visitLiteralNull(ast.LiteralNull node) {
+ ir.Primitive visitLiteralNull(ast.LiteralNull node) {
assert(isOpen);
ir.Constant constant = new ir.Constant(constantSystem.createNull());
add(new ir.LetPrim(constant));
@@ -373,37 +511,45 @@
// LiteralMapEntry
// LiteralSymbol
- ir.Definition visitParenthesizedExpression(
+ ir.Primitive visitParenthesizedExpression(
ast.ParenthesizedExpression node) {
+ assert(isOpen);
return visit(node.expression);
}
// ==== Sends ====
- ir.Definition visitAssert(ast.Send node) {
+ ir.Primitive visitAssert(ast.Send node) {
+ assert(isOpen);
return giveup();
}
- ir.Definition visitClosureSend(ast.Send node) {
+ ir.Primitive visitClosureSend(ast.Send node) {
+ assert(isOpen);
return giveup();
}
- ir.Definition visitDynamicSend(ast.Send node) {
+ ir.Primitive visitDynamicSend(ast.Send node) {
+ assert(isOpen);
return giveup();
}
- ir.Definition visitGetterSend(ast.Send node) {
+ ir.Primitive visitGetterSend(ast.Send node) {
+ assert(isOpen);
Element element = elements[node];
if (!Elements.isLocal(element)) return giveup();
- return assignedVars[variableIndex[element]];
+ int index = variableIndex[element];
+ ir.Primitive value = assignedVars[index];
+ return value == null ? freeVars[index] : value;
}
- ir.Definition visitOperatorSend(ast.Send node) {
+ ir.Primitive visitOperatorSend(ast.Send node) {
+ assert(isOpen);
return giveup();
}
// Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
// where (C', xs) = arguments.fold(Build, C)
- ir.Definition visitStaticSend(ast.Send node) {
+ ir.Primitive visitStaticSend(ast.Send node) {
assert(isOpen);
Element element = elements[node];
// TODO(lry): support static fields. (separate IR instruction?)
@@ -430,16 +576,12 @@
List arguments = [];
// TODO(lry): support default arguments, need support for locals.
bool succeeded = selector.addArgumentsToList(
- node.arguments, arguments, element.implementation,
- // Guard against visiting arguments after an argument expression throws.
- (node) => isOpen ? visit(node) : null,
- (node) => giveup(),
- compiler);
+ node.arguments, arguments, element.implementation, visit,
+ (node) => giveup(), compiler);
if (!succeeded) {
// TODO(lry): generate code to throw a [WrongArgumentCountError].
return giveup();
}
- if (!isOpen) return null;
ir.Parameter v = new ir.Parameter(null);
ir.Continuation k = new ir.Continuation([v]);
ir.Expression invoke =
@@ -448,29 +590,32 @@
return v;
}
- ir.Definition visitSuperSend(ast.Send node) {
+ ir.Primitive visitSuperSend(ast.Send node) {
+ assert(isOpen);
return giveup();
}
- ir.Definition visitTypeReferenceSend(ast.Send node) {
+ ir.Primitive visitTypeReferenceSend(ast.Send node) {
+ assert(isOpen);
return giveup();
}
- ir.Definition visitSendSet(ast.SendSet node) {
+ ir.Primitive visitSendSet(ast.SendSet node) {
+ assert(isOpen);
Element element = elements[node];
if (!Elements.isLocal(element)) return giveup();
if (node.assignmentOperator.source != '=') return giveup();
// Exactly one argument expected for a simple assignment.
assert(!node.arguments.isEmpty);
assert(node.arguments.tail.isEmpty);
- ir.Definition result = visit(node.arguments.head);
+ ir.Primitive result = visit(node.arguments.head);
assignedVars[variableIndex[element]] = result;
return result;
}
static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
- ir.Definition giveup() => throw ABORT_IRNODE_BUILDER;
+ ir.Primitive giveup() => throw ABORT_IRNODE_BUILDER;
ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition 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 2ce6ed8..f2159de 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -32,6 +32,18 @@
bool get hasAtMostOneUse => firstRef == null || firstRef.nextRef == null;
bool get hasExactlyOneUse => firstRef != null && firstRef.nextRef == null;
bool get hasAtLeastOneUse => firstRef != null;
+
+ void substituteFor(Definition other) {
+ if (other.firstRef == null) return;
+ Reference previous, current = other.firstRef;
+ do {
+ current.definition = this;
+ previous = current;
+ current = current.nextRef;
+ } while (current != null);
+ previous.nextRef = firstRef;
+ firstRef = other.firstRef;
+ }
}
abstract class Primitive extends Definition {
@@ -115,15 +127,39 @@
/// Invoke a continuation in tail position.
class InvokeContinuation extends Expression {
final Reference continuation;
- final Reference argument;
+ final List<Reference> arguments;
- InvokeContinuation(Continuation cont, Definition arg)
+ InvokeContinuation(Continuation cont, List<Definition> args)
: continuation = new Reference(cont),
- argument = new Reference(arg);
-
+ arguments = args.map((t) => new Reference(t)).toList(growable: false);
accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
}
+/// The base class of things which can be tested and branched on.
+abstract class Condition extends Node {
+}
+
+class IsTrue extends Condition {
+ final Reference value;
+
+ IsTrue(Definition val) : value = new Reference(val);
+
+ accept(Visitor visitor) => visitor.visitIsTrue(this);
+}
+
+/// Choose between a pair of continuations based on a condition value.
+class Branch extends Expression {
+ final Condition condition;
+ final Reference trueContinuation;
+ final Reference falseContinuation;
+
+ Branch(this.condition, Continuation trueCont, Continuation falseCont)
+ : trueContinuation = new Reference(trueCont),
+ falseContinuation = new Reference(falseCont);
+
+ accept(Visitor visitor) => visitor.visitBranch(this);
+}
+
class Constant extends Primitive {
final dart2js.Constant value;
@@ -177,18 +213,25 @@
T visitExpression(Expression node) => visitNode(node);
T visitDefinition(Definition node) => visitNode(node);
T visitPrimitive(Primitive node) => visitDefinition(node);
+ T visitCondition(Condition node) => visitNode(node);
// Concrete classes.
T visitFunctionDefinition(FunctionDefinition node) => visitNode(node);
+ // Expressions.
T visitLetPrim(LetPrim node) => visitExpression(node);
T visitLetCont(LetCont node) => visitExpression(node);
T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
T visitInvokeContinuation(InvokeContinuation node) => visitExpression(node);
+ T visitBranch(Branch node) => visitExpression(node);
+ // Definitions.
T visitConstant(Constant node) => visitPrimitive(node);
T visitParameter(Parameter node) => visitPrimitive(node);
T visitContinuation(Continuation node) => visitDefinition(node);
+
+ // Conditions.
+ T visitIsTrue(IsTrue node) => visitCondition(node);
}
/// Generate a Lisp-like S-expression representation of an IR node as a string.
@@ -213,56 +256,68 @@
return name;
})
.join(' ');
- return '(FunctionDefinition ($parameters) ${node.body.accept(this)})';
+ return '(FunctionDefinition ($parameters) ${visit(node.body)})';
}
- String visitLetPrim(LetPrim expr) {
+ String visitLetPrim(LetPrim node) {
String name = newValueName();
- names[expr.primitive] = name;
- String value = expr.primitive.accept(this);
- String body = expr.body.accept(this);
+ names[node.primitive] = name;
+ String value = visit(node.primitive);
+ String body = visit(node.body);
return '(LetPrim $name $value) $body';
}
- String visitLetCont(LetCont expr) {
+ String visitLetCont(LetCont node) {
String cont = newContinuationName();
- names[expr.continuation] = cont;
- String parameters = expr.continuation.parameters
+ names[node.continuation] = cont;
+ String parameters = node.continuation.parameters
.map((p) {
String name = newValueName();
names[p] = name;
- return name;
+ return ' $name';
})
- .join(' ');
- String contBody = expr.continuation.body.accept(this);
- String body = expr.body.accept(this);
- return '(LetCont ($cont $parameters) $contBody) $body';
+ .join('');
+ String contBody = visit(node.continuation.body);
+ String body = visit(node.body);
+ return '(LetCont ($cont$parameters) $contBody) $body';
}
- String visitInvokeStatic(InvokeStatic expr) {
- String name = expr.target.name;
- String cont = names[expr.continuation.definition];
- String args = expr.arguments.map((v) => names[v.definition]).join(' ');
+ String visitInvokeStatic(InvokeStatic node) {
+ String name = node.target.name;
+ String cont = names[node.continuation.definition];
+ String args = node.arguments.map((v) => names[v.definition]).join(' ');
return '(InvokeStatic $name $cont $args)';
}
- String visitInvokeContinuation(InvokeContinuation expr) {
- String cont = names[expr.continuation.definition];
- String arg = names[expr.argument.definition];
- return '(InvokeContinuation $cont $arg)';
+ String visitInvokeContinuation(InvokeContinuation node) {
+ String cont = names[node.continuation.definition];
+ String args = node.arguments.map((v) => names[v.definition]).join(' ');
+ return '(InvokeContinuation $cont $args)';
}
- String visitConstant(Constant triv) {
- return '(Constant ${triv.value})';
+ String visitBranch(Branch node) {
+ String condition = visit(node.condition);
+ String trueCont = names[node.trueContinuation.definition];
+ String falseCont = names[node.falseContinuation.definition];
+ return '(Branch $condition $trueCont $falseCont)';
}
- String visitParameter(Parameter triv) {
+ String visitConstant(Constant node) {
+ return '(Constant ${node.value})';
+ }
+
+ String visitParameter(Parameter node) {
// Parameters are visited directly in visitLetCont.
return '(Unexpected Parameter)';
}
- String visitContinuation(Continuation triv) {
+ String visitContinuation(Continuation node) {
// Continuations are visited directly in visitLetCont.
return '(Unexpected Continuation)';
}
+
+ String visitIsTrue(IsTrue node) {
+ String value = names[node.value.definition];
+ return '(IsTrue $value)';
+ }
}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
index b55ab52..563b6b9 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
@@ -40,7 +40,7 @@
* | byte(NODE_INVOKE_STATIC) element selector
* reference(continuation) {reference(argument)}
* | byte(NODE_INVOKE_CONTINUATION) reference(continuation)
- * reference(argument)
+ * {reference(argument)}
*
* reference ::= int(indexDelta)
*
@@ -68,10 +68,12 @@
static const int FIRST_NODE_TAG = STRING_UTF8 + 1;
static const int NODE_CONSTANT = FIRST_NODE_TAG;
- static const int NODE_LET_CONT = NODE_CONSTANT + 1;
+ static const int NODE_IS_TRUE = NODE_CONSTANT + 1;
+ static const int NODE_LET_CONT = NODE_IS_TRUE + 1;
static const int NODE_INVOKE_STATIC = NODE_LET_CONT + 1;
static const int NODE_INVOKE_CONTINUATION = NODE_INVOKE_STATIC + 1;
- static const int LAST_NODE_TAG = NODE_INVOKE_CONTINUATION;
+ static const int NODE_BRANCH = NODE_INVOKE_CONTINUATION + 1;
+ static const int LAST_NODE_TAG = NODE_BRANCH;
static const int FIRST_CONST_TAG = LAST_NODE_TAG + 1;
static const int CONST_BOOL = FIRST_CONST_TAG;
@@ -173,7 +175,7 @@
offset = 0;
emitted = <Object, int>{};
index = 0;
- function.accept(this);
+ visit(function);
int sizeOffset = offset;
writeInt(emitted.length);
@@ -282,10 +284,10 @@
writeInt(index - entryIndex);
}
- void writeBackReferenceList(List entries) {
- writeInt(entries.length);
- for (int i = 0; i < entries.length; i++) {
- writeBackReference(entries[i]);
+ void writeBackReferenceList(int length, Iterable entries) {
+ writeInt(length);
+ for (var x in entries) {
+ writeBackReference(x);
}
}
@@ -364,14 +366,14 @@
recordForBackReference(parameter);
writeElement(parameter.element);
}
- node.body.accept(this);
+ visit(node.body);
}
void visitLetPrim(ir.LetPrim node) {
- node.primitive.accept(this);
+ visit(node.primitive);
// The right-hand side is bound in the body.
recordForBackReference(node.primitive);
- node.body.accept(this);
+ visit(node.body);
}
void visitLetCont(ir.LetCont node) {
@@ -384,10 +386,10 @@
writeInt(node.continuation.parameters.length);
// The continuation is bound in the body.
recordForBackReference(node.continuation);
- node.body.accept(this);
+ visit(node.body);
// The continuation parameters are bound in the continuation's body.
node.continuation.parameters.forEach(recordForBackReference);
- node.continuation.body.accept(this);
+ visit(node.continuation.body);
}
void visitInvokeStatic(ir.InvokeStatic node) {
@@ -397,14 +399,22 @@
// TODO(lry): compact encoding when the arity of the selector and the
// arguments list are the same
writeBackReference(node.continuation.definition);
- writeBackReferenceList(node.arguments.map(
- (a) => a.definition).toList(growable: false));
+ writeBackReferenceList(node.arguments.length,
+ node.arguments.map((a) => a.definition));
}
void visitInvokeContinuation(ir.InvokeContinuation node) {
writeByte(Pickles.NODE_INVOKE_CONTINUATION);
writeBackReference(node.continuation.definition);
- writeBackReference(node.argument.definition);
+ writeBackReferenceList(node.arguments.length,
+ node.arguments.map((a) => a.definition));
+ }
+
+ void visitBranch(ir.Branch node) {
+ writeByte(Pickles.NODE_BRANCH);
+ visit(node.condition);
+ writeBackReference(node.trueContinuation.definition);
+ writeBackReference(node.falseContinuation.definition);
}
void visitConstant(ir.Constant node) {
@@ -412,6 +422,11 @@
node.value.accept(constantPickler);
}
+ void visitIsTrue(ir.IsTrue node) {
+ writeByte(Pickles.NODE_IS_TRUE);
+ writeBackReference(node.value.definition);
+ }
+
void visitNode(ir.Node node) {
throw "Unexpected $node in pickler.";
}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 3c79ef0..f3864d1 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -31,7 +31,7 @@
visitFunctionDefinition(ir.FunctionDefinition f) {
names = new Names();
BlockCollector builder = new BlockCollector(names);
- f.accept(builder);
+ builder.visit(f);
printNode(builder.entry);
for (Block block in builder.cont2block.values) {
@@ -58,7 +58,7 @@
});
});
tag("HIR", () {
- block.body.accept(this);
+ visit(block.body);
});
});
}
@@ -73,7 +73,7 @@
visitLetPrim(ir.LetPrim node) {
String id = names.name(node.primitive);
printStmt(id, "LetPrim $id = ${formatPrimitive(node.primitive)}");
- node.body.accept(this);
+ visit(node.body);
}
visitLetCont(ir.LetCont node) {
@@ -82,7 +82,7 @@
String id = names.name(node.continuation);
printStmt(dummy, "LetCont $id = <$id>");
}
- node.body.accept(this);
+ visit(node.body);
}
visitInvokeStatic(ir.InvokeStatic node) {
@@ -96,8 +96,16 @@
visitInvokeContinuation(ir.InvokeContinuation node) {
String dummy = names.name(node);
String kont = formatReference(node.continuation);
- String arg = formatReference(node.argument);
- printStmt(dummy, "InvokeContinuation $kont ($arg)");
+ String args = node.arguments.map(formatReference).join(', ');
+ printStmt(dummy, "InvokeContinuation $kont ($args)");
+ }
+
+ visitBranch(ir.Branch node) {
+ String dummy = names.name(node);
+ String condition = visit(node.condition);
+ String trueCont = formatReference(node.trueContinuation);
+ String falseCont = formatReference(node.falseContinuation);
+ printStmt(dummy, "Branch $condition ($trueCont, $falseCont)");
}
String formatReference(ir.Reference ref) {
@@ -109,9 +117,7 @@
}
}
- String formatPrimitive(ir.Primitive p) {
- return p.accept(this);
- }
+ String formatPrimitive(ir.Primitive p) => visit(p);
visitConstant(ir.Constant node) {
return "Constant ${node.value}";
@@ -125,6 +131,11 @@
return "Continuation ${names.name(node)}";
}
+ visitIsTrue(ir.IsTrue node) {
+ return "IsTrue(${names.name(node)})";
+ }
+
+ visitCondition(ir.Condition c) {}
visitExpression(ir.Expression e) {}
visitPrimitive(ir.Primitive p) {}
visitDefinition(ir.Definition d) {}
@@ -201,16 +212,16 @@
visitFunctionDefinition(ir.FunctionDefinition f) {
entry = current_block = new Block(names.name(f), [], f.body);
- f.body.accept(this);
+ visit(f.body);
}
visitLetPrim(ir.LetPrim exp) {
- exp.body.accept(this);
+ visit(exp.body);
}
visitLetCont(ir.LetCont exp) {
- exp.continuation.accept(this);
- exp.body.accept(this);
+ visit(exp.continuation);
+ visit(exp.body);
}
visitInvokeStatic(ir.InvokeStatic exp) {
@@ -227,14 +238,21 @@
}
}
- visitConstant(ir.Constant constant) {}
-
- visitParameter(ir.Parameter p) {}
+ visitBranch(ir.Branch exp) {
+ ir.Continuation trueTarget = exp.trueContinuation.definition;
+ if (trueTarget.body != null) {
+ current_block.addEdgeTo(getBlock(trueTarget));
+ }
+ ir.Continuation falseTarget = exp.falseContinuation.definition;
+ if (falseTarget.body != null) {
+ current_block.addEdgeTo(getBlock(falseTarget));
+ }
+ }
visitContinuation(ir.Continuation c) {
var old_node = current_block;
current_block = getBlock(c);
- c.body.accept(this);
+ visit(c.body);
current_block = old_node;
}
}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 7b27bcf..3b29e65 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -121,6 +121,7 @@
ir.Expression readExpressionNode() {
int tag = readByte();
switch (tag) {
+ // Nontail-position expressions.
case Pickles.NODE_CONSTANT:
ir.Definition constant = readConstant();
unpickled[index++] = constant;
@@ -136,6 +137,8 @@
parameters.forEach((p) => unpickled[index++] = p);
addExpression(new ir.LetCont(continuation, body));
break;
+
+ // Tail-position expressions.
case Pickles.NODE_INVOKE_STATIC:
addExpression(readInvokeStatic());
current = null;
@@ -144,6 +147,11 @@
addExpression(readInvokeContinuation());
current = null;
break;
+ case Pickles.NODE_BRANCH:
+ addExpression(readBranch());
+ current = null;
+ break;
+
default:
compiler.internalError(NO_LOCATION_SPANNABLE,
"Unexpected expression entry tag: $tag");
@@ -216,8 +224,26 @@
ir.InvokeContinuation readInvokeContinuation() {
ir.Continuation continuation = readBackReference();
- ir.Definition argument = readBackReference();
- return new ir.InvokeContinuation(continuation, argument);
+ List<ir.Definition> arguments = readBackReferenceList();
+ return new ir.InvokeContinuation(continuation, arguments);
+ }
+
+ ir.Branch readBranch() {
+ ir.Condition condition = readCondition();
+ ir.Continuation trueContinuation = readBackReference();
+ ir.Continuation falseContinuation = readBackReference();
+ return new ir.Branch(condition, trueContinuation, falseContinuation);
+ }
+
+ ir.Condition readCondition() {
+ int tag = readByte();
+ assert(tag == Pickles.NODE_IS_TRUE);
+ return readIsTrue();
+ }
+
+ ir.IsTrue readIsTrue() {
+ ir.Definition value = readBackReference();
+ return new ir.IsTrue(value);
}
Constant readConstantValue() {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 5ae18d7..85199f1 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -458,6 +458,19 @@
Uri get uri => _element.script.resourceUri;
}
+class ResolvedNode {
+ final node;
+ final _elements;
+ final _mirrorSystem;
+ ResolvedNode(this.node, this._elements, this._mirrorSystem);
+
+ Mirror resolvedMirror(node) {
+ var element = _elements[node];
+ if (element == null) return null;
+ return _convertElementToDeclarationMirror(_mirrorSystem, element);
+ }
+}
+
/**
* Transitional class that allows access to features that have not yet
* made it to the mirror API.
@@ -470,4 +483,33 @@
return library._element.compilationUnits.toList().map(
(cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList();
}
+
+ static Iterable metadataSyntaxOf(Dart2JsElementMirror declaration) {
+ Compiler compiler = declaration.mirrorSystem.compiler;
+ return declaration._element.metadata.toList().map((metadata) {
+ var node = metadata.parseNode(compiler);
+ Element annotatedElement = metadata.annotatedElement;
+ var context = annotatedElement.enclosingElement;
+ if (context == null) {
+ context = annotatedElement;
+ }
+ return new ResolvedNode(
+ node, context.treeElements, declaration.mirrorSystem);
+ });
+ }
+
+ static ResolvedNode initializerSyntaxOf(Dart2JsFieldMirror variable) {
+ var node = variable._variable.initializer;
+ if (node == null) return null;
+ return new ResolvedNode(
+ node, variable._variable.treeElements, variable.mirrorSystem);
+ }
+
+ static ResolvedNode defaultValueSyntaxOf(Dart2JsParameterMirror parameter) {
+ if (!parameter.hasDefaultValue) return null;
+ var node = parameter._element.initializer;
+ return new ResolvedNode(node,
+ (parameter.owner as Dart2JsElementMirror)._element.treeElements,
+ parameter.mirrorSystem);
+ }
}
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index 2a5a6c1..0b14e3a 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -123,6 +123,7 @@
import "elements/modelx.dart"
show LibraryElementX,
MetadataAnnotationX,
+ ClassElementX,
FunctionElementX;
import 'util/util.dart';
@@ -441,20 +442,18 @@
}
void patchClass(leg.DiagnosticListener listener,
- ClassElement origin,
- ClassElement patch) {
+ ClassElementX origin,
+ ClassElementX patch) {
if (origin.isPatched) {
listener.internalError(origin,
"Patching the same class more than once.");
}
- // TODO(johnniwinther): Change to functions on the ElementX class.
- origin.patch = patch;
- patch.origin = origin;
+ origin.applyPatch(patch);
}
void tryPatchGetter(leg.DiagnosticListener listener,
- Element origin,
- FunctionElement patch) {
+ Element origin,
+ FunctionElement patch) {
if (!origin.isAbstractField()) {
listener.reportError(
origin, leg.MessageKind.PATCH_NON_GETTER, {'name': origin.name});
@@ -515,8 +514,8 @@
}
void tryPatchFunction(leg.DiagnosticListener listener,
- Element origin,
- FunctionElement patch) {
+ Element origin,
+ FunctionElement patch) {
if (!origin.isFunction()) {
listener.reportError(
origin,
@@ -530,8 +529,8 @@
}
void patchFunction(leg.DiagnosticListener listener,
- FunctionElementX origin,
- FunctionElementX patch) {
+ FunctionElementX origin,
+ FunctionElementX patch) {
if (!origin.modifiers.isExternal()) {
listener.reportError(origin, leg.MessageKind.PATCH_NON_EXTERNAL);
listener.reportInfo(
@@ -547,10 +546,7 @@
listener.internalError(origin,
"Trying to patch an already compiled function.");
}
- // Don't just assign the patch field. This also updates the cachedNode.
- // TODO(johnniwinther): Change to functions on the ElementX class.
- origin.setPatch(patch);
- patch.origin = origin;
+ origin.applyPatch(patch);
}
// TODO(johnniwinther): Add unittest when patch is (real) metadata.
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 4c3b88c..2e6ae95 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -322,18 +322,7 @@
while (!originParameters.isEmpty) {
ParameterElementX originParameter = originParameters.head;
ParameterElementX patchParameter = patchParameters.head;
- // TODO(johnniwinther): Remove the case for reassignment of
- // [patch]/[origin] when resolution is ensure to be done only once.
- assert(invariant(originParameter, originParameter.origin == null));
- assert(invariant(originParameter,
- originParameter.patch == null ||
- originParameter.patch == patchParameter));
- originParameter.patch = patchParameter;
- assert(invariant(patchParameter,
- patchParameter.origin == null ||
- patchParameter.origin == originParameter));
- assert(invariant(patchParameter, patchParameter.patch == null));
- patchParameter.origin = originParameter;
+ originParameter.applyPatch(patchParameter);
DartType originParameterType = originParameter.computeType(compiler);
DartType patchParameterType = patchParameter.computeType(compiler);
if (originParameterType != patchParameterType) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
index 8894cd5..9fbf715 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
@@ -16,19 +16,6 @@
Link<BeginGroupToken> groupingStack = const Link<BeginGroupToken>();
/**
- * Appends a token whose kind is determined by [info] and content is defined
- * by the String [value].
- *
- * This method is invoked for class names, field names, method names, types,
- * etc.
- */
- void appendStringToken(PrecedenceInfo info, String value) {
- tail.next = new StringToken.fromString(info, value, tokenStart,
- canonicalize: true);
- tail = tail.next;
- }
-
- /**
* Appends a fixed token whose kind and content is determined by [info].
* Appends an *operator* token from [info].
*
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 5bb6790..23bb0d7 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -714,6 +714,9 @@
case r'$':
kind = MessageKind.MALFORMED_STRING_LITERAL;
break;
+ case '/*':
+ kind = MessageKind.UNTERMINATED_COMMENT;
+ break;
default:
kind = MessageKind.UNTERMINATED_TOKEN;
break;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index aee544d..f74e339 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -150,9 +150,6 @@
bool asciiOnly, [int extraOffset]);
/** Documentation in subclass [ArrayBasedScanner]. */
- void appendStringToken(PrecedenceInfo info, String value);
-
- /** Documentation in subclass [ArrayBasedScanner]. */
void appendPrecedenceToken(PrecedenceInfo info);
/** Documentation in subclass [ArrayBasedScanner]. */
@@ -745,7 +742,7 @@
while (true) {
if (identical($EOF, next)) {
if (!asciiOnlyLines) handleUnicode(unicodeStart);
- appendStringToken(BAD_INPUT_INFO, "unterminated multi-line comment");
+ unterminated('/*');
break;
} else if (identical($STAR, next)) {
next = advance();
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 75e86d8..efbad80 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1492,8 +1492,10 @@
if (constructor.isPatch) {
// Create origin body element for patched constructors.
- bodyElement.origin = new ConstructorBodyElementX(constructor.origin);
- bodyElement.origin.patch = bodyElement;
+ ConstructorBodyElementX patch = bodyElement;
+ ConstructorBodyElementX origin =
+ new ConstructorBodyElementX(constructor.origin);
+ origin.applyPatch(patch);
classElement.origin.addBackendMember(bodyElement.origin);
}
}
@@ -4801,37 +4803,38 @@
}
HInstruction value;
if (node.isRedirectingFactoryBody) {
- FunctionElement element = elements[node.expression].implementation;
- FunctionElement function = sourceElement;
+ FunctionElement targetConstructor =
+ elements[node.expression].implementation;
+ FunctionElement redirectingConstructor = sourceElement;
List<HInstruction> inputs = <HInstruction>[];
- FunctionSignature calleeSignature = element.functionSignature;
- FunctionSignature callerSignature = function.functionSignature;
- callerSignature.forEachRequiredParameter((Element element) {
+ FunctionSignature targetSignature = targetConstructor.functionSignature;
+ FunctionSignature redirectingSignature =
+ redirectingConstructor.functionSignature;
+ redirectingSignature.forEachRequiredParameter((Element element) {
inputs.add(localsHandler.readLocal(element));
});
- List<Element> calleeOptionals =
- calleeSignature.orderedOptionalParameters;
- List<Element> callerOptionals =
- callerSignature.orderedOptionalParameters;
+ List<Element> targetOptionals =
+ targetSignature.orderedOptionalParameters;
+ List<Element> redirectingOptionals =
+ redirectingSignature.orderedOptionalParameters;
int i = 0;
- for (; i < callerOptionals.length; i++) {
- inputs.add(localsHandler.readLocal(callerOptionals[i]));
+ for (; i < redirectingOptionals.length; i++) {
+ inputs.add(localsHandler.readLocal(redirectingOptionals[i]));
}
- for (; i < calleeOptionals.length; i++) {
- inputs.add(handleConstantForOptionalParameter(calleeOptionals[i]));
+ for (; i < targetOptionals.length; i++) {
+ inputs.add(handleConstantForOptionalParameter(targetOptionals[i]));
}
- if (backend.classNeedsRti(element.getEnclosingClass())) {
- ClassElement cls = function.getEnclosingClass();
- Link<DartType> typeVariable = cls.typeVariables;
- InterfaceType type = elements.getType(node.expression);
- type.typeArguments.forEach((DartType argument) {
+ ClassElement targetClass = targetConstructor.getEnclosingClass();
+ if (backend.classNeedsRti(targetClass)) {
+ ClassElement cls = redirectingConstructor.getEnclosingClass();
+ InterfaceType targetType =
+ redirectingConstructor.computeTargetType(cls.thisType);
+ targetType.typeArguments.forEach((DartType argument) {
inputs.add(analyzeTypeArgument(argument));
- typeVariable = typeVariable.tail;
});
- assert(typeVariable.isEmpty);
}
- pushInvokeStatic(node, element, inputs);
+ pushInvokeStatic(node, targetConstructor, inputs);
value = pop();
} else if (node.expression == null) {
value = graph.addConstantNull(compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 3aede58..e1ec24d 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1824,6 +1824,14 @@
}
''']);
+ static const MessageKind UNTERMINATED_COMMENT = const MessageKind(
+ "Comment starting with '/*' must end with '*/'.",
+ howToFix: DONT_KNOW_HOW_TO_FIX,
+ examples: const [r"""
+main() {
+}
+/*"""]);
+
static const MessageKind COMPILER_CRASHED = const MessageKind(
"The compiler crashed when compiling this element.");
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 4d19e8e..496a35b 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -22,8 +22,7 @@
ArgResults options;
try {
- options = PubCommand.pubArgParser.parse(arguments,
- allowTrailingOptions: true);
+ options = PubCommand.pubArgParser.parse(arguments);
} on FormatException catch (e) {
log.error(e.message);
log.error('Run "pub help" to see available options.');
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 2124374..101669f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -279,19 +279,23 @@
/// A [CompilerOutputProvider] for dart2js.
EventSink<String> provideOutput(String name, String extension) {
- // Dart2js uses an empty string for the name of the entrypoint library.
- // We only expect to get output files associated with that right now. For
- // other files, we'd need some logic to determine the right relative path
- // for it.
- assert(name == "");
-
// TODO(rnystrom): Do this more cleanly. See: #17403.
if (!generateSourceMaps && extension.endsWith(".map")) {
return new NullSink<String>();
}
var primaryId = _transform.primaryInput.id;
- var id = new AssetId(primaryId.package, "${primaryId.path}.$extension");
+
+ // Dart2js uses an empty string for the name of the entrypoint library.
+ // Otherwise, it's the name of a deferred library.
+ var outPath;
+ if (name == "") {
+ outPath = _transform.primaryInput.id.path;
+ } else {
+ outPath = path.join(path.dirname(_transform.primaryInput.id.path), name);
+ }
+
+ var id = new AssetId(primaryId.package, "$outPath.$extension");
// Make a sink that dart2js can write to.
var sink = new StreamController<String>();
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 760d5fc..3cfb07a 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -129,12 +129,17 @@
/// only needs to be set in leaf commands.
bool get takesArguments => false;
+ /// Override this and return `false` to disallow trailing options from being
+ /// parsed after a non-option argument is parsed.
+ bool get allowTrailingOptions => true;
+
/// Alternate names for this command. These names won't be used in the
/// documentation, but they will work when invoked on the command line.
final aliases = const <String>[];
/// The [ArgParser] for this command.
- final commandParser = new ArgParser();
+ ArgParser get commandParser => _commandParser;
+ ArgParser _commandParser;
/// Subcommands exposed by this command.
///
@@ -150,6 +155,8 @@
bool get isOffline => false;
PubCommand() {
+ _commandParser = new ArgParser(allowTrailingOptions: allowTrailingOptions);
+
// Allow "--help" after a command to get command help.
commandParser.addFlag('help', abbr: 'h', negatable: false,
help: 'Print usage information for this command.');
@@ -263,7 +270,7 @@
/// Creates the top-level [ArgParser] used to parse the pub command line.
ArgParser _initArgParser() {
- var argParser = new ArgParser();
+ var argParser = new ArgParser(allowTrailingOptions: true);
// Add the global options.
argParser.addFlag('help', abbr: 'h', negatable: false,
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index de11e56..64374db 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -82,10 +82,11 @@
if (terse) options.add('--terse');
if (toDart) options.add('--output-type=dart');
+ var sourceUrl = path.toUri(entrypoint);
+ options.add("--out=$sourceUrl.js");
+
// Add the source map URLs.
if (includeSourceMapUrls) {
- var sourceUrl = path.toUri(entrypoint);
- options.add("--out=$sourceUrl.js");
options.add("--source-map=$sourceUrl.js.map");
}
diff --git a/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart b/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart
new file mode 100644
index 0000000..cd06568
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dart2js/outputs_deferred_libraries_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const MAIN = """
+import 'dart:async';
+
+@lazyA import 'a.dart' as a;
+@lazyB import 'b.dart' as b;
+
+const lazyA = const DeferredLibrary('a', uri: 'a.js');
+const lazyB = const DeferredLibrary('b', uri: 'b.js');
+
+void main() {
+ Future.wait([lazyA.load(), lazyB.load()]).then((_) {
+ a.fn();
+ b.fn();
+ });
+}
+""";
+
+const A = """
+library a;
+
+fn() => print("a");
+""";
+
+const B = """
+library b;
+
+fn() => print("b");
+""";
+
+main() {
+ initConfig();
+ integration("compiles deferred libraries to separate outputs", () {
+ // Dart2js can take a long time to compile dart code, so we increase the
+ // timeout to cope with that.
+ currentSchedule.timeout *= 3;
+
+ d.dir(appPath, [
+ d.appPubspec(),
+ d.dir('web', [
+ d.file('main.dart', MAIN),
+ d.file('a.dart', A),
+ d.file('b.dart', B)
+ ])
+ ]).create();
+
+ schedulePub(args: ["build"],
+ output: new RegExp(r'Built 4 files to "build".'));
+
+ d.dir(appPath, [
+ d.dir('build', [
+ d.dir('web', [
+ d.matcherFile('main.dart.js', isNot(isEmpty)),
+ d.matcherFile('main.dart.precompiled.js', isNot(isEmpty)),
+ d.matcherFile('main.dart.js_a.part.js', isNot(isEmpty)),
+ d.matcherFile('main.dart.js_b.part.js', isNot(isEmpty)),
+ ])
+ ])
+ ]).validate();
+ });
+}
diff --git a/sdk/lib/collection/iterable.dart b/sdk/lib/collection/iterable.dart
index d74448a..7c8ec70 100644
--- a/sdk/lib/collection/iterable.dart
+++ b/sdk/lib/collection/iterable.dart
@@ -31,7 +31,7 @@
E reduce(E combine(E value, E element)) {
Iterator<E> iterator = this.iterator;
if (!iterator.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E value = iterator.current;
while (iterator.moveNext()) {
@@ -117,7 +117,7 @@
E get first {
Iterator it = iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
return it.current;
}
@@ -125,7 +125,7 @@
E get last {
Iterator it = iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E result;
do {
@@ -136,9 +136,9 @@
E get single {
Iterator it = iterator;
- if (!it.moveNext()) throw new StateError("No elements");
+ if (!it.moveNext()) throw IterableElementError.noElement();
E result = it.current;
- if (it.moveNext()) throw new StateError("More than one element");
+ if (it.moveNext()) throw IterableElementError.tooMany();
return result;
}
@@ -147,7 +147,7 @@
if (test(element)) return element;
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
dynamic lastWhere(bool test(E value), { Object orElse() }) {
@@ -161,7 +161,7 @@
}
if (foundMatching) return result;
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E singleWhere(bool test(E value)) {
@@ -170,14 +170,14 @@
for (E element in this) {
if (test(element)) {
if (foundMatching) {
- throw new StateError("More than one matching element");
+ throw IterableElementError.tooMany();
}
result = element;
foundMatching = true;
}
}
if (foundMatching) return result;
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E elementAt(int index) {
@@ -225,7 +225,7 @@
E reduce(E combine(E value, E element)) {
Iterator<E> iterator = this.iterator;
if (!iterator.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E value = iterator.current;
while (iterator.moveNext()) {
@@ -311,7 +311,7 @@
E get first {
Iterator it = iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
return it.current;
}
@@ -319,7 +319,7 @@
E get last {
Iterator it = iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
E result;
do {
@@ -330,9 +330,9 @@
E get single {
Iterator it = iterator;
- if (!it.moveNext()) throw new StateError("No elements");
+ if (!it.moveNext()) throw IterableElementError.noElement();
E result = it.current;
- if (it.moveNext()) throw new StateError("More than one element");
+ if (it.moveNext()) throw IterableElementError.tooMany();
return result;
}
@@ -341,7 +341,7 @@
if (test(element)) return element;
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
dynamic lastWhere(bool test(E value), { Object orElse() }) {
@@ -355,7 +355,7 @@
}
if (foundMatching) return result;
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E singleWhere(bool test(E value)) {
@@ -364,14 +364,14 @@
for (E element in this) {
if (test(element)) {
if (foundMatching) {
- throw new StateError("More than one matching element");
+ throw IterableElementError.tooMany();
}
result = element;
foundMatching = true;
}
}
if (foundMatching) return result;
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E elementAt(int index) {
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index 9f33e3a..e5cb8b2 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -25,7 +25,7 @@
* "`[]`", "`[]=`", or "`unary-`"),
* * any of the above preceeded by any number of qualifiers,
* where a qualifier is a non-private identifier followed by '`.`',
- * * or the empty string (the default name of a library with not library
+ * * or the empty string (the default name of a library with no library
* name declaration).
*
* The following text is non-normative:
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a8b6082..fbbdd1a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -7752,11 +7752,15 @@
ElementList queryAll(String relativeSelectors) =>
querySelectorAll(relativeSelectors);
- /// Checks if [register] is supported on the current platform.
- bool get supportsRegister {
+ /// Checks if [registerElement] is supported on the current platform.
+ bool get supportsRegisterElement {
return JS('bool', '("registerElement" in #)', this);
}
+ /// *Deprecated*: use [supportsRegisterElement] instead.
+ @deprecated
+ bool get supportsRegister => supportsRegisterElement;
+
@DomName('Document.createElement')
Element createElement(String tagName, [String typeExtension]) {
return _createElement(tagName, typeExtension);
@@ -9317,7 +9321,7 @@
* // Perform any element initialization.
* }
* }
- * document.register('x-custom', CustomElement);
+ * document.registerElement('x-custom', CustomElement);
*/
Element.created() : super._created() {
// Validate that this is a custom element & perform any additional
@@ -9694,15 +9698,39 @@
/**
* Called by the DOM when this element has been inserted into the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+ * draft specification.
*/
@Experimental()
- void enteredView() {}
+ void attached() {
+ // For the deprecation period, call the old callback.
+ enteredView();
+ }
/**
* Called by the DOM when this element has been removed from the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+ * draft specification.
*/
@Experimental()
+ void detached() {
+ // For the deprecation period, call the old callback.
+ leftView();
+ }
+
+ /** *Deprecated*: override [attached] instead. */
+ @Experimental()
+ @deprecated
+ void enteredView() {}
+
+ /** *Deprecated*: override [detached] instead. */
+ @Experimental()
+ @deprecated
void leftView() {}
/**
@@ -14328,7 +14356,7 @@
* }
*
* main() {
- * document.register('x-foo', FooElement);
+ * document.registerElement('x-foo', FooElement);
* var myFoo = new Element.tag('x-foo');
* // prints 'FooElement created!' to the console.
* }
@@ -14345,7 +14373,7 @@
* }
*
* main() {
- * document.register('x-bar', BarElement);
+ * document.registerElement('x-bar', BarElement);
* var myBar = new Element.tag('input', 'x-bar');
* // prints 'BarElement created!' to the console.
* }
@@ -14354,11 +14382,19 @@
* `<input is="x-bar"></input>`
*
*/
- void register(String tag, Type customElementClass, {String extendsTag}) {
+ void registerElement(String tag, Type customElementClass,
+ {String extendsTag}) {
_registerCustomElement(JS('', 'window'), this, tag, customElementClass,
extendsTag);
}
+ /** *Deprecated*: use [registerElement] instead. */
+ @deprecated
+ @Experimental()
+ void register(String tag, Type customElementClass, {String extendsTag}) {
+ return registerElement(tag, customElementClass, extendsTag: extendsTag);
+ }
+
/**
* Static factory designed to expose `visibilitychange` events to event
* handlers that are not necessarily instances of [Document].
@@ -26406,11 +26442,6 @@
// To suppress missing implicit constructor warnings.
factory Url._() { throw new UnsupportedError("Not supported"); }
- @JSName('createObjectURL')
- @DomName('URL.createObjectURL')
- @DocsEditable()
- static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) native;
-
// From URLUtils
@DomName('URL.hash')
@@ -35214,12 +35245,12 @@
};
}
-_callEnteredView(receiver) {
- return receiver.enteredView();
+_callAttached(receiver) {
+ return receiver.attached();
}
-_callLeftView(receiver) {
- return receiver.leftView();
+_callDetached(receiver) {
+ return receiver.detached();
}
_callAttributeChanged(receiver, name, oldValue, newValue) {
return receiver.attributeChanged(name, oldValue, newValue);
@@ -35302,9 +35333,9 @@
JS('=Object', '{value: #}',
_makeCallbackMethod(_callConstructor(constructor, interceptor))));
JS('void', '#.attachedCallback = #', properties,
- JS('=Object', '{value: #}', _makeCallbackMethod(_callEnteredView)));
+ JS('=Object', '{value: #}', _makeCallbackMethod(_callAttached)));
JS('void', '#.detachedCallback = #', properties,
- JS('=Object', '{value: #}', _makeCallbackMethod(_callLeftView)));
+ JS('=Object', '{value: #}', _makeCallbackMethod(_callDetached)));
JS('void', '#.attributeChangedCallback = #', properties,
JS('=Object', '{value: #}', _makeCallbackMethod3(_callAttributeChanged)));
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 2585e84..33f0663 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -350,27 +350,7 @@
@DomName('Animation.Animation')
@DocsEditable()
- factory Animation(Element target, List<Map> keyframes, [timingInput]) {
- if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
- return Animation._create_1(target, keyframes, timingInput);
- }
- if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
- return Animation._create_2(target, keyframes, timingInput);
- }
- if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
- return Animation._create_3(target, keyframes);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- @DocsEditable()
- static Animation _create_1(target, keyframes, timingInput) => _blink.Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
-
- @DocsEditable()
- static Animation _create_2(target, keyframes, timingInput) => _blink.Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
-
- @DocsEditable()
- static Animation _create_3(target, keyframes) => _blink.Native_Animation__create_3constructorCallback(target, keyframes);
+ factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.Native_Animation_Animation(target, keyframes, timingInput);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -768,12 +748,7 @@
@DomName('HTMLAudioElement.HTMLAudioElement')
@DocsEditable()
- factory AudioElement([String src]) {
- return AudioElement._create_1(src);
- }
-
- @DocsEditable()
- static AudioElement _create_1(src) => _blink.Native_HTMLAudioElement__create_1constructorCallback(src);
+ factory AudioElement([String src]) => _blink.Native_HTMLAudioElement_AudioElement(src);
/**
* Constructor instantiated by the DOM when a custom element has been created.
*
@@ -952,26 +927,7 @@
@DocsEditable()
String get type => _blink.Native_Blob_type_Getter(this);
- Blob slice([int start, int end, String contentType]) {
- if (contentType != null) {
- return _slice_1(start, end, contentType);
- }
- if (end != null) {
- return _slice_2(start, end);
- }
- if (start != null) {
- return _slice_3(start);
- }
- return _slice_4();
- }
-
- Blob _slice_1(start, end, contentType) => _blink.Native_Blob__slice_1_Callback(this, start, end, contentType);
-
- Blob _slice_2(start, end) => _blink.Native_Blob__slice_2_Callback(this, start, end);
-
- Blob _slice_3(start) => _blink.Native_Blob__slice_3_Callback(this, start);
-
- Blob _slice_4() => _blink.Native_Blob__slice_4_Callback(this);
+ Blob slice([int start, int end, String contentType]) => _blink.Native_Blob_slice(this, start, end, contentType);
}
@@ -1889,18 +1845,7 @@
@DocsEditable()
void clearRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_clearRect_Callback(this, x, y, width, height);
- void clip([String winding]) {
- if (winding != null) {
- _clip_1(winding);
- return;
- }
- _clip_2();
- return;
- }
-
- void _clip_1(winding) => _blink.Native_CanvasRenderingContext2D__clip_1_Callback(this, winding);
-
- void _clip_2() => _blink.Native_CanvasRenderingContext2D__clip_2_Callback(this);
+ void clip([String winding]) => _blink.Native_CanvasRenderingContext2D_clip(this, winding);
@DomName('CanvasRenderingContext2D.closePath')
@DocsEditable()
@@ -1935,81 +1880,7 @@
@Experimental() // untriaged
bool drawCustomFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(this, element);
- void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
- if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
- return;
- }
- if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
- return;
- }
- if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
- _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
- return;
- }
- if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
- return;
- }
- if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
- return;
- }
- if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
- _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
- return;
- }
- if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
- return;
- }
- if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
- return;
- }
- if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
- _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
- return;
- }
- if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
- return;
- }
- if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
- _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
- return;
- }
- if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
- _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_1_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
- void _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_2_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
- void _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_3_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
- void _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_4_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
- void _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_5_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
- void _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_6_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
- void _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_7_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
- void _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_8_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
- void _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_9_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
-
- void _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_10_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
-
- void _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_11_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
-
- void _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_12_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+ void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.Native_CanvasRenderingContext2D__drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
@DomName('CanvasRenderingContext2D.drawSystemFocusRing')
@DocsEditable()
@@ -2021,35 +1892,13 @@
@Experimental() // untriaged
void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
- void fill([String winding]) {
- if (winding != null) {
- _fill_1(winding);
- return;
- }
- _fill_2();
- return;
- }
-
- void _fill_1(winding) => _blink.Native_CanvasRenderingContext2D__fill_1_Callback(this, winding);
-
- void _fill_2() => _blink.Native_CanvasRenderingContext2D__fill_2_Callback(this);
+ void fill([String winding]) => _blink.Native_CanvasRenderingContext2D_fill(this, winding);
@DomName('CanvasRenderingContext2D.fillRect')
@DocsEditable()
void fillRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_fillRect_Callback(this, x, y, width, height);
- void fillText(String text, num x, num y, [num maxWidth]) {
- if (maxWidth != null) {
- _fillText_1(text, x, y, maxWidth);
- return;
- }
- _fillText_2(text, x, y);
- return;
- }
-
- void _fillText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__fillText_1_Callback(this, text, x, y, maxWidth);
-
- void _fillText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__fillText_2_Callback(this, text, x, y);
+ void fillText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_fillText(this, text, x, y, maxWidth);
@DomName('CanvasRenderingContext2D.getContextAttributes')
@DocsEditable()
@@ -2065,16 +1914,7 @@
@DocsEditable()
List<num> _getLineDash() => _blink.Native_CanvasRenderingContext2D_getLineDash_Callback(this);
- bool isPointInPath(num x, num y, [String winding]) {
- if (winding != null) {
- return _isPointInPath_1(x, y, winding);
- }
- return _isPointInPath_2(x, y);
- }
-
- bool _isPointInPath_1(x, y, winding) => _blink.Native_CanvasRenderingContext2D__isPointInPath_1_Callback(this, x, y, winding);
-
- bool _isPointInPath_2(x, y) => _blink.Native_CanvasRenderingContext2D__isPointInPath_2_Callback(this, x, y);
+ bool isPointInPath(num x, num y, [String winding]) => _blink.Native_CanvasRenderingContext2D_isPointInPath(this, x, y, winding);
@DomName('CanvasRenderingContext2D.isPointInStroke')
@DocsEditable()
@@ -2092,21 +1932,7 @@
@DocsEditable()
void moveTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_moveTo_Callback(this, x, y);
- void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
- if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
- _putImageData_1(imagedata, dx, dy);
- return;
- }
- if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
- _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _putImageData_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__putImageData_1_Callback(this, imagedata, dx, dy);
-
- void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__putImageData_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+ void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
@DomName('CanvasRenderingContext2D.quadraticCurveTo')
@DocsEditable()
@@ -2153,18 +1979,7 @@
@DocsEditable()
void strokeRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_strokeRect_Callback(this, x, y, width, height);
- void strokeText(String text, num x, num y, [num maxWidth]) {
- if (maxWidth != null) {
- _strokeText_1(text, x, y, maxWidth);
- return;
- }
- _strokeText_2(text, x, y);
- return;
- }
-
- void _strokeText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__strokeText_1_Callback(this, text, x, y, maxWidth);
-
- void _strokeText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__strokeText_2_Callback(this, text, x, y);
+ void strokeText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_strokeText(this, text, x, y, maxWidth);
@DomName('CanvasRenderingContext2D.transform')
@DocsEditable()
@@ -2181,21 +1996,7 @@
@Experimental()
ImageData getImageDataHD(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(this, sx, sy, sw, sh);
- void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
- if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
- _webkitPutImageDataHD_1(imagedata, dx, dy);
- return;
- }
- if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
- _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _webkitPutImageDataHD_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(this, imagedata, dx, dy);
-
- void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+ void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageDataHD(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
/**
@@ -2549,12 +2350,7 @@
@DomName('Comment.Comment')
@DocsEditable()
- factory Comment([String data]) {
- return Comment._create_1(data);
- }
-
- @DocsEditable()
- static Comment _create_1(data) => _blink.Native_Comment__create_1constructorCallback(data);
+ factory Comment([String data]) => _blink.Native_Comment_Comment(data);
}
// 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
@@ -6591,31 +6387,13 @@
@Experimental() // non-standard
List<CssRule> get rules => _blink.Native_CSSStyleSheet_rules_Getter(this);
- int addRule(String selector, String style, [int index]) {
- if (index != null) {
- return _addRule_1(selector, style, index);
- }
- return _addRule_2(selector, style);
- }
-
- int _addRule_1(selector, style, index) => _blink.Native_CSSStyleSheet__addRule_1_Callback(this, selector, style, index);
-
- int _addRule_2(selector, style) => _blink.Native_CSSStyleSheet__addRule_2_Callback(this, selector, style);
+ int addRule(String selector, String style, [int index]) => _blink.Native_CSSStyleSheet_addRule(this, selector, style, index);
@DomName('CSSStyleSheet.deleteRule')
@DocsEditable()
void deleteRule(int index) => _blink.Native_CSSStyleSheet_deleteRule_Callback(this, index);
- int insertRule(String rule, [int index]) {
- if (index != null) {
- return _insertRule_1(rule, index);
- }
- return _insertRule_2(rule);
- }
-
- int _insertRule_1(rule, index) => _blink.Native_CSSStyleSheet__insertRule_1_Callback(this, rule, index);
-
- int _insertRule_2(rule) => _blink.Native_CSSStyleSheet__insertRule_2_Callback(this, rule);
+ int insertRule(String rule, [int index]) => _blink.Native_CSSStyleSheet_insertRule(this, rule, index);
@DomName('CSSStyleSheet.removeRule')
@DocsEditable()
@@ -6825,18 +6603,7 @@
@DocsEditable()
List<String> get types => _blink.Native_Clipboard_types_Getter(this);
- void clearData([String type]) {
- if (type != null) {
- _clearData_1(type);
- return;
- }
- _clearData_2();
- return;
- }
-
- void _clearData_1(type) => _blink.Native_Clipboard__clearData_1_Callback(this, type);
-
- void _clearData_2() => _blink.Native_Clipboard__clearData_2_Callback(this);
+ void clearData([String type]) => _blink.Native_Clipboard_clearData(this, type);
/**
* Gets the data for the specified type.
@@ -6935,19 +6702,7 @@
@Experimental() // untriaged
DataTransferItem __getter__(int index) => _blink.Native_DataTransferItemList___getter___Callback(this, index);
- DataTransferItem add(data_OR_file, [String type]) {
- if ((data_OR_file is File || data_OR_file == null) && type == null) {
- return _add_1(data_OR_file);
- }
- if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
- return _add_2(data_OR_file, type);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- DataTransferItem _add_1(data_OR_file) => _blink.Native_DataTransferItemList__add_1_Callback(this, data_OR_file);
-
- DataTransferItem _add_2(data_OR_file, type) => _blink.Native_DataTransferItemList__add_2_Callback(this, data_OR_file, type);
+ DataTransferItem add(data_OR_file, [String type]) => _blink.Native_DataTransferItemList_add(this, data_OR_file, type);
@DomName('DataTransferItemList.addData')
@DocsEditable()
@@ -7720,32 +7475,9 @@
@DocsEditable()
Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.Native_Document_createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
- Event _createEvent([String eventType]) {
- if (eventType != null) {
- return _createEvent_1(eventType);
- }
- return _createEvent_2();
- }
+ Event _createEvent([String eventType]) => _blink.Native_Document__createEvent(this, eventType);
- Event _createEvent_1(eventType) => _blink.Native_Document__createEvent_1_Callback(this, eventType);
-
- Event _createEvent_2() => _blink.Native_Document__createEvent_2_Callback(this);
-
- NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
- if (filter != null) {
- return _createNodeIterator_1(root, whatToShow, filter);
- }
- if (whatToShow != null) {
- return _createNodeIterator_2(root, whatToShow);
- }
- return _createNodeIterator_3(root);
- }
-
- NodeIterator _createNodeIterator_1(root, whatToShow, filter) => _blink.Native_Document__createNodeIterator_1_Callback(this, root, whatToShow, filter);
-
- NodeIterator _createNodeIterator_2(root, whatToShow) => _blink.Native_Document__createNodeIterator_2_Callback(this, root, whatToShow);
-
- NodeIterator _createNodeIterator_3(root) => _blink.Native_Document__createNodeIterator_3_Callback(this, root);
+ NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createNodeIterator(this, root, whatToShow, filter);
@DomName('Document.createRange')
@DocsEditable()
@@ -7761,21 +7493,7 @@
@Experimental()
Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.Native_Document_createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
- TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
- if (filter != null) {
- return _createTreeWalker_1(root, whatToShow, filter);
- }
- if (whatToShow != null) {
- return _createTreeWalker_2(root, whatToShow);
- }
- return _createTreeWalker_3(root);
- }
-
- TreeWalker _createTreeWalker_1(root, whatToShow, filter) => _blink.Native_Document__createTreeWalker_1_Callback(this, root, whatToShow, filter);
-
- TreeWalker _createTreeWalker_2(root, whatToShow) => _blink.Native_Document__createTreeWalker_2_Callback(this, root, whatToShow);
-
- TreeWalker _createTreeWalker_3(root) => _blink.Native_Document__createTreeWalker_3_Callback(this, root);
+ TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createTreeWalker(this, root, whatToShow, filter);
@DomName('Document.elementFromPoint')
@DocsEditable()
@@ -7807,16 +7525,7 @@
@DocsEditable()
List<Node> getElementsByTagName(String localName) => _blink.Native_Document_getElementsByTagName_Callback(this, localName);
- Node importNode(Node node, [bool deep]) {
- if (deep != null) {
- return _importNode_1(node, deep);
- }
- return _importNode_2(node);
- }
-
- Node _importNode_1(node, deep) => _blink.Native_Document__importNode_1_Callback(this, node, deep);
-
- Node _importNode_2(node) => _blink.Native_Document__importNode_2_Callback(this, node);
+ Node importNode(Node node, [bool deep]) => _blink.Native_Document_importNode(this, node, deep);
@DomName('Document.queryCommandEnabled')
@DocsEditable()
@@ -8221,11 +7930,15 @@
ElementList queryAll(String relativeSelectors) =>
querySelectorAll(relativeSelectors);
- /// Checks if [register] is supported on the current platform.
- bool get supportsRegister {
+ /// Checks if [registerElement] is supported on the current platform.
+ bool get supportsRegisterElement {
return true;
}
+ /// *Deprecated*: use [supportsRegisterElement] instead.
+ @deprecated
+ bool get supportsRegister => supportsRegisterElement;
+
@DomName('Document.createElement')
Element createElement(String tagName, [String typeExtension]) {
if (typeExtension != null) {
@@ -8508,12 +8221,7 @@
@DomName('DOMParser.DOMParser')
@DocsEditable()
- factory DomParser() {
- return DomParser._create_1();
- }
-
- @DocsEditable()
- static DomParser _create_1() => _blink.Native_DOMParser__create_1constructorCallback();
+ factory DomParser() => _blink.Native_DOMParser_DomParser();
@DomName('DOMParser.parseFromString')
@DocsEditable()
@@ -8631,49 +8339,11 @@
// To suppress missing implicit constructor warnings.
factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
- bool __delete__(index_OR_name) {
- if ((index_OR_name is int || index_OR_name == null)) {
- return ___delete___1(index_OR_name);
- }
- if ((index_OR_name is String || index_OR_name == null)) {
- return ___delete___2(index_OR_name);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
+ bool __delete__(index_OR_name) => _blink.Native_DOMStringMap___delete__(this, index_OR_name);
- bool ___delete___1(index_OR_name) => _blink.Native_DOMStringMap____delete___1_Callback(this, index_OR_name);
+ String __getter__(index_OR_name) => _blink.Native_DOMStringMap___getter__(this, index_OR_name);
- bool ___delete___2(index_OR_name) => _blink.Native_DOMStringMap____delete___2_Callback(this, index_OR_name);
-
- String __getter__(index_OR_name) {
- if ((index_OR_name is int || index_OR_name == null)) {
- return ___getter___1(index_OR_name);
- }
- if ((index_OR_name is String || index_OR_name == null)) {
- return ___getter___2(index_OR_name);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- String ___getter___1(index_OR_name) => _blink.Native_DOMStringMap____getter___1_Callback(this, index_OR_name);
-
- String ___getter___2(index_OR_name) => _blink.Native_DOMStringMap____getter___2_Callback(this, index_OR_name);
-
- void __setter__(index_OR_name, String value) {
- if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
- ___setter___1(index_OR_name, value);
- return;
- }
- if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
- ___setter___2(index_OR_name, value);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void ___setter___1(index_OR_name, value) => _blink.Native_DOMStringMap____setter___1_Callback(this, index_OR_name, value);
-
- void ___setter___2(index_OR_name, value) => _blink.Native_DOMStringMap____setter___2_Callback(this, index_OR_name, value);
+ void __setter__(index_OR_name, String value) => _blink.Native_DOMStringMap___setter__(this, index_OR_name, value);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -8705,16 +8375,7 @@
@DocsEditable()
String toString() => _blink.Native_DOMTokenList_toString_Callback(this);
- bool toggle(String token, [bool force]) {
- if (force != null) {
- return _toggle_1(token, force);
- }
- return _toggle_2(token);
- }
-
- bool _toggle_1(token, force) => _blink.Native_DOMTokenList__toggle_1_Callback(this, token, force);
-
- bool _toggle_2(token) => _blink.Native_DOMTokenList__toggle_2_Callback(this, token);
+ bool toggle(String token, [bool force]) => _blink.Native_DOMTokenList_toggle(this, token, force);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -9835,7 +9496,7 @@
* // Perform any element initialization.
* }
* }
- * document.register('x-custom', CustomElement);
+ * document.registerElement('x-custom', CustomElement);
*/
Element.created() : super._created() {
// Validate that this is a custom element & perform any additional
@@ -10212,15 +9873,39 @@
/**
* Called by the DOM when this element has been inserted into the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+ * draft specification.
*/
@Experimental()
- void enteredView() {}
+ void attached() {
+ // For the deprecation period, call the old callback.
+ enteredView();
+ }
/**
* Called by the DOM when this element has been removed from the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+ * draft specification.
*/
@Experimental()
+ void detached() {
+ // For the deprecation period, call the old callback.
+ leftView();
+ }
+
+ /** *Deprecated*: override [attached] instead. */
+ @Experimental()
+ @deprecated
+ void enteredView() {}
+
+ /** *Deprecated*: override [detached] instead. */
+ @Experimental()
+ @deprecated
void leftView() {}
/**
@@ -11289,24 +10974,7 @@
@DocsEditable()
String get tagName => _blink.Native_Element_tagName_Getter(this);
- Animation animate(List<Map> keyframes, [timingInput]) {
- if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
- return _animate_1(keyframes, timingInput);
- }
- if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
- return _animate_2(keyframes, timingInput);
- }
- if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
- return _animate_3(keyframes);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- Animation _animate_1(keyframes, timingInput) => _blink.Native_Element__animate_1_Callback(this, keyframes, timingInput);
-
- Animation _animate_2(keyframes, timingInput) => _blink.Native_Element__animate_2_Callback(this, keyframes, timingInput);
-
- Animation _animate_3(keyframes) => _blink.Native_Element__animate_3_Callback(this, keyframes);
+ Animation animate(List<Map> keyframes, [timingInput]) => _blink.Native_Element_animate(this, keyframes, timingInput);
@DomName('Element.blur')
@DocsEditable()
@@ -11485,31 +11153,9 @@
@DocsEditable()
void scrollByPages(int pages) => _blink.Native_Element_scrollByPages_Callback(this, pages);
- void _scrollIntoView([bool alignWithTop]) {
- if (alignWithTop != null) {
- _scrollIntoView_1(alignWithTop);
- return;
- }
- _scrollIntoView_2();
- return;
- }
+ void _scrollIntoView([bool alignWithTop]) => _blink.Native_Element__scrollIntoView(this, alignWithTop);
- void _scrollIntoView_1(alignWithTop) => _blink.Native_Element__scrollIntoView_1_Callback(this, alignWithTop);
-
- void _scrollIntoView_2() => _blink.Native_Element__scrollIntoView_2_Callback(this);
-
- void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
- if (centerIfNeeded != null) {
- _scrollIntoViewIfNeeded_1(centerIfNeeded);
- return;
- }
- _scrollIntoViewIfNeeded_2();
- return;
- }
-
- void _scrollIntoViewIfNeeded_1(centerIfNeeded) => _blink.Native_Element__scrollIntoViewIfNeeded_1_Callback(this, centerIfNeeded);
-
- void _scrollIntoViewIfNeeded_2() => _blink.Native_Element__scrollIntoViewIfNeeded_2_Callback(this);
+ void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.Native_Element__scrollIntoViewIfNeeded(this, centerIfNeeded);
@DomName('Element.setAttribute')
@DocsEditable()
@@ -12113,18 +11759,7 @@
@DocsEditable()
String get name => _blink.Native_Entry_name_Getter(this);
- void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
- if (name != null) {
- _copyTo_1(parent, name, successCallback, errorCallback);
- return;
- }
- _copyTo_2(parent);
- return;
- }
-
- void _copyTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__copyTo_1_Callback(this, parent, name, successCallback, errorCallback);
-
- void _copyTo_2(parent) => _blink.Native_Entry__copyTo_2_Callback(this, parent);
+ void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__copyTo(this, parent, name, successCallback, errorCallback);
Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
var completer = new Completer<Entry>();
@@ -12158,18 +11793,7 @@
return completer.future;
}
- void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
- if (name != null) {
- _moveTo_1(parent, name, successCallback, errorCallback);
- return;
- }
- _moveTo_2(parent);
- return;
- }
-
- void _moveTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__moveTo_1_Callback(this, parent, name, successCallback, errorCallback);
-
- void _moveTo_2(parent) => _blink.Native_Entry__moveTo_2_Callback(this, parent);
+ void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__moveTo(this, parent, name, successCallback, errorCallback);
Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
var completer = new Completer<Entry>();
@@ -12484,12 +12108,7 @@
@DomName('EventSource.EventSource')
@DocsEditable()
- static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
- return EventSource._create_1(url, eventSourceInit);
- }
-
- @DocsEditable()
- static EventSource _create_1(url, eventSourceInit) => _blink.Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+ static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.Native_EventSource_EventSource(url, eventSourceInit);
@DomName('EventSource.CLOSED')
@DocsEditable()
@@ -13035,12 +12654,7 @@
@DomName('FileReader.FileReader')
@DocsEditable()
- factory FileReader() {
- return FileReader._create_1();
- }
-
- @DocsEditable()
- static FileReader _create_1() => _blink.Native_FileReader__create_1constructorCallback();
+ factory FileReader() => _blink.Native_FileReader_FileReader();
@DomName('FileReader.DONE')
@DocsEditable()
@@ -13078,18 +12692,7 @@
@DocsEditable()
void readAsDataUrl(Blob blob) => _blink.Native_FileReader_readAsDataURL_Callback(this, blob);
- void readAsText(Blob blob, [String encoding]) {
- if (encoding != null) {
- _readAsText_1(blob, encoding);
- return;
- }
- _readAsText_2(blob);
- return;
- }
-
- void _readAsText_1(blob, encoding) => _blink.Native_FileReader__readAsText_1_Callback(this, blob, encoding);
-
- void _readAsText_2(blob) => _blink.Native_FileReader__readAsText_2_Callback(this, blob);
+ void readAsText(Blob blob, [String encoding]) => _blink.Native_FileReader_readAsText(this, blob, encoding);
@DomName('FileReader.addEventListener')
@DocsEditable()
@@ -13400,12 +13003,7 @@
@DomName('FontFace.FontFace')
@DocsEditable()
- factory FontFace(String family, String source, Map descriptors) {
- return FontFace._create_1(family, source, descriptors);
- }
-
- @DocsEditable()
- static FontFace _create_1(family, source, descriptors) => _blink.Native_FontFace__create_1constructorCallback(family, source, descriptors);
+ factory FontFace(String family, String source, Map descriptors) => _blink.Native_FontFace_FontFace(family, source, descriptors);
@DomName('FontFace.family')
@DocsEditable()
@@ -13532,18 +13130,7 @@
@Experimental() // untriaged
bool delete(FontFace fontFace) => _blink.Native_FontFaceSet_delete_Callback(this, fontFace);
- void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
- if (thisArg != null) {
- _forEach_1(callback, thisArg);
- return;
- }
- _forEach_2(callback);
- return;
- }
-
- void _forEach_1(callback, thisArg) => _blink.Native_FontFaceSet__forEach_1_Callback(this, callback, thisArg);
-
- void _forEach_2(callback) => _blink.Native_FontFaceSet__forEach_2_Callback(this, callback);
+ void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.Native_FontFaceSet_forEach(this, callback, thisArg);
@DomName('FontFaceSet.has')
@DocsEditable()
@@ -14764,7 +14351,7 @@
* }
*
* main() {
- * document.register('x-foo', FooElement);
+ * document.registerElement('x-foo', FooElement);
* var myFoo = new Element.tag('x-foo');
* // prints 'FooElement created!' to the console.
* }
@@ -14781,7 +14368,7 @@
* }
*
* main() {
- * document.register('x-bar', BarElement);
+ * document.registerElement('x-bar', BarElement);
* var myBar = new Element.tag('input', 'x-bar');
* // prints 'BarElement created!' to the console.
* }
@@ -14790,10 +14377,18 @@
* `<input is="x-bar"></input>`
*
*/
- void register(String tag, Type customElementClass, {String extendsTag}) {
+ void registerElement(String tag, Type customElementClass,
+ {String extendsTag}) {
_Utils.register(this, tag, customElementClass, extendsTag);
}
+ /** *Deprecated*: use [registerElement] instead. */
+ @deprecated
+ @Experimental()
+ void register(String tag, Type customElementClass, {String extendsTag}) {
+ return registerElement(tag, customElementClass, extendsTag: extendsTag);
+ }
+
/**
* Static factory designed to expose `visibilitychange` events to event
* handlers that are not necessarily instances of [Document].
@@ -17096,60 +16691,13 @@
@DocsEditable()
void setCustomValidity(String error) => _blink.Native_HTMLInputElement_setCustomValidity_Callback(this, error);
- void setRangeText(String replacement, {int start, int end, String selectionMode}) {
- if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
- _setRangeText_1(replacement);
- return;
- }
- if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
- _setRangeText_2(replacement, start, end, selectionMode);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
+ void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLInputElement_setRangeText(this, replacement, start, end, selectionMode);
- void _setRangeText_1(replacement) => _blink.Native_HTMLInputElement__setRangeText_1_Callback(this, replacement);
+ void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLInputElement_setSelectionRange(this, start, end, direction);
- void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLInputElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
+ void stepDown([int n]) => _blink.Native_HTMLInputElement_stepDown(this, n);
- void setSelectionRange(int start, int end, [String direction]) {
- if (direction != null) {
- _setSelectionRange_1(start, end, direction);
- return;
- }
- _setSelectionRange_2(start, end);
- return;
- }
-
- void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLInputElement__setSelectionRange_1_Callback(this, start, end, direction);
-
- void _setSelectionRange_2(start, end) => _blink.Native_HTMLInputElement__setSelectionRange_2_Callback(this, start, end);
-
- void stepDown([int n]) {
- if (n != null) {
- _stepDown_1(n);
- return;
- }
- _stepDown_2();
- return;
- }
-
- void _stepDown_1(n) => _blink.Native_HTMLInputElement__stepDown_1_Callback(this, n);
-
- void _stepDown_2() => _blink.Native_HTMLInputElement__stepDown_2_Callback(this);
-
- void stepUp([int n]) {
- if (n != null) {
- _stepUp_1(n);
- return;
- }
- _stepUp_2();
- return;
- }
-
- void _stepUp_1(n) => _blink.Native_HTMLInputElement__stepUp_1_Callback(this, n);
-
- void _stepUp_2() => _blink.Native_HTMLInputElement__stepUp_2_Callback(this);
+ void stepUp([int n]) => _blink.Native_HTMLInputElement_stepUp(this, n);
/// Stream of `speechchange` events handled by this [InputElement].
@DomName('HTMLInputElement.onwebkitSpeechChange')
@@ -18416,12 +17964,7 @@
@DomName('MediaController.MediaController')
@DocsEditable()
- factory MediaController() {
- return MediaController._create_1();
- }
-
- @DocsEditable()
- static MediaController _create_1() => _blink.Native_MediaController__create_1constructorCallback();
+ factory MediaController() => _blink.Native_MediaController_MediaController();
@DomName('MediaController.buffered')
@DocsEditable()
@@ -19022,21 +18565,7 @@
@Experimental() // nonstandard
int get videoDecodedByteCount => _blink.Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(this);
- TextTrack addTextTrack(String kind, [String label, String language]) {
- if (language != null) {
- return _addTextTrack_1(kind, label, language);
- }
- if (label != null) {
- return _addTextTrack_2(kind, label);
- }
- return _addTextTrack_3(kind);
- }
-
- TextTrack _addTextTrack_1(kind, label, language) => _blink.Native_HTMLMediaElement__addTextTrack_1_Callback(this, kind, label, language);
-
- TextTrack _addTextTrack_2(kind, label) => _blink.Native_HTMLMediaElement__addTextTrack_2_Callback(this, kind, label);
-
- TextTrack _addTextTrack_3(kind) => _blink.Native_HTMLMediaElement__addTextTrack_3_Callback(this, kind);
+ TextTrack addTextTrack(String kind, [String label, String language]) => _blink.Native_HTMLMediaElement_addTextTrack(this, kind, label, language);
@DomName('HTMLMediaElement.canPlayType')
@DocsEditable()
@@ -19060,18 +18589,7 @@
@Experimental() // untriaged
void setMediaKeys(MediaKeys mediaKeys) => _blink.Native_HTMLMediaElement_setMediaKeys_Callback(this, mediaKeys);
- void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
- if (initData != null) {
- _webkitAddKey_1(keySystem, key, initData, sessionId);
- return;
- }
- _webkitAddKey_2(keySystem, key);
- return;
- }
-
- void _webkitAddKey_1(keySystem, key, initData, sessionId) => _blink.Native_HTMLMediaElement__webkitAddKey_1_Callback(this, keySystem, key, initData, sessionId);
-
- void _webkitAddKey_2(keySystem, key) => _blink.Native_HTMLMediaElement__webkitAddKey_2_Callback(this, keySystem, key);
+ void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.Native_HTMLMediaElement_addKey(this, keySystem, key, initData, sessionId);
@DomName('HTMLMediaElement.webkitCancelKeyRequest')
@DocsEditable()
@@ -19081,18 +18599,7 @@
// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
void cancelKeyRequest(String keySystem, String sessionId) => _blink.Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
- void generateKeyRequest(String keySystem, [Uint8List initData]) {
- if (initData != null) {
- _webkitGenerateKeyRequest_1(keySystem, initData);
- return;
- }
- _webkitGenerateKeyRequest_2(keySystem);
- return;
- }
-
- void _webkitGenerateKeyRequest_1(keySystem, initData) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(this, keySystem, initData);
-
- void _webkitGenerateKeyRequest_2(keySystem) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(this, keySystem);
+ void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.Native_HTMLMediaElement_generateKeyRequest(this, keySystem, initData);
/// Stream of `canplay` events handled by this [MediaElement].
@DomName('HTMLMediaElement.oncanplay')
@@ -19479,12 +18986,7 @@
@DomName('MediaKeys.MediaKeys')
@DocsEditable()
- factory MediaKeys(String keySystem) {
- return MediaKeys._create_1(keySystem);
- }
-
- @DocsEditable()
- static MediaKeys _create_1(keySystem) => _blink.Native_MediaKeys__create_1constructorCallback(keySystem);
+ factory MediaKeys(String keySystem) => _blink.Native_MediaKeys_MediaKeys(keySystem);
@DomName('MediaKeys.keySystem')
@DocsEditable()
@@ -19574,12 +19076,7 @@
@DomName('MediaSource.MediaSource')
@DocsEditable()
- factory MediaSource() {
- return MediaSource._create_1();
- }
-
- @DocsEditable()
- static MediaSource _create_1() => _blink.Native_MediaSource__create_1constructorCallback();
+ factory MediaSource() => _blink.Native_MediaSource_MediaSource();
@DomName('MediaSource.activeSourceBuffers')
@DocsEditable()
@@ -19605,18 +19102,7 @@
@DocsEditable()
SourceBuffer addSourceBuffer(String type) => _blink.Native_MediaSource_addSourceBuffer_Callback(this, type);
- void endOfStream([String error]) {
- if (error != null) {
- _endOfStream_1(error);
- return;
- }
- _endOfStream_2();
- return;
- }
-
- void _endOfStream_1(error) => _blink.Native_MediaSource__endOfStream_1_Callback(this, error);
-
- void _endOfStream_2() => _blink.Native_MediaSource__endOfStream_2_Callback(this);
+ void endOfStream([String error]) => _blink.Native_MediaSource_endOfStream(this, error);
@DomName('MediaSource.isTypeSupported')
@DocsEditable()
@@ -19684,27 +19170,7 @@
@DomName('MediaStream.MediaStream')
@DocsEditable()
- factory MediaStream([stream_OR_tracks]) {
- if (stream_OR_tracks == null) {
- return MediaStream._create_1();
- }
- if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
- return MediaStream._create_2(stream_OR_tracks);
- }
- if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
- return MediaStream._create_3(stream_OR_tracks);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- @DocsEditable()
- static MediaStream _create_1() => _blink.Native_MediaStream__create_1constructorCallback();
-
- @DocsEditable()
- static MediaStream _create_2(stream_OR_tracks) => _blink.Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
-
- @DocsEditable()
- static MediaStream _create_3(stream_OR_tracks) => _blink.Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+ factory MediaStream([stream_OR_tracks]) => _blink.Native_MediaStream_MediaStream(stream_OR_tracks);
@DomName('MediaStream.ended')
@DocsEditable()
@@ -20480,18 +19946,7 @@
// To suppress missing implicit constructor warnings.
factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
- void send(Uint8List data, [num timestamp]) {
- if (timestamp != null) {
- _send_1(data, timestamp);
- return;
- }
- _send_2(data);
- return;
- }
-
- void _send_1(data, timestamp) => _blink.Native_MIDIOutput__send_1_Callback(this, data, timestamp);
-
- void _send_2(data) => _blink.Native_MIDIOutput__send_2_Callback(this, data);
+ void send(Uint8List data, [num timestamp]) => _blink.Native_MIDIOutput_send(this, data, timestamp);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -22171,12 +21626,7 @@
@DomName('Notification.Notification')
@DocsEditable()
- static Notification _factoryNotification(String title, [Map options]) {
- return Notification._create_1(title, options);
- }
-
- @DocsEditable()
- static Notification _create_1(title, options) => _blink.Native_Notification__create_1constructorCallback(title, options);
+ static Notification _factoryNotification(String title, [Map options]) => _blink.Native_Notification_Notification(title, options);
@DomName('Notification.body')
@DocsEditable()
@@ -22483,12 +21933,7 @@
@DomName('HTMLOptionElement.HTMLOptionElement')
@DocsEditable()
- factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
- return OptionElement._create_1(data, value, defaultSelected, selected);
- }
-
- @DocsEditable()
- static OptionElement _create_1(data, value, defaultSelected, selected) => _blink.Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+ factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected);
/**
* Constructor instantiated by the DOM when a custom element has been created.
*
@@ -22812,27 +22257,7 @@
@DomName('Path.Path')
@DocsEditable()
- factory Path([path_OR_text]) {
- if (path_OR_text == null) {
- return Path._create_1();
- }
- if ((path_OR_text is Path || path_OR_text == null)) {
- return Path._create_2(path_OR_text);
- }
- if ((path_OR_text is String || path_OR_text == null)) {
- return Path._create_3(path_OR_text);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- @DocsEditable()
- static Path _create_1() => _blink.Native_Path__create_1constructorCallback();
-
- @DocsEditable()
- static Path _create_2(path_OR_text) => _blink.Native_Path__create_2constructorCallback(path_OR_text);
-
- @DocsEditable()
- static Path _create_3(path_OR_text) => _blink.Native_Path__create_3constructorCallback(path_OR_text);
+ factory Path([path_OR_text]) => _blink.Native_Path_Path(path_OR_text);
@DomName('Path.arc')
@DocsEditable()
@@ -24080,33 +23505,7 @@
@DocsEditable()
void close() => _blink.Native_RTCDataChannel_close_Callback(this);
- void send(data) {
- if ((data is TypedData || data == null)) {
- _send_1(data);
- return;
- }
- if ((data is ByteBuffer || data == null)) {
- _send_2(data);
- return;
- }
- if ((data is Blob || data == null)) {
- _send_3(data);
- return;
- }
- if ((data is String || data == null)) {
- _send_4(data);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _send_1(data) => _blink.Native_RTCDataChannel__send_1_Callback(this, data);
-
- void _send_2(data) => _blink.Native_RTCDataChannel__send_2_Callback(this, data);
-
- void _send_3(data) => _blink.Native_RTCDataChannel__send_3_Callback(this, data);
-
- void _send_4(data) => _blink.Native_RTCDataChannel__send_4_Callback(this, data);
+ void send(data) => _blink.Native_RTCDataChannel_send(this, data);
@DomName('RTCDataChannel.sendBlob')
@DocsEditable()
@@ -24222,24 +23621,7 @@
@DocsEditable()
MediaStreamTrack get track => _blink.Native_RTCDTMFSender_track_Getter(this);
- void insertDtmf(String tones, [int duration, int interToneGap]) {
- if (interToneGap != null) {
- _insertDTMF_1(tones, duration, interToneGap);
- return;
- }
- if (duration != null) {
- _insertDTMF_2(tones, duration);
- return;
- }
- _insertDTMF_3(tones);
- return;
- }
-
- void _insertDTMF_1(tones, duration, interToneGap) => _blink.Native_RTCDTMFSender__insertDTMF_1_Callback(this, tones, duration, interToneGap);
-
- void _insertDTMF_2(tones, duration) => _blink.Native_RTCDTMFSender__insertDTMF_2_Callback(this, tones, duration);
-
- void _insertDTMF_3(tones) => _blink.Native_RTCDTMFSender__insertDTMF_3_Callback(this, tones);
+ void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.Native_RTCDTMFSender_insertDtmf(this, tones, duration, interToneGap);
@DomName('RTCDTMFSender.addEventListener')
@DocsEditable()
@@ -24297,12 +23679,7 @@
@DomName('RTCIceCandidate.RTCIceCandidate')
@DocsEditable()
- factory RtcIceCandidate(Map dictionary) {
- return RtcIceCandidate._create_1(dictionary);
- }
-
- @DocsEditable()
- static RtcIceCandidate _create_1(dictionary) => _blink.Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+ factory RtcIceCandidate(Map dictionary) => _blink.Native_RTCIceCandidate_RtcIceCandidate(dictionary);
@DomName('RTCIceCandidate.candidate')
@DocsEditable()
@@ -24450,12 +23827,7 @@
@DomName('RTCPeerConnection.RTCPeerConnection')
@DocsEditable()
- factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
- return RtcPeerConnection._create_1(rtcIceServers, mediaConstraints);
- }
-
- @DocsEditable()
- static RtcPeerConnection _create_1(rtcIceServers, mediaConstraints) => _blink.Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+ factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints);
@DomName('RTCPeerConnection.iceConnectionState')
@DocsEditable()
@@ -24619,12 +23991,7 @@
@DomName('RTCSessionDescription.RTCSessionDescription')
@DocsEditable()
- factory RtcSessionDescription([Map descriptionInitDict]) {
- return RtcSessionDescription._create_1(descriptionInitDict);
- }
-
- @DocsEditable()
- static RtcSessionDescription _create_1(descriptionInitDict) => _blink.Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+ factory RtcSessionDescription([Map descriptionInitDict]) => _blink.Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict);
@DomName('RTCSessionDescription.sdp')
@DocsEditable()
@@ -24772,19 +24139,7 @@
@DocsEditable()
int get width => _blink.Native_Screen_width_Getter(this);
- bool lockOrientation(orientation_OR_orientations) {
- if ((orientation_OR_orientations is String || orientation_OR_orientations == null)) {
- return _lockOrientation_1(orientation_OR_orientations);
- }
- if ((orientation_OR_orientations is List<String> || orientation_OR_orientations == null)) {
- return _lockOrientation_2(orientation_OR_orientations);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- bool _lockOrientation_1(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_1_Callback(this, orientation_OR_orientations);
-
- bool _lockOrientation_2(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_2_Callback(this, orientation_OR_orientations);
+ bool lockOrientation(orientation_OR_orientations) => _blink.Native_Screen_lockOrientation(this, orientation_OR_orientations);
@DomName('Screen.unlockOrientation')
@DocsEditable()
@@ -25414,12 +24769,7 @@
@DomName('SharedWorker.SharedWorker')
@DocsEditable()
- factory SharedWorker(String scriptURL, [String name]) {
- return SharedWorker._create_1(scriptURL, name);
- }
-
- @DocsEditable()
- static SharedWorker _create_1(scriptURL, name) => _blink.Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+ factory SharedWorker(String scriptURL, [String name]) => _blink.Native_SharedWorker_SharedWorker(scriptURL, name);
@DomName('SharedWorker.port')
@DocsEditable()
@@ -25559,18 +24909,7 @@
@Experimental() // untriaged
void appendBuffer(ByteBuffer data) => _blink.Native_SourceBuffer_appendBuffer_Callback(this, data);
- void appendStream(FileStream stream, [int maxSize]) {
- if (maxSize != null) {
- _appendStream_1(stream, maxSize);
- return;
- }
- _appendStream_2(stream);
- return;
- }
-
- void _appendStream_1(stream, maxSize) => _blink.Native_SourceBuffer__appendStream_1_Callback(this, stream, maxSize);
-
- void _appendStream_2(stream) => _blink.Native_SourceBuffer__appendStream_2_Callback(this, stream);
+ void appendStream(FileStream stream, [int maxSize]) => _blink.Native_SourceBuffer_appendStream(this, stream, maxSize);
@DomName('SourceBuffer.appendTypedData')
@DocsEditable()
@@ -25804,12 +25143,7 @@
@DomName('SpeechGrammar.SpeechGrammar')
@DocsEditable()
- factory SpeechGrammar() {
- return SpeechGrammar._create_1();
- }
-
- @DocsEditable()
- static SpeechGrammar _create_1() => _blink.Native_SpeechGrammar__create_1constructorCallback();
+ factory SpeechGrammar() => _blink.Native_SpeechGrammar_SpeechGrammar();
@DomName('SpeechGrammar.src')
@DocsEditable()
@@ -25845,12 +25179,7 @@
@DomName('SpeechGrammarList.SpeechGrammarList')
@DocsEditable()
- factory SpeechGrammarList() {
- return SpeechGrammarList._create_1();
- }
-
- @DocsEditable()
- static SpeechGrammarList _create_1() => _blink.Native_SpeechGrammarList__create_1constructorCallback();
+ factory SpeechGrammarList() => _blink.Native_SpeechGrammarList_SpeechGrammarList();
@DomName('SpeechGrammarList.length')
@DocsEditable()
@@ -25902,31 +25231,9 @@
SpeechGrammar elementAt(int index) => this[index];
// -- end List<SpeechGrammar> mixins.
- void addFromString(String string, [num weight]) {
- if (weight != null) {
- _addFromString_1(string, weight);
- return;
- }
- _addFromString_2(string);
- return;
- }
+ void addFromString(String string, [num weight]) => _blink.Native_SpeechGrammarList_addFromString(this, string, weight);
- void _addFromString_1(string, weight) => _blink.Native_SpeechGrammarList__addFromString_1_Callback(this, string, weight);
-
- void _addFromString_2(string) => _blink.Native_SpeechGrammarList__addFromString_2_Callback(this, string);
-
- void addFromUri(String src, [num weight]) {
- if (weight != null) {
- _addFromUri_1(src, weight);
- return;
- }
- _addFromUri_2(src);
- return;
- }
-
- void _addFromUri_1(src, weight) => _blink.Native_SpeechGrammarList__addFromUri_1_Callback(this, src, weight);
-
- void _addFromUri_2(src) => _blink.Native_SpeechGrammarList__addFromUri_2_Callback(this, src);
+ void addFromUri(String src, [num weight]) => _blink.Native_SpeechGrammarList_addFromUri(this, src, weight);
@DomName('SpeechGrammarList.item')
@DocsEditable()
@@ -26105,12 +25412,7 @@
@DomName('SpeechRecognition.SpeechRecognition')
@DocsEditable()
- factory SpeechRecognition() {
- return SpeechRecognition._create_1();
- }
-
- @DocsEditable()
- static SpeechRecognition _create_1() => _blink.Native_SpeechRecognition__create_1constructorCallback();
+ factory SpeechRecognition() => _blink.Native_SpeechRecognition_SpeechRecognition();
/// Checks if this type is supported on the current platform.
static bool get supported => true;
@@ -26525,12 +25827,7 @@
@DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
@DocsEditable()
- factory SpeechSynthesisUtterance([String text]) {
- return SpeechSynthesisUtterance._create_1(text);
- }
-
- @DocsEditable()
- static SpeechSynthesisUtterance _create_1(text) => _blink.Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+ factory SpeechSynthesisUtterance([String text]) => _blink.Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text);
@DomName('SpeechSynthesisUtterance.lang')
@DocsEditable()
@@ -26761,49 +26058,11 @@
@DocsEditable()
int get _length => _blink.Native_Storage_length_Getter(this);
- bool __delete__(index_OR_name) {
- if ((index_OR_name is int || index_OR_name == null)) {
- return ___delete___1(index_OR_name);
- }
- if ((index_OR_name is String || index_OR_name == null)) {
- return ___delete___2(index_OR_name);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
+ bool __delete__(index_OR_name) => _blink.Native_Storage___delete__(this, index_OR_name);
- bool ___delete___1(index_OR_name) => _blink.Native_Storage____delete___1_Callback(this, index_OR_name);
+ String __getter__(index_OR_name) => _blink.Native_Storage___getter__(this, index_OR_name);
- bool ___delete___2(index_OR_name) => _blink.Native_Storage____delete___2_Callback(this, index_OR_name);
-
- String __getter__(index_OR_name) {
- if ((index_OR_name is int || index_OR_name == null)) {
- return ___getter___1(index_OR_name);
- }
- if ((index_OR_name is String || index_OR_name == null)) {
- return ___getter___2(index_OR_name);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- String ___getter___1(index_OR_name) => _blink.Native_Storage____getter___1_Callback(this, index_OR_name);
-
- String ___getter___2(index_OR_name) => _blink.Native_Storage____getter___2_Callback(this, index_OR_name);
-
- void __setter__(index_OR_name, String value) {
- if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
- ___setter___1(index_OR_name, value);
- return;
- }
- if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
- ___setter___2(index_OR_name, value);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void ___setter___1(index_OR_name, value) => _blink.Native_Storage____setter___1_Callback(this, index_OR_name, value);
-
- void ___setter___2(index_OR_name, value) => _blink.Native_Storage____setter___2_Callback(this, index_OR_name, value);
+ void __setter__(index_OR_name, String value) => _blink.Native_Storage___setter__(this, index_OR_name, value);
@DomName('Storage.clear')
@DocsEditable()
@@ -27688,34 +26947,9 @@
@DocsEditable()
void setCustomValidity(String error) => _blink.Native_HTMLTextAreaElement_setCustomValidity_Callback(this, error);
- void setRangeText(String replacement, {int start, int end, String selectionMode}) {
- if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
- _setRangeText_1(replacement);
- return;
- }
- if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
- _setRangeText_2(replacement, start, end, selectionMode);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
+ void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLTextAreaElement_setRangeText(this, replacement, start, end, selectionMode);
- void _setRangeText_1(replacement) => _blink.Native_HTMLTextAreaElement__setRangeText_1_Callback(this, replacement);
-
- void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLTextAreaElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
-
- void setSelectionRange(int start, int end, [String direction]) {
- if (direction != null) {
- _setSelectionRange_1(start, end, direction);
- return;
- }
- _setSelectionRange_2(start, end);
- return;
- }
-
- void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLTextAreaElement__setSelectionRange_1_Callback(this, start, end, direction);
-
- void _setSelectionRange_2(start, end) => _blink.Native_HTMLTextAreaElement__setSelectionRange_2_Callback(this, start, end);
+ void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLTextAreaElement_setSelectionRange(this, start, end, direction);
}
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
@@ -28961,34 +28195,7 @@
// To suppress missing implicit constructor warnings.
factory Url._() { throw new UnsupportedError("Not supported"); }
- @DomName('URL._createObjectUrlFromWebKitSource')
- @DocsEditable()
- @Experimental() // untriaged
- static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) => _blink.Native_URL__createObjectUrlFromWebKitSource_Callback(source);
-
- static String createObjectUrl(blob_OR_source_OR_stream) {
- if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
- return _createObjectURL_1(blob_OR_source_OR_stream);
- }
- if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
- return _createObjectURL_2(blob_OR_source_OR_stream);
- }
- if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
- return _createObjectURL_3(blob_OR_source_OR_stream);
- }
- if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
- return _createObjectURL_4(blob_OR_source_OR_stream);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- static String _createObjectURL_1(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
-
- static String _createObjectURL_2(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
-
- static String _createObjectURL_3(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
-
- static String _createObjectURL_4(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream);
+ static String createObjectUrl(blob_OR_source_OR_stream) => _blink.Native_URL_createObjectUrl(blob_OR_source_OR_stream);
@DomName('URL.createObjectUrlFromBlob')
@DocsEditable()
@@ -29506,12 +28713,7 @@
@DomName('VTTCue.VTTCue')
@DocsEditable()
- factory VttCue(num startTime, num endTime, String text) {
- return VttCue._create_1(startTime, endTime, text);
- }
-
- @DocsEditable()
- static VttCue _create_1(startTime, endTime, text) => _blink.Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+ factory VttCue(num startTime, num endTime, String text) => _blink.Native_VTTCue_VttCue(startTime, endTime, text);
@DomName('VTTCue.align')
@DocsEditable()
@@ -29615,12 +28817,7 @@
@DomName('VTTRegion.VTTRegion')
@DocsEditable()
- factory VttRegion() {
- return VttRegion._create_1();
- }
-
- @DocsEditable()
- static VttRegion _create_1() => _blink.Native_VTTRegion__create_1constructorCallback();
+ factory VttRegion() => _blink.Native_VTTRegion_VttRegion();
@DomName('VTTRegion.height')
@DocsEditable()
@@ -29832,27 +29029,7 @@
@DomName('WebSocket.WebSocket')
@DocsEditable()
- factory WebSocket(String url, [protocol_OR_protocols]) {
- if ((url is String || url == null) && protocol_OR_protocols == null) {
- return WebSocket._create_1(url);
- }
- if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
- return WebSocket._create_2(url, protocol_OR_protocols);
- }
- if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
- return WebSocket._create_3(url, protocol_OR_protocols);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- @DocsEditable()
- static WebSocket _create_1(url) => _blink.Native_WebSocket__create_1constructorCallback(url);
-
- @DocsEditable()
- static WebSocket _create_2(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
-
- @DocsEditable()
- static WebSocket _create_3(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+ factory WebSocket(String url, [protocol_OR_protocols]) => _blink.Native_WebSocket_WebSocket(url, protocol_OR_protocols);
/// Checks if this type is supported on the current platform.
static bool get supported => true;
@@ -29901,24 +29078,7 @@
@DocsEditable()
String get url => _blink.Native_WebSocket_url_Getter(this);
- void close([int code, String reason]) {
- if (reason != null) {
- _close_1(code, reason);
- return;
- }
- if (code != null) {
- _close_2(code);
- return;
- }
- _close_3();
- return;
- }
-
- void _close_1(code, reason) => _blink.Native_WebSocket__close_1_Callback(this, code, reason);
-
- void _close_2(code) => _blink.Native_WebSocket__close_2_Callback(this, code);
-
- void _close_3() => _blink.Native_WebSocket__close_3_Callback(this);
+ void close([int code, String reason]) => _blink.Native_WebSocket_close(this, code, reason);
/**
* Transmit data to the server over this connection.
@@ -30964,19 +30124,7 @@
@DocsEditable()
WindowBase get window => _blink.Native_Window_window_Getter(this);
- WindowBase __getter__(index_OR_name) {
- if ((index_OR_name is int || index_OR_name == null)) {
- return ___getter___1(index_OR_name);
- }
- if ((index_OR_name is String || index_OR_name == null)) {
- return ___getter___2(index_OR_name);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- WindowBase ___getter___1(index_OR_name) => _blink.Native_Window____getter___1_Callback(this, index_OR_name);
-
- WindowBase ___getter___2(index_OR_name) => _blink.Native_Window____getter___2_Callback(this, index_OR_name);
+ WindowBase __getter__(index_OR_name) => _blink.Native_Window___getter__(this, index_OR_name);
/**
* Displays a modal alert to the user.
@@ -31805,12 +30953,7 @@
@DomName('Worker.Worker')
@DocsEditable()
- factory Worker(String scriptUrl) {
- return Worker._create_1(scriptUrl);
- }
-
- @DocsEditable()
- static Worker _create_1(scriptUrl) => _blink.Native_Worker__create_1constructorCallback(scriptUrl);
+ factory Worker(String scriptUrl) => _blink.Native_Worker_Worker(scriptUrl);
/// Checks if this type is supported on the current platform.
static bool get supported => true;
@@ -32109,12 +31252,7 @@
@DomName('XPathEvaluator.XPathEvaluator')
@DocsEditable()
- factory XPathEvaluator() {
- return XPathEvaluator._create_1();
- }
-
- @DocsEditable()
- static XPathEvaluator _create_1() => _blink.Native_XPathEvaluator__create_1constructorCallback();
+ factory XPathEvaluator() => _blink.Native_XPathEvaluator_XPathEvaluator();
@DomName('XPathEvaluator.createExpression')
@DocsEditable()
@@ -32293,12 +31431,7 @@
@DomName('XMLSerializer.XMLSerializer')
@DocsEditable()
- factory XmlSerializer() {
- return XmlSerializer._create_1();
- }
-
- @DocsEditable()
- static XmlSerializer _create_1() => _blink.Native_XMLSerializer__create_1constructorCallback();
+ factory XmlSerializer() => _blink.Native_XMLSerializer_XmlSerializer();
@DomName('XMLSerializer.serializeToString')
@DocsEditable()
@@ -32324,12 +31457,7 @@
@DomName('XSLTProcessor.XSLTProcessor')
@DocsEditable()
- factory XsltProcessor() {
- return XsltProcessor._create_1();
- }
-
- @DocsEditable()
- static XsltProcessor _create_1() => _blink.Native_XSLTProcessor__create_1constructorCallback();
+ factory XsltProcessor() => _blink.Native_XSLTProcessor_XsltProcessor();
/// Checks if this type is supported on the current platform.
static bool get supported => true;
@@ -33013,12 +32141,7 @@
@DomName('FileReaderSync.FileReaderSync')
@DocsEditable()
- factory _FileReaderSync() {
- return _FileReaderSync._create_1();
- }
-
- @DocsEditable()
- static _FileReaderSync _create_1() => _blink.Native_FileReaderSync__create_1constructorCallback();
+ factory _FileReaderSync() => _blink.Native_FileReaderSync__FileReaderSync();
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -33756,12 +32879,7 @@
@DomName('WebKitCSSMatrix.WebKitCSSMatrix')
@DocsEditable()
- factory _WebKitCSSMatrix([String cssValue]) {
- return _WebKitCSSMatrix._create_1(cssValue);
- }
-
- @DocsEditable()
- static _WebKitCSSMatrix _create_1(cssValue) => _blink.Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+ factory _WebKitCSSMatrix([String cssValue]) => _blink.Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -33796,12 +32914,7 @@
@DomName('WebKitMediaSource.WebKitMediaSource')
@DocsEditable()
- factory _WebKitMediaSource() {
- return _WebKitMediaSource._create_1();
- }
-
- @DocsEditable()
- static _WebKitMediaSource _create_1() => _blink.Native_WebKitMediaSource__create_1constructorCallback();
+ factory _WebKitMediaSource() => _blink.Native_WebKitMediaSource__WebKitMediaSource();
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -38060,7 +37173,6 @@
throw new UnsupportedError('Element is incorrect type');
}
return _Utils.changeElementWrapper(element, _type);
- return null;
}
}
@@ -38864,7 +37976,7 @@
String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
void clear() => Maps.clear(this);
void forEach(void f(String key, String value)) => Maps.forEach(this, f);
- Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
+ Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
Iterable<String> get values => Maps.getValues(this);
int get length => Maps.length(this);
bool get isEmpty => Maps.isEmpty(this);
diff --git a/sdk/lib/html/dartium/nativewrappers.dart b/sdk/lib/html/dartium/nativewrappers.dart
index 5000343..55e5742 100644
--- a/sdk/lib/html/dartium/nativewrappers.dart
+++ b/sdk/lib/html/dartium/nativewrappers.dart
@@ -4,8 +4,8 @@
library nativewrappers;
-class NativeFieldWrapperClass1 {
- NativeFieldWrapperClass1() {
+class NativeFieldWrapperClass2 {
+ NativeFieldWrapperClass2() {
throw new UnsupportedError(
"Generative constructors not supported on native types.");
}
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 426ab31..2d51aed 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -223,24 +223,7 @@
@DocsEditable()
void deleteObjectStore(String name) => _blink.Native_IDBDatabase_deleteObjectStore_Callback(this, name);
- Transaction transaction(storeName_OR_storeNames, String mode) {
- if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
- return _transaction_1(storeName_OR_storeNames, mode);
- }
- if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
- return _transaction_2(storeName_OR_storeNames, mode);
- }
- if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
- return _transaction_3(storeName_OR_storeNames, mode);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- Transaction _transaction_1(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_1_Callback(this, storeName_OR_storeNames, mode);
-
- Transaction _transaction_2(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_2_Callback(this, storeName_OR_storeNames, mode);
-
- Transaction _transaction_3(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_3_Callback(this, storeName_OR_storeNames, mode);
+ Transaction transaction(storeName_OR_storeNames, String mode) => _blink.Native_IDBDatabase_transaction(this, storeName_OR_storeNames, mode);
@DomName('IDBDatabase.transactionList')
@DocsEditable()
@@ -386,16 +369,7 @@
@DocsEditable()
OpenDBRequest _deleteDatabase(String name) => _blink.Native_IDBFactory_deleteDatabase_Callback(this, name);
- OpenDBRequest _open(String name, [int version]) {
- if (version != null) {
- return _open_1(name, version);
- }
- return _open_2(name);
- }
-
- OpenDBRequest _open_1(name, version) => _blink.Native_IDBFactory__open_1_Callback(this, name, version);
-
- OpenDBRequest _open_2(name) => _blink.Native_IDBFactory__open_2_Callback(this, name);
+ OpenDBRequest _open(String name, [int version]) => _blink.Native_IDBFactory__open(this, name, version);
@DomName('IDBFactory.webkitGetDatabaseNames')
@DocsEditable()
@@ -795,19 +769,7 @@
@DocsEditable()
Request _count(Object key) => _blink.Native_IDBObjectStore_count_Callback(this, key);
- Index _createIndex(String name, keyPath, [Map options]) {
- if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
- return _createIndex_1(name, keyPath, options);
- }
- if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
- return _createIndex_2(name, keyPath, options);
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- Index _createIndex_1(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_1_Callback(this, name, keyPath, options);
-
- Index _createIndex_2(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_2_Callback(this, name, keyPath, options);
+ Index _createIndex(String name, keyPath, [Map options]) => _blink.Native_IDBObjectStore__createIndex(this, name, keyPath, options);
@DomName('IDBObjectStore.delete')
@DocsEditable()
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 4ad6d14..6149cb9 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -46,18 +46,18 @@
bool get isEmpty => length == 0;
E get first {
- if (length == 0) throw new StateError("No elements");
+ if (length == 0) throw IterableElementError.noElement();
return elementAt(0);
}
E get last {
- if (length == 0) throw new StateError("No elements");
+ if (length == 0) throw IterableElementError.noElement();
return elementAt(length - 1);
}
E get single {
- if (length == 0) throw new StateError("No elements");
- if (length > 1) throw new StateError("Too many elements");
+ if (length == 0) throw IterableElementError.noElement();
+ if (length > 1) throw IterableElementError.tooMany();
return elementAt(0);
}
@@ -104,7 +104,7 @@
}
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
dynamic lastWhere(bool test(E element), { Object orElse() }) {
@@ -117,7 +117,7 @@
}
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E singleWhere(bool test(E element)) {
@@ -128,7 +128,7 @@
E element = elementAt(i);
if (test(element)) {
if (matchFound) {
- throw new StateError("More than one matching element");
+ throw IterableElementError.tooMany();
}
matchFound = true;
match = element;
@@ -138,7 +138,7 @@
}
}
if (matchFound) return match;
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
String join([String separator = ""]) {
@@ -175,7 +175,7 @@
Iterable map(f(E element)) => new MappedListIterable(this, f);
E reduce(E combine(var value, E element)) {
- if (length == 0) throw new StateError("No elements");
+ if (length == 0) throw IterableElementError.noElement();
E value = elementAt(0);
for (int i = 1; i < length; i++) {
value = combine(value, elementAt(i));
@@ -661,11 +661,11 @@
int get length => 0;
- E get first { throw new StateError("No elements"); }
+ E get first { throw IterableElementError.noElement(); }
- E get last { throw new StateError("No elements"); }
+ E get last { throw IterableElementError.noElement(); }
- E get single { throw new StateError("No elements"); }
+ E get single { throw IterableElementError.noElement(); }
E elementAt(int index) { throw new RangeError.value(index); }
@@ -677,17 +677,17 @@
E firstWhere(bool test(E element), { E orElse() }) {
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E lastWhere(bool test(E element), { E orElse() }) {
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
E singleWhere(bool test(E element), { E orElse() }) {
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
String join([String separator = ""]) => "";
@@ -697,7 +697,7 @@
Iterable map(f(E element)) => const EmptyIterable();
E reduce(E combine(E value, E element)) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
fold(var initialValue, combine(var previousValue, E element)) {
@@ -774,7 +774,7 @@
static dynamic reduce(Iterable iterable,
dynamic combine(previousValue, element)) {
Iterator iterator = iterable.iterator;
- if (!iterator.moveNext()) throw new StateError("No elements");
+ if (!iterator.moveNext()) throw IterableElementError.noElement();
var value = iterator.current;
while (iterator.moveNext()) {
value = combine(value, iterator.current);
@@ -824,7 +824,7 @@
static dynamic first(Iterable iterable) {
Iterator it = iterable.iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
return it.current;
}
@@ -832,7 +832,7 @@
static dynamic last(Iterable iterable) {
Iterator it = iterable.iterator;
if (!it.moveNext()) {
- throw new StateError("No elements");
+ throw IterableElementError.noElement();
}
dynamic result;
do {
@@ -843,9 +843,9 @@
static dynamic single(Iterable iterable) {
Iterator it = iterable.iterator;
- if (!it.moveNext()) throw new StateError("No elements");
+ if (!it.moveNext()) throw IterableElementError.noElement();
dynamic result = it.current;
- if (it.moveNext()) throw new StateError("More than one element");
+ if (it.moveNext()) throw IterableElementError.tooMany();
return result;
}
@@ -856,7 +856,7 @@
if (test(element)) return element;
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
static dynamic lastWhere(Iterable iterable,
@@ -872,7 +872,7 @@
}
if (foundMatching) return result;
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
static dynamic lastWhereList(List list,
@@ -884,7 +884,7 @@
if (test(element)) return element;
}
if (orElse != null) return orElse();
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
static dynamic singleWhere(Iterable iterable, bool test(dynamic value)) {
@@ -893,14 +893,14 @@
for (dynamic element in iterable) {
if (test(element)) {
if (foundMatching) {
- throw new StateError("More than one matching element");
+ throw IterableElementError.tooMany();
}
result = element;
foundMatching = true;
}
}
if (foundMatching) return result;
- throw new StateError("No matching element");
+ throw IterableElementError.noElement();
}
static dynamic elementAt(Iterable iterable, int index) {
@@ -1058,7 +1058,7 @@
otherStart = 0;
}
if (otherStart + length > otherList.length) {
- throw new StateError("Not enough elements");
+ throw IterableElementError.tooFew();
}
Lists.copy(otherList, otherStart, list, start, length);
}
@@ -1165,3 +1165,15 @@
return result;
}
}
+
+/**
+ * Creates errors throw by [Iterable] when the element count is wrong.
+ */
+abstract class IterableElementError {
+ /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */
+ static StateError noElement() => new StateError("No element");
+ /** Error thrown by, e.g., [Iterable.single] if there are too many results. */
+ static StateError tooMany() => new StateError("Too many elements");
+ /** Error thrown by, e.g., [List.setRange] if there are too few elements. */
+ static StateError tooFew() => new StateError("Too few elements");
+}
diff --git a/sdk/lib/internal/list.dart b/sdk/lib/internal/list.dart
index f40c39b..473a87a 100644
--- a/sdk/lib/internal/list.dart
+++ b/sdk/lib/internal/list.dart
@@ -307,6 +307,49 @@
}
/**
+ * Creates errors thrown by unmodifiable lists when they are attempted modified.
+ *
+ * This class creates [UnsupportedError]s with specialized messages.
+ */
+abstract class UnmodifiableListError {
+ /** Error thrown when trying to add elements to an unmodifiable list. */
+ static UnsupportedError add()
+ => new UnsupportedError("Cannot add to unmodifiable List");
+
+ /** Error thrown when trying to add elements to an unmodifiable list. */
+ static UnsupportedError change()
+ => new UnsupportedError(
+ "Cannot change the content of an unmodifiable List");
+
+ /** Error thrown when trying to change the length of an unmodifiable list. */
+ static UnsupportedError length()
+ => new UnsupportedError("Cannot change length of unmodifiable List");
+
+ /** Error thrown when trying to remove elements from an unmodifiable list. */
+ static UnsupportedError remove()
+ => new UnsupportedError("Cannot remove from unmodifiable List");
+}
+
+/**
+ * Creates errors thrown by non-growable lists when they are attempted modified.
+ *
+ * This class creates [UnsupportedError]s with specialized messages.
+ */
+abstract class NonGrowableListError {
+ /** Error thrown when trying to add elements to an non-growable list. */
+ static UnsupportedError add()
+ => new UnsupportedError("Cannot add to non-growable List");
+
+ /** Error thrown when trying to change the length of an non-growable list. */
+ static UnsupportedError length()
+ => new UnsupportedError("Cannot change length of non-growable List");
+
+ /** Error thrown when trying to remove elements from an non-growable list. */
+ static UnsupportedError remove()
+ => new UnsupportedError("Cannot remove from non-growable List");
+}
+
+/**
* Converts a growable list to a fixed length list with the same elements.
*
* For internal use only.
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 18360c6..371543f 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -877,14 +877,8 @@
*
* void handleGetRequest(HttpRequest req) {
* HttpResponse res = req.response;
- * var body = [];
- * req.listen((List<int> buffer) => body.add(buffer),
- * onDone: () {
- * res.write('Received ${body.length} for request ');
- * res.write(' ${req.method}: ${req.uri.path}');
- * res.close();
- * },
- * onError: handleError);
+ * res.write('Received request ${req.method}: ${req.uri.path}');
+ * res.close();
* }
*/
abstract class HttpRequest implements Stream<List<int>> {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index b966c61..680acb6 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -246,13 +246,22 @@
{bool sendClientCertificate: false,
String certificateName,
bool onBadCertificate(X509Certificate certificate)}) {
- return _RawSecureSocket.connect(
+ _RawSecureSocket._verifyFields(
host,
port,
certificateName,
- is_server: false,
- sendClientCertificate: sendClientCertificate,
- onBadCertificate: onBadCertificate);
+ false,
+ false,
+ false,
+ sendClientCertificate,
+ onBadCertificate);
+ return RawSocket.connect(host, port)
+ .then((socket) {
+ return secure(socket,
+ sendClientCertificate: sendClientCertificate,
+ certificateName: certificateName,
+ onBadCertificate: onBadCertificate);
+ });
}
/**
@@ -293,7 +302,7 @@
socket.readEventsEnabled = false;
socket.writeEventsEnabled = false;
return _RawSecureSocket.connect(
- host != null ? host : socket.address,
+ host != null ? host : socket.address.host,
socket.port,
certificateName,
is_server: false,
@@ -463,34 +472,24 @@
bool requireClientCertificate: false,
bool sendClientCertificate: false,
bool onBadCertificate(X509Certificate certificate)}) {
- var future;
_verifyFields(host, requestedPort, certificateName, is_server,
requestClientCertificate, requireClientCertificate,
sendClientCertificate, onBadCertificate);
- if (host is String) {
- if (socket != null) {
- future = new Future.value(
- (socket.address as dynamic)._cloneWithNewHost(host));
- } else {
- future = InternetAddress.lookup(host).then((addrs) => addrs.first);
- }
- } else {
- future = new Future.value(host);
- }
- return future.then((addr) {
- return new _RawSecureSocket(addr,
- requestedPort,
- certificateName,
- is_server,
- socket,
- subscription,
- bufferedData,
- requestClientCertificate,
- requireClientCertificate,
- sendClientCertificate,
- onBadCertificate)
- ._handshakeComplete.future;
- });
+ if (host is InternetAddress) host = host.host;
+ var address = socket.address;
+ if (host != null) address = address._cloneWithNewHost(host);
+ return new _RawSecureSocket(address,
+ requestedPort,
+ certificateName,
+ is_server,
+ socket,
+ subscription,
+ bufferedData,
+ requestClientCertificate,
+ requireClientCertificate,
+ sendClientCertificate,
+ onBadCertificate)
+ ._handshakeComplete.future;
}
_RawSecureSocket(
@@ -498,7 +497,7 @@
int requestedPort,
this.certificateName,
this.is_server,
- RawSocket socket,
+ RawSocket this._socket,
this._socketSubscription,
this._bufferedData,
this.requestClientCertificate,
@@ -521,31 +520,26 @@
if (onBadCertificate != null) {
_secureFilter.registerBadCertificateCallback(_onBadCertificateWrapper);
}
- var futureSocket;
- if (socket == null) {
- futureSocket = RawSocket.connect(address, requestedPort);
+ _socket.readEventsEnabled = true;
+ _socket.writeEventsEnabled = false;
+ if (_socketSubscription == null) {
+ // If a current subscription is provided use this otherwise
+ // create a new one.
+ _socketSubscription = _socket.listen(_eventDispatcher,
+ onError: _reportError,
+ onDone: _doneHandler);
} else {
- futureSocket = new Future.value(socket);
- }
- futureSocket.then((rawSocket) {
- _socket = rawSocket;
- _socket.readEventsEnabled = true;
- _socket.writeEventsEnabled = false;
- if (_socketSubscription == null) {
- // If a current subscription is provided use this otherwise
- // create a new one.
- _socketSubscription = _socket.listen(_eventDispatcher,
- onError: _reportError,
- onDone: _doneHandler);
- } else {
- if (_socketSubscription.isPaused) {
- throw new StateError("Subscription passed to TLS upgrade is paused");
- }
- _socketSubscription
- ..onData(_eventDispatcher)
- ..onError(_reportError)
- ..onDone(_doneHandler);
+ if (_socketSubscription.isPaused) {
+ _socket.close();
+ throw new ArgumentError(
+ "Subscription passed to TLS upgrade is paused");
}
+ _socketSubscription
+ ..onData(_eventDispatcher)
+ ..onError(_reportError)
+ ..onDone(_doneHandler);
+ }
+ try {
_secureFilter.connect(address.host,
(address as dynamic)._in_addr,
port,
@@ -556,8 +550,9 @@
requireClientCertificate,
sendClientCertificate);
_secureHandshake();
- })
- .catchError(_reportError);
+ } catch (e, s) {
+ _reportError(e, s);
+ }
}
StreamSubscription listen(void onData(RawSocketEvent data),
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b1e5be7..337029c 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -244,6 +244,36 @@
* is fully closed and is no longer bound.
*/
Future<RawServerSocket> close();
+
+ /**
+ * Get the [RawServerSocketReference].
+ *
+ * WARNING: This feature is *highly experimental* and currently only works on
+ * Linux. The API is most likely going to change in the near future.
+ *
+ * The returned [RawServerSocketReference] can be used to create other
+ * [RawServerSocket]s listening on the same port,
+ * using [RawServerSocketReference.create].
+ * Incoming connections on the port will be distributed fairly between the
+ * active server sockets.
+ * The [RawServerSocketReference] can be distributed to other isolates through
+ * a [RawSendPort].
+ */
+ RawServerSocketReference get reference;
+}
+
+
+/**
+ * A [RawServerSocketReference].
+ *
+ * WARNING: This class is used with [RawServerSocket.reference] which is highly
+ * experimental.
+ */
+abstract class RawServerSocketReference {
+ /**
+ * Create a new [RawServerSocket], from this reference.
+ */
+ Future<RawServerSocket> create();
}
@@ -305,8 +335,39 @@
* is fully closed and is no longer bound.
*/
Future<ServerSocket> close();
+
+ /**
+ * Get the [ServerSocketReference].
+ *
+ * WARNING: This feature is *highly experimental* and currently only works on
+ * Linux. The API is most likely going to change in the near future.
+ *
+ * The returned [ServerSocketReference] can be used to create other
+ * [ServerSocket]s listening on the same port,
+ * using [ServerSocketReference.create].
+ * Incoming connections on the port will be distributed fairly between the
+ * active server sockets.
+ * The [ServerSocketReference] can be distributed to other isolates through a
+ * [SendPort].
+ */
+ ServerSocketReference get reference;
}
+
+/**
+ * A [ServerSocketReference].
+ *
+ * WARNING: This class is used with [ServerSocket.reference] which is highly
+ * experimental.
+ */
+abstract class ServerSocketReference {
+ /**
+ * Create a new [ServerSocket], from this reference.
+ */
+ Future<ServerSocket> create();
+}
+
+
/**
* The [SocketDirection] is used as a parameter to [Socket.close] and
* [RawSocket.close] to close a socket in the specified direction(s).
@@ -388,8 +449,10 @@
* if the host-lookup or connection failed.
*
* [host] can either be a [String] or an [InternetAddress]. If [host] is a
- * [String], [connect] will perform a [InternetAddress.lookup] and use
- * the first value in the list.
+ * [String], [connect] will perform a [InternetAddress.lookup] and try
+ * all returned [InternetAddress]es, in turn, until connected. Unless a
+ * connection was established, the error from the first attempt is
+ * returned.
*/
external static Future<RawSocket> connect(host, int port);
@@ -479,8 +542,10 @@
* if the host-lookup or connection failed.
*
* [host] can either be a [String] or an [InternetAddress]. If [host] is a
- * [String], [connect] will perform a [InternetAddress.lookup] and use
- * the first value in the list.
+ * [String], [connect] will perform a [InternetAddress.lookup] and try
+ * all returned [InternetAddress]es, in turn, until connected. Unless a
+ * connection was established, the error from the first attempt is
+ * returned.
*/
external static Future<Socket> connect(host, int port);
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index a35ca3e..327ef3a 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -133,6 +133,10 @@
{List<String> protocols: const []}) =>
_WebSocketImpl.connect(url, protocols);
+ @Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
+ ' instead of `extends` if implementing this abstract class.')
+ WebSocket();
+
/**
* Creates a WebSocket from an already-upgraded socket.
*
@@ -144,13 +148,18 @@
*
* [protocol] should be the protocol negotiated by this handshake, if any.
*
- * If [serverSide] is `false`, the WebSocket will act as the client and mask
- * the messages it sends. If it's `true`, it will act as the server and will
- * not mask its messages.
+ * [serverSide] must be passed explicitly. If it's `false`, the WebSocket will
+ * act as the client and mask the messages it sends. If it's `true`, it will
+ * act as the server and will not mask its messages.
*/
factory WebSocket.fromUpgradedSocket(Socket socket, {String protocol,
- bool serverSide: true}) =>
- new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+ bool serverSide}) {
+ if (serverSide == null) {
+ throw new ArgumentError("The serverSide argument must be passed "
+ "explicitly to WebSocket.fromUpgradedSocket.");
+ }
+ return new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+ }
/**
* Returns the current state of the connection.
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index ddffcd6..7fb810e 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -55,9 +55,6 @@
*/
library dart.mirrors;
-import 'dart:async';
-import 'dart:isolate';
-
/**
* A [MirrorSystem] is the main interface used to reflect on a set of
* associated libraries.
@@ -569,7 +566,7 @@
}
/// A mirror on an import or export declaration.
-abstract class LibraryDependencyMirror {
+abstract class LibraryDependencyMirror implements Mirror {
/// Is `true` if this dependency is an import.
bool get isImport;
@@ -597,7 +594,7 @@
}
/// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorMirror {
+abstract class CombinatorMirror implements Mirror {
/// The list of identifiers on the combinator.
List<Symbol> get identifiers;
diff --git a/sdk/lib/profiler/profiler.dart b/sdk/lib/profiler/profiler.dart
index 56614dd..0bcae56 100644
--- a/sdk/lib/profiler/profiler.dart
+++ b/sdk/lib/profiler/profiler.dart
@@ -14,53 +14,52 @@
/// Label of [this].
String get label;
- /// Make [this] the current tag for the isolate.
- makeCurrent();
+ /// Make [this] the current tag for the isolate. Returns the current tag
+ /// before setting.
+ UserTag makeCurrent();
+
+ /// The default [UserTag] with label 'Default'.
+ static UserTag get defaultTag => _FakeUserTag._defaultTag;
}
// This is a fake implementation of UserTag so that code can compile and run
// in dart2js.
class _FakeUserTag implements UserTag {
- static List _instances = [];
+ static Map _instances = {};
_FakeUserTag.real(this.label);
factory _FakeUserTag(String label) {
// Canonicalize by name.
- for (var tag in _instances) {
- if (tag.label == label) {
- return tag;
- }
+ var existingTag = _instances[label];
+ if (existingTag != null) {
+ return existingTag;
}
// Throw an exception if we've reached the maximum number of user tags.
if (_instances.length == UserTag.MAX_USER_TAGS) {
throw new UnsupportedError(
'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
}
- // Create a new instance and add it to the instance list.
+ // Create a new instance and add it to the instance map.
var instance = new _FakeUserTag.real(label);
- _instances.add(instance);
+ _instances[label] = instance;
return instance;
}
final String label;
- makeCurrent() {
+ UserTag makeCurrent() {
+ var old = _currentTag;
_currentTag = this;
+ return old;
}
+
+ static final UserTag _defaultTag = new _FakeUserTag('Default');
}
-var _currentTag = null;
+var _currentTag = _FakeUserTag._defaultTag;
/// Returns the current [UserTag] for the isolate.
UserTag getCurrentTag() {
return _currentTag;
}
-
-/// Sets the current [UserTag] for the isolate to null. Returns current tag
-/// before clearing.
-UserTag clearCurrentTag() {
- var old = _currentTag;
- _currentTag = null;
- return old;
-}
\ No newline at end of file
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 55ea84b..a88c32f 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -231,43 +231,9 @@
@DocsEditable()
void noteOn(num when) => _blink.Native_AudioBufferSourceNode_noteOn_Callback(this, when);
- void start([num when, num grainOffset, num grainDuration]) {
- if (grainDuration != null) {
- _start_1(when, grainOffset, grainDuration);
- return;
- }
- if (grainOffset != null) {
- _start_2(when, grainOffset);
- return;
- }
- if (when != null) {
- _start_3(when);
- return;
- }
- _start_4();
- return;
- }
+ void start([num when, num grainOffset, num grainDuration]) => _blink.Native_AudioBufferSourceNode_start(this, when, grainOffset, grainDuration);
- void _start_1(when, grainOffset, grainDuration) => _blink.Native_AudioBufferSourceNode__start_1_Callback(this, when, grainOffset, grainDuration);
-
- void _start_2(when, grainOffset) => _blink.Native_AudioBufferSourceNode__start_2_Callback(this, when, grainOffset);
-
- void _start_3(when) => _blink.Native_AudioBufferSourceNode__start_3_Callback(this, when);
-
- void _start_4() => _blink.Native_AudioBufferSourceNode__start_4_Callback(this);
-
- void stop([num when]) {
- if (when != null) {
- _stop_1(when);
- return;
- }
- _stop_2();
- return;
- }
-
- void _stop_1(when) => _blink.Native_AudioBufferSourceNode__stop_1_Callback(this, when);
-
- void _stop_2() => _blink.Native_AudioBufferSourceNode__stop_2_Callback(this);
+ void stop([num when]) => _blink.Native_AudioBufferSourceNode_stop(this, when);
/// Stream of `ended` events handled by this [AudioBufferSourceNode].
@DomName('AudioBufferSourceNode.onended')
@@ -300,12 +266,7 @@
@DomName('AudioContext.AudioContext')
@DocsEditable()
- factory AudioContext() {
- return AudioContext._create_1();
- }
-
- @DocsEditable()
- static AudioContext _create_1() => _blink.Native_AudioContext__create_1constructorCallback();
+ factory AudioContext() => _blink.Native_AudioContext_AudioContext();
/// Checks if this type is supported on the current platform.
static bool get supported => true;
@@ -350,53 +311,17 @@
@DocsEditable()
AudioBufferSourceNode createBufferSource() => _blink.Native_AudioContext_createBufferSource_Callback(this);
- ChannelMergerNode createChannelMerger([int numberOfInputs]) {
- if (numberOfInputs != null) {
- return _createChannelMerger_1(numberOfInputs);
- }
- return _createChannelMerger_2();
- }
+ ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.Native_AudioContext_createChannelMerger(this, numberOfInputs);
- ChannelMergerNode _createChannelMerger_1(numberOfInputs) => _blink.Native_AudioContext__createChannelMerger_1_Callback(this, numberOfInputs);
-
- ChannelMergerNode _createChannelMerger_2() => _blink.Native_AudioContext__createChannelMerger_2_Callback(this);
-
- ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
- if (numberOfOutputs != null) {
- return _createChannelSplitter_1(numberOfOutputs);
- }
- return _createChannelSplitter_2();
- }
-
- ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) => _blink.Native_AudioContext__createChannelSplitter_1_Callback(this, numberOfOutputs);
-
- ChannelSplitterNode _createChannelSplitter_2() => _blink.Native_AudioContext__createChannelSplitter_2_Callback(this);
+ ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.Native_AudioContext_createChannelSplitter(this, numberOfOutputs);
@DomName('AudioContext.createConvolver')
@DocsEditable()
ConvolverNode createConvolver() => _blink.Native_AudioContext_createConvolver_Callback(this);
- DelayNode createDelay([num maxDelayTime]) {
- if (maxDelayTime != null) {
- return _createDelay_1(maxDelayTime);
- }
- return _createDelay_2();
- }
+ DelayNode createDelay([num maxDelayTime]) => _blink.Native_AudioContext_createDelay(this, maxDelayTime);
- DelayNode _createDelay_1(maxDelayTime) => _blink.Native_AudioContext__createDelay_1_Callback(this, maxDelayTime);
-
- DelayNode _createDelay_2() => _blink.Native_AudioContext__createDelay_2_Callback(this);
-
- DelayNode createDelayNode([num maxDelayTime]) {
- if (maxDelayTime != null) {
- return _createDelayNode_1(maxDelayTime);
- }
- return _createDelayNode_2();
- }
-
- DelayNode _createDelayNode_1(maxDelayTime) => _blink.Native_AudioContext__createDelayNode_1_Callback(this, maxDelayTime);
-
- DelayNode _createDelayNode_2() => _blink.Native_AudioContext__createDelayNode_2_Callback(this);
+ DelayNode createDelayNode([num maxDelayTime]) => _blink.Native_AudioContext_createDelayNode(this, maxDelayTime);
@DomName('AudioContext.createDynamicsCompressor')
@DocsEditable()
@@ -410,21 +335,7 @@
@DocsEditable()
GainNode createGainNode() => _blink.Native_AudioContext_createGainNode_Callback(this);
- ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
- if (numberOfOutputChannels != null) {
- return _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
- }
- if (numberOfInputChannels != null) {
- return _createJavaScriptNode_2(bufferSize, numberOfInputChannels);
- }
- return _createJavaScriptNode_3(bufferSize);
- }
-
- ScriptProcessorNode _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createJavaScriptNode_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
-
- ScriptProcessorNode _createJavaScriptNode_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createJavaScriptNode_2_Callback(this, bufferSize, numberOfInputChannels);
-
- ScriptProcessorNode _createJavaScriptNode_3(bufferSize) => _blink.Native_AudioContext__createJavaScriptNode_3_Callback(this, bufferSize);
+ ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createJavaScriptNode(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
@DomName('AudioContext.createMediaElementSource')
@DocsEditable()
@@ -451,26 +362,7 @@
@Experimental() // untriaged
PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.Native_AudioContext_createPeriodicWave_Callback(this, real, imag);
- ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
- if (numberOfOutputChannels != null) {
- return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
- }
- if (numberOfInputChannels != null) {
- return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
- }
- if (bufferSize != null) {
- return _createScriptProcessor_3(bufferSize);
- }
- return _createScriptProcessor_4();
- }
-
- ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createScriptProcessor_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
-
- ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createScriptProcessor_2_Callback(this, bufferSize, numberOfInputChannels);
-
- ScriptProcessorNode _createScriptProcessor_3(bufferSize) => _blink.Native_AudioContext__createScriptProcessor_3_Callback(this, bufferSize);
-
- ScriptProcessorNode _createScriptProcessor_4() => _blink.Native_AudioContext__createScriptProcessor_4_Callback(this);
+ ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
@DomName('AudioContext.createWaveShaper')
@DocsEditable()
@@ -631,21 +523,7 @@
@DocsEditable()
int get numberOfOutputs => _blink.Native_AudioNode_numberOfOutputs_Getter(this);
- void _connect(destination, int output, [int input]) {
- if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
- _connect_1(destination, output, input);
- return;
- }
- if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
- _connect_2(destination, output);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _connect_1(destination, output, input) => _blink.Native_AudioNode__connect_1_Callback(this, destination, output, input);
-
- void _connect_2(destination, output) => _blink.Native_AudioNode__connect_2_Callback(this, destination, output);
+ void _connect(destination, int output, [int input]) => _blink.Native_AudioNode__connect(this, destination, output, input);
@DomName('AudioNode.disconnect')
@DocsEditable()
@@ -1101,12 +979,7 @@
@DomName('OfflineAudioContext.OfflineAudioContext')
@DocsEditable()
- factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
- return OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
- }
-
- @DocsEditable()
- static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) => _blink.Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+ factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -1184,31 +1057,9 @@
@Experimental() // untriaged
void setPeriodicWave(PeriodicWave periodicWave) => _blink.Native_OscillatorNode_setPeriodicWave_Callback(this, periodicWave);
- void start([num when]) {
- if (when != null) {
- _start_1(when);
- return;
- }
- _start_2();
- return;
- }
+ void start([num when]) => _blink.Native_OscillatorNode_start(this, when);
- void _start_1(when) => _blink.Native_OscillatorNode__start_1_Callback(this, when);
-
- void _start_2() => _blink.Native_OscillatorNode__start_2_Callback(this);
-
- void stop([num when]) {
- if (when != null) {
- _stop_1(when);
- return;
- }
- _stop_2();
- return;
- }
-
- void _stop_1(when) => _blink.Native_OscillatorNode__stop_1_Callback(this, when);
-
- void _stop_2() => _blink.Native_OscillatorNode__stop_2_Callback(this);
+ void stop([num when]) => _blink.Native_OscillatorNode_stop(this, when);
/// Stream of `ended` events handled by this [OscillatorNode].
@DomName('OscillatorNode.onended')
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index ea55cda..4b55e83 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -2325,27 +2325,7 @@
@DocsEditable()
void bufferByteData(int target, ByteBuffer data, int usage) => _blink.Native_WebGLRenderingContext_bufferByteData_Callback(this, target, data, usage);
- void bufferData(int target, data_OR_size, int usage) {
- if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
- _bufferData_1(target, data_OR_size, usage);
- return;
- }
- if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
- _bufferData_2(target, data_OR_size, usage);
- return;
- }
- if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
- _bufferData_3(target, data_OR_size, usage);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _bufferData_1(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_1_Callback(this, target, data_OR_size, usage);
-
- void _bufferData_2(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_2_Callback(this, target, data_OR_size, usage);
-
- void _bufferData_3(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_3_Callback(this, target, data_OR_size, usage);
+ void bufferData(int target, data_OR_size, int usage) => _blink.Native_WebGLRenderingContext_bufferData(this, target, data_OR_size, usage);
@DomName('WebGLRenderingContext.bufferDataTyped')
@DocsEditable()
@@ -2355,21 +2335,7 @@
@DocsEditable()
void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.Native_WebGLRenderingContext_bufferSubByteData_Callback(this, target, offset, data);
- void bufferSubData(int target, int offset, data) {
- if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
- _bufferSubData_1(target, offset, data);
- return;
- }
- if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
- _bufferSubData_2(target, offset, data);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _bufferSubData_1(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_1_Callback(this, target, offset, data);
-
- void _bufferSubData_2(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_2_Callback(this, target, offset, data);
+ void bufferSubData(int target, int offset, data) => _blink.Native_WebGLRenderingContext_bufferSubData(this, target, offset, data);
@DomName('WebGLRenderingContext.bufferSubDataTyped')
@DocsEditable()
@@ -2723,39 +2689,7 @@
@DocsEditable()
void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
- void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
- if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
- _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
- return;
- }
- if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
- _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
- _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
- _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
- _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) => _blink.Native_WebGLRenderingContext__texImage2D_1_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
-
- void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_2_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
- void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_3_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
- void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_4_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-
- void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_5_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+ void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
@DomName('WebGLRenderingContext.texImage2DCanvas')
@DocsEditable()
@@ -2781,39 +2715,7 @@
@DocsEditable()
void texParameteri(int target, int pname, int param) => _blink.Native_WebGLRenderingContext_texParameteri_Callback(this, target, pname, param);
- void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
- if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
- _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
- return;
- }
- if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
- _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
- _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
- _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
- return;
- }
- if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
- _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
- return;
- }
- throw new ArgumentError("Incorrect number or type of arguments");
- }
-
- void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) => _blink.Native_WebGLRenderingContext__texSubImage2D_1_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
-
- void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_2_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
- void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_3_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
- void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_4_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-
- void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_5_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+ void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
@DomName('WebGLRenderingContext.texSubImage2DCanvas')
@DocsEditable()
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index b62178e..654fce0 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -25,6 +25,7 @@
'try_dart_static_files': [
'index.html',
'dartlang-style.css',
+ 'line_numbers.css',
'iframe.html',
'iframe.js',
'dart-icon.png', # iOS icon.
diff --git a/site/try/index.html b/site/try/index.html
index 63cdacd..4e5805c 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -14,8 +14,10 @@
See: http://www.google.com/fonts#UsePlace:use/Collection:Open+Sans:400,600,700,800,300
-->
+<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800,300' rel='stylesheet' type='text/css'>
<link rel="stylesheet" type="text/css" href="dartlang-style.css">
+<link rel="alternate stylesheet" type="text/css" href="line_numbers.css" title="line_numbers">
<style>
a.diagnostic {
/* position: relative; */
@@ -148,7 +150,16 @@
height: auto;
}
+.mainEditorPane {
+ overflow-y: auto;
+ overflow-x: hidden;
+ white-space: pre;
+ max-height: 80vh;
+}
+.lineNumber {
+ position: relative;
+}
</style>
<meta itemprop="name" content="Try Dart!">
@@ -201,7 +212,7 @@
<a class="brand" href="//www.dartlang.org/" title="Dart Homepage" target="_blank">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJxQTFRFAAAAAIvMdsvDAIvMdsvDAIvMdsvDLaTJAIvMOqnHdsvDAIvMdsvDAIvMKaLJdsvDAIvMAIvMdsvDAIvMdsvDdsvDAIvMAIvMAZnFdsvDAILHAIPHAITIAIXJAIfKAIjKAIrLAIrMAIvMAJXHAJjFC5i/I6HENr2yOb6zPr+0TsK4UsO5WbnEWcW8Xsa9Yse+Zsi/asjAc8rCdsvDdt4SRQAAABp0Uk5TABAQICAwMFBgYGBwcICAgI+vr7+/z9/v7+97IXGnAAAAqUlEQVQYV13QxxaCQBBE0VZkjBgAGVEBaVEUM/P//yaTGg5vV3dZANTCZ9BvFAoR93kVC9FnthW6uIPTJ7UkdHaXvS2LXKNBURInyDXPsShbzjU7XCpxhooDVGo5QcQAJmjUco64AY/UcIrowYCTaj5KBZeTaj5JBTc6l11OlQKMf497y1ahefFb3TQfcqtM/fipJF/X9gnDon6/ah/aDDfNOgosNA2b8QdGciZlh/U93AAAAABJRU5ErkJggg==" alt="Dart">
</a>
-<ul class="nav pull-right"><li><a href="#" id="settings"><i class="icon-cog"></i></a></li></ul>
+<ul class="nav pull-right"><li><a href="https://code.google.com/p/dart/issues/entry?template=Try+Dart+Bug" target="_blank"><i class="fa fa-bug"></i></a></li><li><a href="#" id="settings"><i class="icon-cog"></i></a></li></ul>
<ul class="nav hidden-phone">
<li class="active"><a>Try Dart!</a></li>
diff --git a/site/try/line_numbers.css b/site/try/line_numbers.css
new file mode 100644
index 0000000..786d555
--- /dev/null
+++ b/site/try/line_numbers.css
@@ -0,0 +1,23 @@
+/* Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ */
+
+.mainEditorPane {
+ padding: 0px;
+ counter-reset: dart-line-number;
+}
+
+.lineNumber {
+ padding-left: 3.5em;
+}
+
+.lineNumber:before {
+ counter-increment: dart-line-number;
+ content: counter(dart-line-number) " ";
+ position: absolute;
+ left: 0px;
+ width: 3em;
+ text-align: right;
+ background-color: lightgoldenrodyellow;
+}
diff --git a/site/try/nossl.appcache b/site/try/nossl.appcache
index d5218a3..07be94d 100644
--- a/site/try/nossl.appcache
+++ b/site/try/nossl.appcache
@@ -8,6 +8,7 @@
CACHE:
index.html
dartlang-style.css
+line_numbers.css
leap.dart.js
iframe.html
diff --git a/site/try/project_server.dart b/site/try/project_server.dart
index d71d870..08c5d56 100644
--- a/site/try/project_server.dart
+++ b/site/try/project_server.dart
@@ -7,7 +7,8 @@
import 'dart:io';
import 'dart:async' show
- Future;
+ Future,
+ Stream;
import 'dart:convert' show
HtmlEscape,
@@ -145,12 +146,6 @@
response.close();
}
- redirect(String location) {
- response.statusCode = HttpStatus.FOUND;
- response.headers.add(HttpHeaders.LOCATION, location);
- response.close();
- }
-
badRequest(String problem) {
response.statusCode = HttpStatus.BAD_REQUEST;
response.write(htmlInfo("Bad request",
diff --git a/site/try/src/cache.dart b/site/try/src/cache.dart
index fd4cce0..a61ec0a 100644
--- a/site/try/src/cache.dart
+++ b/site/try/src/cache.dart
@@ -20,21 +20,30 @@
/// Called when the window has finished loading.
void onLoad(Event event) {
- window.applicationCache.onUpdateReady.listen((_) => updateCacheStatus());
- window.applicationCache.onCached.listen((_) => updateCacheStatus());
- window.applicationCache.onChecking.listen((_) => updateCacheStatus());
- window.applicationCache.onDownloading.listen((_) => updateCacheStatus());
- window.applicationCache.onError.listen((_) => updateCacheStatus());
- window.applicationCache.onNoUpdate.listen((_) => updateCacheStatus());
- window.applicationCache.onObsolete.listen((_) => updateCacheStatus());
+ if (!ApplicationCache.supported) return;
+ window.applicationCache.onUpdateReady.listen(updateCacheStatus);
+ window.applicationCache.onCached.listen(updateCacheStatus);
+ window.applicationCache.onChecking.listen(updateCacheStatus);
+ window.applicationCache.onDownloading.listen(updateCacheStatus);
+ window.applicationCache.onError.listen(updateCacheStatus);
+ window.applicationCache.onNoUpdate.listen(updateCacheStatus);
+ window.applicationCache.onObsolete.listen(updateCacheStatus);
window.applicationCache.onProgress.listen(onCacheProgress);
}
-onCacheProgress(ProgressEvent event) {
- if (!event.lengthComputable) {
- updateCacheStatus();
- return;
+void onCacheProgress(Event event) {
+ if (event is ProgressEvent) {
+ // Firefox doesn't fire a ProgressEvent on cache progress. Just a plain
+ // Event with type == "progress".
+ if (event.lengthComputable) {
+ updateCacheStatusFromEvent(event);
+ return;
+ }
}
+ updateCacheStatus(null);
+}
+
+void updateCacheStatusFromEvent(ProgressEvent event) {
cacheStatusElement.nodes.clear();
cacheStatusElement.appendText('Downloading SDK ');
var progress = '${event.loaded} of ${event.total}';
@@ -62,7 +71,7 @@
return '?';
}
-void updateCacheStatus() {
+void updateCacheStatus(_) {
cacheStatusElement.nodes.clear();
int status = window.applicationCache.status;
if (status == ApplicationCache.UPDATEREADY) {
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index 3f6fbaf..1bc432d 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -293,7 +293,10 @@
void consolePrint(message) {
if (window.parent != window) {
// Test support.
- window.parent.postMessage('$message\n', '/');
+ // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
+ // 30 across build bots. Support for '/' was added in version 29, and we
+ // support the two most recent versions.
+ window.parent.postMessage('$message\n', '*');
}
console.appendText('$message\n');
}
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index d330a7b..9072ef8 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -27,6 +27,9 @@
info,
warning;
+import 'selection.dart' show
+ isCollapsed;
+
const String INDENT = '\u{a0}\u{a0}';
Set<String> seenIdentifiers;
@@ -106,7 +109,7 @@
/// exists.
Element getElementAtSelection() {
Selection selection = window.getSelection();
- if (!selection.isCollapsed) return null;
+ if (!isCollapsed(selection)) return null;
var anchorNode = selection.anchorNode;
if (!mainEditorPane.contains(anchorNode)) return null;
if (mainEditorPane == anchorNode) return null;
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index a59cf4e..4d4dd24 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -21,7 +21,9 @@
EOF_TOKEN,
ErrorToken,
StringScanner,
- Token;
+ Token,
+ UnmatchedToken,
+ UnterminatedToken;
import 'package:compiler/implementation/source_file.dart' show
StringSourceFile;
@@ -53,7 +55,8 @@
CompilationUnit;
import 'selection.dart' show
- TrySelection;
+ TrySelection,
+ isCollapsed;
import 'editor.dart' as editor;
@@ -61,6 +64,10 @@
import 'settings.dart' as settings;
+const String TRY_DART_NEW_DEFECT =
+ 'https://code.google.com/p/dart/issues/entry'
+ '?template=Try+Dart+Internal+Error';
+
/**
* UI interaction manager for the entire application.
*/
@@ -85,6 +92,8 @@
void onInput(Event event);
+ // TODO(ahe): Rename to onKeyDown (as it is called in response to keydown
+ // event).
void onKeyUp(KeyboardEvent event);
void onMutation(List<MutationRecord> mutations, MutationObserver observer);
@@ -127,7 +136,33 @@
void onKeyUp(KeyboardEvent event) => state.onKeyUp(event);
void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
- return state.onMutation(mutations, observer);
+ try {
+ try {
+ return state.onMutation(mutations, observer);
+ } finally {
+ // Discard any mutations during the observer, as these can lead to
+ // infinite loop.
+ observer.takeRecords();
+ }
+ } catch (error, stackTrace) {
+ try {
+ editor.isMalformedInput = true;
+ outputDiv
+ ..nodes.clear()
+ ..append(new HeadingElement.h1()..appendText('Internal Error'))
+ ..appendText('We would appreciate if you take a moment to report '
+ 'this at ')
+ ..append(
+ new AnchorElement(href: TRY_DART_NEW_DEFECT)
+ ..target = '_blank'
+ ..appendText(TRY_DART_NEW_DEFECT))
+ ..appendText('\nError and stack trace:\n$error\n')
+ ..appendText('$stackTrace\n');
+ } catch (e) {
+ // Double faults ignored.
+ }
+ rethrow;
+ }
}
void onSelectionChange(Event event) => state.onSelectionChange(event);
@@ -195,13 +230,28 @@
void onUnmodifiedKeyUp(KeyboardEvent event) {
switch (event.keyCode) {
case KeyCode.ENTER: {
- event.preventDefault();
Selection selection = window.getSelection();
- if (selection.isCollapsed && selection.anchorNode is Text) {
- Text text = selection.anchorNode;
- int offset = selection.anchorOffset;
- text.insertData(offset, '\n');
- selection.collapse(text, offset + 1);
+ if (isCollapsed(selection)) {
+ event.preventDefault();
+ Node node = selection.anchorNode;
+ if (node is Text) {
+ Text text = node;
+ int offset = selection.anchorOffset;
+ // If at end-of-file, insert an extra newline. The the extra
+ // newline ensures that the next line isn't empty. At least Chrome
+ // behaves as if "\n" is just a single line. "\nc" (where c is any
+ // character) is two lines, according to Chrome.
+ String newline = isAtEndOfFile(text, offset) ? '\n\n' : '\n';
+ text.insertData(offset, newline);
+ selection.collapse(text, offset + 1);
+ } else if (node is Element) {
+ node.appendText('\n\n');
+ selection.collapse(node.firstChild, 1);
+ } else {
+ window.console
+ ..error('Unexpected node')
+ ..dir(node);
+ }
}
break;
}
@@ -229,8 +279,46 @@
Selection selection = window.getSelection();
TrySelection trySelection = new TrySelection(mainEditorPane, selection);
+ Set<Node> normalizedNodes = new Set<Node>();
for (MutationRecord record in mutations) {
- normalizeMutationRecord(record, trySelection);
+ normalizeMutationRecord(record, trySelection, normalizedNodes);
+ }
+
+ if (normalizedNodes.length == 1) {
+ Node node = normalizedNodes.single;
+ if (node is Element && node.classes.contains('lineNumber')) {
+ print('Single line change: ${node.outerHtml}');
+
+ String currentText = node.text;
+
+ trySelection = new TrySelection(node, selection);
+ trySelection.updateText(currentText);
+
+ editor.isMalformedInput = false;
+ int offset = 0;
+ List<Node> nodes = <Node>[];
+
+ String state = '';
+ Element previousLine = node.previousElementSibling;
+ if (previousLine != null) {
+ state = previousLine.getAttribute('dart-state');
+ }
+ for (String line in splitLines(currentText)) {
+ List<Node> lineNodes = <Node>[];
+ state = tokenizeAndHighlight(
+ line, state, offset, trySelection, lineNodes);
+ offset += line.length;
+ nodes.add(makeLine(lineNodes, state));
+ }
+
+ node.parent.insertAllBefore(nodes, node);
+ node.remove();
+ trySelection.adjust(selection);
+
+ // Discard highlighting mutations.
+ observer.takeRecords();
+ return;
+ }
}
String currentText = mainEditorPane.text;
@@ -244,7 +332,14 @@
int offset = 0;
List<Node> nodes = <Node>[];
- tokenizeAndHighlight(currentText, offset, trySelection, nodes);
+ String state = '';
+ for (String line in splitLines(currentText)) {
+ List<Node> lineNodes = <Node>[];
+ state =
+ tokenizeAndHighlight(line, state, offset, trySelection, lineNodes);
+ offset += line.length;
+ nodes.add(makeLine(lineNodes, state));
+ }
mainEditorPane
..nodes.clear()
@@ -670,63 +765,133 @@
event.getModifierState("OS");
}
-void tokenizeAndHighlight(String currentText,
- int offset,
- TrySelection trySelection,
- List<Node> nodes) {
+String tokenizeAndHighlight(String line,
+ String state,
+ int start,
+ TrySelection trySelection,
+ List<Node> nodes) {
+ String newState = '';
+ int offset = state.length;
+ int adjustedStart = start - state.length;
+
// + offset + charOffset + globalOffset + (charOffset + charCount)
// v v v v
// do identifier_abcdefghijklmnopqrst
- for (Token token = tokenize(currentText);
+ for (Token token = tokenize('$state$line');
token.kind != EOF_TOKEN;
token = token.next) {
int charOffset = token.charOffset;
int charCount = token.charCount;
- if (charOffset < offset) continue; // Happens for scanner errors.
-
- Decoration decoration = editor.getDecoration(token);
-
- Token follow = token.next;
- if (token is BeginGroupToken) {
- follow = token.endGroup.next;
+ Token tokenToDecorate = token;
+ if (token is UnterminatedToken && isUnterminatedMultiLineToken(token)) {
+ newState += '${token.start}';
+ continue; // This might not be an error.
+ } else {
+ Token follow = token.next;
+ if (token is BeginGroupToken && token.endGroup != null) {
+ follow = token.endGroup.next;
+ }
+ if (follow is ErrorToken && follow.charOffset == token.charOffset) {
+ if (follow is UnmatchedToken) {
+ newState += '${follow.begin.value}';
+ } else {
+ tokenToDecorate = follow;
+ }
+ }
}
- if (follow is ErrorToken) {
- decoration = editor.getDecoration(follow);
+
+ if (charOffset < offset) {
+ // Happens for scanner errors, or for the [state] prefix.
+ continue;
}
+ Decoration decoration = editor.getDecoration(tokenToDecorate);
+
if (decoration == null) continue;
// Add a node for text before current token.
- trySelection.addNodeFromSubstring(offset, charOffset, nodes);
+ trySelection.addNodeFromSubstring(
+ adjustedStart + offset, adjustedStart + charOffset, nodes);
// Add a node for current token.
trySelection.addNodeFromSubstring(
- charOffset, charOffset + charCount, nodes, decoration);
+ adjustedStart + charOffset,
+ adjustedStart + charOffset + charCount, nodes, decoration);
offset = charOffset + charCount;
}
// Add a node for anything after the last (decorated) token.
- trySelection.addNodeFromSubstring(offset, currentText.length, nodes);
+ trySelection.addNodeFromSubstring(
+ adjustedStart + offset, start + line.length, nodes);
- // Ensure text always ends with a newline.
- if (!currentText.endsWith('\n')) {
- nodes.add(new Text('\n'));
- }
+ return newState;
}
-void normalizeMutationRecord(MutationRecord record, TrySelection selection) {
- if (record.addedNodes.isEmpty) return;
+bool isUnterminatedMultiLineToken(UnterminatedToken token) {
+ return
+ token.start == '/*' ||
+ token.start == "'''" ||
+ token.start == '"""' ||
+ token.start == "r'''" ||
+ token.start == 'r"""';
+}
+
+void normalizeMutationRecord(MutationRecord record,
+ TrySelection selection,
+ Set<Node> normalizedNodes) {
for (Node node in record.addedNodes) {
if (node.parent == null) continue;
StringBuffer buffer = new StringBuffer();
int selectionOffset = htmlToText(node, buffer, selection);
Text newNode = new Text('$buffer');
node.replaceWith(newNode);
+ normalizedNodes.add(findLine(newNode));
if (selectionOffset != -1) {
selection.anchorNode = newNode;
selection.anchorOffset = selectionOffset;
}
}
+ if (!record.removedNodes.isEmpty) {
+ normalizedNodes.add(findLine(record.target));
+ }
+ if (record.type == "characterData") {
+ normalizedNodes.add(findLine(record.target));
+ }
+}
+
+// Finds the line of [node] (a parent node with CSS class 'lineNumber').
+// If no such parent exists, return mainEditorPane if it is a parent.
+// Otherwise return [node].
+Node findLine(Node node) {
+ for (Node n = node; n != null; n = n.parent) {
+ if (n is Element && n.classes.contains('lineNumber')) return n;
+ if (n == mainEditorPane) return n;
+ }
+ return node;
+}
+
+Element makeLine(List<Node> lineNodes, String state) {
+ // Using a div element here (anything with display=block) generally messes up
+ // editing and navigation. We would like to use a block element here so
+ // error messages show as expected. But no such luck. Fortunately, there
+ // are strong indications that the current solution for displaying errors
+ // isn't good enough anyways.
+ return new SpanElement()
+ ..setAttribute('dart-state', state)
+ ..nodes.addAll(lineNodes)
+ ..classes.add('lineNumber');
+}
+
+bool isAtEndOfFile(Text text, int offset) {
+ Node line = findLine(text);
+ return
+ line.nextNode == null &&
+ text.parent.nextNode == null &&
+ offset == text.length;
+}
+
+List<String> splitLines(String text) {
+ return text.split(new RegExp('^', multiLine: true));
}
diff --git a/site/try/src/selection.dart b/site/try/src/selection.dart
index 35e17a8..7551b59 100644
--- a/site/try/src/selection.dart
+++ b/site/try/src/selection.dart
@@ -23,8 +23,8 @@
int globalOffset = -1;
TrySelection(this.root, Selection selection)
- : this.anchorNode = selection.isCollapsed ? selection.anchorNode : null,
- this.anchorOffset = selection.isCollapsed ? selection.anchorOffset : -1;
+ : anchorNode = isCollapsed(selection) ? selection.anchorNode : null,
+ anchorOffset = isCollapsed(selection) ? selection.anchorOffset : -1;
Text addNodeFromSubstring(int start,
int end,
@@ -34,7 +34,7 @@
Text textNode = new Text(text.substring(start, end));
- if (start <= globalOffset && globalOffset < end) {
+ if (start <= globalOffset && globalOffset <= end) {
anchorNode = textNode;
anchorOffset = globalOffset - start;
}
@@ -74,3 +74,9 @@
return -1;
}
}
+
+bool isCollapsed(Selection selection) {
+ // Firefox and Chrome don't agree on if the selection is collapsed if there
+ // is no node selected.
+ return selection.isCollapsed && selection.anchorNode != null;
+}
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index e9b66d6..1fefeb8 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -104,11 +104,9 @@
buildCode(interaction);
(mainEditorPane = new DivElement())
- ..classes.add('well')
+ ..classes.addAll(['well', 'mainEditorPane'])
..style.backgroundColor = currentTheme.background.color
..style.color = currentTheme.foreground.color
- ..style.overflow = 'visible'
- ..style.whiteSpace = 'pre'
..style.font = codeFont
..spellcheck = false;
@@ -179,7 +177,7 @@
..appendText('Save');
cacheStatusElement = document.getElementById('appcache-status');
- updateCacheStatus();
+ updateCacheStatus(null);
var section = document.querySelector('article[class="homepage"]>section');
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 6f062d4..0d27176 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -119,8 +119,6 @@
#co19 issue 680
Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t04: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A07_t01: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A16_t01: StaticWarning
# co19 roll to r706: Please triage all these issues.
Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
@@ -195,9 +193,9 @@
LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning
LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index be6e51e..4fdf01d 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -936,7 +936,7 @@
LibTest/math/log_A01_t01: Fail # TODO(dart2js-team): Please triage this failure.
-[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == opera) ]
+[ $compiler == dart2js && ($runtime == ie10 || $runtime == ff || $runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim || $runtime == opera ) ]
*: Skip
#
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index c72b315..08cfe6b 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -7,7 +7,6 @@
[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
# Something is breaking browser_test.dart in the test infrastructure in these tests. Issue 18558.
-LayoutTests/fast/dom/HTMLS*: Skip # Issue 18558
LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index fc5f230..3b8578d 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -19,6 +19,9 @@
// Helper methods for debugging should never be called from production code:
"implementation/helpers/": const [" is never "],
"implementation/util/setlet.dart": const [" is never "],
+
+ // Some things in dart_printer are not yet used
+ "implementation/dart_backend/dart_printer.dart" : const [" is never "]
};
void main() {
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index f8ec58b..ebc3a6d 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -8,7 +8,6 @@
import 'dart:io' show exit;
import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
import '../../../sdk/lib/_internal/compiler/compiler.dart'
show Diagnostic;
@@ -45,6 +44,10 @@
void call(Uri uri, int begin, int end, String message, kind) {
diagnosticHandler(uri, begin, end, message, kind);
}
+
+ String prefixMessage(String message, Diagnostic kind) {
+ return message;
+ }
}
testOutputProvider(script, libraryRoot, packageRoot, inputProvider, handler,
@@ -56,8 +59,9 @@
void main() {
compileFunc = testOutputProvider;
exitFunc = (exitCode) {
- Expect.equals(1, diagnosticHandler.messages.length);
- var message = diagnosticHandler.messages[0];
+ CollectingFormattingDiagnosticHandler handler = diagnosticHandler;
+ Expect.equals(1, handler.messages.length);
+ var message = handler.messages[0];
Expect.isTrue(message[0].contains("Cannot open file"));
Expect.equals(Diagnostic.ERROR, message[1]);
Expect.equals(1, exitCode);
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 34d18a6..355bbb5 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -25,7 +25,8 @@
}
Node testExpression(String text, [String alternate]) {
- var node = parseStatement('$text;').expression;
+ ExpressionStatement statement = parseStatement('$text;');
+ Expression node = statement.expression;
testNode(node, alternate == null ? text : alternate, text);
return node;
}
diff --git a/tests/compiler/dart2js/codegen_helper.dart b/tests/compiler/dart2js/codegen_helper.dart
index 20a8f0a..be3029c 100644
--- a/tests/compiler/dart2js/codegen_helper.dart
+++ b/tests/compiler/dart2js/codegen_helper.dart
@@ -27,10 +27,11 @@
return compiler.run(uri).then((success) {
Expect.isTrue(success);
Map<String, String> result = new Map<String, String>();
- for (var element in compiler.backend.generatedCode.keys) {
+ var backend = compiler.backend;
+ for (var element in backend.generatedCode.keys) {
if (element.getCompilationUnit().script.readableUri != uri) continue;
var name = element.name;
- var code = compiler.backend.assembleCode(element);
+ var code = backend.assembleCode(element);
result[name] = code;
}
return result;
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 23fa7ac..62a3651 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -5,7 +5,6 @@
import "package:expect/expect.dart";
import 'dart:async';
import "package:async_helper/async_helper.dart";
-import 'parser_helper.dart';
import 'mock_compiler.dart';
import '../../../sdk/lib/_internal/compiler/compiler.dart';
import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' as leg;
@@ -451,6 +450,8 @@
get resolvedElements => compiler.enqueuer.resolution.resolvedElements;
ElementAst operator[](Element element) =>
new ElementAst(element.parseNode(compiler), resolvedElements[element]);
+
+ noSuchMethod(Invocation invocation) => throw 'unimplemented method';
}
PlaceholderCollector collectPlaceholders(compiler, element) =>
@@ -471,7 +472,9 @@
compiler.processQueue(compiler.enqueuer.resolution, mainElement);
PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
FunctionExpression mainNode = mainElement.parseNode(compiler);
- FunctionExpression fooNode = mainNode.body.statements.nodes.head.function;
+ Block body = mainNode.body;
+ FunctionDeclaration functionDeclaration = body.statements.nodes.head;
+ FunctionExpression fooNode = functionDeclaration.function;
LocalPlaceholder fooPlaceholder =
collector.functionScopes[mainElement].localPlaceholders.first;
Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index d570b0a..3829354 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -9,6 +9,7 @@
import 'dart:mirrors';
import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' as tree;
import '../../../sdk/lib/_internal/compiler/implementation/string_validator.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
/// For debugging the [AstBuilder] stack. Prints information about [x].
void show(x) {
@@ -586,12 +587,13 @@
push(statement);
}
+ // TODO(kmillikin,asgerf): this code is currently untested.
endFunctionDeclaration(Token end) {
Statement body = pop();
Parameters parameters = pop();
String name = pop(asName);
TypeAnnotation returnType = popTypeAnnotation();
- push(new FunctionStatement(name, parameters, body, returnType));
+ push(new FunctionDeclaration(name, parameters, returnType));
}
endFunctionBody(int count, Token begin, Token end) {
@@ -681,15 +683,25 @@
return buf.toString();
}
+/// Converts [exp] to an instance of the frontend AST and unparses that.
+String frontUnparseExpression(Expression exp) {
+ tree.Node node = new TreePrinter().makeExpression(exp);
+ return tree.unparse(node);
+}
+/// Converts [stmt] to an instance of the frontend AST and unparses that.
+String frontUnparseStatement(Statement stmt) {
+ tree.Node node = new TreePrinter().makeStatement(stmt);
+ return tree.unparse(node);
+}
+
/// Parses [code], unparses the resulting AST, then parses the unparsed text.
/// The ASTs from the first and second parse are then compared for structural
/// equality. Alternatively, if [expected] is not an empty string, the second
/// parse must match the AST of parsing [expected].
void checkFn(String code, String expected, Function parse, Function unparse) {
- String unparsed = "";
+ var firstParse = parse(code);
+ String unparsed = unparse(firstParse);
try {
- var firstParse = parse(code);
- unparsed = unparse(firstParse);
var secondParse = parse(unparsed);
var baseline = expected == "" ? firstParse : parse(expected);
checkDeepEqual(baseline, secondParse);
@@ -698,11 +710,13 @@
}
}
-void checkExpression(String code, [String expected=""]) {
+void checkExpression(String code, [String expected="", String expected2=""]) {
checkFn(code, expected, parseExpression, unparseExpression);
+ checkFn(code, expected2, parseExpression, frontUnparseExpression);
}
-void checkStatement(String code, [String expected=""]) {
+void checkStatement(String code, [String expected="", String expected2=""]) {
checkFn(code, expected, parseStatement, unparseStatement);
+ checkFn(code, expected2, parseStatement, frontUnparseStatement);
}
void debugTokens(String code) {
@@ -880,6 +894,10 @@
checkExpression(r"'${$x}'");
checkExpression(r"'${$x}y'");
+ checkExpression("null + null");
+
+ checkExpression("throw x");
+ checkStatement("throw x;");
checkStatement("var x, y, z;");
checkStatement("final x, y, z;");
@@ -932,5 +950,10 @@
checkStatement("do while(x); while (y);");
checkStatement("{do; while(x); while (y);}");
+ checkStatement('switch(x) { case 1: case 2: return y; }');
+ checkStatement('switch(x) { default: return y; }');
+ checkStatement('switch(x) { case 1: x=y; default: return y; }');
+ checkStatement('switch(x) { case 1: x=y; y=z; break; default: return y; }');
+
}
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 88a5680..582bcf0 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -43,7 +43,8 @@
var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
- var classes = compiler.backend.emitter.neededClasses;
+ var backend = compiler.backend;
+ var classes = backend.emitter.neededClasses;
var inputElement = classes.where((e) => e.name == 'InputElement').single;
var lib1 = compiler.libraries["memory:lib1.dart"];
var foo1 = lib1.find("foo1");
@@ -54,7 +55,7 @@
var lib4 = compiler.libraries["memory:lib4.dart"];
var bar1 = lib4.find("bar1");
var bar2 = lib4.find("bar2");
- var outputClassLists = compiler.backend.emitter.outputClassLists;
+ var outputClassLists = backend.emitter.outputClassLists;
Expect.equals(mainOutputUnit, outputUnitForElement(main));
Expect.notEquals(mainOutputUnit, outputUnitForElement(foo1));
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred_not_in_main_test.dart
index a2d828a..5c1bf87 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred_not_in_main_test.dart
@@ -40,13 +40,14 @@
var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
- var classes = compiler.backend.emitter.neededClasses;
+ var backend = compiler.backend;
+ var classes = backend.emitter.neededClasses;
var lib1 = compiler.libraries["memory:lib1.dart"];
var lib2 = compiler.libraries["memory:lib2.dart"];
var foo1 = lib1.find("foo1");
var foo2 = lib2.find("foo2");
- var outputClassLists = compiler.backend.emitter.outputClassLists;
+ var outputClassLists = backend.emitter.outputClassLists;
Expect.notEquals(mainOutputUnit, outputUnitForElement(foo2));
}));
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 72f42fc..f36c662 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -34,11 +34,11 @@
int skip = code.indexOf('{');
ClassElement cls = parseUnit(code, compiler, compiler.mainApp).head;
cls.parseNode(compiler);
- for (Element e in cls.localMembers) {
+ cls.forEachLocalMember((Element e) {
String name = e.name;
if (e.isConstructor()) {
name = Elements.reconstructConstructorName(e).replaceFirst(r'$', '.');
}
Expect.equals(code.indexOf(name, skip), e.position().charOffset);
- }
+ });
}
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index d170c9d..2fc70b5 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -9,9 +9,10 @@
import 'type_test_helper.dart';
import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
- show Element, ClassElement, MemberSignature, Name, PublicName;
+ show Element, ClassElement, MemberSignature, Name, PublicName,
+ DeclaredMember, Member;
import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
- show SyntheticMember, ErroneousMember;
+ show DeclaredMember, ErroneousMember, SyntheticMember;
void main() {
testClassMembers();
@@ -90,7 +91,7 @@
}
if (inheritedFrom != null) {
- MemberSignature inherited = checkType == CHECK_CLASS
+ DeclaredMember inherited = checkType == CHECK_CLASS
? inheritedFrom.element.lookupClassMember(memberName)
: inheritedFrom.element.lookupInterfaceMember(memberName);
Expect.isNotNull(inherited,
@@ -111,19 +112,21 @@
Set<MemberSignature> members = new Set<MemberSignature>();
List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom;
for (InterfaceType type in from) {
- MemberSignature inheritedMember =
+ DeclaredMember inheritedMember =
type.element.lookupInterfaceMember(memberName);
Expect.isNotNull(inheritedMember);
members.add(inheritedMember.inheritFrom(type));
}
Expect.setEquals(members, member.declarations);
} else if (declarer != null) {
- Expect.equals(declarer, member.declarer,
- "Unexpected declarer '${member.declarer}' of $memberKind member "
+ DeclaredMember declared = member;
+ Expect.equals(declarer, declared.declarer,
+ "Unexpected declarer '${declared.declarer}' of $memberKind member "
"'$member'. Expected '${declarer}'.");
} else {
- Expect.equals(cls.element, member.element.getEnclosingClass());
- Expect.equals(cls, member.declarer);
+ DeclaredMember declared = member;
+ Expect.equals(cls.element, declared.element.getEnclosingClass());
+ Expect.equals(cls, declared.declarer);
}
Expect.equals(isSetter, member.isSetter);
Expect.equals(isGetter, member.isGetter);
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
index 4409497..db8010d 100644
--- a/tests/compiler/dart2js/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -5,7 +5,6 @@
library dart2js.test.memory_source_file_helper;
import 'dart:async' show Future;
-import 'dart:io';
export 'dart:io' show Platform;
export '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 6550d17..5a16e56 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -32,16 +32,18 @@
MessageKind.FORMAL_DECLARED_CONST,
MessageKind.FORMAL_DECLARED_STATIC,
MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
- MessageKind.HEX_DIGIT_EXPECTED,
MessageKind.HIDDEN_IMPLICIT_IMPORT,
MessageKind.HIDDEN_IMPORT,
MessageKind.INHERIT_GETTER_AND_METHOD,
MessageKind.UNIMPLEMENTED_METHOD,
MessageKind.UNIMPLEMENTED_METHOD_ONE,
- MessageKind.UNMATCHED_TOKEN,
- MessageKind.UNTERMINATED_STRING,
MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
MessageKind.VOID_NOT_ALLOWED,
+
+ MessageKind.HEX_DIGIT_EXPECTED, // http://dartbug.com/18574
+ MessageKind.UNMATCHED_TOKEN, // http://dartbug.com/18574
+ MessageKind.UNTERMINATED_COMMENT, // http://dartbug.com/18574
+ MessageKind.UNTERMINATED_STRING, // http://dartbug.com/18574
]);
/// Most messages can be tested without causing a fatal error. Add an exception
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index ab302eb..1c7f596 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -6,6 +6,8 @@
import "package:async_helper/async_helper.dart";
import 'compiler_helper.dart';
import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+ show PrimitiveConstant;
void checkPosition(Spannable spannable, Node node, String source, compiler) {
SourceSpan span = compiler.spanFromSpannable(spannable);
@@ -34,7 +36,7 @@
'Unexpected metadata count on $element.');
PartialMetadataAnnotation annotation = element.metadata.head;
annotation.ensureResolved(compiler);
- Constant value = annotation.value;
+ PrimitiveConstant value = annotation.value;
Expect.stringEquals('xyz', value.value.slowToString());
checkPosition(annotation, annotation.cachedNode, source1, compiler);
@@ -57,8 +59,8 @@
Expect.isFalse(identical(annotation1, annotation2),
'expected unique instances');
Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
- Constant value1 = annotation1.value;
- Constant value2 = annotation2.value;
+ PrimitiveConstant value1 = annotation1.value;
+ PrimitiveConstant value2 = annotation2.value;
Expect.identical(value1, value2, 'expected same compile-time constant');
Expect.stringEquals('xyz', value1.value.slowToString());
Expect.stringEquals('xyz', value2.value.slowToString());
@@ -87,7 +89,7 @@
Expect.equals(1, length(element.metadata));
PartialMetadataAnnotation annotation = element.metadata.head;
annotation.ensureResolved(compiler);
- Constant value = annotation.value;
+ PrimitiveConstant value = annotation.value;
Expect.stringEquals('xyz', value.value.slowToString());
checkPosition(annotation, annotation.cachedNode, source3, compiler);
@@ -116,8 +118,8 @@
Expect.isFalse(identical(annotation1, annotation2),
'expected unique instances');
Expect.notEquals(annotation1, annotation2, 'expected unequal instances');
- Constant value1 = annotation1.value;
- Constant value2 = annotation2.value;
+ PrimitiveConstant value1 = annotation1.value;
+ PrimitiveConstant value2 = annotation2.value;
Expect.identical(value1, value2, 'expected same compile-time constant');
Expect.stringEquals('xyz', value1.value.slowToString());
Expect.stringEquals('xyz', value2.value.slowToString());
@@ -169,7 +171,7 @@
PartialMetadataAnnotation annotation = metadata.head;
annotation.ensureResolved(compiler);
- Constant value = annotation.value;
+ PrimitiveConstant value = annotation.value;
Expect.stringEquals('xyz', value.value.slowToString());
checkPosition(annotation, annotation.cachedNode, source, compiler);
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index 57c869b..1f3b7ae 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -15,7 +15,7 @@
import
'../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
show
- Node;
+ Block, ExpressionStatement, FunctionExpression, Node, Send;
import
'../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
show
@@ -54,13 +54,15 @@
Map<Node, String> renames = backend.renames;
Map<LibraryElement, String> imports = backend.imports;
- Node getNameFunctionNode =
- backend.memberNodes.values.first.first.body.statements.nodes.head;
+ FunctionExpression node = backend.memberNodes.values.first.first;
+ Block block = node.body;
+ ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
+ Send send = getNameFunctionNode.expression;
Expect.equals(renames[mirrorRenamer.mirrorHelperGetNameFunctionNode.name],
- renames[getNameFunctionNode.expression.selector]);
+ renames[send.selector]);
Expect.equals("",
- renames[getNameFunctionNode.expression.receiver]);
+ renames[send.receiver]);
Expect.equals(1, imports.keys.length);
}));
}
@@ -73,11 +75,13 @@
Map<Node, String> renames = backend.renames;
Map<LibraryElement, String> imports = backend.imports;
- Node getNameFunctionNode =
- backend.memberNodes.values.first.first.body.statements.nodes.head;
+ FunctionExpression node = backend.memberNodes.values.first.first;
+ Block block = node.body;
+ ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
+ Send send = getNameFunctionNode.expression;
- Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.selector));
- Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.receiver));
+ Expect.isFalse(renames.containsKey(send.selector));
+ Expect.isFalse(renames.containsKey(send.receiver));
Expect.equals(1, imports.keys.length);
}));
}
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index e72f98a..5a74894 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -14,8 +14,7 @@
DartBackend;
import
'../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
- Node, Identifier;
+show Identifier, Node, Send;
import
'../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
show
@@ -53,7 +52,8 @@
Identifier identifier = node.asIdentifier();
if (identifier != null) {
String source = identifier.source;
- if (mirrorRenamer.mirrorSystemGetNameNodes.first.selector == node)
+ Send send = mirrorRenamer.mirrorSystemGetNameNodes.first;
+ if (send.selector == node)
continue;
if (symbols.containsKey(renames[node])) {
print(node);
diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
index 5f8c5c0..68bc816 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
@@ -15,6 +15,8 @@
show Diagnostic;
import 'dart:async';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+ show JavaScriptBackend;
main() {
Uri script = currentDirectory.resolveUri(Platform.script);
@@ -50,7 +52,8 @@
Expect.isFalse(compiler.enqueuer.codegen.hasEnqueuedEverything);
Expect.isFalse(compiler.enqueuer.codegen.hasEnqueuedReflectiveStaticFields);
Expect.isFalse(compiler.disableTypeInference);
- Expect.isFalse(compiler.backend.hasRetainedMetadata);
+ JavaScriptBackend backend = compiler.backend;
+ Expect.isFalse(backend.hasRetainedMetadata);
}));
}
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index ba2afed..f2656a2 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -21,8 +21,9 @@
import
'../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show
- Elements;
+show Element, Elements;
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+ show JavaScriptBackend;
void expectOnlyVerboseInfo(Uri uri, int begin, int end, String message, kind) {
if (kind.name == 'verbose info') {
@@ -81,15 +82,15 @@
compiler.stringClass, compiler.boolClass, compiler.nullClass,
compiler.listClass
];
-
+ JavaScriptBackend backend = compiler.backend;
Iterable<String> nativeNames =
- nativeClasses.map(compiler.backend.namer.getNameOfClass);
+ nativeClasses.map(backend.namer.getNameOfClass);
expectedNames.addAll(nativeNames);
Set recordedNames = new Set()
- ..addAll(compiler.backend.emitter.recordedMangledNames)
- ..addAll(compiler.backend.emitter.mangledFieldNames.keys)
- ..addAll(compiler.backend.emitter.mangledGlobalFieldNames.keys);
+ ..addAll(backend.emitter.recordedMangledNames)
+ ..addAll(backend.emitter.mangledFieldNames.keys)
+ ..addAll(backend.emitter.mangledGlobalFieldNames.keys);
Expect.setEquals(new Set.from(expectedNames), recordedNames);
for (var library in compiler.libraries.values) {
@@ -111,13 +112,12 @@
// There should at least be one metadata constant:
// 1. The constructed constant for 'MirrorsUsed'.
- Expect.isTrue(compiler.backend.metadataConstants.length >= 1);
+ Expect.isTrue(backend.metadataConstants.length >= 1);
- Set<Constant> compiledConstants =
- compiler.backend.constants.compiledConstants;
+ Set<Constant> compiledConstants = backend.constants.compiledConstants;
// Make sure that most of the metadata constants aren't included in the
// generated code.
- for (var dependency in compiler.backend.metadataConstants) {
+ for (var dependency in backend.metadataConstants) {
Constant constant = dependency.constant;
Expect.isFalse(compiledConstants.contains(constant), '$constant');
}
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 5526922..9b47f8d 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -259,8 +259,8 @@
FunctionExpression function = parseMember('operator -() => null;');
Send name = function.name.asSend();
Expect.isNotNull(name);
- Expect.stringEquals('operator', name.receiver.source);
- Expect.stringEquals('-', name.selector.source);
+ Expect.stringEquals('operator', name.receiver.toString());
+ Expect.stringEquals('-', name.selector.toString());
Expect.isTrue(function.parameters.isEmpty);
Expect.isNull(function.returnType);
Expect.isNull(function.getOrSet);
@@ -285,6 +285,8 @@
void log(message) {
print(message);
}
+
+ noSuchMethod(Invocation invocation) => throw 'unsupported operation';
}
void testMissingCloseParen() {
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/resolution_test.dart
index 4f47d01..3480144 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/resolution_test.dart
@@ -9,6 +9,7 @@
import "package:async_helper/async_helper.dart";
import 'compiler_helper.dart';
import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
const String NO_RUNTIME_TYPE = r"""
import 'dart:core' as prefix;
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 04ca4e3..832e784 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -12,6 +12,7 @@
import "parser_helper.dart";
import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart';
Node buildIdentifier(String name) => new Identifier(scan(name));
@@ -613,15 +614,15 @@
testTopLevelFields() {
MockCompiler compiler = new MockCompiler();
compiler.parseScript("int a;");
- VariableElement element = compiler.mainApp.find("a");
+ VariableElementX element = compiler.mainApp.find("a");
Expect.equals(ElementKind.FIELD, element.kind);
VariableDefinitions node = element.variables.parseNode(element, compiler);
Identifier typeName = node.type.typeName;
Expect.equals(typeName.source, 'int');
compiler.parseScript("var b, c;");
- VariableElement bElement = compiler.mainApp.find("b");
- VariableElement cElement = compiler.mainApp.find("c");
+ VariableElementX bElement = compiler.mainApp.find("b");
+ VariableElementX cElement = compiler.mainApp.find("c");
Expect.equals(ElementKind.FIELD, bElement.kind);
Expect.equals(ElementKind.FIELD, cElement.kind);
Expect.isTrue(bElement != cElement);
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 752d05a..35c633b 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -8,14 +8,15 @@
import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
import "mock_compiler.dart";
-import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
Future<CodeBuffer> compileAll(SourceFile sourceFile) {
MockCompiler compiler = new MockCompiler();
Uri uri = new Uri(path: sourceFile.filename);
compiler.sourceFiles[uri.toString()] = sourceFile;
+ JavaScriptBackend backend = compiler.backend;
return compiler.runCompiler(uri).then((_) {
- return compiler.backend.emitter.mainBuffer;
+ return backend.emitter.mainBuffer;
});
}
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 9ef843f..5a0644c 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2075,8 +2075,9 @@
void generateOutput(String text) {
for (WarningMessage message in compiler.warnings) {
- var beginToken = message.node.getBeginToken();
- var endToken = message.node.getEndToken();
+ Node node = message.node;
+ var beginToken = node.getBeginToken();
+ var endToken = node.getEndToken();
int begin = beginToken.charOffset;
int end = endToken.charOffset + endToken.charCount;
SourceFile sourceFile = new StringSourceFile('analysis', text);
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index a6d9f8c..886a93b 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -4,10 +4,9 @@
import "package:expect/expect.dart";
import "compiler_helper.dart";
-import "parser_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
import "type_mask_test_helper.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
TypeMask nullType;
TypeMask objectType;
@@ -384,6 +383,7 @@
}
void testIntersection(MockCompiler compiler) {
+ JavaScriptBackend backend = compiler.backend;
RuleSet ruleSet = new RuleSet('intersection',
(t1, t2) => t1.intersection(t2, compiler));
rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
@@ -519,9 +519,9 @@
rule(jsIndexable, nonPrimitive1, emptyType);
rule(jsIndexable, nonPrimitive2, emptyType);
rule(jsIndexable, potentialArray, new TypeMask.nonNullSubtype(
- compiler.backend.jsArrayClass));
+ backend.jsArrayClass));
rule(jsIndexable, potentialString, new TypeMask.nonNullSubtype(
- compiler.backend.jsStringClass));
+ backend.jsStringClass));
rule(jsIndexable, jsBooleanOrNull, emptyType);
rule(jsIndexable, jsNumberOrNull, emptyType);
rule(jsIndexable, jsIntegerOrNull, emptyType);
@@ -677,6 +677,7 @@
void main() {
MockCompiler compiler = new MockCompiler();
+ JavaScriptBackend backend = compiler.backend;
compiler.interceptorsLibrary.forEachLocalMember((element) {
if (element.isClass()) {
compiler.enqueuer.resolution.registerInstantiatedClass(
@@ -697,52 +698,29 @@
compiler.functionClass);
potentialArray = new TypeMask.subtype(
compiler.listClass);
- potentialString = new TypeMask.subtype(
- patternClass);
- jsInterceptor = new TypeMask.nonNullSubclass(
- compiler.backend.jsInterceptorClass);
- jsArrayOrNull = new TypeMask.subclass(
- compiler.backend.jsArrayClass);
- jsReadableArray = new TypeMask.nonNullSubclass(
- compiler.backend.jsArrayClass);
- jsMutableArrayOrNull = new TypeMask.subclass(
- compiler.backend.jsMutableArrayClass);
- jsMutableArray = new TypeMask.nonNullSubclass(
- compiler.backend.jsMutableArrayClass);
- jsFixedArrayOrNull = new TypeMask.exact(
- compiler.backend.jsFixedArrayClass);
- jsFixedArray = new TypeMask.nonNullExact(
- compiler.backend.jsFixedArrayClass);
- jsExtendableArrayOrNull = new TypeMask.exact(
- compiler.backend.jsExtendableArrayClass);
- jsExtendableArray = new TypeMask.nonNullExact(
- compiler.backend.jsExtendableArrayClass);
- jsIndexableOrNull = new TypeMask.subtype(
- compiler.backend.jsIndexableClass);
- jsIndexable = new TypeMask.nonNullSubtype(
- compiler.backend.jsIndexableClass);
- jsInterceptorOrNull = new TypeMask.subclass(
- compiler.backend.jsInterceptorClass);
- jsStringOrNull = new TypeMask.exact(
- compiler.backend.jsStringClass);
- jsString = new TypeMask.nonNullExact(
- compiler.backend.jsStringClass);
- jsBoolean = new TypeMask.nonNullExact(
- compiler.backend.jsBoolClass);
- jsNumber = new TypeMask.nonNullSubclass(
- compiler.backend.jsNumberClass);
- jsInteger = new TypeMask.nonNullExact(
- compiler.backend.jsIntClass);
- jsDouble = new TypeMask.nonNullExact(
- compiler.backend.jsDoubleClass);
- jsBooleanOrNull = new TypeMask.exact(
- compiler.backend.jsBoolClass);
- jsNumberOrNull = new TypeMask.subclass(
- compiler.backend.jsNumberClass);
- jsIntegerOrNull = new TypeMask.exact(
- compiler.backend.jsIntClass);
- jsDoubleOrNull = new TypeMask.exact(
- compiler.backend.jsDoubleClass);
+ potentialString = new TypeMask.subtype(patternClass);
+ jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
+ jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
+ jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
+ jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
+ jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
+ jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
+ jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
+ jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
+ jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
+ jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
+ jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
+ jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
+ jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
+ jsString = new TypeMask.nonNullExact(backend.jsStringClass);
+ jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
+ jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
+ jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
+ jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
+ jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
+ jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
+ jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
+ jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
nullType = const TypeMask.empty();
objectType = new TypeMask.nonNullSubclass(
compiler.objectClass);
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/type_variable_occurrence_test.dart
index 1d51adf..5c71028 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/type_variable_occurrence_test.dart
@@ -57,10 +57,10 @@
ClassElement A = env.getElement('A');
- expect(bool expect, String memberName) {
+ expect(bool expectResult, String memberName) {
DartType memberType = env.getMemberType(A, memberName);
TypeVariableType typeVariable = memberType.typeVariableOccurrence;
- if (expect) {
+ if (expectResult) {
Expect.isNotNull(typeVariable);
Expect.equals(A, Types.getClassContext(memberType));
} else {
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index fa5f0bb..ced1c31 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -83,4 +83,6 @@
void log(message) {
messages.add(message);
}
+
+ noSuchMethod(Invocation invocation) => throw 'unsupported operation';
}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index bd7d93f..fd54729 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -44,7 +44,7 @@
[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == jsshell) ]
code_motion_exception_test: Skip # Required V8 specific format of JavaScript errors.
-[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == chrome || $runtime == chromeOnAndroid) ]
+[ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == safari || $runtime == safarimobilesim || $runtime == chrome || $runtime == chromeOnAndroid) ]
isolate2_test/01: Fail # Issue 14458.
[ $runtime == jsshell ]
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 800e3f8..c445f42 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -63,7 +63,7 @@
[ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
unicode_test: Fail
-[ $runtime == ff || $runtime == ie9 || $runtime == jsshell || $runtime == safari ]
+[ $runtime == ff || $runtime == ie9 || $runtime == jsshell || $runtime == safari || $runtime == safarimobilesim ]
double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
@@ -105,7 +105,7 @@
[ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == safari) ]
+[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
[ $compiler == dart2js && ( $runtime == drt) ]
@@ -160,7 +160,7 @@
num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
string_test: StaticWarning, OK # Test generates error on purpose.
-[ $compiler == dart2js && $runtime == safari ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
[ $runtime == ie9 || $runtime == ie10 ]
diff --git a/tests/html/custom/attribute_changed_callback_test.dart b/tests/html/custom/attribute_changed_callback_test.dart
index 14b8614..3eaa446 100644
--- a/tests/html/custom/attribute_changed_callback_test.dart
+++ b/tests/html/custom/attribute_changed_callback_test.dart
@@ -52,8 +52,8 @@
setUp(() => customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(A.tag, A);
- document.register(B.tag, B);
+ document.registerElement(A.tag, A);
+ document.registerElement(B.tag, B);
}
}));
diff --git a/tests/html/custom/constructor_calls_created_synchronously_test.dart b/tests/html/custom/constructor_calls_created_synchronously_test.dart
index 0eb1f5c..256b9f8 100644
--- a/tests/html/custom/constructor_calls_created_synchronously_test.dart
+++ b/tests/html/custom/constructor_calls_created_synchronously_test.dart
@@ -30,7 +30,7 @@
return customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(A.tag, A);
+ document.registerElement(A.tag, A);
}
});
});
@@ -51,7 +51,8 @@
});
test("can extend elements that don't have special prototypes", () {
- document.register('fancy-section', FancySection, extendsTag: 'section');
+ document.registerElement('fancy-section', FancySection,
+ extendsTag: 'section');
var fancy = document.createElement('section', 'fancy-section');
expect(fancy is FancySection, true, reason: 'fancy-section was registered');
expect(fancy.wasCreated, true, reason: 'FancySection ctor was called');
diff --git a/tests/html/custom/created_callback_test.dart b/tests/html/custom/created_callback_test.dart
index 8652520..769b784 100644
--- a/tests/html/custom/created_callback_test.dart
+++ b/tests/html/custom/created_callback_test.dart
@@ -65,15 +65,15 @@
return customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(B.tag, B);
- document.register(C.tag, C);
+ document.registerElement(B.tag, B);
+ document.registerElement(C.tag, C);
ErrorConstructorElement.register();
}
});
});
test('transfer created callback', () {
- document.register(A.tag, A);
+ document.registerElement(A.tag, A);
var x = new A();
expect(A.createdInvocations, 1);
});
@@ -107,7 +107,8 @@
test('cannot register without created', () {
expect(() {
- document.register(MissingCreatedElement.tag, MissingCreatedElement);
+ document.registerElement(MissingCreatedElement.tag,
+ MissingCreatedElement);
}, throws);
});
@@ -149,7 +150,8 @@
test('cannot register created with params', () {
expect(() {
- document.register('x-created-with-params', CreatedWithParametersElement);
+ document.registerElement('x-created-with-params',
+ CreatedWithParametersElement);
}, throws);
});
@@ -171,7 +173,7 @@
NestedElement.created() : super.created();
static void register() {
- document.register(tag, NestedElement);
+ document.registerElement(tag, NestedElement);
}
static void test() {
@@ -203,7 +205,7 @@
}
static void register() {
- document.register(tag, AccessWhileUpgradingElement);
+ document.registerElement(tag, AccessWhileUpgradingElement);
}
static void test() {
@@ -239,7 +241,7 @@
}
static void register() {
- document.register(tag, ErrorConstructorElement);
+ document.registerElement(tag, ErrorConstructorElement);
}
}
@@ -254,7 +256,7 @@
NestedCreatedConstructorElement.created() : super.created();
static void register() {
- document.register(tag, NestedCreatedConstructorElement);
+ document.registerElement(tag, NestedCreatedConstructorElement);
}
// Try to run the created constructor, and record the results.
diff --git a/tests/html/custom/document_register_basic_test.dart b/tests/html/custom/document_register_basic_test.dart
index c5a0d6e..e127ebf 100644
--- a/tests/html/custom/document_register_basic_test.dart
+++ b/tests/html/custom/document_register_basic_test.dart
@@ -47,23 +47,23 @@
setUp(() => customElementsReady);
- test('Testing document.register() basic behaviors', () {
- document.register(Foo.tag, Foo);
+ test('Testing document.registerElement() basic behaviors', () {
+ document.registerElement(Foo.tag, Foo);
// Cannot register an existing dart:html type.
- expect(() => document.register('x-bad-a', HtmlElement), throws);
+ expect(() => document.registerElement('x-bad-a', HtmlElement), throws);
// Invalid user type. Doesn't inherit from HtmlElement.
- expect(() => document.register('x-bad-b', BadB), throws);
+ expect(() => document.registerElement('x-bad-b', BadB), throws);
// Not a type.
- expect(() => document.register('x-bad-c', null), throws);
+ expect(() => document.registerElement('x-bad-c', null), throws);
// Cannot register system type.
- expect(() => document.register('x-bad-d', Object), throws);
+ expect(() => document.registerElement('x-bad-d', Object), throws);
// Must extend HtmlElement, not just implement it.
- expect(() => document.register(BadE.tag, BadE), throws);
+ expect(() => document.registerElement(BadE.tag, BadE), throws);
// Constructor initiated instantiation
var createdFoo = new Foo();
@@ -104,14 +104,14 @@
expect(someProperty[container.firstChild], someProperty[parsedFoo]);
// Having another constructor
- document.register(Bar.tag, Bar);
+ document.registerElement(Bar.tag, Bar);
var createdBar = new Bar();
expect(createdBar is Bar, isTrue);
expect(createdBar is Foo, isFalse);
expect(createdBar.tagName, "X-BAR");
// Having a subclass
- document.register(Baz.tag, Baz);
+ document.registerElement(Baz.tag, Baz);
var createdBaz = new Baz();
expect(createdBaz.tagName, "X-BAZ");
expect(createdBaz.thisIsACustomClass, isTrue);
diff --git a/tests/html/custom/document_register_type_extensions_test.dart b/tests/html/custom/document_register_type_extensions_test.dart
index 80f703f..67957b12 100644
--- a/tests/html/custom/document_register_type_extensions_test.dart
+++ b/tests/html/custom/document_register_type_extensions_test.dart
@@ -93,12 +93,12 @@
return;
}
registeredTypes = true;
- document.register(Foo.tag, Foo);
- document.register(Bar.tag, Bar, extendsTag: 'input');
- document.register(Baz.tag, Baz);
- document.register(Qux.tag, Qux, extendsTag: 'input');
- document.register(MyCanvas.tag, MyCanvas, extendsTag: 'canvas');
- document.register(CustomCustomDiv.tag, CustomCustomDiv, extendsTag: 'div');
+ document.registerElement(Foo.tag, Foo);
+ document.registerElement(Bar.tag, Bar, extendsTag: 'input');
+ document.registerElement(Baz.tag, Baz);
+ document.registerElement(Qux.tag, Qux, extendsTag: 'input');
+ document.registerElement(MyCanvas.tag, MyCanvas, extendsTag: 'canvas');
+ document.registerElement(CustomCustomDiv.tag, CustomCustomDiv, extendsTag: 'div');
}
setUp(() => customElementsReady);
@@ -107,19 +107,19 @@
setUp(registerTypes);
test('cannot register twice', () {
- expect(() => document.register(FooBad.tag, Foo, extendsTag: 'div'),
+ expect(() => document.registerElement(FooBad.tag, Foo, extendsTag: 'div'),
throws);
});
test('cannot register for non-matching tag', () {
expect(() {
- document.register('x-input-div', Bar, extendsTag: 'div');
+ document.registerElement('x-input-div', Bar, extendsTag: 'div');
}, throws);
});
test('cannot register type extension for custom tag', () {
expect(() {
- document.register('x-custom-tag', CustomCustomDiv);
+ document.registerElement('x-custom-tag', CustomCustomDiv);
}, throws);
});
});
diff --git a/tests/html/custom/element_upgrade_test.dart b/tests/html/custom/element_upgrade_test.dart
index 244f21b..c8e7376 100644
--- a/tests/html/custom/element_upgrade_test.dart
+++ b/tests/html/custom/element_upgrade_test.dart
@@ -40,7 +40,7 @@
upgrader.upgrade(e);
};
- document.register('custom-element', CustomElement);
+ document.registerElement('custom-element', CustomElement);
}
}));
diff --git a/tests/html/custom/entered_left_view_test.dart b/tests/html/custom/entered_left_view_test.dart
index 4822d0e..a2804bc 100644
--- a/tests/html/custom/entered_left_view_test.dart
+++ b/tests/html/custom/entered_left_view_test.dart
@@ -18,12 +18,43 @@
invocations.add('created');
}
+ void attached() {
+ invocations.add('attached');
+ }
+
void enteredView() {
- invocations.add('entered');
+ // Deprecated name. Should never be called since we override "attached".
+ invocations.add('enteredView');
+ }
+
+ void detached() {
+ invocations.add('detached');
}
void leftView() {
- invocations.add('left');
+ // Deprecated name. Should never be called since we override "detached".
+ invocations.add('leftView');
+ }
+
+ void attributeChanged(String name, String oldValue, String newValue) {
+ invocations.add('attribute changed');
+ }
+}
+
+
+// Test that the deprecated callbacks still work.
+class FooOldCallbacks extends HtmlElement {
+ factory FooOldCallbacks() => null;
+ FooOldCallbacks.created() : super.created() {
+ invocations.add('created');
+ }
+
+ void enteredView() {
+ invocations.add('enteredView');
+ }
+
+ void leftView() {
+ invocations.add('leftView');
}
void attributeChanged(String name, String oldValue, String newValue) {
@@ -35,7 +66,7 @@
useHtmlIndividualConfiguration();
// Adapted from Blink's
- // fast/dom/custom/entered-left-document.html test.
+ // fast/dom/custom/attached-detached-document.html test.
var docA = document;
var docB = document.implementation.createHtmlDocument('');
@@ -46,7 +77,8 @@
setUp(() => customElementsReady.then((_) {
if (registeredTypes) return;
registeredTypes = true;
- document.register('x-a', Foo);
+ document.registerElement('x-a', Foo);
+ document.registerElement('x-a-old', FooOldCallbacks);
}));
group('standard_events', () {
@@ -60,38 +92,84 @@
expect(invocations, ['created']);
});
- test('entered', () {
+ test('attached', () {
document.body.append(a);
customElementsTakeRecords();
- expect(invocations, ['entered']);
+ expect(invocations, ['attached']);
});
- test('left', () {
+ test('detached', () {
a.remove();
customElementsTakeRecords();
- expect(invocations, ['left']);
+ expect(invocations, ['detached']);
});
var div = new DivElement();
- test('nesting does not trigger entered', () {
+ test('nesting does not trigger attached', () {
div.append(a);
customElementsTakeRecords();
expect(invocations, []);
});
- test('nested entering triggers entered', () {
+ test('nested entering triggers attached', () {
document.body.append(div);
customElementsTakeRecords();
- expect(invocations, ['entered']);
+ expect(invocations, ['attached']);
});
- test('nested leaving triggers left', () {
+ test('nested leaving triggers detached', () {
div.remove();
customElementsTakeRecords();
- expect(invocations, ['left']);
+ expect(invocations, ['detached']);
});
});
+
+ // TODO(jmesserly): remove after deprecation period.
+ group('standard_events -- old callback names', () {
+ var a;
+ setUp(() {
+ invocations = [];
+ });
+
+ test('Created', () {
+ a = new Element.tag('x-a-old');
+ expect(invocations, ['created']);
+ });
+
+ test('enteredView', () {
+ document.body.append(a);
+ customElementsTakeRecords();
+ expect(invocations, ['enteredView']);
+ });
+
+ test('leftView', () {
+ a.remove();
+ customElementsTakeRecords();
+ expect(invocations, ['leftView']);
+ });
+
+ var div = new DivElement();
+ test('nesting does not trigger enteredView', () {
+ div.append(a);
+ customElementsTakeRecords();
+ expect(invocations, []);
+ });
+
+ test('nested entering triggers enteredView', () {
+ document.body.append(div);
+ customElementsTakeRecords();
+ expect(invocations, ['enteredView']);
+ });
+
+ test('nested leaving triggers leftView', () {
+ div.remove();
+ customElementsTakeRecords();
+ expect(invocations, ['leftView']);
+ });
+ });
+
+
group('viewless_document', () {
var a;
setUp(() {
@@ -110,7 +188,7 @@
test('Entered document without a view', () {
docB.body.append(a);
expect(invocations, [],
- reason: 'entered callback should not be invoked when entering a '
+ reason: 'attached callback should not be invoked when entering a '
'document without a view');
});
@@ -124,16 +202,16 @@
test('Entered document with a view', () {
document.body.append(a);
customElementsTakeRecords();
- expect(invocations, ['entered'],
- reason: 'entered callback should be invoked when entering a document '
+ expect(invocations, ['attached'],
+ reason: 'attached callback should be invoked when entering a document '
'with a view');
});
test('Left document with a view', () {
a.remove();
customElementsTakeRecords();
- expect(invocations, ['left'],
- reason: 'left callback should be invoked when leaving a document '
+ expect(invocations, ['detached'],
+ reason: 'detached callback should be invoked when leaving a document '
'with a view');
});
@@ -165,14 +243,14 @@
upgradeCustomElements(s);
expect(invocations, ['created'],
- reason: 'the entered callback should not be invoked when entering a '
+ reason: 'the attached callback should not be invoked when entering a '
'Shadow DOM subtree not in the document');
});
test('Leaves Shadow DOM that is not in a document', () {
s.innerHtml = '';
expect(invocations, [],
- reason: 'the left callback should not be invoked when leaving a '
+ reason: 'the detached callback should not be invoked when leaving a '
'Shadow DOM subtree not in the document');
});
@@ -182,15 +260,15 @@
document.body.append(div);
customElementsTakeRecords();
- expect(invocations, ['created', 'entered'],
- reason: 'the entered callback should be invoked when inserted into '
+ expect(invocations, ['created', 'attached'],
+ reason: 'the attached callback should be invoked when inserted into '
'a document with a view as part of Shadow DOM');
div.remove();
customElementsTakeRecords();
- expect(invocations, ['created', 'entered', 'left'],
- reason: 'the left callback should be invoked when removed from a '
+ expect(invocations, ['created', 'attached', 'detached'],
+ reason: 'the detached callback should be invoked when removed from a '
'document with a view as part of Shadow DOM');
});
});
@@ -208,14 +286,14 @@
upgradeCustomElements(div);
expect(invocations, ['created'],
- reason: 'the entered callback should not be invoked when inserted '
+ reason: 'the attached callback should not be invoked when inserted '
'into a disconnected subtree');
});
test('Leaves a disconnected subtree of DOM', () {
div.innerHtml = '';
expect(invocations, [],
- reason: 'the left callback should not be invoked when removed from a '
+ reason: 'the detached callback should not be invoked when removed from a '
'disconnected subtree');
});
@@ -225,8 +303,8 @@
invocations = [];
document.body.append(div);
customElementsTakeRecords();
- expect(invocations, ['entered'],
- reason: 'the entered callback should be invoked when inserted into a '
+ expect(invocations, ['attached'],
+ reason: 'the attached callback should be invoked when inserted into a '
'document with a view as part of a subtree');
});
});
diff --git a/tests/html/custom/js_custom_test.dart b/tests/html/custom/js_custom_test.dart
index 1abf32f..fc80ffa 100644
--- a/tests/html/custom/js_custom_test.dart
+++ b/tests/html/custom/js_custom_test.dart
@@ -31,7 +31,7 @@
return customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(A.tag, A);
+ document.registerElement(A.tag, A);
}
});
});
@@ -51,7 +51,7 @@
test('accessing custom JS element from Dart', () {
var script = '''
- var Foo = document.register('x-foo', {
+ var Foo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype, {
createdCallback: {
value: function() {
diff --git a/tests/html/custom/mirrors_test.dart b/tests/html/custom/mirrors_test.dart
index e8778d1..87a7ffd 100644
--- a/tests/html/custom/mirrors_test.dart
+++ b/tests/html/custom/mirrors_test.dart
@@ -22,8 +22,8 @@
setUp(() => customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(A.tag, A);
- document.register(B.tag, B);
+ document.registerElement(A.tag, A);
+ document.registerElement(B.tag, B);
}
}));
diff --git a/tests/html/custom/regress_194523002_test.dart b/tests/html/custom/regress_194523002_test.dart
index f7a5ae1..33541df 100644
--- a/tests/html/custom/regress_194523002_test.dart
+++ b/tests/html/custom/regress_194523002_test.dart
@@ -28,7 +28,7 @@
return customElementsReady.then((_) {
if (!registered) {
registered = true;
- document.register(A.tag, A);
+ document.registerElement(A.tag, A);
}
});
});
diff --git a/tests/html/custom/template_wrappers_test.dart b/tests/html/custom/template_wrappers_test.dart
index 5b9ff64..0828c97 100644
--- a/tests/html/custom/template_wrappers_test.dart
+++ b/tests/html/custom/template_wrappers_test.dart
@@ -30,7 +30,7 @@
test('element is upgraded once', () {
expect(createdCount, 0);
- document.register('x-custom', CustomElement);
+ document.registerElement('x-custom', CustomElement);
expect(createdCount, 0);
var element = document.createElement('x-custom');
@@ -54,7 +54,7 @@
d1.attributes['foo'] = 'bar';
d1 = null;
- document.register('x-custom-two', CustomElement);
+ document.registerElement('x-custom-two', CustomElement);
expect(createdCount, 1);
diff --git a/tests/html/custom_elements_test.dart b/tests/html/custom_elements_test.dart
index f31f84a..3ab5207 100644
--- a/tests/html/custom_elements_test.dart
+++ b/tests/html/custom_elements_test.dart
@@ -46,7 +46,7 @@
group('register', () {
test('register', () {
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
var element = new Element.tag(tag);
expect(element, isNotNull);
@@ -56,13 +56,13 @@
test('register twice', () {
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
expect(() {
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
}, throws, reason: 'Cannot register a tag more than once.');
var newTag = nextTag;
- document.register(newTag, CustomType);
+ document.registerElement(newTag, CustomType);
var element = new Element.tag(newTag);
expect(element, isNotNull);
@@ -71,19 +71,19 @@
test('register null', () {
expect(() {
- document.register(nextTag, null);
+ document.registerElement(nextTag, null);
}, throws, reason: 'Cannot register a null type.');
});
test('register native', () {
expect(() {
- document.register(nextTag, BodyElement);
+ document.registerElement(nextTag, BodyElement);
}, throws, reason: 'Cannot register a native element.');
});
test('register non-element', () {
expect(() {
- document.register(nextTag, NotAnElement);
+ document.registerElement(nextTag, NotAnElement);
}, throws, reason: 'Cannot register a non-element.');
});
});
@@ -105,7 +105,7 @@
firedOnPre = true;
});
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
upgradeCustomElements(dom);
var postElement = dom.children[0];
@@ -132,7 +132,7 @@
group('innerHtml', () {
test('query', () {
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
var element = new DivElement();
element.setInnerHtml('<$tag></$tag>',
treeSanitizer: new NullTreeSanitizer());
@@ -147,7 +147,7 @@
test('query id', () {
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
var element = new DivElement();
element.setInnerHtml('<$tag id="someid"></$tag>',
treeSanitizer: new NullTreeSanitizer());
@@ -165,7 +165,7 @@
test('created', () {
int oldCount = customCreatedCount;
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
var element = new DivElement();
element.setInnerHtml('<$tag></$tag>',
treeSanitizer: new NullTreeSanitizer());
@@ -178,7 +178,7 @@
group('mixins', () {
test('can invoke mixin methods', () {
var tag = nextTag;
- document.register(tag, CustomType);
+ document.registerElement(tag, CustomType);
var element = new Element.tag(tag);
element.invokeMixinMethod();
diff --git a/tests/html/html.status b/tests/html/html.status
index 08cdd23..deef6ce 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -16,7 +16,7 @@
[ $compiler == dart2js && $browser ]
custom/created_callback_test: Fail # Support for created constructor.
-[ $compiler == dart2js && ($runtime == safari || $runtime == ff || $runtime == chrome || $ie) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff || $runtime == chrome || $ie) ]
custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
@@ -72,6 +72,11 @@
speechrecognition_test/types: Fail # TODO(dart2js-team): Please triage this failure.
xhr_test/json: Fail # TODO(dart2js-team): Please triage this failure.
+[ $runtime == safarimobilesim ]
+canvasrenderingcontext2d_test/fillText: RuntimeError # Issue 18573
+element_offset_test/offset: RuntimeError # Issue 18573
+element_types_test/supported_meter: RuntimeError # Issue 18573
+
[ $runtime == chrome ]
touchevent_test/supported: Pass, Fail # Issue 17061
xhr_cross_origin_test: Pass, Fail # Issue 11884
@@ -304,12 +309,9 @@
xhr_test/supported_overrideMimeType: Fail
xsltprocessor_test/supported: Fail
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
worker_test: Skip # Issue 13221
worker_api_test: Skip # Issue 13221
-input_element_test/supported_month: RuntimeError
-input_element_test/supported_time: RuntimeError
-input_element_test/supported_week: RuntimeError
webgl_1_test: Pass, Fail # Issue 8219
canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
@@ -325,8 +327,6 @@
fileapi_test/supported: Fail
indexeddb_1_test/supported: Fail
indexeddb_1_test/supportsDatabaseNames: Fail
-input_element_test/supported_date: Fail
-input_element_test/supported_datetime-local: Fail
media_stream_test/supported_MediaStreamEvent: Fail
media_stream_test/supported_MediaStreamTrackEvent: Fail
media_stream_test/supported_media: Fail
@@ -334,9 +334,16 @@
rtc_test/supported: Fail
shadow_dom_test/supported: Fail
speechrecognition_test/supported: Fail
-touchevent_test/supported: Fail
xhr_test/json: Fail # Safari doesn't support JSON response type
+[ $runtime == safari ]
+input_element_test/supported_month: RuntimeError
+input_element_test/supported_time: RuntimeError
+input_element_test/supported_week: RuntimeError
+input_element_test/supported_date: Fail
+input_element_test/supported_datetime-local: Fail
+touchevent_test/supported: Fail
+
[ $runtime == opera ]
blob_constructor_test: Fail
canvas_test: Fail
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index f1f41fa..0dd2952 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -9,6 +9,9 @@
[ $runtime == vm && $arch == mips && $mode == debug ]
mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
+[ $runtime == vm && $arch == simarm && $mode == debug ]
+mandel_isolate_test: Crash, Pass # Issue 18670
+
[ $runtime == vm && $arch == simarm64 ]
*: Skip
diff --git a/tests/language/const_map3_test.dart b/tests/language/const_map3_test.dart
new file mode 100644
index 0000000..ee2f88c
--- /dev/null
+++ b/tests/language/const_map3_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+ static const b = const B();
+}
+
+class B implements A {
+ const B();
+
+ operator ==(o) => true; /// 00: compile-time error
+}
+
+main() {
+ // It is a compile-time error if the key type overrides operator ==.
+ var m = const { A.b: 42 };
+ Expect.equals(42, m[const B()]);
+
+ m = const { "foo": 99, A.b: 499 };
+ Expect.equals(499, m[const B()]);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 91945d5..8a67e43 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -124,5 +124,20 @@
stack_overflow_test: Skip # Crashes. Issue 17440.
stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
+# arm64 port is WIP. No issue numbers until we're a bit further along.
[ $compiler == none && $runtime == vm && $arch == simarm64 ]
-*: Skip
+vm/regress_16873_test: Skip # Pass, Slow
+
+# Unimplemented features
+vm/string_polymorphic_test: Crash
+vm/optimization_test: Crash
+vm/math_vm_test: Crash
+vm/deopt_hoisted_smi_check_vm_test:Crash
+vm/reusable_boxes_test: Crash
+vm/allocation_sinking_vm_test: Crash
+double_modulo_test: Crash
+modulo_test: Crash
+guess_cid_test: Crash
+arithmetic_canonicalization_test: Crash
+try_catch_optimized1_test: Crash
+arithmetic_test: Crash
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index c07a0da..cb09358 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -453,12 +453,25 @@
list_literal1_test/01: CompileTimeError # Issue 16391
map_literal1_test/01: CompileTimeError # Issue 16391
-# Issue 17522
-deferred_constraints_type_annotation_test/*: Pass, Fail
-deferred_constraints_constants_test/*: Pass, Fail
+# Issue 18562- Old syntax (@lazy) for deferred libraries
deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
deferred_constraints_constants_old_syntax_test/*: Pass, Fail
-deferred_closurize_load_library_test: Fail
+
+# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
+# generate the "The deferred types cannot be used in a declaration" warning
+#deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+#deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+#deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+
+# Deferred loading support, tests marked as failing until support is enabled by default.
+deferred_closurize_load_library_test: Pass, Fail
+deferred_not_loaded_check_test/*: Pass, Fail
+deferred_shadow_load_library_test: Pass, Fail
+deferred_constraints_constants_test/*: Pass, Fail
+deferred_load_library_wrong_args_test/*: Pass, Fail
+deferred_constraints_type_annotation_test/*: Pass, Fail
+deferred_load_inval_code_test: Pass, Fail
+deferred_not_loaded_check_test: Pass, Fail
# Issues to be fixed now that type parameters have been fixed
# (issues 14221, 15553)
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index da96370..46fe07f 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -78,6 +78,9 @@
import_combinators_negative_test: fail
interface_static_non_final_fields_negative_test: fail
+# test issue 11697: switch/case and static const class member
+switch_case_static_const_test: fail
+
# test issue 11918: mixin and const constructor
const_constructor_mixin_test/01: fail
const_constructor_mixin3_test/01: fail
@@ -198,6 +201,7 @@
bad_named_constructor_negative_test: CompileTimeError
body_less_constructor_wrong_arg_negative_test: CompileTimeError
const_counter_negative_test: CompileTimeError
+const_map3_test/00: MissingCompileTimeError
const_optional_args_negative_test: CompileTimeError
constructor_redirect1_negative_test: CompileTimeError
constructor_redirect2_negative_test: CompileTimeError
@@ -453,13 +457,15 @@
list_literal1_test/01: CompileTimeError # Issue 16391
map_literal1_test/01: CompileTimeError # Issue 16391
-# Issue 17522
-deferred_constraints_type_annotation_test/*: Pass, Fail
-deferred_constraints_constants_test/*: Pass, Fail
+# Issue 18562- Old syntax (@lazy) for deferred libraries
deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
deferred_constraints_constants_old_syntax_test/*: Pass, Fail
-deferred_shadow_load_library_test: Fail
-deferred_closurize_load_library_test: Fail
+
+# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
+# generate the "The deferred types cannot be used in a declaration" warning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
# Issues to be fixed now that type parameters have been fixed
# (issues 14221, 15553)
@@ -487,7 +493,4 @@
factory1_test/none: StaticWarning
generic_closure_test: StaticWarning
local_function2_test: StaticWarning
-null_test/none: StaticWarning
redirecting_factory_long_test: StaticWarning
-type_parameter_literal_test: StaticWarning
-mirrors/new_instance_with_type_arguments_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index e55ec91..27041c4 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -146,7 +146,7 @@
*: Fail, Pass # TODO(ahe): Triage these tests.
-[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == ie9 || $runtime == safari)]
+[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell || $runtime == ie9 || $runtime == safari || $runtime == safarimobilesim)]
round_test: Fail, OK # Common JavaScript engine Math.round bug.
[ $compiler == dart2js && $runtime == chromeOnAndroid ]
diff --git a/tests/language/regress_18535_test.dart b/tests/language/regress_18535_test.dart
new file mode 100644
index 0000000..991a8a8
--- /dev/null
+++ b/tests/language/regress_18535_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 18535.
+
+import 'dart:mirrors';
+import 'package:collection/collection.dart';
+
+void main() {
+ print(currentMirrorSystem().libraries);
+}
\ No newline at end of file
diff --git a/tests/language/switch_case_static_const_test.dart b/tests/language/switch_case_static_const_test.dart
new file mode 100644
index 0000000..e15a9f4
--- /dev/null
+++ b/tests/language/switch_case_static_const_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+ static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+ switch (p) {
+ case S:
+ break;
+ case A.S:
+ break;
+ case 'abc':
+ break;
+ }
+}
+
+main() {
+ foo('p');
+}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 5e5d7de..9d9085a 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -6,6 +6,7 @@
lib/_internal: Skip # Slow like a hell - timeouts.
[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
+lib/_blink/dartium/_blink_dartium: CompileTimeError # Issue 16522
lib/_chrome/dart2js/chrome_dart2js: CompileTimeError # Issue 16522
lib/html/dart2js/html_dart2js: CompileTimeError # Issue 16522
lib/html/dartium/html_dartium: CompileTimeError # Issue 16522
@@ -16,7 +17,6 @@
lib/_internal/compiler/samples/compile_loop/compile_loop: CompileTimeError # Issue 16524
lib/_internal/compiler/samples/darttags/darttags: CompileTimeError # Issue 16524
lib/js/dart2js/js_dart2js: CompileTimeError # Issue 16524
-lib/js/dartium/js_dartium: CompileTimeError # Issue 16524
lib/svg/dart2js/svg_dart2js: CompileTimeError # Issue 16524
lib/svg/dartium/svg_dartium: CompileTimeError # Issue 16524
lib/typed_data/dart2js/native_typed_data_dart2js: CompileTimeError # Issue 16524
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 4198cae..da8892f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -96,6 +96,7 @@
mirrors/parameter_test/none: RuntimeError # Issue 6490
mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
mirrors/private_symbol_test: CompileTimeError # Issue 13597
+mirrors/private_types_test: RuntimeError # Issue 6490
mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
mirrors/redirecting_factory_test/02: RuntimeError # Issue 6490
mirrors/reflected_type_function_type_test: RuntimeError # Issue 12607
@@ -118,7 +119,7 @@
mirrors/raw_type_test/01: RuntimeError # http://dartbug.com/6490
mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
-[ $runtime == safari ]
+[ $runtime == safari || $runtime == safarimobilesim ]
typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
@@ -128,7 +129,7 @@
typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
-[ $compiler == dart2js && $runtime != jsshell && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
+[ $compiler == dart2js && $runtime != jsshell && $runtime != safarimobilesim && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
math/math_test: RuntimeError
math/math2_test: RuntimeError
diff --git a/tests/lib/mirrors/private_types_test.dart b/tests/lib/mirrors/private_types_test.dart
new file mode 100644
index 0000000..fd86f89
--- /dev/null
+++ b/tests/lib/mirrors/private_types_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.private_types;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+typedef int _F(int i);
+class _C<_T> {}
+
+typedef int F(int i);
+class C<T> {}
+
+main() {
+ Expect.isTrue(reflectType(_F).isPrivate);
+ Expect.isFalse((reflectType(_F) as TypedefMirror).referent.isPrivate);
+ Expect.isTrue(reflectType(_C).isPrivate);
+ Expect.isTrue(reflectClass(_C).typeVariables.single.isPrivate);
+
+ Expect.isFalse(reflectType(F).isPrivate);
+ Expect.isFalse((reflectType(F) as TypedefMirror).referent.isPrivate);
+ Expect.isFalse(reflectType(C).isPrivate);
+ Expect.isFalse(reflectClass(C).typeVariables.single.isPrivate);
+
+ Expect.isFalse(reflectType(dynamic).isPrivate);
+ Expect.isFalse(currentMirrorSystem().dynamicType.isPrivate);
+ Expect.isFalse(currentMirrorSystem().voidType.isPrivate);
+}
diff --git a/tests/lib/profiler/user_tags_test.dart b/tests/lib/profiler/user_tags_test.dart
index 4070d90..f09abcd 100644
--- a/tests/lib/profiler/user_tags_test.dart
+++ b/tests/lib/profiler/user_tags_test.dart
@@ -6,6 +6,11 @@
import 'dart:profiler';
import 'package:expect/expect.dart';
+// Test that the default tag is set.
+testDefault() {
+ Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+}
+
// Test that the label property matches the constructor.
void testLabel() {
var label = 'Hello World';
@@ -19,6 +24,9 @@
var label = 'Global Tag';
var tag = new UserTag(label);
Expect.isTrue(identical(tag, tag1));
+ var defaultLabel = 'Default';
+ var defaultTag = new UserTag(defaultLabel);
+ Expect.isTrue(identical(UserTag.defaultTag, defaultTag));
}
@@ -29,16 +37,6 @@
}
-// Test clearCurrentTag.
-void testClearCurrent(tag) {
- tag.makeCurrent();
- Expect.isTrue(identical(tag, getCurrentTag()));
- var old_tag = clearCurrentTag();
- Expect.isTrue(identical(tag, old_tag));
- Expect.isNull(getCurrentTag());
-}
-
-
// Test that we reach a limit of tags an exception is thrown.
void testExhaust() {
var i = 0;
@@ -50,7 +48,29 @@
}
+var callerTag = new UserTag('caller');
+var calleeTag = new UserTag('callee');
+
+void callee() {
+ var old = calleeTag.makeCurrent();
+ Expect.isTrue(identical(calleeTag, getCurrentTag()));
+ old.makeCurrent();
+}
+
+void testCallerPattern() {
+ Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+ var old = callerTag.makeCurrent();
+ Expect.isTrue(identical(callerTag, getCurrentTag()));
+ callee();
+ Expect.isTrue(identical(callerTag, getCurrentTag()));
+ old.makeCurrent();
+ Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
+}
+
+
main() {
+ testDefault();
+ testCallerPattern();
var label = 'Global Tag';
var tag = new UserTag(label);
testLabel();
@@ -58,6 +78,5 @@
for (var i = 0; i < 2000; i++) {
testMakeCurrent(tag);
}
- testClearCurrent(tag);
Expect.throws(testExhaust);
}
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index 6c90ed9..33fc191 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -472,8 +472,6 @@
}
testPausedSecuringSubscription(bool pausedServer, bool pausedClient) {
- bool expectFail = pausedServer || pausedClient;
-
asyncStart();
var clientComplete = new Completer();
RawServerSocket.bind(HOST, 0).then((server) {
@@ -483,25 +481,32 @@
if (pausedServer) {
subscription.pause();
}
- RawSecureSocket.secureServer(
- client, CERTIFICATE, subscription: subscription).then((client) {
- if (expectFail) {
- Expect.fail("secureServer succeeded with paused subscription");
- }
- }).catchError((e) {
- if (!expectFail) {
- Expect.fail("secureServer failed with non-paused subscriptions");
- }
- if (pausedServer) {
- Expect.isTrue(e is StateError);
- }
- }).whenComplete(() {
+ void done() {
server.close();
clientComplete.future.then((_) {
client.close();
asyncEnd();
});
- });
+ }
+ try {
+ RawSecureSocket.secureServer(
+ client, CERTIFICATE, subscription: subscription)
+ .catchError((_) {})
+ .whenComplete(() {
+ if (pausedServer) {
+ Expect.fail("secureServer succeeded with paused subscription");
+ }
+ done();
+ });
+ } catch (e) {
+ if (!pausedServer) {
+ Expect.fail("secureServer failed with non-paused subscriptions");
+ }
+ if (pausedServer) {
+ Expect.isTrue(e is ArgumentError);
+ }
+ done();
+ }
});
});
@@ -511,22 +516,26 @@
if (pausedClient) {
subscription.pause();
}
- RawSecureSocket.secure(
- socket, subscription: subscription).then((socket) {
- if (expectFail) {
- Expect.fail("secure succeeded with paused subscription");
- }
- socket.close();
- }).catchError((e) {
- if (!expectFail) {
+ try {
+ RawSecureSocket.secure(
+ socket, subscription: subscription)
+ .catchError((_) {})
+ .whenComplete(() {
+ if (pausedClient) {
+ Expect.fail("secure succeeded with paused subscription");
+ }
+ socket.close();
+ clientComplete.complete(null);
+ });
+ } catch (e) {
+ if (!pausedClient) {
Expect.fail("secure failed with non-paused subscriptions ($e)");
}
if (pausedClient) {
- Expect.isTrue(e is StateError);
+ Expect.isTrue(e is ArgumentError);
}
- }).whenComplete(() {
clientComplete.complete(null);
- });
+ }
});
});
});
@@ -555,6 +564,7 @@
testSimpleConnectFail("not_a_nickname", true);
testSimpleConnectFail("CN=notARealDistinguishedName", true);
testServerListenAfterConnect();
+
testSimpleReadWrite(listenSecure: true,
connectSecure: true,
handshakeBeforeSecure: false,
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 27a903e..564f412 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -386,7 +386,8 @@
});
}
- testFromSocket() {
+ testFromUpgradedSocket() {
+ asyncStart();
createServer().then((server) {
server.listen((request) {
Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION));
@@ -401,18 +402,17 @@
..headers.add(HttpHeaders.UPGRADE, "websocket")
..headers.add("Sec-WebSocket-Accept", accept);
request.response.contentLength = 0;
- return request.response.detachSocket()
- .then((socket) => new WebSocket.fromUpgradedSocket(socket))
- .then((websocket) {
+ request.response.detachSocket().then((socket) {
+ return new WebSocket.fromUpgradedSocket(socket, serverSide: true);
+ }).then((websocket) {
websocket.add("Hello");
websocket.close();
+ asyncEnd();
});
});
var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
- var client = new HttpClient();
- var completer = new Completer();
WebSocket.connect(url).then((websocket) {
return websocket.listen((message) {
Expect.equals("Hello", message);
@@ -442,7 +442,7 @@
testUsePOST();
testConnections(10, 3002, "Got tired");
testIndividualUpgrade(5);
- testFromSocket();
+ testFromUpgradedSocket();
}
}
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index e2a36fe..26ec20a 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index e9564a6..62de2f0 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -118,8 +118,6 @@
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
-
-[ $arch == mips && $mode == debug ]
io/file_read_special_device_test: Fail # dartbug.com/17440
[ $arch == simarm64 ]
diff --git a/tests/standalone/vmservice/isolate_class_field_test.dart b/tests/standalone/vmservice/isolate_class_field_test.dart
index be85613..dd3f44e 100644
--- a/tests/standalone/vmservice/isolate_class_field_test.dart
+++ b/tests/standalone/vmservice/isolate_class_field_test.dart
@@ -30,7 +30,7 @@
Expect.equals('Field', field['type']);
Expect.equals('final_fixed_length_list', field['user_name']);
Expect.equals('final_fixed_length_list', field['name']);
- Expect.equals('Float32List', field['guard_class']['user_name']);
+ Expect.equals('_Float32Array', field['guard_class']['user_name']);
Expect.equals(true, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
@@ -44,7 +44,7 @@
Expect.equals(false, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
- Expect.equals('Float32List', field['guard_class']['user_name']);
+ Expect.equals('_Float32Array', field['guard_class']['user_name']);
Expect.equals('variable', field['guard_length']);
}
@@ -55,7 +55,7 @@
Expect.equals(false, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
- Expect.equals('String', field['guard_class']['user_name']);
+ Expect.equals('_OneByteString', field['guard_class']['user_name']);
Expect.equals(false, field['guard_nullable']);
Expect.equals('variable', field['guard_length']);
}
@@ -86,7 +86,7 @@
Expect.equals(false, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
- Expect.equals('double', field['guard_class']['user_name']);
+ Expect.equals('_Double', field['guard_class']['user_name']);
Expect.equals(true, field['guard_nullable']);
Expect.equals('variable', field['guard_length']);
}
@@ -98,7 +98,7 @@
Expect.equals(true, field['final']);
Expect.equals(false, field['static']);
Expect.equals(true, field['final']);
- Expect.equals('int', field['guard_class']['user_name']);
+ Expect.equals('_Smi', field['guard_class']['user_name']);
Expect.equals(false, field['guard_nullable']);
Expect.equals('variable', field['guard_length']);
}
@@ -107,7 +107,7 @@
Expect.equals('Field', field['type']);
Expect.equals('final_fixed_length_list', field['user_name']);
Expect.equals('final_fixed_length_list', field['name']);
- Expect.equals('Float32List', field['guard_class']['user_name']);
+ Expect.equals('_Float32Array', field['guard_class']['user_name']);
Expect.equals(true, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
@@ -118,7 +118,7 @@
Expect.equals('Field', field['type']);
Expect.equals('fixed_length_array', field['user_name']);
Expect.equals('fixed_length_array', field['name']);
- Expect.equals('List', field['guard_class']['user_name']);
+ Expect.equals('_List', field['guard_class']['user_name']);
Expect.equals(true, field['final']);
Expect.equals(false, field['static']);
Expect.equals(false, field['const']);
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
new file mode 100644
index 0000000..ef7932f
--- /dev/null
+++ b/tests/try/cursor_position_test.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--package-root=sdk/lib/_internal/
+
+// Test that cursor positions are correctly updated after adding new content.
+
+library trydart.cursor_position_test;
+
+import 'dart:html';
+import 'dart:async';
+
+import '../../site/try/src/interaction_manager.dart' show
+ InteractionManager;
+
+import '../../site/try/src/ui.dart' show
+ hackDiv,
+ mainEditorPane,
+ observer;
+
+import '../../site/try/src/user_option.dart' show
+ UserOption;
+
+import '../../pkg/expect/lib/expect.dart';
+
+import '../../pkg/async_helper/lib/async_helper.dart';
+
+void main() {
+ InteractionManager interaction = mockTryDartInteraction();
+
+ List<TestCase> tests = <TestCase>[
+
+ new TestCase('Test adding two lines programmatically.', () {
+ clearEditorPaneWithoutNotifications();
+ mainEditorPane.appendText('\n\n');
+ Text text = mainEditorPane.firstChild;
+ window.getSelection().collapse(text, 1);
+ checkSelectionIsCollapsed(text, 1);
+ }, checkAtBeginningOfSecondLine),
+
+ new TestCase('Test adding a new line with mock key event.', () {
+ clearEditorPaneWithoutNotifications();
+ checkSelectionIsCollapsed(mainEditorPane, 0);
+ simulateEnterKeyDown(interaction);
+ }, checkAtBeginningOfSecondLine),
+
+ ];
+
+ runTests(tests.iterator, completerForAsyncTest());
+}
+
+void simulateEnterKeyDown(InteractionManager interaction) {
+ interaction.onKeyUp(
+ new MockKeyboardEvent('keydown', keyCode: KeyCode.ENTER));
+}
+
+void clearEditorPaneWithoutNotifications() {
+ mainEditorPane.nodes.clear();
+ observer.takeRecords();
+}
+
+void checkSelectionIsCollapsed(Node node, int offset) {
+ var selection = window.getSelection();
+ Expect.isTrue(selection.isCollapsed, 'selection.isCollapsed');
+ Expect.equals(node, selection.anchorNode, 'selection.anchorNode');
+ Expect.equals(offset, selection.anchorOffset, 'selection.anchorOffset');
+}
+
+void checkLineCount(int expectedLineCount) {
+ Expect.equals(
+ expectedLineCount, mainEditorPane.nodes.length,
+ 'mainEditorPane.nodes.length');
+}
+
+void checkAtBeginningOfSecondLine() {
+ checkLineCount(2);
+ checkSelectionIsCollapsed(mainEditorPane.nodes[1].firstChild, 0);
+}
+
+runTests(Iterator<TestCase> iterator, Completer completer) {
+ if (iterator.moveNext()) {
+ TestCase test = iterator.current;
+ new Future(() {
+ print('${test.description}\nSetup.');
+ test.setup();
+ new Future(() {
+ test.validate();
+ print('${test.description}\nDone.');
+ runTests(iterator, completer);
+ });
+ });
+ } else {
+ completer.complete(null);
+ }
+}
+
+Completer completerForAsyncTest() {
+ Completer completer = new Completer();
+ asyncTest(() => completer.future.then((_) {
+ // Clear the DOM to work around a bug in test.dart.
+ document.body.nodes.clear();
+ }));
+ return completer;
+}
+
+InteractionManager mockTryDartInteraction() {
+ UserOption.storage = {};
+
+ InteractionManager interaction = new InteractionManager();
+
+ hackDiv = new DivElement();
+ mainEditorPane = new DivElement()
+ ..style.whiteSpace = 'pre'
+ ..contentEditable = 'true';
+
+ observer = new MutationObserver(interaction.onMutation);
+ observer.observe(
+ mainEditorPane, childList: true, characterData: true, subtree: true);
+
+ document.body.nodes.addAll([mainEditorPane, hackDiv]);
+
+ return interaction;
+}
+
+class MockKeyboardEvent extends KeyEvent {
+ final int keyCode;
+
+ MockKeyboardEvent(String type, {int keyCode})
+ : this.keyCode = keyCode,
+ super.wrap(new KeyEvent(type, keyCode: keyCode));
+
+ bool getModifierState(String keyArgument) => false;
+}
+
+typedef void VoidFunction();
+
+class TestCase {
+ final String description;
+ final VoidFunction setup;
+ final VoidFunction validate;
+
+ TestCase(this.description, this.setup, this.validate);
+}
diff --git a/tests/try/end_to_end_test.dart b/tests/try/end_to_end_test.dart
index 46abf8e..3452aa8 100644
--- a/tests/try/end_to_end_test.dart
+++ b/tests/try/end_to_end_test.dart
@@ -19,6 +19,18 @@
import 'package:async_helper/async_helper.dart';
+void onError(String message, String filename, int lineno) {
+ if (filename != null) {
+ message = '$filename:$lineno: $message';
+ }
+ print("Error occurred in Try Dart iframe: $message");
+ new Future(() {
+ // Chrome seems to not call window.onerror when you throw in response to an
+ // error event. So we throw the error in a future.
+ throw 'Error from iframe: $message';
+ });
+}
+
void installErrorHandlerOn(IFrameElement iframe) {
// This method uses dart:js to install an error event handler on the content
// window of [iframe]. This is a workaround for http://dartbug.com/17936.
@@ -29,16 +41,10 @@
throw 'No contentWindow in iframe';
}
contentWindowProxy.callMethod('addEventListener', ['error', (eventProxy) {
- String filename = eventProxy['filename'];
- int lineno = eventProxy['lineno'];
- String message = eventProxy['message'];
- print("Error occurred in iframe: $message");
- new Future(() {
- // Chrome seems to not call window.onerror when you throw in response to
- // an error event. So we throw the error in a future.
- throw 'Error from iframe: $filename:$lineno: $message';
- });
+ onError(
+ eventProxy['message'], eventProxy['filename'], eventProxy['lineno']);
}]);
+ contentWindowProxy['onerror'] = onError;
}
void onIframeLoaded(Event event) {
@@ -66,7 +72,6 @@
window.localStorage.clear();
IFrameElement iframe = new IFrameElement()
- ..src = '/root_build/try_dartlang_org/index.html'
..style.width = '90vw'
..style.height = '90vh'
..onLoad.listen(onIframeLoaded);
@@ -75,4 +80,6 @@
// fired the load event. That seems to matter according to some sources on
// stackoverflow.
installErrorHandlerOn(iframe);
+
+ iframe.src = '/root_build/try_dartlang_org/index.html';
}
diff --git a/tests/try/internal_error_test.dart b/tests/try/internal_error_test.dart
new file mode 100644
index 0000000..8cbac3a
--- /dev/null
+++ b/tests/try/internal_error_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--package-root=sdk/lib/_internal/
+
+library trydart.internal_error_test;
+
+import 'dart:html';
+import 'dart:async';
+
+import '../../site/try/src/interaction_manager.dart' show
+ InteractionManager,
+ TRY_DART_NEW_DEFECT;
+
+import '../../site/try/src/ui.dart' show
+ mainEditorPane,
+ observer,
+ outputDiv;
+
+import '../../site/try/src/user_option.dart' show
+ UserOption;
+
+import '../../pkg/expect/lib/expect.dart';
+import '../../pkg/async_helper/lib/async_helper.dart';
+
+main() {
+ UserOption.storage = {};
+
+ var interaction = new InteractionManager();
+ mainEditorPane = new DivElement();
+ outputDiv = new PreElement();
+ document.body.append(mainEditorPane);
+ observer = new MutationObserver((mutations, observer) {
+ try {
+ interaction.onMutation(mutations, observer);
+ } catch (e) {
+ // Ignored.
+ }
+ });
+ observer.observe(
+ mainEditorPane, childList: true, characterData: true, subtree: true);
+
+ mainEditorPane.innerHtml = 'main() { print("hello"); }';
+
+ interaction.currentCompilationUnit = null; // This will provoke a crash.
+
+ asyncTest(() {
+ return new Future(() {
+ Expect.isTrue(outputDiv.text.contains(TRY_DART_NEW_DEFECT));
+ });
+ });
+}
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index 8355275..f16c3d8 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -23,13 +23,16 @@
import '../../pkg/async_helper/lib/async_helper.dart';
const Map<String, String> tests = const <String, String> {
- '<span><p>//...</p>}</span>': '//...\n}\n',
- 'someText': 'someText\n',
- '"\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
- '"\$\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
- '"\$\$4"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4"\n',
- '"\$\$4 "': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4 "\n',
- '1e': '<DIAGNOSTIC>1e</DIAGNOSTIC>\n',
+ '<span><p>//...</p>}</span>': '//...\n}',
+ 'someText': 'someText',
+ '"\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC>"',
+ '"\$\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>"',
+ '"\$\$4"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4"',
+ '"\$\$4 "': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4 "',
+ '1e': '<DIAGNOSTIC>1e</DIAGNOSTIC>',
+ 'r"""\n\n\'"""': 'r"""\n\n\'"""',
+ '"': '<DIAGNOSTIC>"</DIAGNOSTIC>',
+ '/**\n*/': '/**\n*/',
};
List<Node> queryDiagnosticNodes() {
@@ -76,7 +79,5 @@
..observe(
mainEditorPane, childList: true, characterData: true, subtree: true);
- mainEditorPane.innerHtml = "<span><p>//...</p>}</span>";
-
asyncTest(runTests);
}
diff --git a/tests/try/try.status b/tests/try/try.status
index 2b285d9..e591cc8 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -2,9 +2,12 @@
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
-# Not dart2js on chrome or drt.
-[ $compiler != dart2js || ($runtime != drt && $runtime != chrome) ]
+# Try Dart is tested on the following configurations:
+# dart2js-drt (Content Shell --dump-render-tree)
+# dart2js-chrome
+# dart2js-ff (Firefox)
+[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff) ]
*: Skip
[ $csp ]
-end_to_end_test: Fail, OK # http://dartbug.com/17935
+end_to_end_test: Skip, OK # http://dartbug.com/17935
diff --git a/tools/VERSION b/tools/VERSION
index ef14d62..ed7eba2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 1
MINOR 4
PATCH 0
-PRERELEASE 5
-PRERELEASE_PATCH 1
+PRERELEASE 6
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 6aacb4f..d0974e6 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -264,8 +264,9 @@
else:
gsutil_command = [sys.executable, GSUtil.GSUTIL_PATH]
- run(gsutil_command + gsutil_args, env=env,
- shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and sys.platform == 'win32'))
+ return run(gsutil_command + gsutil_args, env=env,
+ shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and
+ sys.platform == 'win32'))
def upload(self, local_path, remote_path, recursive=False, public=False):
assert remote_path.startswith('gs://')
@@ -278,6 +279,13 @@
args += [local_path, remote_path]
self.execute(args)
+ def cat(self, remote_path):
+ assert remote_path.startswith('gs://')
+
+ args = ['cat', remote_path]
+ (stdout, _, _) = self.execute(args)
+ return stdout
+
def setGroupReadACL(self, remote_path, group):
args = ['acl', 'ch', '-g', '%s:R' % group, remote_path]
self.execute(args)
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index ca322f9..06c3b07 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -25,7 +25,7 @@
r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?-?(\d*)-?(\d*)')
DART2JS_FULL_BUILDER = r'dart2js-full-(linux|mac|windows)(-checked)?(-minified)?-(\d+)-(\d+)'
WEB_BUILDER = (
- r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
+ r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
DART2JS_FULL_CONFIGURATIONS = {
'linux' : [ ],
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 3714728..8b3e251 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -99,10 +99,10 @@
with bot.BuildStep('Upload artifacts'):
bot_name, _ = bot.GetBotName()
channel = bot_utils.GetChannelFromName(bot_name)
-# if channel != bot_utils.Channel.BLEEDING_EDGE:
- ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
-# else:
-# print 'Not uploading artifacts on bleeding edge'
+ if channel != bot_utils.Channel.BLEEDING_EDGE:
+ ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
+ else:
+ print 'Not uploading artifacts on bleeding edge'
if __name__ == '__main__':
# We pass in None for build_step to avoid building the sdk.
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
new file mode 100755
index 0000000..d6295a6
--- /dev/null
+++ b/tools/bots/version_checker.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+
+# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import json
+import re
+import sys
+
+import bot
+import bot_utils
+
+utils = bot_utils.GetUtils()
+
+VERSION_BUILDER = r'version-checker'
+
+def VersionConfig(name, is_buildbot):
+ version_pattern = re.match(VERSION_BUILDER, name)
+ if not version_pattern:
+ return None
+ # We don't really use this, but we create it anyway to use the standard
+ # bot execution model.
+ return bot.BuildInfo('none', 'none', 'release', 'linux')
+
+def GetLatestVersionFromGCS(channel):
+ namer = bot_utils.GCSNamer(channel=channel)
+ gsutil = bot_utils.GSUtil()
+ gcs_version_path = namer.version_filepath('latest')
+ print 'Getting latest version from: %s' % gcs_version_path
+ version_json = gsutil.cat(gcs_version_path)
+ version_map = json.loads(version_json)
+ return version_map['version']
+
+def ValidateChannelVersion(latest_version, channel):
+ repo_version = utils.ReadVersionFile()
+ assert repo_version.channel == channel
+ if channel == bot_utils.Channel.STABLE:
+ assert int(repo_version.prerelease) == 0
+ assert int(repo_version.prerelease_patch) == 0
+
+ version_re = r'(\d+)\.(\d+)\.(\d+)(-dev\.(\d+)\.(\d+))?'
+
+ latest_match = re.match(version_re, latest_version)
+ latest_major = int(latest_match.group(1))
+ latest_minor = int(latest_match.group(2))
+ latest_patch = int(latest_match.group(3))
+ # We don't use these on stable.
+ latest_prerelease = int(latest_match.group(5) or 0)
+ latest_prerelease_patch = int(latest_match.group(6) or 0)
+
+ if latest_major < int(repo_version.major):
+ return True
+ if latest_minor < int(repo_version.minor):
+ return True
+ if latest_patch < int(repo_version.patch):
+ return True
+ if latest_prerelease < int(repo_version.prerelease):
+ return True
+ if latest_prerelease_patch < int(repo_version.prerelease_patch):
+ return True
+ return False
+
+def VersionSteps(build_info):
+ with bot.BuildStep('Version file sanity checking'):
+ bot_name, _ = bot.GetBotName()
+ channel = bot_utils.GetChannelFromName(bot_name)
+ if channel == bot_utils.Channel.BLEEDING_EDGE:
+ print 'No sanity checking on bleeding edge'
+ else:
+ assert (channel == bot_utils.Channel.STABLE or
+ channel == bot_utils.Channel.DEV)
+ latest_version = GetLatestVersionFromGCS(channel)
+ version = utils.GetVersion()
+ print 'Latests version on GCS: %s' % latest_version
+ print 'Version currently building: %s' % version
+ if not ValidateChannelVersion(latest_version, channel):
+ print "Validation failed"
+ sys.exit(1)
+ else:
+ print 'Version file changed, sanity checks passed'
+
+if __name__ == '__main__':
+ # We pass in None for build_step to avoid building.
+ bot.RunBot(VersionConfig, VersionSteps, build_step=None)
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index 0eba452..3b344c6 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -31,6 +31,10 @@
result.add_option("--out_dir",
default=None,
help="Where to put the packages.")
+ result.add_option("-a", "--arch",
+ help='Target architectures (comma-separated).',
+ metavar='[all,ia32,x64]',
+ default='x64')
return result
@@ -45,7 +49,7 @@
raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
(' '.join(cmd), stderr, stdout))
-def BuildDebianPackage(tarball, out_dir):
+def BuildDebianPackage(tarball, out_dir, arch):
version = utils.GetVersion()
tarroot = 'dart-%s' % version
origtarname = 'dart_%s.orig.tar.gz' % version
@@ -65,9 +69,15 @@
print "Building source package"
RunBuildPackage(['-S', '-us', '-uc'], join(temp_dir, tarroot));
+ # Build 32-bit binary package.
+ if ('ia32' in arch):
+ print "Building i386 package"
+ RunBuildPackage(['-B', '-ai386', '-us', '-uc'], join(temp_dir, tarroot));
+
# Build 64-bit binary package.
- print "Building amd64 package"
- RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot));
+ if ('x64' in arch):
+ print "Building amd64 package"
+ RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot));
# Copy the Debian package files to the build directory.
debbase = 'dart_%s' % version
@@ -76,14 +86,21 @@
'%s.orig.tar.gz' % debbase,
'%s-1.debian.tar.gz' % debbase
]
+ i386_package = [
+ '%s-1_i386.deb' % debbase
+ ]
amd64_package = [
'%s-1_amd64.deb' % debbase
]
for name in source_package:
copyfile(join(temp_dir, name), join(out_dir, name))
- for name in amd64_package:
- copyfile(join(temp_dir, name), join(out_dir, name))
+ if ('ia32' in arch):
+ for name in i386_package:
+ copyfile(join(temp_dir, name), join(out_dir, name))
+ if ('x64' in arch):
+ for name in amd64_package:
+ copyfile(join(temp_dir, name), join(out_dir, name))
def Main():
if HOST_OS != 'linux':
@@ -93,6 +110,10 @@
options, args = BuildOptions().parse_args()
out_dir = options.out_dir
tar_filename = options.tar_filename
+ if options.arch == 'all':
+ options.arch = 'ia32,x64'
+ arch = options.arch.split(',')
+
if not options.out_dir:
out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
@@ -101,7 +122,7 @@
utils.GetBuildDir(HOST_OS, HOST_OS),
'dart-%s.tar.gz' % utils.GetVersion())
- BuildDebianPackage(tar_filename, out_dir)
+ BuildDebianPackage(tar_filename, out_dir, arch)
if __name__ == '__main__':
sys.exit(Main())
diff --git a/tools/dartium/archive.py b/tools/dartium/archive.py
new file mode 100755
index 0000000..04889cc
--- /dev/null
+++ b/tools/dartium/archive.py
@@ -0,0 +1,204 @@
+#!/usr/bin/python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import glob
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+import utils
+
+HOST_OS = utils.guessOS()
+
+if HOST_OS == 'mac':
+ VERSION_FILE = 'Chromium.app/Contents/MacOS/VERSION'
+ CONTENTSHELL_FILES = ['Content Shell.app', 'ffmpegsumo.so', 'osmesa.so',
+ 'lib']
+ CHROMEDRIVER_FILES = ['chromedriver']
+elif HOST_OS == 'linux':
+ VERSION_FILE = 'VERSION'
+ CONTENTSHELL_FILES = ['content_shell', 'content_shell.pak', 'fonts.conf',
+ 'libffmpegsumo.so', 'libosmesa.so', 'lib',
+ 'icudtl.dat']
+ CHROMEDRIVER_FILES = ['chromedriver']
+elif HOST_OS == 'win':
+ VERSION_FILE = 'VERSION'
+ # TODO: provide proper list.
+ CONTENTSHELL_FILES = ['content_shell.exe', 'AHEM____.ttf']
+ CHROMEDRIVER_FILES = ['chromedriver.exe']
+else:
+ raise Exception('Unsupported platform')
+
+# Append a file with size of the snapshot.
+CONTENTSHELL_FILES.append('snapshot-size.txt')
+
+
+def GenerateVersionFile():
+ # TODO: fix it.
+ if HOST_OS == 'win': return
+ versionInfo = utils.getCommandOutput(os.path.join('..', '..',
+ 'dart', 'tools', 'dartium',
+ 'print_dart_version.sh'))
+ file = open(VERSION_FILE, 'w')
+ file.write(versionInfo)
+ file.close()
+
+
+def GenerateDartiumFileList(mode, srcpath):
+ def blacklisted(name):
+ # We include everything if this is a debug build.
+ if mode.lower() == 'debug':
+ return True
+ else:
+ # We don't include .debug/.pdb files if this is a release build.
+ if name.endswith('.debug') or name.endswith('.pdb'):
+ return False
+ return True
+
+ configFile = os.path.join(srcpath, 'chrome', 'tools', 'build', HOST_OS,
+ 'FILES.cfg')
+ configNamespace = {}
+ execfile(configFile, configNamespace)
+ fileList = [file['filename'] for file in configNamespace['FILES']]
+
+ # The debug version of dartium on our bots build with
+ # 'component=shared_library', so we need to include all libraries
+ # (i.e. 'lib/*.so) as we do on the CONTENTSHELL_FILES list above.
+ if HOST_OS == 'linux' and mode.lower() == 'debug':
+ fileList.append('lib')
+
+ # Filter out files we've blacklisted and don't want to include.
+ fileList = filter(blacklisted, fileList)
+ return fileList
+
+
+def GenerateContentShellFileList(srcpath):
+ return CONTENTSHELL_FILES
+
+
+def GenerateChromeDriverFileList(srcpath):
+ return CHROMEDRIVER_FILES
+
+
+def ZipDir(zipFile, directory):
+ if HOST_OS == 'win':
+ cmd = os.path.normpath(os.path.join(
+ os.path.dirname(__file__),
+ '../third_party/lzma_sdk/Executable/7za.exe'))
+ options = ['a', '-r', '-tzip']
+ else:
+ cmd = 'zip'
+ options = ['-yr']
+ utils.runCommand([cmd] + options + [zipFile, directory])
+
+
+def GenerateZipFile(zipFile, stageDir, fileList):
+ # Stage files.
+ for fileName in fileList:
+ fileName = fileName.rstrip(os.linesep)
+ targetName = os.path.join(stageDir, fileName)
+ try:
+ targetDir = os.path.dirname(targetName)
+ if not os.path.exists(targetDir):
+ os.makedirs(targetDir)
+ if os.path.isdir(fileName):
+ # TODO: This is a hack to handle duplicates on the fileList of the
+ # form: [ 'lib/foo.so', 'lib' ]
+ if os.path.exists(targetName) and os.path.isdir(targetName):
+ shutil.rmtree(targetName)
+ shutil.copytree(fileName, targetName)
+ elif os.path.exists(fileName):
+ shutil.copy2(fileName, targetName)
+ except:
+ import traceback
+ print 'Troubles processing %s [cwd=%s]: %s' % (fileName, os.getcwd(), traceback.format_exc())
+
+ ZipDir(zipFile, stageDir)
+
+
+def StageAndZip(fileList, target):
+ if not target:
+ return None
+
+ stageDir = target
+ zipFile = stageDir + '.zip'
+
+ # Cleanup old files.
+ if os.path.exists(stageDir):
+ shutil.rmtree(stageDir)
+ os.mkdir(stageDir)
+ oldFiles = glob.glob(target.split('-')[0] + '*.zip')
+ for oldFile in oldFiles:
+ os.remove(oldFile)
+
+ GenerateVersionFile()
+ GenerateZipFile(zipFile, stageDir, fileList)
+ print 'last change: %s' % (zipFile)
+
+ # Clean up. Buildbot disk space is limited.
+ shutil.rmtree(stageDir)
+
+ return zipFile
+
+
+def Archive(srcpath, mode, dartium_target, contentshell_target,
+ chromedriver_target, is_win_ninja=False):
+ # We currently build using ninja on mac debug.
+ if HOST_OS == 'mac':
+ releaseDir = os.path.join(srcpath, 'out', mode)
+ # Also package dynamic libraries.
+ extra_files = [file for file in os.listdir(releaseDir) if file.endswith('.dylib')]
+ elif HOST_OS == 'linux':
+ releaseDir = os.path.join(srcpath, 'out', mode)
+ extra_files = []
+ elif HOST_OS == 'win':
+ if is_win_ninja:
+ releaseDir = os.path.join(srcpath, 'out', mode)
+ else:
+ releaseDir = os.path.join(srcpath, 'out', mode)
+ # issue(16760) - we _need_ to fix our parsing of the FILES.cfg
+ extra_files = [file for file in os.listdir(releaseDir) if file.endswith('manifest')]
+ else:
+ raise Exception('Unsupported platform')
+ os.chdir(releaseDir)
+
+ dartium_zip = StageAndZip(
+ GenerateDartiumFileList(mode, srcpath) + extra_files, dartium_target)
+ contentshell_zip = StageAndZip(GenerateContentShellFileList(srcpath) + extra_files,
+ contentshell_target)
+ chromedriver_zip = StageAndZip(GenerateChromeDriverFileList(srcpath) + extra_files,
+ chromedriver_target)
+ return (dartium_zip, contentshell_zip, chromedriver_zip)
+
+
+def main():
+ pathname = os.path.dirname(sys.argv[0])
+ fullpath = os.path.abspath(pathname)
+ srcpath = os.path.join(fullpath, '..', '..', '..')
+
+ parser = optparse.OptionParser()
+ parser.add_option('--dartium', dest='dartium',
+ action='store', type='string',
+ help='dartium archive name')
+ parser.add_option('--contentshell', dest='contentshell',
+ action='store', type='string',
+ help='content shell archive name')
+ parser.add_option('--chromedriver', dest='chromedriver',
+ action='store', type='string',
+ help='chromedriver archive name')
+ parser.add_option('--mode', dest='mode',
+ default='Release',
+ action='store', type='string',
+ help='(Release|Debug)')
+ (options, args) = parser.parse_args()
+ Archive(srcpath, options.mode, options.dartium, options.contentshell,
+ options.chromedriver)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/dartium/build.py b/tools/dartium/build.py
new file mode 100755
index 0000000..df511b0
--- /dev/null
+++ b/tools/dartium/build.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+# This file is used by the buildbot.
+
+import optparse
+import os.path
+import utils
+
+ALL_TARGETS = [
+ 'content_shell',
+ 'chrome',
+ 'blink_tests',
+ 'pkg_packages',
+]
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('--target', dest='target',
+ default='all',
+ action='store', type='string',
+ help='Target (%s)' % ', '.join(ALL_TARGETS))
+ parser.add_option('--mode', dest='mode',
+ action='store', type='string',
+ help='Build mode (Debug or Release)')
+ parser.add_option('--clobber', dest='clobber',
+ action='store_true',
+ help='Clobber the output directory')
+ parser.add_option('-j', '--jobs', dest='jobs',
+ action='store',
+ help='Number of jobs')
+ (options, args) = parser.parse_args()
+ mode = options.mode
+ if options.jobs:
+ jobs = options.jobs
+ else:
+ jobs = utils.guessCpus()
+ if not (mode in ['Debug', 'Release']):
+ raise Exception('Invalid build mode')
+
+ if options.target == 'all':
+ targets = ALL_TARGETS
+ else:
+ targets = [options.target]
+
+ if options.clobber:
+ utils.runCommand(['rm', '-rf', 'out'])
+
+ utils.runCommand(['ninja',
+ '-j%s' % jobs,
+ '-C',
+ os.path.join('out', mode)]
+ + targets)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/dartium/buildbot_annotated_steps.py b/tools/dartium/buildbot_annotated_steps.py
new file mode 100755
index 0000000..7f95594
--- /dev/null
+++ b/tools/dartium/buildbot_annotated_steps.py
@@ -0,0 +1,366 @@
+#!/usr/bin/python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Chromium buildbot steps
+
+Run the Dart layout tests.
+"""
+
+import os
+import platform
+import re
+import shutil
+import socket
+import subprocess
+import sys
+import imp
+
+BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
+REVISION = 'BUILDBOT_REVISION'
+BUILDER_PATTERN = (r'^dartium-(mac|lucid64|lucid32|win)'
+ r'-(full|inc|debug)(-ninja)?(-(be|dev|stable|integration))?$')
+
+if platform.system() == 'Windows':
+ GSUTIL = 'e:/b/build/scripts/slave/gsutil.bat'
+else:
+ GSUTIL = '/b/build/scripts/slave/gsutil'
+ACL = 'public-read'
+GS_SITE = 'gs://'
+GS_URL = 'https://sandbox.google.com/storage/'
+GS_DIR = 'dartium-archive'
+LATEST = 'latest'
+CONTINUOUS = 'continuous'
+
+REVISION_FILE = 'chrome/browser/ui/webui/dartvm_revision.h'
+
+# Add dartium tools and build/util to python path.
+SRC_PATH = os.path.dirname(os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+DART_PATH = os.path.join(SRC_PATH, 'dart')
+TOOLS_PATH = os.path.join(DART_PATH, 'tools', 'dartium')
+BUILD_UTIL_PATH = os.path.join(SRC_PATH, 'build', 'util')
+# We limit testing on drt since it takes a long time to run
+DRT_FILTER = 'html'
+
+
+sys.path.extend([TOOLS_PATH, BUILD_UTIL_PATH])
+import archive
+import utils
+
+bot_utils = imp.load_source('bot_utils',
+ os.path.join(DART_PATH, 'tools', 'bots', 'bot_utils.py'))
+
+def DartArchiveFile(local_path, remote_path, create_md5sum=False):
+ # Copy it to the new unified gs://dart-archive bucket
+ # TODO(kustermann/ricow): Remove all the old archiving code, once everything
+ # points to the new location
+ gsutil = bot_utils.GSUtil()
+ gsutil.upload(local_path, remote_path, public=True)
+ if create_md5sum:
+ # 'local_path' may have a different filename than 'remote_path'. So we need
+ # to make sure the *.md5sum file contains the correct name.
+ assert '/' in remote_path and not remote_path.endswith('/')
+ mangled_filename = remote_path[remote_path.rfind('/') + 1:]
+ local_md5sum = bot_utils.CreateChecksumFile(local_path, mangled_filename)
+ gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
+
+def UploadDartiumVariant(revision, name, channel, arch, mode, zip_file):
+ name = name.replace('drt', 'content_shell')
+ system = sys.platform
+
+ namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
+ remote_path = namer.dartium_variant_zipfilepath(revision, name, system, arch,
+ mode)
+ DartArchiveFile(zip_file, remote_path, create_md5sum=True)
+ return remote_path
+
+def ExecuteCommand(cmd):
+ """Execute a command in a subprocess.
+ """
+ print 'Executing: ' + ' '.join(cmd)
+ try:
+ pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (output, error) = pipe.communicate()
+ if pipe.returncode != 0:
+ print 'Execution failed: ' + str(error)
+ return (pipe.returncode, output)
+ except:
+ import traceback
+ print 'Execution raised exception:', traceback.format_exc()
+ return (-1, '')
+
+
+# TODO: Instead of returning a tuple we should make a class with these fields.
+def GetBuildInfo():
+ """Returns a tuple (name, dart_revision, version, mode, arch, channel,
+ is_full) where:
+ - name: A name for the build - the buildbot host if a buildbot.
+ - dart_revision: The dart revision.
+ - version: A version string corresponding to this build.
+ - mode: 'Debug' or 'Release'
+ - arch: target architecture
+ - channel: the channel this build is happening on
+ - is_full: True if this is a full build.
+ """
+ os.chdir(SRC_PATH)
+
+ name = None
+ version = None
+ mode = 'Release'
+
+ # Populate via builder environment variables.
+ name = os.environ[BUILDER_NAME]
+
+ # We need to chdir() to src/dart in order to get the correct revision number.
+ with utils.ChangedWorkingDirectory(DART_PATH):
+ dart_tools_utils = imp.load_source('dart_tools_utils',
+ os.path.join('tools', 'utils.py'))
+ dart_revision = dart_tools_utils.GetSVNRevision()
+
+ version = dart_revision + '.0'
+ is_incremental = '-inc' in name
+ is_win_ninja = 'win-inc-ninja' in name
+ is_full = False
+
+ pattern = re.match(BUILDER_PATTERN, name)
+ assert pattern
+ arch = 'x64' if pattern.group(1) == 'lucid64' else 'ia32'
+ if pattern.group(2) == 'debug':
+ mode = 'Debug'
+ is_full = pattern.group(2) == 'full'
+ channel = pattern.group(5)
+ if not channel:
+ channel = 'be'
+
+ # Fall back if not on builder.
+ if not name:
+ name = socket.gethostname().split('.')[0]
+
+ return (name, dart_revision, version, mode, arch, channel, is_full,
+ is_incremental, is_win_ninja)
+
+
+def RunDartTests(mode, component, suite, arch, checked, test_filter=None,
+ is_win_ninja=False):
+ """Runs the Dart WebKit Layout tests.
+ """
+ cmd = [sys.executable]
+ script = os.path.join(TOOLS_PATH, 'test.py')
+ cmd.append(script)
+ cmd.append('--buildbot')
+ cmd.append('--mode=' + mode)
+ cmd.append('--component=' + component)
+ cmd.append('--suite=' + suite)
+ cmd.append('--arch=' + arch)
+ cmd.append('--' + checked)
+ cmd.append('--no-show-results')
+
+ if is_win_ninja:
+ cmd.append('--win-ninja-build')
+
+ if test_filter:
+ cmd.append('--test-filter=' + test_filter)
+
+ status = subprocess.call(cmd)
+ if status != 0:
+ print '@@@STEP_FAILURE@@@'
+ return status
+
+
+def UploadDartTestsResults(layout_test_results_dir, name, version,
+ component, checked):
+ """Uploads test results to google storage.
+ """
+ print ('@@@BUILD_STEP archive %s_layout_%s_tests results@@@' %
+ (component, checked))
+ dir_name = os.path.dirname(layout_test_results_dir)
+ base_name = os.path.basename(layout_test_results_dir)
+ cwd = os.getcwd()
+ os.chdir(dir_name)
+
+ archive_name = 'layout_test_results.zip'
+ archive.ZipDir(archive_name, base_name)
+
+ target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
+ checked + '-' + version + '.zip'])
+ status = UploadArchive(os.path.abspath(archive_name), GS_SITE + target)
+ os.remove(archive_name)
+ if status == 0:
+ print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
+ else:
+ print '@@@STEP_FAILURE@@@'
+ os.chdir(cwd)
+
+
+def ListArchives(pattern):
+ """List the contents in Google storage matching the file pattern.
+ """
+ cmd = [GSUTIL, 'ls', pattern]
+ (status, output) = ExecuteCommand(cmd)
+ if status != 0:
+ return []
+ return output.split(os.linesep)
+
+
+def RemoveArchives(archives):
+ """Remove the list of archives in Google storage.
+ """
+ for archive in archives:
+ if archive.find(GS_SITE) == 0:
+ cmd = [GSUTIL, 'rm', archive.rstrip()]
+ (status, _) = ExecuteCommand(cmd)
+ if status != 0:
+ return status
+ return 0
+
+
+def UploadArchive(source, target):
+ """Upload an archive zip file to Google storage.
+ """
+
+ # Upload file.
+ cmd = [GSUTIL, 'cp', source, target]
+ (status, output) = ExecuteCommand(cmd)
+ if status != 0:
+ return status
+ print 'Uploaded: ' + output
+
+ # Set ACL.
+ if ACL is not None:
+ cmd = [GSUTIL, 'setacl', ACL, target]
+ (status, output) = ExecuteCommand(cmd)
+ return status
+
+
+def main():
+ (dartium_bucket, dart_revision, version, mode, arch, channel,
+ is_full, is_incremental, is_win_ninja) = GetBuildInfo()
+ drt_bucket = dartium_bucket.replace('dartium', 'drt')
+ chromedriver_bucket = dartium_bucket.replace('dartium', 'chromedriver')
+
+ def archiveAndUpload(archive_latest=False):
+ print '@@@BUILD_STEP dartium_generate_archive@@@'
+ cwd = os.getcwd()
+ dartium_archive = dartium_bucket + '-' + version
+ drt_archive = drt_bucket + '-' + version
+ chromedriver_archive = chromedriver_bucket + '-' + version
+ dartium_zip, drt_zip, chromedriver_zip = \
+ archive.Archive(SRC_PATH, mode, dartium_archive,
+ drt_archive, chromedriver_archive,
+ is_win_ninja=is_win_ninja)
+ status = upload('dartium', dartium_bucket, os.path.abspath(dartium_zip),
+ archive_latest=archive_latest)
+ if status == 0:
+ status = upload('drt', drt_bucket, os.path.abspath(drt_zip),
+ archive_latest=archive_latest)
+ if status == 0:
+ status = upload('chromedriver', chromedriver_bucket,
+ os.path.abspath(chromedriver_zip),
+ archive_latest=archive_latest)
+ os.chdir(cwd)
+ if status != 0:
+ print '@@@STEP_FAILURE@@@'
+ return status
+
+ def upload(module, bucket, zip_file, archive_latest=False):
+ status = 0
+
+ # We archive to the new location on all builders except for -inc builders.
+ if not is_incremental:
+ print '@@@BUILD_STEP %s_upload_archive_new @@@' % module
+ # We archive the full builds to gs://dart-archive/
+ revision = 'latest' if archive_latest else dart_revision
+ remote_path = UploadDartiumVariant(revision, module, channel, arch,
+ mode.lower(), zip_file)
+ print '@@@STEP_LINK@download@' + remote_path + '@@@'
+
+ # We archive to the old locations only for bleeding_edge builders
+ if channel == 'be':
+ _, filename = os.path.split(zip_file)
+ if not archive_latest:
+ target = '/'.join([GS_DIR, bucket, filename])
+ print '@@@BUILD_STEP %s_upload_archive@@@' % module
+ status = UploadArchive(zip_file, GS_SITE + target)
+ print '@@@STEP_LINK@download@' + GS_URL + target + '@@@'
+ else:
+ print '@@@BUILD_STEP %s_upload_latest@@@' % module
+ # Clear latest for this build type.
+ old = '/'.join([GS_DIR, LATEST, bucket + '-*'])
+ old_archives = ListArchives(GS_SITE + old)
+
+ # Upload the new latest and remove unnecessary old ones.
+ target = GS_SITE + '/'.join([GS_DIR, LATEST, filename])
+ status = UploadArchive(zip_file, target)
+ if status == 0:
+ RemoveArchives(
+ [iarch for iarch in old_archives if iarch != target])
+ else:
+ print 'Upload failed'
+
+ # Upload unversioned name to continuous site for incremental
+ # builds.
+ if '-inc' in bucket:
+ continuous_name = bucket[:bucket.find('-inc')]
+ target = GS_SITE + '/'.join([GS_DIR, CONTINUOUS,
+ continuous_name + '.zip'])
+ status = UploadArchive(zip_file, target)
+
+ print ('@@@BUILD_STEP %s_upload_archive is over (status = %s)@@@' %
+ (module, status))
+
+ return status
+
+ def test(component, suite, checked, test_filter=None):
+ """Test a particular component (e.g., dartium or frog).
+ """
+ print '@@@BUILD_STEP %s_%s_%s_tests@@@' % (component, suite, checked)
+ sys.stdout.flush()
+ layout_test_results_dir = os.path.join(SRC_PATH, 'webkit', mode,
+ 'layout-test-results')
+ shutil.rmtree(layout_test_results_dir, ignore_errors=True)
+ status = RunDartTests(mode, component, suite, arch, checked,
+ test_filter=test_filter, is_win_ninja=is_win_ninja)
+
+ if suite == 'layout' and status != 0:
+ UploadDartTestsResults(layout_test_results_dir, dartium_bucket, version,
+ component, checked)
+ return status
+
+ result = 0
+
+ # Archive to the revision bucket unless integration build
+ if channel != 'integration':
+ result = archiveAndUpload(archive_latest=False)
+
+ # On dev/stable we archive to the latest bucket as well
+ if channel != 'be':
+ result = archiveAndUpload(archive_latest=True) or result
+
+ # Run layout tests
+ if mode == 'Release' or platform.system() != 'Darwin':
+ result = test('drt', 'layout', 'unchecked') or result
+ result = test('drt', 'layout', 'checked') or result
+
+ # Run dartium tests
+ result = test('dartium', 'core', 'unchecked') or result
+ result = test('dartium', 'core', 'checked') or result
+
+ # Run ContentShell tests
+ # NOTE: We don't run ContentShell tests on dartium-*-inc builders to keep
+ # cycle times down.
+ if not is_incremental:
+ # If we run all checked tests on dartium, we restrict the number of
+ # unchecked tests on drt to DRT_FILTER
+ result = test('drt', 'core', 'unchecked', test_filter=DRT_FILTER) or result
+ result = test('drt', 'core', 'checked') or result
+
+ # On the 'be' channel, we only archive to the latest bucket if all tests ran
+ # successfull.
+ if result == 0 and channel == 'be':
+ result = archiveAndUpload(archive_latest=True) or result
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/dartium/fetch_reference_build.py b/tools/dartium/fetch_reference_build.py
new file mode 100755
index 0000000..077d49c
--- /dev/null
+++ b/tools/dartium/fetch_reference_build.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Fetches an archived chromium build into
+ src/chrome/tools/test/reference_build unless
+ src/chrome/tools/test/reference_build/REQUESTED_REVISION is the same as
+ src/chrome/tools/test/reference_build/CURRENT_REVISION.
+ Must be run from the root of a Dartium or multivm checkout.
+
+Usage:
+ $ ./src/dart/tools/dartium/fetch_reference_build_revision.py
+"""
+
+import os
+import subprocess
+import sys
+
+def main(argv):
+ dirname = os.path.join('src', 'chrome', 'tools',
+ 'test', 'reference_build')
+ request = os.path.join(dirname, 'REQUESTED_REVISION')
+ found = os.path.join(dirname, 'CURRENT_REVISION')
+ if not os.path.exists(request):
+ return
+ with file(request, 'r') as f:
+ request_revision = f.read()
+
+ if os.path.exists(found):
+ with file(found, 'r') as f:
+ found_revision = f.read()
+ if found_revision == request_revision:
+ return
+
+ get_script = os.path.join('src', 'dart', 'tools',
+ 'dartium', 'get_chromium_build.py')
+ get_script = os.path.abspath(get_script)
+ exit_code = subprocess.call(['python', get_script,
+ '-r', request_revision,
+ '-t', dirname])
+ if exit_code == 0:
+ with file(found, 'w') as f:
+ f.write(request_revision)
+ return exit_code
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/tools/dartium/generate_dart_vm_version.py b/tools/dartium/generate_dart_vm_version.py
new file mode 100755
index 0000000..68ec2f5
--- /dev/null
+++ b/tools/dartium/generate_dart_vm_version.py
@@ -0,0 +1,35 @@
+import datetime
+import imp
+import os
+import subprocess
+import sys
+import time
+
+scriptpath = os.path.abspath(os.path.dirname(__file__))
+utils = imp.load_source('utils', os.path.join(scriptpath, '..', 'utils.py'))
+
+REVISION_FILE = 'src/chrome/browser/ui/webui/dartvm_revision.h'
+EXPIRATION_FILE = 'src/third_party/WebKit/Source/bindings/dart/ExpirationTimeSecsSinceEpoch.time_t'
+
+def updateFile(filename, content):
+ if os.path.exists(filename):
+ if file(filename, 'r').read() == content:
+ return
+ else:
+ dir = os.path.dirname(filename)
+ if not os.path.exists(dir):
+ os.makedirs(dir)
+ file(filename, 'w').write(content)
+
+def main():
+ dart_version = utils.GetVersion()
+ version_string = '#define DART_VM_REVISION "%s"\n' % dart_version.strip()
+
+ updateFile(REVISION_FILE, version_string)
+
+ expiration_date = datetime.date.today() + datetime.timedelta(weeks=12)
+ updateFile(EXPIRATION_FILE,
+ "%dLL\n" % time.mktime(expiration_date.timetuple()))
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/dartium/get_chromium_build.py b/tools/dartium/get_chromium_build.py
new file mode 100755
index 0000000..edb8bac
--- /dev/null
+++ b/tools/dartium/get_chromium_build.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Gets a Chromium archived build, and unpacks it
+ into a target directory.
+
+ Use -r option to specify the revison number
+ Use -t option to specify the directory to unzip the build into.
+
+Usage:
+ $ /path/to/get_chromium_build.py -r <revision> -t <target>
+"""
+
+import logging
+import optparse
+import os
+import platform
+import shutil
+import subprocess
+import sys
+import time
+import urllib
+import urllib2
+import zipfile
+
+# Example chromium build location:
+# gs://chromium-browser-snapshots/Linux_x64/228977/chrome-linux.zip
+CHROMIUM_URL_FMT = ('http://commondatastorage.googleapis.com/'
+ 'chromium-browser-snapshots/%s/%s/%s')
+
+class BuildUpdater(object):
+ _PLATFORM_PATHS_MAP = {
+ 'Linux': { 'zipfiles': ['chrome-linux.zip'],
+ 'folder': 'chrome_linux',
+ 'archive_path': 'Linux_x64'},
+ 'Darwin': {'zipfiles': ['chrome-mac.zip'],
+ 'folder': 'chrome_mac',
+ 'archive_path': 'Mac'},
+ 'Windows': {'zipfiles': ['chrome-win32.zip',
+ 'chrome-win32-syms.zip'],
+ 'folder': 'chrome_win',
+ 'archive_path': 'Win'}}
+
+ def __init__(self, options):
+ platform_data = BuildUpdater._PLATFORM_PATHS_MAP[platform.system()]
+ self._zipfiles = platform_data['zipfiles']
+ self._folder = platform_data['folder']
+ self._archive_path = platform_data['archive_path']
+ self._revision = int(options.revision)
+ self._target_dir = options.target_dir
+ self._download_dir = os.path.join(self._target_dir, 'downloads')
+
+ def _GetBuildUrl(self, revision, filename):
+ return CHROMIUM_URL_FMT % (self._archive_path, revision, filename)
+
+ def _FindBuildRevision(self, revision, filename):
+ MAX_REVISIONS_PER_BUILD = 100
+ for revision_guess in xrange(revision, revision + MAX_REVISIONS_PER_BUILD):
+ if self._DoesBuildExist(revision_guess, filename):
+ return revision_guess
+ else:
+ time.sleep(.1)
+ return None
+
+ def _DoesBuildExist(self, revision_guess, filename):
+ url = self._GetBuildUrl(revision_guess, filename)
+
+ r = urllib2.Request(url)
+ r.get_method = lambda: 'HEAD'
+ try:
+ urllib2.urlopen(r)
+ return True
+ except urllib2.HTTPError, err:
+ if err.code == 404:
+ return False
+
+ def _DownloadBuild(self):
+ if not os.path.exists(self._download_dir):
+ os.makedirs(self._download_dir)
+ for zipfile in self._zipfiles:
+ build_revision = self._FindBuildRevision(self._revision, zipfile)
+ if not build_revision:
+ logging.critical('Failed to find %s build for r%s\n',
+ self._archive_path,
+ self._revision)
+ sys.exit(1)
+ url = self._GetBuildUrl(build_revision, zipfile)
+ logging.info('Downloading %s', url)
+ r = urllib2.urlopen(url)
+ with file(os.path.join(self._download_dir, zipfile), 'wb') as f:
+ f.write(r.read())
+
+ def _UnzipFile(self, dl_file, dest_dir):
+ if not zipfile.is_zipfile(dl_file):
+ return False
+ logging.info('Unzipping %s', dl_file)
+ with zipfile.ZipFile(dl_file, 'r') as z:
+ for content in z.namelist():
+ dest = os.path.join(dest_dir, content[content.find('/')+1:])
+ # Create dest parent dir if it does not exist.
+ if not os.path.isdir(os.path.dirname(dest)):
+ logging.info('Making %s', dest)
+ os.makedirs(os.path.dirname(dest))
+ # If dest is just a dir listing, do nothing.
+ if not os.path.basename(dest):
+ continue
+ with z.open(content) as unzipped_content:
+ logging.info('Extracting %s to %s (%s)', content, dest, dl_file)
+ with file(dest, 'wb') as dest_file:
+ dest_file.write(unzipped_content.read())
+ permissions = z.getinfo(content).external_attr >> 16
+ if permissions:
+ os.chmod(dest, permissions)
+ return True
+
+ def _ClearDir(self, dir):
+ """Clears all files in |dir| except for hidden files and folders."""
+ for root, dirs, files in os.walk(dir):
+ # Skip hidden files and folders (like .svn and .git).
+ files = [f for f in files if f[0] != '.']
+ dirs[:] = [d for d in dirs if d[0] != '.']
+
+ for f in files:
+ os.remove(os.path.join(root, f))
+
+ def _ExtractBuild(self):
+ dest_dir = os.path.join(self._target_dir, self._folder)
+ self._ClearDir(dest_dir)
+ for root, _, dl_files in os.walk(os.path.join(self._download_dir)):
+ for dl_file in dl_files:
+ dl_file = os.path.join(root, dl_file)
+ if not self._UnzipFile(dl_file, dest_dir):
+ logging.info('Copying %s to %s', dl_file, dest_dir)
+ shutil.copy(dl_file, dest_dir)
+ shutil.rmtree(self._download_dir)
+
+ def DownloadAndUpdateBuild(self):
+ self._DownloadBuild()
+ self._ExtractBuild()
+
+
+def ParseOptions(argv):
+ parser = optparse.OptionParser()
+ usage = 'usage: %prog <options>'
+ parser.set_usage(usage)
+ parser.add_option('-r', dest='revision',
+ help='Revision to download.')
+ parser.add_option('-t', dest='target_dir',
+ help='Target directory for unzipped Chromium.')
+
+ (options, _) = parser.parse_args(argv)
+ if not options.revision:
+ logging.critical('Must specify -r.\n')
+ sys.exit(1)
+ if not options.target_dir:
+ logging.critical('Must specify -t.\n')
+ sys.exit(1)
+ return options
+
+def main(argv):
+ logging.getLogger().setLevel(logging.DEBUG)
+ options = ParseOptions(argv)
+ b = BuildUpdater(options)
+ b.DownloadAndUpdateBuild()
+ logging.info('Successfully got archived Chromium build.')
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/tools/dartium/print_dart_version.sh b/tools/dartium/print_dart_version.sh
new file mode 100755
index 0000000..273e0d5
--- /dev/null
+++ b/tools/dartium/print_dart_version.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Print svn revisions for Dartium internal repositories. The output
+# is included in each Dartium archive build / release.
+#
+# This script is necessary because Dartium maintains its own branches
+# of Chromium and WebKit. This script is for temporary use only; it
+# will not be integrated back into Chromium.
+
+function version() {
+ if [ $(svnversion) == exported ]
+ then
+ # git-svn
+ git svn info | grep Revision | cut -c 11-
+ else
+ # svn
+ echo $(svnversion)
+ fi
+}
+
+root_dir=$(dirname $0)/../..
+pushd ${root_dir} > /dev/null
+echo dartium-chromium: $(version)
+cd third_party/WebKit
+echo dartium-webkit: $(version)
+cd ../../dart/runtime
+echo dartium-runtime: $(version)
+popd > /dev/null
diff --git a/tools/dartium/set_reference_build_revision.py b/tools/dartium/set_reference_build_revision.py
new file mode 100755
index 0000000..f860210
--- /dev/null
+++ b/tools/dartium/set_reference_build_revision.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Writes a revision number into src/chrome/tools/test/reference_build/REVISON
+ Must be run from the root of a Dartium or multivm checkout.
+
+Usage:
+ $ ./src/dart/tools/dartium/set_reference_build_revision.py <revision>
+"""
+
+import os
+import sys
+
+def main(argv):
+ revision = argv[1]
+ output = os.path.join('src', 'chrome', 'tools',
+ 'test', 'reference_build',
+ 'REQUESTED_REVISION')
+ dirname = os.path.dirname(output)
+ if dirname and not os.path.exists(dirname):
+ os.makedirs(dirname)
+ with file(output, 'w') as f:
+ f.write(revision)
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/tools/dartium/start_dartium_roll.sh b/tools/dartium/start_dartium_roll.sh
new file mode 100755
index 0000000..41aebbf
--- /dev/null
+++ b/tools/dartium/start_dartium_roll.sh
@@ -0,0 +1,999 @@
+#!/bin/bash -e
+
+# Requirements:
+# sudo apt-get install xclip
+
+
+# e.g. 1908 ROLL
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --pre-roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --info
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --pre-roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --roll
+# ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --info
+
+# e.g., 1916 ROLL
+# ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 259084 --new-branch 1916 --new-revision 260298 --chrome --pre-roll
+
+# ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 169907 --new-branch 1916 --new-revision 170313 --blink --pre-roll
+
+E_INVALID_ARG=128
+
+function usage {
+ echo "Usage: $0 [--options]"
+ echo "Options:"
+ echo " --[no-]verbose: display information about each step"
+ echo " --directory base: base directory of local git repository"
+ echo " (e.g., ~/dartium-roll implies directory"
+ echo " ~/dartium-roll/src and"
+ echo " ~/dartium-roll/src/third_party/WebKit)**"
+ echo " --chrome: for the Chrome branch (not with --blink)**"
+ echo " --blink: for the Blink branch (not with --chrome)**"
+ echo " --old-branch name: name of previous true branch (e.g., use 1847"
+ echo " for version 34.0.1847.92) *"
+ echo " --old-revision revision: revision of base trunk for $OLD version *"
+ echo " --new-branch name: name of new true branch to create *"
+ echo " --new-revision revision: revision of base trunk for new branch *"
+ echo " --pre-roll: display commands to prepare for the roll"
+ echo " --roll: display Git commands to execute for creating"
+ echo " branches for the roll"
+ echo " --info: display hashes for $BASE and $LAST on each"
+ echo " branch (stripped$OLD, trunkdata$OLD, and"
+ echo " trunkdata$NEW)"
+ echo " --help: this message"
+ echo
+ echo "* - required"
+ echo
+ echo "* Script will prompt interactively if options not given."
+ echo "** Argument must be specified."
+ echo
+ exit 1
+}
+
+
+function verbose_message {
+ if [ "$do_verbose" = 1 ]; then
+ if [ "${1}" = "" ]; then
+ echo
+ else
+ echo -e "...${1}..."
+ fi
+ fi
+}
+
+
+# Does the file src/.git/config contains the added lines pointing to the chrome
+# remote dart$OLD and dart$NEW branches for src/ (e.g, dart1847 and dart1908):
+#
+# [svn-remote "dart$OLD"]
+# url = svn://svn.chromium.org/chrome/branches/dart/$OLD/src
+# fetch = :refs/remotes/dart1847
+# [svn-remote "dart$NEW"]
+# url = svn://svn.chromium.org/chrome/branches/dart/$NEW/src
+# fetch = :refs/remotes/dart1908
+#
+# and does the file src/third_party/WebKit/.git/config contains the added lines
+# for blink:
+#
+# [svn-remote "dart$OLD"]
+# url = svn://svn.chromium.org/blink/branches/dart/$OLD/src
+# fetch = :refs/remotes/dart1847
+# [svn-remote "dart$NEW"]
+# url = svn://svn.chromium.org/blink/branches/dart/$NEW/src
+# fetch = :refs/remotes/dart1908
+#
+function validate_remotes {
+ verbose_message "Validating Remotes"
+
+ if [ "$do_which" = "chrome" ]; then
+ # Ensure remote for old Dartium release exist (e.g., remotes/dart1847)
+ remote_dart_last=$(git branch -a | grep "remotes/dart${do_old_branch}")
+ # Ensure remote for new Dartium release exist (e.g., remotes/dart1908)
+ remote_dart_new=$(git branch -a | grep "remotes/dart${do_new_branch}")
+ if [ "$remote_dart_last" = "" ]; then
+ $(display_error "missing old remotes/dart${do_old_branch}")
+ exit -1
+ fi
+ if [ "$remote_dart_new" = "" ]; then
+ $(display_error "missing new remotes/dart${do_new_branch}")
+ exit -1
+ fi
+ elif [ "$do_which" = "blink" ]; then
+ # Ensure remote for old Dartium release exist (e.g., remotes/dart1847)
+ remote_dart_last=$(git branch -a | grep "remotes/blink-svn/${do_old_branch}")
+ # Ensure remote for new Dartium release exist (e.g., remotes/dart1908)
+ remote_dart_new=$(git branch -a | grep "remotes/blink-svn/multivm-${do_new_branch}")
+
+ if [ "$remote_dart_last" = "" ]; then
+ $(display_error "missing old remotes/blink-svn/${do_old_branch}")
+ exit -1
+ fi
+ if [ "$remote_dart_new" = "" ]; then
+ $(display_error "missing new remotes/blink-svn/multivm-${do_new_branch}")
+ exit -1
+ fi
+ else
+ $(display_error "--chrome or --blink must be specified")
+ exit -1
+ fi
+}
+
+function stripped_exist {
+ local branch_name=$(git branch --no-color --list $(stripped_name) | sed 's/^[ \t\*]*//')
+ echo $branch_name
+}
+
+# Does the branch trunkdart$OLD or trunkdart$NEW exist where $OLD is previous
+# branch (e.g. 1847) and $NEW is new branch to roll (e.g., 1908)
+# $(trunk_exist ${do_old_branch}) or $(trunk_exist ${do_new_branch})
+# Strip out the spaces and * (implies current branch) then return the branch name.
+function trunk_exist {
+ local branch_name=$(git branch --list --no-color trunkdart${1} | sed 's/^[ \t\*]*//' | tail -n 1)
+ echo $branch_name
+}
+
+function validate_repository {
+ verbose_message "Validating Repository"
+
+ strip_branch=${stripped_name}
+
+ # Validate that branches exist.
+ stripped_found=${stripped_exist}
+ old_branch_found=$(trunk_exist ${do_old_branch})
+ new_branch_found=$(trunk_exist ${do_new_branch})
+
+ if [ "$stripped_found" != "" ]; then
+ $(display_error "branch ${strip_branch} already exist")
+ exit -1
+ fi
+
+ if [ "$old_branch_found" != "" ]; then
+ $(display_error "branch trunkdart${do_old_branch} already exist")
+ exit -1
+ fi
+
+ if [ "$new_branch_found" != "" ]; then
+ $(display_error "branch trunkdart${do_new_branch} already exist")
+ exit -1
+ fi
+}
+
+function display_error() {
+ echo -e "\n\e[1;31mERROR: ${1}\e[0m\n" >&2
+ exit 1
+}
+
+
+# Given a revision number $1 return the trunk's hash code for that revision.
+function hash_trunk_revision {
+ # Chrome trunk hash code for [NewChromeCommit]
+ hash_trunk=$(git log master --grep=src@${1} --pretty=format:'%H' -n 1)
+}
+
+
+# Return the last revision for a branch. Used by new trunk roll for the
+# DEPS file for the last revision to use during build.
+function last_revision() {
+ echo $(git svn log ${1} --oneline -1 | cut -d '|' -f1 | sed "s/r//")
+}
+
+
+# Return the branch for strippedOOOO use bash line:
+# $(stripped_name)
+function stripped_name {
+ echo "stripped${do_old_branch}"
+}
+
+
+# Give a branch name return the trunk release for that branch.
+function trunkdart_name {
+ echo "trunkdart${1}"
+}
+
+
+# Compute the hash codes for the previous branch hash_base is the first commit
+# and hash_last is final commit.
+function hash_codes_base_last {
+ # Get the first commit for previous Dartium roll on chrome branch.
+ hash_base=$(git rev-list ${1} --pretty=format:'%H' | tail -n 1)
+
+ # Get the last commit for previous Dartium roll on chrome branch.
+ hash_last=$(git log ${1} --pretty=format:'%H' -1)
+}
+
+
+# Compute the hash codes for the previous branch hash_base is the first commit
+# and hash_last is final commit.
+function hash_codes_base2_last2 {
+ # Get the last commit for previous Dartium roll on chrome branch.
+ hash_last2=$(git log ${1} --pretty=format:'%H' -1)
+
+ local search
+ if [ "$do_which" = "chrome" ]; then
+ search="chrome/trunk/src@${do_old_revision}"
+ else
+ search="blink/branches/dart/multivm-${do_new_revision}@${do_old_revision}"
+ fi
+
+ # Get the first commit for previous Dartium roll on chrome branch.
+ hash_base2=$(git log ${1} --grep=@${do_old_revision} --pretty=format:'%H' | tail -1)
+}
+
+
+# Pad right/left up to 80 spaces.
+# Parameter $1 string to pad.
+# Parameter $2 is max length to post-pad with spaces.
+# Parameter $3 if specified padd to the right otherwise pad to the right.
+# Returns string right padded with spaces.
+function space_pad() {
+ local spaces=$(printf '%0.1s' " "{1..80})
+ local spaces_pad=${spaces:0:$2}
+ local padding=$(printf "%s" "${spaces_pad:${#1}}")
+
+ if [[ "$3" = "" ]]; then
+ # Pad to the right [default].
+ echo "${1}${padding}"
+ else
+ # Pad to the left.
+ echo "${padding}${1}"
+ fi
+}
+
+
+# Format the line '| URL: <url> |'.
+# Paramter $1 - url to format
+# Returns the formatted and space padded line for display_hashes.
+function display_url() {
+ # Line length is 65, skipped # 9 characters at beginning '| URL: '
+ # and last character '|'. Up to 55 characters of padding.
+ local format_url=$(space_pad $1 55)
+ local valid_url=$(valid_branch_url $1)
+ if [[ "$valid_url" = "" ]]; then
+ # Error format padding is same as above remote_url 55;
+ local format_err=$(space_pad "WARNING ON TRUNK - FIX IMMEDIATELY" 55)
+ # Output in red, the problem, both lines the URL and the warning message.
+ echo -e "| URL: \e[1;31m${format_url}\e[0m|\n| \e[1;31m${format_err}\e[0m|"
+ else
+ # URL looks good.
+ echo "| URL: ${format_url}|"
+ fi
+}
+
+
+function display_hashes {
+ if [ "$do_info_hashes" = 1 ]; then
+ local format_which=$(space_pad $do_which 6 1)
+ stripped_branch=$(stripped_name)
+ # stripped$OLD found
+ stripped_found=$(stripped_exist)
+ if [ "$stripped_found" != "" ]; then
+ hash_codes_base_last ${stripped_branch}
+ hash_trunk_revision ${do_old_revision}
+ # Display the first/last commit hash for stripped$OLD branch and the
+ # trunk hash for $OLD@do_last_revsion.
+ echo "================================================================="
+ local format_branch=$(space_pad $stripped_branch 32 1)
+ echo "| \$OLD: ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |"
+ local remote_url=$(url_branch $stripped_branch)
+
+# TODO(terry): Testing failure below remove before checkin
+# local remote_url=$(url_branch "master")
+
+ echo "$(display_url $remote_url)"
+ echo "|---------------------------------------------------------------|"
+ local format_hash=$(space_pad $hash_base 51)
+ echo "| \$BASE | ${format_hash} |"
+ echo "|---------------------------------------------------------------|"
+ format_hash=$(space_pad $hash_last 51)
+ echo "| \$LAST | ${format_hash} |"
+ echo "================================================================="
+ echo
+ else
+ echo "${stripped_branch} not found"
+ echo
+ fi
+
+ # trunkdart$OLD found
+ branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+ old_branch_found=$(trunk_exist ${do_old_branch})
+ if [ "$old_branch_found" != "" ]; then
+ hash_codes_base2_last2 ${branch_trunkdart_old}
+ hash_trunk_revision ${do_old_revision}
+ # Display the first/last commit hash for trunkdart$OLD branch and the
+ # trunk hash for $OLD@do_last_revsion.
+ echo "================================================================="
+ local format_branch=$(space_pad $branch_trunkdart_old 32 1)
+ echo "| \$OLD ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |"
+ local remote_url=$(url_branch $branch_trunkdart_old)
+ echo "$(display_url $remote_url)"
+ echo "|---------------------------------------------------------------|"
+ local format_base2=$(space_pad $hash_base2 51)
+ echo "| \$BASE2 | ${format_base2} |"
+ echo "|---------------------------------------------------------------|"
+ local format_last2=$(space_pad $hash_last2 51)
+ echo "| \$LAST2 | ${format_last2} |"
+ echo "================================================================="
+ echo
+ else
+ echo "${branch_trunkdart_old} not found"
+ echo
+ fi
+
+ # trunkdart$NEW found
+ branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+ new_branch_found=$(trunk_exist ${do_new_branch})
+ if [ "$new_branch_found" != "" ]; then
+ hash_trunk_revision ${do_new_revision}
+ # Display the trunk hash for $NEW@do_new_revsion.
+ echo "================================================================="
+ local format_branch=$(space_pad $branch_trunkdart_new 32 1)
+ echo "| \$NEW ${format_which} dart${do_new_branch}@${do_new_revision}${format_branch} |"
+ local remote_url=$(url_branch $branch_trunkdart_new)
+ echo "$(display_url $remote_url)"
+ echo "|---------------------------------------------------------------|"
+ local revision=$(last_revision $branch_trunkdart_new)
+ local format_revision=$(space_pad $revision 43)
+ echo "| last revision | ${format_revision} |"
+ echo "================================================================="
+ echo
+ else
+ echo "${branch_trunkdart_new} not found"
+ echo
+ fi
+ fi
+}
+
+
+function switch_branch() {
+ $(git checkout ${1} --quiet)
+ local curr_branch=$(git name-rev --name-only HEAD)
+ if [[ "$curr_branch" != "$1" ]]; then
+ $(display_error "Unable to switch to branch $1 - pending commits/add?")
+ exit -1
+ fi
+ echo $curr_branch
+}
+
+
+# Check that the branch is not pointing to either blink or chrome trunk.
+# These branches should be pointing to either:
+# svn://svn.chromium.org/chrome/branches/dart/NNNN
+# svn://svn.chromium.org/blink/branches/dart/NNNN
+#
+# $1 parameter - branch-name to make current branch and check repository
+# name.
+function check_branch() {
+ local old_branch=$(git name-rev --name-only HEAD)
+ local curr_branch=$(switch_branch $1)
+ local trunk_url;
+
+ if [ "$do_which" = "chrome" ]; then
+ # Chrome
+ trunk_url='Committing to svn://svn.chromium.org/chrome/trunk/src ...'
+ elif [ "$do_which" = "blink" ]; then
+ # Blink
+ trunk_url='Committing to svn://svn.chromium.org/blink/trunk ...'
+ else
+ $(display_error "Neither blink or chrome specified")
+ exit -1
+ fi
+
+ local remote_commit=$(git svn dcommit --dry-run | head -1 | grep "${trunk_url}")
+
+ curr_branch=$(switch_branch $old_branch)
+ if [[ "$curr_branch" != "$old_branch" ]]; then
+ $(display_error "Unable to switch back to original branch ${old_branch}")
+ exit -1
+ fi
+
+ if [[ "$remote_commit" != "" ]]; then
+ $(display_error "Branch ${1} is NOT pointing to the Dart branch repository but pointing to trunk.")
+ exit -1
+ fi
+
+ echo "Local branch '${1}' is based on the remote branch/dart repository."
+}
+
+
+# Given an URL of a remote repository passed as parameter $1 (e.g., from
+# url_branch function) return the URL passed in if valid or return empty
+# string "".
+function valid_branch_url() {
+ # Compute what the remote repository should be:
+ # svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}/src
+ # e.g., svn://svn.chromium.org/chrome/branches/dart/1847/src
+ # or blink:
+ # svn://svn.chromium.org/blink/branches/dart/${do_old_branch}
+ # e.g., svn://svn.chromium.org/blink/branches/dart/1847
+ local src_dir=""
+ if [[ "$do_which" = "chrome" ]]; then
+ src_dir="/src"
+ fi
+ local old_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}${src_dir}"
+ local new_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_new_branch}${src_dir}"
+
+ echo $(echo "$1" | grep -e "${old_remote}" -e "${new_remote}")
+}
+
+
+# Returns the remote repository URL associated with a branch.
+# Parameter $1 is the branch name.
+function url_branch() {
+ local old_branch=$(git name-rev --name-only HEAD)
+ local curr_branch=$(switch_branch $1)
+
+ local remote_commit=$(git svn dcommit --dry-run | head -1 | sed 's/Committing to //' | sed 's/ ...//')
+
+ curr_branch=$(switch_branch $old_branch)
+
+ echo "${remote_commit}"
+}
+
+
+# Ensure that any created branches (stripped$OLD, trunkdart$OLD and
+# trunkdart$NEW) are not pointing to either the blink or chrome trunks.
+function validate_branches() {
+ # stripped branch
+ local stripped_found=$(stripped_exist)
+ if [ "$stripped_found" != "" ]; then
+ local branch_name=$(stripped_name)
+ local check_result=$(check_branch ${branch_name})
+ printf "%s\n" "$check_result"
+ fi
+
+ # trunkdart$OLD
+ local branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+ local old_branch_found=$(trunk_exist ${do_old_branch})
+ if [ "$old_branch_found" != "" ]; then
+ local check_result=$(check_branch $branch_trunkdart_old)
+ printf "%s\n" "$check_result"
+ fi
+
+ # trunkdart$NEW
+ local branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+ local new_branch_found=$(trunk_exist ${do_new_branch})
+ if [ "$new_branch_found" != "" ]; then
+ local check_result=$(check_branch $branch_trunkdart_new)
+ printf "%s\n" "$check_result"
+ fi
+}
+
+
+function display_roll_commands() {
+ if [ "$roll_branches" = 1 ]; then
+ if [ "$do_which" = "chrome" ]; then
+ roll_chrome_commands
+ elif [ "$do_which" = "blink" ]; then
+ roll_blink_commands
+ fi
+ fi
+}
+
+
+# Show commands to create SVN branch folder and remote repository for new roll.
+function display_remote_repository_creation() {
+# TODO(terry): Use the diretory passed in instead of hard-coded dartium-NNNN
+# TODO(terry): Should execute each command with a Y or N and command runs.
+# TODO(terry): Echo output from commands especially clone and rebase using "OUTPUT=$(git cl rebase); echo $OUTPUT"
+# TODO(terry): Add ability to copy to clipboard programmatically us 'echo "hi" | xclip -selection clipboard'
+# copies hi to clipboard.
+ echo "Do the following pre-roll setup"
+ if [ "$do_which" = "chrome" ]; then
+ echo " mkdir dartium-${do_new_branch}"
+ echo " cd dartium-${do_new_branch}"
+ echo " svn mkdir -m \"Preparing Chrome 35/${do_new_branch} branch\" "\
+ "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}"
+ echo " svn cp -m \"Branching for ${do_new_branch} @${do_new_revision}\" "\
+ "svn://svn.chromium.org/chrome/trunk/src@${do_new_revision} "\
+ "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src"
+ echo " git svn clone -r241107 svn://svn.chromium.org/chrome/trunk/src src"
+ echo
+ echo " cd src"
+ echo " git cl rebase"
+ echo
+ echo "-----After rebase finishes-----"
+ echo
+ echo " 1. Add the below lines to src/.git/config"
+ echo
+ echo "[svn-remote \"dart${do_old_branch}\"]"
+ echo " url = svn://svn.chromium.org/chrome/branches/dart/${do_old_branch}/src"
+ echo " fetch = :refs/remotes/dart${do_old_branch}"
+ echo "[svn-remote \"dart${do_new_branch}\"]"
+ echo " url = svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src"
+ echo " fetch = :refs/remotes/dart${do_new_branch}"
+ echo
+ echo " 2. Get the code"
+ echo
+ echo " cd src"
+ echo " git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}"
+ elif [ "$do_which" = "blink" ]; then
+ echo " Directory dartium-${do_new_branch} exists."
+ echo " cd dartium-${do_new_branch}"
+ echo " svn cp -m \"Branching ${do_new_branch} @${do_new_revision}\" "\
+ "svn://svn.chromium.org/blink/trunk@${do_new_revision} "\
+ "svn://svn.chromium.org/blink/branches/dart/${do_new_branch}"
+
+ echo " git svn clone --trunk=trunk --branches=branches/dart"\
+ " --prefix=blink-svn/ -r165883:HEAD " \
+ "svn://svn.chromium.org/blink src/third_party/WebKit"
+ echo
+ echo " cd src/third_party/WebKit"
+ echo " git cl rebase"
+ echo
+ echo "-----After rebase finishes-----"
+ echo
+ echo " 1. Add the below lines to src/third_party/WebKit/.git/config"
+ echo
+ echo "[svn-remote \"dart${do_old_branch}\"]"
+ echo " url = svn://svn.chromium.org/blink/branches/dart/${do_old_branch}"
+ echo " fetch = :refs/remotes/dart${do_old_branch}"
+ echo "[svn-remote \"dart${do_new_branch}\"]"
+ echo " url = svn://svn.chromium.org/blink/branches/dart/${do_new_branch}"
+ echo " fetch = :refs/remotes/dart${do_new_branch}"
+ echo
+ echo " 2. Get the code"
+ echo
+ echo " cd src/third_party/WebKit"
+ #TODO(terry): Should the fetch be remotes/blink-svn/multivm-${do_new_branch}
+ echo " git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}"
+ fi
+}
+
+# Displays each of the 3 steps, of GIT commands, to create the
+# branches for a Dartium roll.
+#
+# Givin the following Dartium roll information:
+# Previous Dartium roll 1847 @251094 ($OLD)
+# New Dartium roll to make 1908 @ 259084 ($NEW)
+#
+# Three branches will be created a stripped[$OLD], trunkdart[$OLD]
+# and trunkdart[$NEW].
+#
+# |==============================================|
+# | $OLD | 1847 |
+# |----------------------------------------------|
+# | $OLD_REV | 251094 |
+# |----------------------------------------------|
+# | $NEW | 1908 |
+# |----------------------------------------------|
+# | $NEW_REV | 259084 |
+# |==============================================|
+#
+# stripped$OLD - Branch with upstream patches stripped out.
+# trunkdart$OLD - Branch with all patches for $OLD.
+# trunkdart$NEW - Branch of a new Chromium/Blink release with
+# cherry-picked $OLD commits from trunkdart$OLD.
+#
+# stripped$OLD, trunkdart$OLD points the SVN remote repository
+#
+# svn://svn.chromium.org/chrome/branches/dart/1847/src
+#
+# trunkdart$NEW points to the SVN remote repository
+# svn://svn.chromium.org/chrome/branches/dart/1908/src
+#
+# STEP 1.
+# -------
+# Create the stripped$OLD:
+# > git checkout -b stripped$OLD dart$OLD
+# > git rebase -i $BASE
+#
+# e.g., git checkout -b stripped1847 dart1847
+# git rebase -i 3345f6a26911beda2ed352e887549bc514acb4bd
+#
+# Rebasing with -i will launch an editor, show all commits after $BASE and let
+# you interactively remove any upstream commits from trunk. Upstream commits
+# have a format of "Incrementing VERSION to 32.0.1847.78". Then save and quit
+# the editor.
+#
+# $BASE and $LAST are computed by this script and is returned in the
+# 'git rebase -i <hash-code>' command.
+#
+# NOTE: How $BASE and $LAST are computed:
+# ---------------------------------------
+# $BASE, first commit in $OLD, is computed by:
+# > git rev-list stripped1847 --pretty=format:'%H' | tail -n 1
+# Return a GIT hash code e.g., 3345f6a26911beda2ed352e887549bc514acb4bd
+#
+# $LAST, last commit in $NEW, is computed by:
+# > git log stripped1847 --pretty=format:'%H' -1
+# Return a GIT hash code e.g., 44d12cd4b7e041f8d06f8735f1af08abb66825c4
+#
+# STEP 2.
+# -------
+# Create the trunkdart$OLD e.g.,
+# > git checkout -b trunkdart$OLD $BASE
+# > git cherry-pick $BASE..$LAST
+#
+# e.g., git checkout -b trunkdart1847
+#
+# Create branch trunkdart$OLD and reapplies all Dart-related work on $OLD (from
+# the stripped branch created in Step1.). This cherry-pick should not have any
+# conflicts as you are rebasing onto exactly the same source code layout.
+#
+# STEP 3.
+# -------
+# Create the branch for $NEW (trunkdart$NEW):
+# > git checkout -b trunkdart$NEW dart$NEW
+# > git cherry-pick $BASE2..$LAST2
+#
+# Important points trunkdart$NEW is attached to the remote SVN repository created
+# in pre-steps.
+#
+# e.g., git checkout -b trunkdart1908 dart1908
+# git cherry-pick xxxx..xxxx
+#
+# $BASE2 should be the same as $BASE to validate with:
+#
+# > git log trunkdart$OLD --grep=@$OLD_REV --pretty=format:'%H' | tail -1
+#
+# e.g., git log trunkdart1847 --grep=251094 --pretty=format:'%H' | tail -1
+# 3345f6a26911beda2ed352e887549bc514acb4bd
+#
+# $LAST2 is the last commit in $OLD in trunkdart$OLD computed by:
+#
+# > git log trunkdart$OLD --pretty=format:'%H' -1
+#
+# e.g., > git log trunkdart1847 --pretty=format:'%H' -1
+# 2549d8ecd211ee6fed6699d70f319e077b425be4
+#
+# The we'll cherry-pick commits from $OLD.
+# e.g.,
+# > git cherry-pick 3345f6a26911beda2ed352e887549bc514acb4bd..2549d8ecd211ee6fed6699d70f319e077b425be4
+#
+# Cherry picking is an iterative process. Each commit in the $OLD branch is
+# applied to the $NEW branch any conflicts will need to fixed.
+#
+# Fix each file conflict(s) in a particular commit:
+#
+# > vim <filename>
+# > git add <filename>
+#
+# When all file conflicts for a particular commit are done then:
+#
+# > git commit -a -m "Merged $OLD"
+#
+# Continue the original cherry-picking
+# > git cherry-pick --continue
+#
+#
+# ********************************************************************
+# * IMPORTANT: *
+# ********************************************************************
+#
+# When all commits are made to our new trunk (trunkdart$NEW). Then try an
+# initial dcommit with the --dry-run option.
+#
+# > git svn dcommit --dry-run
+#
+# e.g., git svn dcommit --dry-run
+# Committing to svn://svn.chromium.org/chrome/branches/dart/1908/src ...
+# diff-tree 48e85b5f247696c432d9dbb55c37f88f4df8a06a~1 48e85b5f247696c432d9dbb55c37f88f4df8a06a
+# ...
+#
+# It is important to check the first line "Committing to " the repository
+# should be the new remote SVN e.g., svn://svn.chromium.org/chrome/branches/dart/1908/src ...
+#
+# IT SHOULD NOT BE "svn://svn.chromium.org/chrome/trunk/src ..." this will
+# dcommit the changes to the chrome trunk and break the chromium build.
+#
+function roll_chrome_commands() {
+ stripped_found=$(stripped_exist)
+ old_branch_found=$(trunk_exist ${do_old_branch})
+ new_branch_found=$(trunk_exist ${do_new_branch})
+
+ echo
+ echo "================================================"
+ echo "| git commands to run: |"
+ echo "================================================"
+
+ remoteOld=dart${do_old_branch}
+ strip_branch=$(stripped_name)
+
+ if [ "$stripped_found" = "" ]; then
+ echo "------------------ Step 1. ---------------------"
+ echo
+
+ # Git command to create stripped old branch.
+ echo "git checkout -b ${strip_branch} ${remoteOld}"
+
+ # Get hashes for base for do_old_branch.
+ hash_codes_base_last ${remoteOld}
+
+ echo "git rebase -i ${hash_base}"
+ echo
+ elif [ "$old_branch_found" = "" ]; then
+ echo "------------------ Step 2. ---------------------"
+ echo
+
+ # Get hashes for base, last and base hash from trunk for the last branch.
+ hash_codes_base_last ${strip_branch}
+
+ # Git command to create old branch with only changes from base to last
+ # commits for that branch. Checkout based on stripped$OLD first commit
+ # $BASE.
+ branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+ echo "git checkout -b ${branch_trunkdart_old} ${hash_base}"
+
+ echo "git cherry-pick ${hash_base}..${hash_last}"
+ echo
+ elif [ "$new_branch_found" = "" ]; then
+ echo "------------------ Step 3. ---------------------"
+ echo
+
+ # Git command to create new branch to roll.
+ branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+
+ # get base and last commit hashes of the trunkdart$OLD
+ hash_codes_base2_last2 ${branch_trunkdart_old}
+
+ echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}"
+
+ echo "git cherry-pick ${hash_base2}..${hash_last2}"
+ echo
+ else
+ echo "===== Nothing to do - Roll setup complete. ====="
+ fi
+
+ echo "================================================"
+}
+
+
+function roll_blink_commands() {
+ stripped_found=$(stripped_exist)
+ old_branch_found=$(trunk_exist ${do_old_branch})
+ new_branch_found=$(trunk_exist ${do_new_branch})
+
+ echo
+ echo "================================================"
+ echo "| git commands to run: |"
+ echo "================================================"
+
+ remoteOld=dart${do_old_branch}
+ strip_branch=$(stripped_name)
+
+ if [ "$stripped_found" = "" ]; then
+ echo "------------------ Step 1. ---------------------"
+ echo
+
+ # Git command to create stripped old branch.
+ echo "git checkout -b ${strip_branch} ${remoteOld}"
+
+ # Get hashes for base dir do_old_branch.
+ hash_codes_base_last ${remoteOld}
+
+ eho "git rebase -i ${hash_base}"
+ echo
+ elif [ "$old_branch_found" = "" ]; then
+ echo "------------------ Step 2. ---------------------"
+ echo
+
+ # Get hashes for base, last and base hash from trunk for the last branch.
+ hash_codes_base_last ${strip_branch}
+
+ # Git command to create old branch with only changes from base to last
+ # commits for that branch. Checkout based on stripped$OLD first commit
+ # $BASE.
+ branch_trunkdart_old=$(trunkdart_name ${do_old_branch})
+ echo "git checkout -b ${branch_trunkdart_old} ${hash_base}"
+
+ echo "git cherry-pick ${hash_base}..${hash_last}"
+ echo
+ elif [ "$new_branch_found" = "" ]; then
+ echo "------------------ Step 3. ---------------------"
+ echo
+
+
+ # Git command to create new branch to roll.
+ branch_trunkdart_new=$(trunkdart_name ${do_new_branch})
+
+ # get base and last commit hashes of the trunkdart$OLD
+ hash_codes_base2_last2 ${branch_trunkdart_old}
+
+ echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}"
+
+ echo "git cherry-pick ${hash_base2}..${hash_last2}"
+ echo
+ else
+ echo "===== Nothing to do - Roll setup complete. ====="
+ fi
+
+ echo "================================================"
+}
+
+
+# checkout strippedOOOO and trunkdartNNNN
+create_branches=0
+
+do_info_hashes=0
+
+base_dir=""
+
+# Display the pre-roll commands; if specified nothing else is displayed.
+do_pre_roll=0
+
+# which branch chrome or blink
+do_which=""
+
+# Display detail information about all major steps
+do_verbose=0
+
+# $OLD branch
+do_old_branch=""
+do_old_revision=""
+
+# $NEW branch
+do_new_branch=""
+do_new_revision=""
+
+curr_switch=""
+for var in "$@"
+do
+ case "$var" in
+ --help)
+ usage
+ exit
+ ;;
+ --verbose)
+ do_verbose=1
+ curr_switch=""
+ ;;
+ --no-verbose)
+ do_verbose=0
+ curr_switch=""
+ ;;
+ --chrome)
+ if [ "$do_which" != "" ]; then
+ $(display_error "--chrome can not be specified with --blink")
+ exit $E_INVALID_ARG
+ fi
+ do_which="chrome"
+ curr_switch=""
+ ;;
+ --blink)
+ if [ "$do_which" != "" ]; then
+ $(display_error "--blink can not be specified with --chrome")
+ exit $E_INVALID_ARG
+ fi
+ do_which="blink"
+ curr_switch=""
+ ;;
+ --pre-roll)
+ do_pre_roll=1
+ curr_switch=""
+ ;;
+ --roll)
+ roll_branches=1
+ curr_switch=""
+ ;;
+ --info)
+ do_info_hashes=1
+ curr_switch=""
+ ;;
+ --directory)
+ curr_switch="base-directory" # takes an argument.
+ ;;
+ --old-branch)
+ curr_switch="old-branch" # takes an argument.
+ ;;
+ --new-branch)
+ curr_switch="new-branch" # takes an argument.
+ ;;
+ --old-revision)
+ curr_switch="old-revision" # takes an argument.
+ ;;
+ --new-revision)
+ curr_switch="new-revision" # takes an argument.
+ ;;
+ *)
+ prefix=${var:0:2}
+ if [ "$prefix" = "--" ]; then
+ $(display_error "unexpected switch ${var}")
+ exit $E_INVALID_ARG
+ fi
+ case "$curr_switch" in
+ base-directory)
+ base_dir="${var}"
+ ;;
+ old-branch)
+ do_old_branch="${var}"
+ ;;
+ old-revision)
+ do_old_revision="${var}"
+ ;;
+ new-branch)
+ do_new_branch="${var}"
+ ;;
+ new-revision)
+ do_new_revision="${var}"
+ ;;
+ *)
+ if [ "$curr_switch" != "" ]; then
+ $(display_error "unexpected paramter for ${curr_switch}")
+ exit $E_INVALID_ARG
+ else
+ $(display_error "unexpected switch ${var}")
+ exit $E_INVALID_ARG
+ fi
+ ;;
+ esac
+ curr_switch=""
+ ;;
+ esac
+done
+
+# Insure that everything is known otherwise prompt information.
+if [ "$base_dir" = "" ]; then
+ echo "--directory switch must be specified."
+ exit $E_INVALID_ARG
+fi
+
+if [ "$do_which" == "" ]; then
+ echo "--chrome or --blink switch must be specified."
+ exit $E_INVALID_ARG
+fi
+
+if [ "$do_old_branch" = "" ]; then
+ echo "Enter LAST ${do_which} true branch (e.g., Chrome version 34.0.1847.92 true branch is 1847)"
+ read do_old_branch
+fi
+
+if [ "$do_old_revision" = "" ]; then
+ echo "Enter LAST ${do_which} base trunk revision #"
+ read do_old_revision
+fi
+
+if [ "$do_new_branch" = "" ]; then
+ echo "Enter NEW ${do_which} true branch (e.g., Chrome version 35.0.1908.4 true branch is 1908)"
+ read do_new_branch
+fi
+
+if [ "$do_new_revision" = "" ]; then
+ echo "Enter NEW ${do_which} base trunk revision #"
+ read do_new_revision
+fi
+
+echo
+echo "Rolling new branch ${do_new_branch}@${do_new_revision}"
+
+verbose_message
+verbose_message "Previous branch ${do_old_branch}@${do_old_revision}"
+verbose_message "New branch ${do_new_branch}@${do_new_revision}"
+verbose_message
+
+if [[ "$do_pre_roll" = "1" ]]; then
+ display_remote_repository_creation
+ exit 1
+fi
+
+pushd . > /dev/null
+
+if [ "$base_dir" != "" ]; then
+ cd ${base_dir}
+fi
+
+cd src
+
+if [ "$do_which" = "blink" ]; then
+ cd third_party/WebKit
+fi
+
+# Disable ^C and ^Z while running script.
+trap '' INT
+trap '' TSTP
+
+validate_remotes
+
+display_roll_commands
+
+display_hashes
+
+# Insure that all local branches for the roll are NOT based on the chrome or
+# blink trunks.
+validate_branches
+
+# Re-enable ^C and ^Z.
+trap - INT
+trap - TSTP
+
+popd > /dev/null
+
diff --git a/tools/dartium/test.py b/tools/dartium/test.py
new file mode 100755
index 0000000..75b85d5
--- /dev/null
+++ b/tools/dartium/test.py
@@ -0,0 +1,242 @@
+#!/usr/bin/env python
+#
+# Copyright 2011 Google Inc. All Rights Reserved.
+
+import fnmatch
+import optparse
+import os
+import re
+import shutil
+import subprocess
+import sys
+import urllib
+import utils
+
+SCRIPT_TAG = '<script type="application/%s" src="%s"></script>\n'
+
+DART_TEST_DIR = os.path.join('dart')
+
+DART_VM_FLAGS = [
+ ]
+DART_VM_CHECKED_FLAGS = DART_VM_FLAGS + [
+ '--enable_type_checks',
+ '--warning_as_error',
+ ]
+
+TEST_DRT_FLAGS = [
+ '--compiler=none',
+ '--runtime=drt',
+ '--drt=%(drt)s',
+ '--mode=%(mode)s',
+ '--arch=%(arch)s',
+ '--build-directory=%(build_dir)s',
+ '--report',
+ '--time',
+ ]
+
+TEST_DRT_CHECKED_FLAGS = TEST_DRT_FLAGS + [
+ '--checked',
+ ]
+
+TEST_DARTIUM_FLAGS = [
+ '--compiler=none',
+ '--runtime=dartium',
+ '--dartium=%(dartium)s',
+ '--mode=%(mode)s',
+ '--build-directory=%(build_dir)s',
+ '--report',
+ '--time',
+ ]
+
+TEST_DARTIUM_CHECKED_FLAGS = TEST_DARTIUM_FLAGS + [
+ '--checked',
+ ]
+
+TEST_INFO = {
+ 'dartium': {
+ 'core': {
+ 'checked': TEST_DARTIUM_CHECKED_FLAGS,
+ 'unchecked': TEST_DARTIUM_FLAGS,
+ },
+ },
+ 'drt': {
+ 'layout': {
+ 'checked': DART_VM_CHECKED_FLAGS,
+ 'unchecked': DART_VM_FLAGS,
+ },
+ 'core': {
+ 'checked': TEST_DRT_CHECKED_FLAGS,
+ 'unchecked': TEST_DRT_FLAGS,
+ },
+ },
+}
+
+COMPONENTS = TEST_INFO.keys()
+SUITES = [ 'layout', 'core' ]
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('--mode', dest='mode',
+ action='store', type='string',
+ help='Test mode (Debug or Release)')
+ parser.add_option('--component', dest='component',
+ default='drt',
+ action='store', type='string',
+ help='Execution mode (dartium, drt or all)')
+ parser.add_option('--suite', dest='suite',
+ default='all',
+ action='store', type='string',
+ help='Test suite (layout, core, or all)')
+ parser.add_option('--arch', dest='arch',
+ default='ia32',
+ action='store', type='string',
+ help='Target architecture')
+ parser.add_option('--no-show-results', action='store_false',
+ default=True, dest='show_results',
+ help='Don\'t launch a browser with results '
+ 'after the tests are done')
+ parser.add_option('--checked', action='store_true',
+ default=False, dest='checked',
+ help='Run Dart code in checked mode')
+ parser.add_option('--unchecked', action='store_true',
+ default=False, dest='unchecked',
+ help='Run Dart code in unchecked mode')
+ parser.add_option('--buildbot', action='store_true',
+ default=False, dest='buildbot',
+ help='Print results in buildbot format')
+ parser.add_option('--layout-test', dest='layout_test',
+ default=None,
+ action='store', type='string',
+ help='Single layout test to run if set')
+ parser.add_option('--test-filter', dest='test_filter',
+ default=None,
+ action='store', type='string',
+ help='Test filter for core tests')
+ parser.add_option('--win-ninja-build', action='store_true',
+ default=False, dest='is_win_ninja',
+ help='We are on windows and use ninja for building.')
+
+ (options, args) = parser.parse_args()
+ mode = options.mode
+ if not (mode in ['Debug', 'Release']):
+ raise Exception('Invalid test mode')
+
+ if options.component == 'all':
+ components = COMPONENTS
+ elif not (options.component in COMPONENTS):
+ raise Exception('Invalid component %s' % options.component)
+ else:
+ components = [ options.component ]
+
+ if options.suite == 'all':
+ suites = SUITES
+ elif not (options.suite in SUITES):
+ raise Exception('Invalid suite %s' % options.suite)
+ else:
+ suites = [ options.suite ]
+
+ # If --checked or --unchecked not present, run with both.
+ checkmodes = ['unchecked', 'checked']
+ if options.checked or options.unchecked:
+ checkmodes = []
+ if options.unchecked: checkmodes.append('unchecked')
+ if options.checked: checkmodes.append('checked')
+
+ pathname = os.path.dirname(sys.argv[0])
+ fullpath = os.path.abspath(pathname)
+ srcpath = os.path.normpath(os.path.join(fullpath, '..'))
+
+ test_mode = ''
+ timeout = 30000
+ if mode == 'Debug':
+ test_mode = '--debug'
+ timeout = 60000
+
+ show_results = ''
+ if not options.show_results:
+ show_results = '--no-show-results'
+
+ host_os = utils.guessOS()
+ if options.is_win_ninja:
+ host_os = 'win-ninja'
+ build_root, drt_path, dartium_path, dart_path = {
+ 'mac': (
+ 'out',
+ os.path.join('Content Shell.app', 'Contents', 'MacOS', 'Content Shell'),
+ os.path.join('Chromium.app', 'Contents', 'MacOS', 'Chromium'),
+ 'dart',
+ ),
+ 'linux': ('out', 'content_shell', 'chrome', 'dart'),
+ 'win': ('out', 'content_shell.exe', 'chrome.exe', 'dart.exe'),
+ 'win-ninja': ('out', 'content_shell.exe', 'chrome.exe', 'dart.exe'),
+ }[host_os]
+
+ build_dir = os.path.join(srcpath, build_root, mode)
+
+ executable_map = {
+ 'mode': mode.lower(),
+ 'build_dir': os.path.relpath(build_dir),
+ 'drt': os.path.join(build_dir, drt_path),
+ 'dartium': os.path.join(build_dir, dartium_path),
+ 'dart': os.path.join(build_dir, dart_path),
+ 'arch': options.arch,
+ }
+
+ test_script = os.path.join(srcpath, 'webkit', 'tools', 'layout_tests',
+ 'run_webkit_tests.py')
+
+ errors = False
+ for component in components:
+ for checkmode in checkmodes:
+ # Capture errors and report at the end.
+ try:
+ if ('layout' in suites and
+ 'layout' in TEST_INFO[component] and
+ checkmode in TEST_INFO[component]['layout']):
+ # Run layout tests in this mode
+ dart_flags = ' '.join(TEST_INFO[component]['layout'][checkmode])
+
+ if options.layout_test:
+ test = os.path.join(DART_TEST_DIR, options.layout_test)
+ else:
+ test = DART_TEST_DIR
+ package_root = os.path.join(build_dir, 'packages')
+ utils.runCommand(['python',
+ test_script,
+ test_mode,
+ show_results,
+ '--time-out-ms', str(timeout),
+ # Temporary hack to fix issue with svn vs. svn.bat.
+ '--builder-name', 'BuildBot',
+ '--additional-env-var',
+ 'DART_FLAGS=%s' % dart_flags,
+ '--additional-env-var',
+ 'DART_PACKAGE_ROOT=file://%s' % package_root,
+ test])
+
+ # Run core dart tests
+ if ('core' in suites and
+ 'core' in TEST_INFO[component] and
+ checkmode in TEST_INFO[component]['core']):
+ core_flags = TEST_INFO[component]['core'][checkmode]
+ core_flags = map(lambda flag: flag % executable_map, core_flags)
+ if options.buildbot:
+ core_flags = ['--progress=buildbot'] + core_flags
+ tester = os.path.join(srcpath, 'dart', 'tools', 'test.py')
+ test_filter = [options.test_filter] if options.test_filter else []
+ utils.runCommand(['python', tester] + core_flags + test_filter)
+ except (StandardError, Exception) as e:
+ print 'Fail: ' + str(e)
+ errors = True
+
+ if errors:
+ return 1
+ else:
+ return 0
+
+if __name__ == '__main__':
+ try:
+ sys.exit(main())
+ except StandardError as e:
+ print 'Fail: ' + str(e)
+ sys.exit(1)
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
new file mode 100755
index 0000000..c3036eb
--- /dev/null
+++ b/tools/dartium/update_deps.py
@@ -0,0 +1,269 @@
+#!/usr/bin/python
+
+# Update Dartium DEPS automatically.
+
+from datetime import datetime, timedelta
+import optparse
+import os
+import re
+from subprocess import Popen, PIPE
+import sys
+from time import strptime
+
+# Instructions:
+#
+# To run locally:
+# (a) Create and change to a directory to run the updater in:
+# > mkdir /usr/local/google/home/$USER/dartium_deps_updater
+# > cd /usr/local/google/home/$USER/dartium_deps_updater
+#
+# (b) Make a 'deps' directory to store temporary files:
+# > mkdir deps
+#
+# (c) Checkout dart/tools/dartium (with this script):
+# > svn co https://dart.googlecode.com/svn/branches/bleeding_edge/dart/tools/dartium dartium_tools
+#
+# (d) If your home directory is remote, consider redefining it for this shell/script:
+# > cp -R $HOME/.subversion /usr/local/google/home/$USER
+# > export HOME=/usr/local/google/home/$USER
+#
+# (e) Test by running (Ctrl-C to quit):
+# > ./dartium_tools/update_deps.py
+# > ./dartium_tools/update_deps.py --target=multivm
+# > ./dartium_tools/update_deps.py --target=clank
+# > ./dartium_tools/update_deps.py --target=integration
+#
+# (f) Run periodical update:
+# > while true; do ./dartium_tools/update_deps.py --force ; sleep 300 ; done
+
+########################################################################
+# Repositories to auto-update
+########################################################################
+
+BRANCH_CURRENT="dart/1847"
+BRANCH_NEXT="dart/1916"
+BRANCH_MULTIVM="dart/multivm"
+
+TARGETS = {
+ 'dartium': (
+ 'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/dartium.deps',
+ 'dartium',
+ ['webkit', 'chromium'],
+ BRANCH_CURRENT,
+ ),
+ 'integration': (
+ 'https://dart.googlecode.com/svn/branches/dartium_integration/deps/dartium.deps',
+ 'dartium',
+ ['webkit', 'chromium'],
+ BRANCH_NEXT,
+ ),
+ 'clank': (
+ 'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/clank.deps',
+ 'dartium',
+ ['webkit', 'chromium'],
+ BRANCH_CURRENT,
+ ),
+ 'multivm': (
+ 'https://dart.googlecode.com/svn/branches/bleeding_edge/deps/multivm.deps',
+ 'multivm',
+ ['blink'],
+ BRANCH_MULTIVM,
+ ),
+}
+
+# Each element in this map represents a repository to update. Entries
+# take the form:
+# (repo_tag: (svn_url, view_url))
+#
+# The repo_tag must match the DEPS revision entry. I.e, there must be
+# an entry of the form:
+# 'dartium_%s_revision' % repo_tag
+# to roll forward.
+#
+# The view_url should be parameterized by revision number. This is
+# used to generated the commit message.
+REPOSITORY_INFO = {
+ 'webkit': (
+ 'http://src.chromium.org/blink/branches/%s',
+ 'http://src.chromium.org/viewvc/blink?view=rev&revision=%s'),
+ 'blink': (
+ 'http://src.chromium.org/blink/branches/%s',
+ 'http://src.chromium.org/viewvc/blink?view=rev&revision=%s'),
+ 'chromium': (
+ 'http://src.chromium.org/chrome/branches/%s',
+ 'http://src.chromium.org/viewvc/chrome?view=rev&revision=%s'),
+}
+
+REPOSITORIES = REPOSITORY_INFO.keys()
+
+########################################################################
+# Actions
+########################################################################
+
+def write_file(filename, content):
+ f = open(filename, "w")
+ f.write(content)
+ f.close()
+
+def run_cmd(cmd):
+ print "\n[%s]\n$ %s" % (os.getcwd(), " ".join(cmd))
+ pipe = Popen(cmd, stdout=PIPE, stderr=PIPE)
+ output = pipe.communicate()
+ if pipe.returncode == 0:
+ return output[0]
+ else:
+ print output[1]
+ print "FAILED. RET_CODE=%d" % pipe.returncode
+ sys.exit(pipe.returncode)
+
+def parse_iso_time(s):
+ pair = s.rsplit(' ', 1)
+ d = datetime.strptime(pair[0], '%Y-%m-%d %H:%M:%S')
+ offset = timedelta(hours=int(pair[1][0:3]))
+ return d - offset
+
+def parse_git_log(output, repo):
+ if len(output) < 4:
+ return []
+ lst = output.split(os.linesep)
+ lst = [s.strip('\'') for s in lst]
+ lst = [s.split(',', 3) for s in lst]
+ lst = [{'repo': repo,
+ 'rev': s[0],
+ 'isotime':s[1],
+ 'author': s[2],
+ 'utctime': parse_iso_time(s[1]),
+ 'info': s[3]} for s in lst]
+ return lst
+
+def parse_svn_log(output, repo):
+ lst = output.split(os.linesep)
+ lst = [s.strip('\'') for s in lst]
+ output = '_LINESEP_'.join(lst)
+ lst = output.split('------------------------------------------------------------------------')
+ lst = [s.replace('_LINESEP_', '\n') for s in lst]
+ lst = [s.strip('\n') for s in lst]
+ lst = [s.strip(' ') for s in lst]
+ lst = [s for s in lst if len(s) > 0]
+ pattern = re.compile(' \| (\d+) line(s|)')
+ lst = [pattern.sub(' | ', s) for s in lst]
+ lst = [s.split(' | ', 3) for s in lst]
+ lst = [{'repo': repo,
+ 'rev': s[0].replace('r', ''),
+ 'author': s[1],
+ 'isotime':s[2][0:25],
+ 'utctime': parse_iso_time(s[2][0:25]),
+ 'info': s[3].split('\n')[2]} for s in lst]
+ return lst
+
+def commit_url(repo, rev):
+ numrev = rev.replace('r', '')
+ if repo in REPOSITORIES:
+ (_, view_url) = REPOSITORY_INFO[repo]
+ return view_url % numrev
+ else:
+ raise Exception('Unknown repo');
+
+def find_max(revs):
+ max_time = None
+ max_position = None
+ for i, rev in enumerate(revs):
+ if rev == []:
+ continue
+ if max_time is None or rev[0]['utctime'] > max_time:
+ max_time = rev[0]['utctime']
+ max_position = i
+ return max_position
+
+def merge_revs(revs):
+ position = find_max(revs)
+ if position is None:
+ return []
+ item = revs[position][0]
+ revs[position] = revs[position][1:]
+ return [item] + merge_revs(revs)
+
+def main():
+ option_parser = optparse.OptionParser()
+ option_parser.add_option('', '--target', help="Update one of [dartium|integration|multivm|clank]", action="store", dest="target", default="dartium")
+ option_parser.add_option('', '--force', help="Push DEPS update to server without prompting", action="store_true", dest="force")
+ options, args = option_parser.parse_args()
+
+ target = options.target
+ if not target in TARGETS.keys():
+ print "Error: invalid target"
+ print "Choose one of " + str(TARGETS)
+ (deps_dir, prefix, repos, branch) = TARGETS[target]
+ deps_file = deps_dir + '/DEPS'
+
+ src_dir = "/usr/local/google/home/%s/dartium_deps_updater/deps/%s" % (os.environ["USER"], target)
+ os.putenv("GIT_PAGER", "")
+
+ if not os.path.exists(src_dir):
+ print run_cmd(['svn', 'co', deps_dir, src_dir])
+
+ os.chdir(src_dir)
+
+ # parse DEPS
+ deps = run_cmd(['svn', 'cat', deps_file])
+ rev_num = {}
+ for repo in repos:
+ revision = '%s_%s_revision":\s*"(.+)"' % (prefix, repo)
+ rev_num[repo] = re.search(revision, deps).group(1)
+
+ # update repos
+ all_revs = []
+ for repo in repos:
+ (svn_url, _) = REPOSITORY_INFO[repo]
+ output = run_cmd(["svn", "log", "-r", "HEAD:%s" % rev_num[repo], svn_url % branch])
+ revs = parse_svn_log(output, repo)
+ if revs and revs[-1]['rev'] == rev_num[repo]:
+ revs.pop()
+ all_revs.append(revs)
+
+ pending_updates = merge_revs(all_revs)
+ pending_updates.reverse()
+
+ print
+ print "Current DEPS revisions:"
+ for repo in repos:
+ print ' %s_%s_revision=%s' % (prefix, repo, rev_num[repo])
+
+ if len(pending_updates) == 0:
+ print "DEPS is up-to-date."
+ sys.exit(0)
+ else:
+ print "Pending DEPS updates:"
+ for s in pending_updates:
+ print " %s to %s (%s) %s" % (s['repo'], s['rev'], s['isotime'], s['info'])
+
+ # make the next DEPS update
+ os.chdir(src_dir)
+ run_cmd(['rm', 'DEPS'])
+ print run_cmd(['svn', 'update'])
+ s = pending_updates[0]
+
+ pattern = re.compile(prefix + '_' + s['repo'] + '_revision":\s*"(.+)"')
+ new_deps = pattern.sub(prefix + '_' + s['repo'] + '_revision": "' + s['rev'] + '"', deps)
+ write_file('DEPS', new_deps)
+
+ commit_log = 'DEPS AutoUpdate: %s to %s (%s) %s\n' % (s['repo'], s['rev'], s['isotime'], s['author'])
+ commit_log += s['info'] + '\n' + commit_url(s['repo'], s['rev'])
+
+ write_file('commit_log.txt', commit_log)
+ print run_cmd(['svn', 'diff'])
+ print
+ print "Commit log:"
+ print "---------------------------------------------"
+ print commit_log
+ print "---------------------------------------------"
+
+ if not options.force:
+ print "Ready to push; press Enter to continue or Control-C to abort..."
+ sys.stdin.readline()
+ print run_cmd(['svn', 'commit', '--file', 'commit_log.txt'])
+ print "Done."
+
+
+if '__main__' == __name__:
+ main()
diff --git a/tools/dartium/update_patched_files.py b/tools/dartium/update_patched_files.py
new file mode 100755
index 0000000..37e9543
--- /dev/null
+++ b/tools/dartium/update_patched_files.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+import overrides_database
+import shutil
+import subprocess
+import sys
+
+
+def svn_update(path, rev):
+ subprocess.call(['svn', 'up', '-r', str(rev), path])
+
+
+def update_overridden_files(old_rev, new_rev):
+ assert old_rev < new_rev
+ for override in overrides_database.OVERRIDDEN_FILES:
+ patched = override['modified']
+ orig = override['original']
+ svn_update(orig, old_rev)
+ shutil.copyfile(patched, orig)
+ svn_update(orig, new_rev)
+ shutil.copyfile(orig, patched)
+
+
+if __name__ == '__main__':
+ update_overridden_files(int(sys.argv[1]), int(sys.argv[2]))
diff --git a/tools/dartium/update_version.py b/tools/dartium/update_version.py
new file mode 100755
index 0000000..020eea3
--- /dev/null
+++ b/tools/dartium/update_version.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+import subprocess
+import sys
+
+def FetchSVNRevision():
+ try:
+ proc = subprocess.Popen(['svn', 'info'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ cwd='src/dart',
+ shell=(sys.platform=='win32'))
+ except OSError:
+ # command is apparently either not installed or not executable.
+ return None
+ if not proc:
+ return None
+
+ for line in proc.stdout:
+ line = line.strip()
+ if not line:
+ continue
+ key, val = line.split(': ', 1)
+ if key == 'Revision':
+ return val
+
+ return None
+
+
+def main():
+ revision = FetchSVNRevision()
+ path = 'src/chrome/VERSION'
+ text = file(path).readlines()
+ text[2] = 'BUILD=d%s\n' % revision
+ file(path, 'w').writelines(text)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/dartium/utils.py b/tools/dartium/utils.py
new file mode 100755
index 0000000..e2a50ed
--- /dev/null
+++ b/tools/dartium/utils.py
@@ -0,0 +1,123 @@
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+# This file contains a set of utilities functions used
+# by both SConstruct and other Python-based scripts.
+
+import commands
+import os
+import platform
+import re
+import subprocess
+
+class ChangedWorkingDirectory(object):
+ def __init__(self, new_dir):
+ self._new_dir = new_dir
+
+ def __enter__(self):
+ self._old_dir = os.getcwd()
+ os.chdir(self._new_dir)
+ return self._new_dir
+
+ def __exit__(self, *_):
+ os.chdir(self._old_dir)
+
+# Try to guess the host operating system.
+def guessOS():
+ id = platform.system()
+ if id == "Linux":
+ return "linux"
+ elif id == "Darwin":
+ return "mac"
+ elif id == "Windows" or id == "Microsoft":
+ # On Windows Vista platform.system() can return "Microsoft" with some
+ # versions of Python, see http://bugs.python.org/issue1082 for details.
+ return "win"
+ else:
+ return None
+
+
+# Try to guess the host architecture.
+def guessArchitecture():
+ id = platform.machine()
+ if id.startswith('arm'):
+ return 'arm'
+ elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
+ return 'x86'
+ elif id == 'i86pc':
+ return 'x86'
+ else:
+ return None
+
+
+# Try to guess the number of cpus on this machine.
+def guessCpus():
+ if os.path.exists("/proc/cpuinfo"):
+ return int(commands.getoutput("grep -E '^processor' /proc/cpuinfo | wc -l"))
+ if os.path.exists("/usr/bin/hostinfo"):
+ return int(commands.getoutput('/usr/bin/hostinfo | grep "processors are logically available." | awk "{ print \$1 }"'))
+ win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
+ if win_cpu_count:
+ return int(win_cpu_count)
+ return int(os.getenv("PARFAIT_NUMBER_OF_CORES", 2))
+
+
+# Returns true if we're running under Windows.
+def isWindows():
+ return guessOS() == 'win32'
+
+# Reads a text file into an array of strings - one for each
+# line. Strips comments in the process.
+def readLinesFrom(name):
+ result = []
+ for line in open(name):
+ if '#' in line:
+ line = line[:line.find('#')]
+ line = line.strip()
+ if len(line) == 0:
+ continue
+ result.append(line)
+ return result
+
+def listArgCallback(option, opt_str, value, parser):
+ if value is None:
+ value = []
+
+ for arg in parser.rargs:
+ if arg[:2].startswith('--'):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+
+def getCommandOutput(cmd):
+ print cmd
+ pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ output = pipe.communicate()
+ if pipe.returncode == 0:
+ return output[0]
+ else:
+ print output[1]
+ raise Exception('Failed to run command. return code=%s' % pipe.returncode)
+
+def runCommand(cmd, env_update=None):
+ if env_update is None:
+ env_update = {}
+ print 'Running: ' + ' '.join(["%s='%s'" % (k, v) for k, v in env_update.iteritems()]) + ' ' + ' '.join(cmd)
+ env_copy = dict(os.environ.items())
+ env_copy.update(env_update)
+ p = subprocess.Popen(cmd, env=env_copy)
+ if p.wait() != 0:
+ raise Exception('Failed to run command. return code=%s' % p.returncode)
+
+def main(argv):
+ print "GuessOS() -> ", guessOS()
+ print "GuessArchitecture() -> ", guessArchitecture()
+ print "GuessCpus() -> ", guessCpus()
+ print "IsWindows() -> ", isWindows()
+
+
+if __name__ == "__main__":
+ import sys
+ main(sys.argv)
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index fdeb28d..cd457d6 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -68,6 +68,15 @@
void handleEvent();
};
+// FIXME(leafp): This is a temporary hack to get things running while
+// we are still generating _blink from the dart side idl files.
+// Once we are up and running generating dart:_blink in dartium
+// this should go away.
+[Supplemental]
+interface URL {
+ [Suppressed] static DOMString createObjectURL(WebKitMediaSource source);
+};
+
[Supplemental]
interface CanvasRenderingContext2D {
[DartName=createImageDataFromImageData] ImageData createImageData(ImageData imagedata);
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 5f816451..ca8763f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -36,7 +36,10 @@
]
class HtmlDartGenerator(object):
- def __init__(self, interface, options):
+ def __init__(self, interface, options, dart_use_blink):
+ # This goes away after the Chrome 35 roll (or whenever we commit to the
+ # dart:blink refactor)
+ self._dart_use_blink = dart_use_blink
self._database = options.database
self._interface = interface
self._type_registry = options.type_registry
@@ -315,12 +318,13 @@
declaration,
generate_call,
is_optional,
+ emitter,
can_omit_type_check=lambda type, pos: False):
parameter_names = [p.name for p in info.param_infos]
number_of_required_in_dart = info.NumberOfRequiredInDart()
- body_emitter = self._members_emitter.Emit(
+ body_emitter = emitter.Emit(
'\n'
' $DECLARATION {\n'
'$!BODY'
@@ -432,6 +436,10 @@
def IsOptional(signature_index, argument):
return is_optional(operations[signature_index], argument)
+ emitter = \
+ self._native_library_emitter if self._dart_use_blink \
+ else self._members_emitter
+
self._GenerateOverloadDispatcher(
info,
[operation.arguments for operation in operations],
@@ -439,6 +447,7 @@
declaration,
GenerateCall,
IsOptional,
+ emitter,
can_omit_type_check)
def AdditionalImplementedInterfaces(self):
@@ -529,13 +538,25 @@
if param_info.is_optional:
inits.Emit(' if ($E != null) e.$E = $E;\n', E=param_info.name)
else:
+ custom_factory_ctr = self._interface.id in _custom_factories
+ constructor_full_name = constructor_info._ConstructorFullName(
+ self._DartType)
+
def GenerateCall(
stmts_emitter, call_emitter,
version, signature_index, argument_count):
name = emitter.Format('_create_$VERSION', VERSION=version)
- call_emitter.Emit('$FACTORY.$NAME($FACTORY_PARAMS)',
- FACTORY=factory_name,
- NAME=name,
+ if self._dart_use_blink:
+ qualified_name = \
+ "_".join(["Native",self._interface.id,
+ name + 'constructorCallback'])
+ else:
+ qualified_name = emitter.Format(
+ '$FACTORY.$NAME',
+ FACTORY=factory_name,
+ NAME=name)
+ call_emitter.Emit('$FACTORY_NAME($FACTORY_PARAMS)',
+ FACTORY_NAME=qualified_name,
FACTORY_PARAMS= \
constructor_info.ParametersAsArgumentList(argument_count))
self.EmitStaticFactoryOverload(
@@ -545,22 +566,47 @@
def IsOptional(signature_index, argument):
return self.IsConstructorArgumentOptional(argument)
- custom_factory_ctr = self._interface.id in _custom_factories
- constructor_full_name = constructor_info._ConstructorFullName(
- self._DartType)
+ entry_declaration = emitter.Format(
+ '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
+ FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
+ 'static %s' % constructor_full_name),
+ CTOR=(('' if not custom_factory_ctr else '_factory')
+ + constructor_full_name),
+ METADATA=metadata,
+ PARAMS=constructor_info.ParametersAsDeclaration(self._DartType))
+
+ if self._dart_use_blink:
+ overload_emitter = self._native_library_emitter
+ mname = constructor_full_name.replace(".", "_")
+ blink_name = \
+ "_".join(["Native",self._interface.id, mname])
+ qual_name = self._native_library_name + "." + blink_name
+ actuals_s = constructor_info.ParametersAsStringOfVariables()
+ self._members_emitter.Emit(
+ '\n'
+ ' $DECLARATION => $NATIVE_NAME($ACTUALS);\n',
+ DECLARATION=entry_declaration,
+ NATIVE_NAME=qual_name,
+ ACTUALS=actuals_s)
+ overload_declaration = emitter.Format(
+ '// Generated overload resolver\n'
+ '$CTOR($PARAMS)',
+ CTOR=blink_name,
+ PARAMS=actuals_s)
+
+
+ else:
+ overload_emitter = self._members_emitter
+ overload_declaration = entry_declaration
+
self._GenerateOverloadDispatcher(
constructor_info,
constructor_info.idl_args,
False,
- emitter.Format('$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
- FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
- 'static %s' % constructor_full_name),
- CTOR=(('' if not custom_factory_ctr else '_factory')
- + constructor_full_name),
- METADATA=metadata,
- PARAMS=constructor_info.ParametersAsDeclaration(self._DartType)),
+ overload_declaration,
GenerateCall,
- IsOptional)
+ IsOptional,
+ overload_emitter)
def _AddFutureifiedOperation(self, info, html_name):
"""Given a API function that uses callbacks, convert it to using Futures.
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index dda2469..0ecc980 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -650,7 +650,7 @@
"""
def __init__(self, interface, options):
- super(Dart2JSBackend, self).__init__(interface, options)
+ super(Dart2JSBackend, self).__init__(interface, options, False)
self._database = options.database
self._template_loader = options.templates
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 3f3043e..86cf994 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -133,8 +133,7 @@
('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream',
('DOMURL', '_createObjectUrlFromWebKitSourceCallback'): 'URLMediaSource',
('DOMURL', '_createObjectURL_2Callback'): 'URLMediaSource',
- ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaSource',
- ('DOMURL', '_createObjectURL_4Callback'): 'URLMediaStream',
+ ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaStream',
}
_cpp_partial_map = {}
@@ -158,6 +157,109 @@
('Node', 'nodeType', 'Getter'),
('NodeList', 'length', 'Getter'),
('NodeList', 'item', 'Callback'),
+ ('WebGLRenderingContext', 'drawingBufferHeight', 'Getter'),
+ ('WebGLRenderingContext', 'drawingBufferWidth', 'Getter'),
+ ('WebGLRenderingContext', 'activeTexture', 'Callback'),
+ ('WebGLRenderingContext', 'attachShader', 'Callback'),
+ ('WebGLRenderingContext', 'bindAttribLocation', 'Callback'),
+ ('WebGLRenderingContext', 'bindBuffer', 'Callback'),
+ ('WebGLRenderingContext', 'bindFramebuffer', 'Callback'),
+ ('WebGLRenderingContext', 'bindRenderbuffer', 'Callback'),
+ ('WebGLRenderingContext', 'bindTexture', 'Callback'),
+ ('WebGLRenderingContext', 'blendColor', 'Callback'),
+ ('WebGLRenderingContext', 'blendEquation', 'Callback'),
+ ('WebGLRenderingContext', 'blendEquationSeparate', 'Callback'),
+ ('WebGLRenderingContext', 'blendFunc', 'Callback'),
+ ('WebGLRenderingContext', 'blendFuncSeparate', 'Callback'),
+ ('WebGLRenderingContext', 'checkFramebufferStatus', 'Callback'),
+ ('WebGLRenderingContext', 'clear', 'Callback'),
+ ('WebGLRenderingContext', 'clearColor', 'Callback'),
+ ('WebGLRenderingContext', 'clearDepth', 'Callback'),
+ ('WebGLRenderingContext', 'clearStencil', 'Callback'),
+ ('WebGLRenderingContext', 'colorMask', 'Callback'),
+ ('WebGLRenderingContext', 'compileShader', 'Callback'),
+ ('WebGLRenderingContext', 'compressedTexImage2D', 'Callback'),
+ ('WebGLRenderingContext', 'compressedTexSubImage2D', 'Callback'),
+ ('WebGLRenderingContext', 'copyTexImage2D', 'Callback'),
+ ('WebGLRenderingContext', 'copyTexSubImage2D', 'Callback'),
+ ('WebGLRenderingContext', 'cullFace', 'Callback'),
+ ('WebGLRenderingContext', 'deleteBuffer', 'Callback'),
+ ('WebGLRenderingContext', 'deleteFramebuffer', 'Callback'),
+ ('WebGLRenderingContext', 'deleteProgram', 'Callback'),
+ ('WebGLRenderingContext', 'deleteRenderbuffer', 'Callback'),
+ ('WebGLRenderingContext', 'deleteShader', 'Callback'),
+ ('WebGLRenderingContext', 'deleteTexture', 'Callback'),
+ ('WebGLRenderingContext', 'depthFunc', 'Callback'),
+ ('WebGLRenderingContext', 'depthMask', 'Callback'),
+ ('WebGLRenderingContext', 'depthRange', 'Callback'),
+ ('WebGLRenderingContext', 'detachShader', 'Callback'),
+ ('WebGLRenderingContext', 'disable', 'Callback'),
+ ('WebGLRenderingContext', 'disableVertexAttribArray', 'Callback'),
+ ('WebGLRenderingContext', 'drawArrays', 'Callback'),
+ ('WebGLRenderingContext', 'drawElements', 'Callback'),
+ ('WebGLRenderingContext', 'enable', 'Callback'),
+ ('WebGLRenderingContext', 'enableVertexAttribArray', 'Callback'),
+ ('WebGLRenderingContext', 'finish', 'Callback'),
+ ('WebGLRenderingContext', 'flush', 'Callback'),
+ ('WebGLRenderingContext', 'framebufferRenderbuffer', 'Callback'),
+ ('WebGLRenderingContext', 'framebufferTexture2D', 'Callback'),
+ ('WebGLRenderingContext', 'frontFace', 'Callback'),
+ ('WebGLRenderingContext', 'generateMipmap', 'Callback'),
+ ('WebGLRenderingContext', 'getActiveAttrib', 'Callback'),
+ ('WebGLRenderingContext', 'getActiveUniform', 'Callback'),
+ ('WebGLRenderingContext', 'getAttachedShaders', 'Callback'),
+ ('WebGLRenderingContext', 'getAttribLocation', 'Callback'),
+ ('WebGLRenderingContext', 'hint', 'Callback'),
+ ('WebGLRenderingContext', 'isBuffer', 'Callback'),
+ ('WebGLRenderingContext', 'isContextLost', 'Callback'),
+ ('WebGLRenderingContext', 'isEnabled', 'Callback'),
+ ('WebGLRenderingContext', 'isFramebuffer', 'Callback'),
+ ('WebGLRenderingContext', 'isProgram', 'Callback'),
+ ('WebGLRenderingContext', 'isRenderbuffer', 'Callback'),
+ ('WebGLRenderingContext', 'isShader', 'Callback'),
+ ('WebGLRenderingContext', 'isTexture', 'Callback'),
+ ('WebGLRenderingContext', 'lineWidth', 'Callback'),
+ ('WebGLRenderingContext', 'linkProgram', 'Callback'),
+ ('WebGLRenderingContext', 'pixelStorei', 'Callback'),
+ ('WebGLRenderingContext', 'polygonOffset', 'Callback'),
+ ('WebGLRenderingContext', 'scissor', 'Callback'),
+ ('WebGLRenderingContext', 'stencilFunc', 'Callback'),
+ ('WebGLRenderingContext', 'stencilFuncSeparate', 'Callback'),
+ ('WebGLRenderingContext', 'stencilMask', 'Callback'),
+ ('WebGLRenderingContext', 'stencilMaskSeparate', 'Callback'),
+ ('WebGLRenderingContext', 'stencilOp', 'Callback'),
+ ('WebGLRenderingContext', 'stencilOpSeparate', 'Callback'),
+ ('WebGLRenderingContext', 'uniform1f', 'Callback'),
+ ('WebGLRenderingContext', 'uniform1fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform1i', 'Callback'),
+ ('WebGLRenderingContext', 'uniform1iv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform2f', 'Callback'),
+ ('WebGLRenderingContext', 'uniform2fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform2i', 'Callback'),
+ ('WebGLRenderingContext', 'uniform2iv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform3f', 'Callback'),
+ ('WebGLRenderingContext', 'uniform3fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform3i', 'Callback'),
+ ('WebGLRenderingContext', 'uniform3iv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform4f', 'Callback'),
+ ('WebGLRenderingContext', 'uniform4fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniform4i', 'Callback'),
+ ('WebGLRenderingContext', 'uniform4iv', 'Callback'),
+ ('WebGLRenderingContext', 'uniformMatrix2fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniformMatrix3fv', 'Callback'),
+ ('WebGLRenderingContext', 'uniformMatrix4fv', 'Callback'),
+ ('WebGLRenderingContext', 'useProgram', 'Callback'),
+ ('WebGLRenderingContext', 'validateProgram', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib1f', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib1fv', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib2f', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib2fv', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib3f', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib3fv', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib4f', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttrib4fv', 'Callback'),
+ ('WebGLRenderingContext', 'vertexAttribPointer', 'Callback'),
+ ('WebGLRenderingContext', 'viewport', 'Callback'),
])
# TODO(vsm): This should be recoverable from IDL, but we appear to not
@@ -245,7 +347,7 @@
def __init__(self, interface, native_library_emitter,
cpp_library_emitter, options, dart_use_blink):
- super(DartiumBackend, self).__init__(interface, options)
+ super(DartiumBackend, self).__init__(interface, options, dart_use_blink)
self._interface = interface
self._cpp_library_emitter = cpp_library_emitter
@@ -256,9 +358,6 @@
self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
self._metadata = options.metadata
self._native_library_name = "_blink"
- # This goes away after the Chrome 35 roll (or whenever we commit to the
- # dart:blink refactor)
- self._dart_use_blink = dart_use_blink
# These get initialized by StartInterface
self._cpp_header_emitter = None
self._cpp_impl_emitter = None
@@ -450,7 +549,7 @@
def _EmitConstructorInfrastructure(self,
constructor_info, constructor_callback_cpp_name, factory_method_name,
- argument_count=None):
+ argument_count=None, emit_to_native=False):
constructor_callback_id = self._interface.id + '_' + constructor_callback_cpp_name
if argument_count is None:
argument_count = len(constructor_info.param_infos)
@@ -472,16 +571,17 @@
# Then we emit the impedance matching wrapper to call out to the
# toplevel wrapper
- self._members_emitter.Emit(
- '\n @DocsEditable()\n'
- ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
- '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
- INTERFACE_NAME=self._interface_type_info.interface_name(),
- FACTORY_METHOD_NAME=factory_method_name,
- PARAMETERS=typed_formals,
- TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
- dart_native_name),
- OUTPARAMETERS=parameters)
+ if not emit_to_native:
+ self._members_emitter.Emit(
+ '\n @DocsEditable()\n'
+ ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
+ '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
+ INTERFACE_NAME=self._interface_type_info.interface_name(),
+ FACTORY_METHOD_NAME=factory_method_name,
+ PARAMETERS=typed_formals,
+ TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
+ dart_native_name),
+ OUTPARAMETERS=parameters)
else:
self._members_emitter.Emit(
'\n @DocsEditable()\n'
@@ -531,7 +631,8 @@
def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
constructor_callback_cpp_name = name + 'constructorCallback'
self._EmitConstructorInfrastructure(
- constructor_info, constructor_callback_cpp_name, name, len(arguments))
+ constructor_info, constructor_callback_cpp_name, name, len(arguments),
+ emit_to_native=self._dart_use_blink)
ext_attrs = self._interface.ext_attrs
@@ -1014,34 +1115,73 @@
if not is_custom:
self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
else:
- self._GenerateDispatcher(info, info.operations, dart_declaration)
+ self._GenerateDispatcher(info, info.operations, dart_declaration, html_name)
- def _GenerateDispatcher(self, info, operations, dart_declaration):
+ def _GenerateDispatcher(self, info, operations, dart_declaration, html_name):
def GenerateCall(
stmts_emitter, call_emitter, version, operation, argument_count):
- overload_name = '_%s_%s' % (operation.id, version)
- return_type = self.SecureOutputType(operation.type.id)
+ native_suffix = 'Callback'
actuals = info.ParametersAsListOfVariables(argument_count)
- actuals_s = ", ".join(actuals)
+ return_type = self.SecureOutputType(operation.type.id)
+ if self._dart_use_blink:
+ base_name = '_%s_%s' % (operation.id, version)
+ overload_name = \
+ DeriveNativeName(self._interface.id, base_name, native_suffix)
+ static = True
+ if not operation.is_static:
+ actuals = ['mthis'] + actuals
+ actuals_s = ", ".join(actuals)
+ dart_declaration = '%s(%s)' % (
+ base_name, actuals_s)
+ else:
+ base_name = '_%s_%s' % (operation.id, version)
+ overload_name = base_name
+ static = operation.is_static
+ actuals_s = ", ".join(actuals)
+ dart_declaration = '%s%s %s(%s)' % (
+ 'static ' if static else '',
+ return_type,
+ overload_name, actuals_s)
+
call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
- dart_declaration = '%s%s %s(%s)' % (
- 'static ' if operation.is_static else '',
- return_type,
- overload_name, actuals_s)
is_custom = 'Custom' in operation.ext_attrs
native_suffix = 'Callback'
auto_scope_setup = \
- self._GenerateAutoSetupScope(overload_name, native_suffix)
+ self._GenerateAutoSetupScope(base_name, native_suffix)
cpp_callback_name = self._GenerateNativeBinding(
- overload_name, (0 if operation.is_static else 1) + argument_count,
- dart_declaration, operation.is_static, return_type, actuals,
- 'Callback', is_custom, auto_scope_setup, emit_metadata=False)
+ base_name, (0 if static else 1) + argument_count,
+ dart_declaration, static, return_type, actuals,
+ native_suffix, is_custom, auto_scope_setup, emit_metadata=False,
+ emit_to_native=self._dart_use_blink)
if not is_custom:
self._GenerateOperationNativeCallback(operation,
operation.arguments[:argument_count], cpp_callback_name,
auto_scope_setup)
+
+ if self._dart_use_blink:
+ name = DeriveNativeName(self._interface.id, html_name, "")
+ qual_name = DeriveQualifiedName(self._native_library_name,
+ name)
+ actuals = info.ParametersAsListOfVariables()
+ formals = info.ParametersAsListOfVariables()
+ if not info.IsStatic():
+ formals = ['mthis'] + formals
+ actuals = ['this'] + actuals
+ actuals_s = ', '.join(actuals)
+ formals_s = ', '.join(formals)
+ self._members_emitter.Emit(
+ '\n'
+ ' $DECLARATION => $NATIVE_NAME($ACTUALS);\n',
+ DECLARATION=dart_declaration,
+ NATIVE_NAME=qual_name,
+ ACTUALS=actuals_s)
+
+ dart_declaration = \
+ '// Generated overload resolver\n' \
+ '%s(%s)' % (name, formals_s)
+
self._GenerateDispatcherBody(
info,
operations,
@@ -1441,7 +1581,7 @@
def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
static, return_type, parameters, native_suffix, is_custom,
- auto_scope_setup=True, emit_metadata=True):
+ auto_scope_setup=True, emit_metadata=True, emit_to_native=False):
metadata = []
if emit_metadata:
metadata = self._metadata.GetFormattedMetadata(
@@ -1465,17 +1605,17 @@
FORMALS=formals,
NATIVE_BINDING=native_binding)
- # We then emit a class method which calls out to the mangled toplevel
- # function. Eventually this will be replaced with a call to an
- # interceptor
- self._members_emitter.Emit(
- '\n'
- ' $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
- METADATA=metadata,
- DART_DECLARATION=dart_declaration,
- DART_NAME=DeriveQualifiedName(self._native_library_name,
- dart_native_name),
- ACTUALS=actuals)
+ if not emit_to_native:
+ caller_emitter = self._members_emitter
+ full_dart_name = DeriveQualifiedName(self._native_library_name,
+ dart_native_name)
+ caller_emitter.Emit(
+ '\n'
+ ' $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
+ METADATA=metadata,
+ DART_DECLARATION=dart_declaration,
+ DART_NAME=full_dart_name,
+ ACTUALS=actuals)
else:
self._members_emitter.Emit(
'\n'
diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart
index 009f857..62c120d 100644
--- a/tools/dom/src/dart2js_CustomElementSupport.dart
+++ b/tools/dom/src/dart2js_CustomElementSupport.dart
@@ -16,12 +16,12 @@
};
}
-_callEnteredView(receiver) {
- return receiver.enteredView();
+_callAttached(receiver) {
+ return receiver.attached();
}
-_callLeftView(receiver) {
- return receiver.leftView();
+_callDetached(receiver) {
+ return receiver.detached();
}
_callAttributeChanged(receiver, name, oldValue, newValue) {
return receiver.attributeChanged(name, oldValue, newValue);
@@ -104,9 +104,9 @@
JS('=Object', '{value: #}',
_makeCallbackMethod(_callConstructor(constructor, interceptor))));
JS('void', '#.attachedCallback = #', properties,
- JS('=Object', '{value: #}', _makeCallbackMethod(_callEnteredView)));
+ JS('=Object', '{value: #}', _makeCallbackMethod(_callAttached)));
JS('void', '#.detachedCallback = #', properties,
- JS('=Object', '{value: #}', _makeCallbackMethod(_callLeftView)));
+ JS('=Object', '{value: #}', _makeCallbackMethod(_callDetached)));
JS('void', '#.attributeChangedCallback = #', properties,
JS('=Object', '{value: #}', _makeCallbackMethod3(_callAttributeChanged)));
diff --git a/tools/dom/src/dartium_CustomElementSupport.dart b/tools/dom/src/dartium_CustomElementSupport.dart
index df29593..3afc56a 100644
--- a/tools/dom/src/dartium_CustomElementSupport.dart
+++ b/tools/dom/src/dartium_CustomElementSupport.dart
@@ -31,7 +31,6 @@
throw new UnsupportedError('Element is incorrect type');
}
return _Utils.changeElementWrapper(element, _type);
- return null;
}
}
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 5d89649..af2983c 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -492,7 +492,7 @@
String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
void clear() => Maps.clear(this);
void forEach(void f(String key, String value)) => Maps.forEach(this, f);
- Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
+ Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
Iterable<String> get values => Maps.getValues(this);
int get length => Maps.length(this);
bool get isEmpty => Maps.isEmpty(this);
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index d8c4edc..490dd14 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -417,7 +417,7 @@
static void initializeCustomElement(HtmlElement element) native "Utils_initializeCustomElement";
- static void changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
+ static Element changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
}
class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
index 30b3725..dec9dba 100644
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -10,6 +10,30 @@
* up the dart:html library.
*/
library dart.dom._blink;
+// TODO(leafp) These are mostly copied over from dart:html. When
+// we shift dart:blink generation over to dartium, this dependency
+// should go away, or at least be reconsidered.
+import 'dart:async';
+import 'dart:collection';
+import 'dart:html';
+import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:html_common';
+import 'dart:indexed_db';
+import 'dart:isolate';
+import "dart:convert";
+import 'dart:math';
+// TODO(vsm): Remove this when we can do the proper checking in
+// native code for custom elements.
+import 'dart:mirrors';
+import 'dart:nativewrappers';
+import 'dart:typed_data';
+import 'dart:web_gl' as gl;
+import 'dart:web_sql';
+// Not actually used, but imported since dart:html can generate these objects.
+import 'dart:svg' as svg;
+import 'dart:svg' show Matrix;
+import 'dart:svg' show SvgSvgElement;
+import 'dart:web_audio' show AudioNode, AudioParam;
part '$AUXILIARY_DIR/blink_native_DOMImplementation.dart';
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index 98df72e..d96f6c8 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -48,8 +48,8 @@
ElementList queryAll(String relativeSelectors) =>
querySelectorAll(relativeSelectors);
- /// Checks if [register] is supported on the current platform.
- bool get supportsRegister {
+ /// Checks if [registerElement] is supported on the current platform.
+ bool get supportsRegisterElement {
$if DART2JS
return JS('bool', '("registerElement" in #)', this);
$else
@@ -57,6 +57,10 @@
$endif
}
+ /// *Deprecated*: use [supportsRegisterElement] instead.
+ @deprecated
+ bool get supportsRegister => supportsRegisterElement;
+
@DomName('Document.createElement')
Element createElement(String tagName, [String typeExtension]) {
$if DART2JS
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 4155c8d..c28b153 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -361,7 +361,7 @@
* // Perform any element initialization.
* }
* }
- * document.register('x-custom', CustomElement);
+ * document.registerElement('x-custom', CustomElement);
*/
Element.created() : super._created() {
// Validate that this is a custom element & perform any additional
@@ -738,15 +738,39 @@
/**
* Called by the DOM when this element has been inserted into the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+ * draft specification.
*/
@Experimental()
- void enteredView() {}
+ void attached() {
+ // For the deprecation period, call the old callback.
+ enteredView();
+ }
/**
* Called by the DOM when this element has been removed from the live
* document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+ * draft specification.
*/
@Experimental()
+ void detached() {
+ // For the deprecation period, call the old callback.
+ leftView();
+ }
+
+ /** *Deprecated*: override [attached] instead. */
+ @Experimental()
+ @deprecated
+ void enteredView() {}
+
+ /** *Deprecated*: override [detached] instead. */
+ @Experimental()
+ @deprecated
void leftView() {}
/**
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 70662bd..1cfbdcb 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -219,7 +219,7 @@
* }
*
* main() {
- * document.register('x-foo', FooElement);
+ * document.registerElement('x-foo', FooElement);
* var myFoo = new Element.tag('x-foo');
* // prints 'FooElement created!' to the console.
* }
@@ -236,7 +236,7 @@
* }
*
* main() {
- * document.register('x-bar', BarElement);
+ * document.registerElement('x-bar', BarElement);
* var myBar = new Element.tag('input', 'x-bar');
* // prints 'BarElement created!' to the console.
* }
@@ -245,16 +245,22 @@
* `<input is="x-bar"></input>`
*
*/
+ void registerElement(String tag, Type customElementClass,
+ {String extendsTag}) {
$if DART2JS
- void register(String tag, Type customElementClass, {String extendsTag}) {
_registerCustomElement(JS('', 'window'), this, tag, customElementClass,
extendsTag);
- }
$else
- void register(String tag, Type customElementClass, {String extendsTag}) {
_Utils.register(this, tag, customElementClass, extendsTag);
- }
$endif
+ }
+
+ /** *Deprecated*: use [registerElement] instead. */
+ @deprecated
+ @Experimental()
+ void register(String tag, Type customElementClass, {String extendsTag}) {
+ return registerElement(tag, customElementClass, extendsTag: extendsTag);
+ }
/**
* Static factory designed to expose `visibilitychange` events to event
diff --git a/tools/test.dart b/tools/test.dart
index ebc807b..229cf0f 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -165,7 +165,8 @@
maxBrowserProcesses = 1;
} else if (conf['runtime'].startsWith('safari')) {
// Safari does not allow us to run from a fresh profile, so we can only
- // use one browser.
+ // use one browser. Additionally, you can not start two simulators
+ // for mobile safari simultainiously.
maxBrowserProcesses = 1;
} else if (conf['runtime'] == 'chrome' &&
Platform.operatingSystem == 'macos') {
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index a1a9d92..718588d 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -76,6 +76,8 @@
browser = new Dartium(checkedMode);
} else if (name == 'safari') {
browser = new Safari();
+ } else if (name == 'safarimobilesim') {
+ browser = new SafariMobileSimulator();
} else if (name.startsWith('ie')) {
browser = new IE();
} else {
@@ -440,6 +442,49 @@
String toString() => "Chrome";
}
+
+class SafariMobileSimulator extends Safari {
+ /**
+ * Directories where safari simulator stores state. We delete these if the
+ * deleteCache is set
+ */
+ static const List<String> CACHE_DIRECTORIES =
+ const ["Library/Application Support/iPhone Simulator/7.1/Applications"];
+
+ // Clears the cache if the static deleteCache flag is set.
+ // Returns false if the command to actually clear the cache did not complete.
+ Future<bool> clearCache() {
+ if (!Browser.deleteCache) return new Future.value(true);
+ var home = Platform.environment['HOME'];
+ Iterator iterator = CACHE_DIRECTORIES.map((s) => "$home/$s").iterator;
+ return deleteIfExists(iterator);
+ }
+
+ Future<bool> start(String url) {
+ _logEvent("Starting safari mobile simulator browser on: $url");
+ return clearCache().then((success) {
+ if (!success) {
+ _logEvent("Could not clear cache, exiting");
+ return false;
+ }
+ var args = ["-SimulateApplication",
+ "/Applications/Xcode.app/Contents/Developer/Platforms/"
+ "iPhoneSimulator.platform/Developer/SDKs/"
+ "iPhoneSimulator7.1.sdk/Applications/MobileSafari.app/"
+ "MobileSafari",
+ "-u", url];
+ return startBrowser(_binary, args)
+ .catchError((e) {
+ _logEvent("Running $_binary --version failed with $e");
+ return false;
+ });
+ });
+ }
+
+ String toString() => "SafariMobileSimulator";
+}
+
+
class Dartium extends Chrome {
final bool checkedMode;
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index ae4a362..f36c43e 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -36,6 +36,7 @@
case 'ie9':
case 'opera':
case 'safari':
+ case 'safarimobilesim':
// TODO(ahe): Replace this with one or more browser runtimes.
return new DummyRuntimeConfiguration();
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 657da29..48824f3 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -100,7 +100,7 @@
['-r', '--runtime'],
['vm', 'd8', 'jsshell', 'drt', 'dartium', 'ff', 'firefox',
'chrome', 'safari', 'ie9', 'ie10', 'ie11', 'opera',
- 'chromeOnAndroid',
+ 'chromeOnAndroid', 'safarimobilesim',
'ContentShellOnAndroid', 'DartiumOnAndroid', 'none'],
'vm'),
new _TestOptionSpecification(
@@ -603,7 +603,7 @@
// with dart2js, we should remove it from here.
validRuntimes = const ['d8', 'jsshell', 'drt', 'none', 'dartium',
'ff', 'chrome', 'safari', 'ie9', 'ie10', 'ie11',
- 'opera', 'chromeOnAndroid'];
+ 'opera', 'chromeOnAndroid', 'safarimobilesim'];
break;
case 'dartanalyzer':
case 'dart2analyzer':
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index dbcf5e3..24b1510 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2020,6 +2020,7 @@
'chrome',
'ff',
'chromeOnAndroid',
+ 'safarimobilesim',
'ContentShellOnAndroid',
'DartiumOnAndroid'
];
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index f56ccfa..b5b5f87 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -208,6 +208,11 @@
'safari': const {
'macos': '/Applications/Safari.app/Contents/MacOS/Safari'
},
+ 'safarimobilesim': const {
+ 'macos': '/Applications/Xcode.app/Contents/Developer/Platforms/'
+ 'iPhoneSimulator.platform/Developer/Applications/'
+ 'iPhone Simulator.app/Contents/MacOS/iPhone Simulator'
+ },
'ie9': const {
'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
},