anchor.diff:    /// The canonical URL of [stylesheet].
     final Uri canonicalUrl;
   
  -  /// The stylesheets that [stylesheet] imports.
  -  final List<_StylesheetNode> upstream;
  +  /// A map from non-canonicalized import URLs in [stylesheet] to the
  +  /// stylesheets those imports refer to.
  +  ///
  +  /// This may have `null` values, which indicate failed imports.
  +  final Map<Uri, _StylesheetNode> upstream;
   
     /// The stylesheets that import [stylesheet].
     ///
  
positive.code:       var stylesheet = importCache.importCanonical(importer, canonicalUrl, url);
        if (stylesheet == null) return null;
  
        var active = new Set<Uri>.from([canonicalUrl]);
        return new _StylesheetNode(
            stylesheet,
            importer,
            canonicalUrl,
            findImports(stylesheet)
                .map((import) => _nodeFor(
                    Uri.parse(import.url), importer, canonicalUrl, active))
                .where((node) => node != null));
      });
    }
  
    /// Returns the [StylesheetNode] for the stylesheet at the given [url], which
  
negative.code:     DateTime transitiveModificationTime(_StylesheetNode node) {
        return _transitiveModificationTimes.putIfAbsent(node.canonicalUrl, () {
          var latest = node.importer.modificationTime(node.canonicalUrl);
          for (var upstream in node.upstream.values) {
            if (upstream == null) continue;
            var upstreamTime = transitiveModificationTime(upstream);
            if (upstreamTime.isAfter(latest)) latest = upstreamTime;
          }
  