anchor.diff:  import 'dart:async';
   import 'dart:html' as html;
   
  -import '../lib/services.dart' as services;
  +import 'enum.dart';
  +import 'services.dart' as services;
   import 'preferences.dart';
   
   final bool _INCLUDE_TYPES = true;
  
positive.code:       !(bottom < another.top || top > another.bottom);
  
    String toString() => "($top, $bottom)";
  }
  
  /**
  
negative.code:   }
  
    void scrollOffsetRangeIntoView(OffsetRange offsetRange) {
      _ScrollDirection scrollDirection;
  
      if (offsetRange.centeredLower(_lastScrolledOffsetRange)) {
        scrollDirection = _ScrollDirection.DOWN;
      } else if (offsetRange.centeredHigher(_lastScrolledOffsetRange)) {
        scrollDirection = _ScrollDirection.UP;
      }
  
      if (scrollDirection != null) {
        OutlineItem item = _edgeItemInCodeOffsetRange(
            offsetRange, atBottom: scrollDirection == _ScrollDirection.DOWN);
        _scrollItemIntoView(item, scrollDirection);
        _lastScrolledOffsetRange = offsetRange;
      }
    }
  
    void _scrollItemIntoView(OutlineItem item, _ScrollDirection direction) {
      if (item == null) return;
  
      // This may change dynamically: do not cache.
      html.Rectangle rootListRect = _rootListDiv.getBoundingClientRect();
      html.Rectangle elementRect = item.element.getBoundingClientRect();
      // Perhaps the item is already in view.
      if (!rootListRect.containsRectangle(elementRect)) {
        // Use [item.anchor], not [item.element] to pull the minimal amount of
        // [item] into view. For example, [item.element] for OutlineClass
        // spans the whole class, which may not even fit into the viewport.
        item.anchor.scrollIntoView(direction.value);
      }
    }
  
  