anchor.diff:  import 'pages.dart';
   import 'transitions.dart';
   
  -// Heroes are the parts of an application's screen-to-screen transitions where a
  -// widget from one screen shifts to a position on the other. For example,
  -// album art from a list of albums growing to become the centerpiece of the
  -// album's details view. In this context, a screen is a navigator ModalRoute.
  -
  -// To get this effect, all you have to do is wrap each hero on each route with a
  -// Hero widget, and give each hero a tag. The tag must either be unique within the
  -// current route's widget subtree. When the app transitions from one route to
  -// another, each hero is animated to its new location. If a hero is only
  -// present on one of the routes and not the other, then it will be made to
  -// appear or disappear as needed.
  -
   // TODO(ianh): Make the appear/disappear animations pretty. Right now they're
   // pretty crude (just rotate and shrink the constraints). They should probably
   // involve actually scaling and fading, at a minimum.
  -
  -// Heroes and the Navigator's Stack must be axis-aligned for all this to work.
  -// The top left and bottom right coordinates of each animated Hero will be
  -// converted to global coordinates and then from there converted to the
  -// Navigator Stack's coordinate space, and the entire Hero subtree will, for the
  -// duration of the animation, be lifted out of its original place, and
  -// positioned on that stack. If the Hero isn't axis aligned, this is going to
  -// fail in a rather ugly fashion. Don't rotate your heroes!
  -
  -// To make the animations look good, it's critical that the widget tree for the
  -// hero in both locations be essentially identical. The widget of the target is
  -// used to do the transition: when going from route A to route B, route B's
  -// hero's widget is placed over route A's hero's widget, and route A's hero is
  -// hidden. Then the widget is animated to route B's hero's position, and then
  -// the widget is inserted into route B. When going back from B to A, route A's
  -// hero's widget is placed over where route B's hero's widget was, and then the
  -// animation goes the other way.
   
   // TODO(ianh): If the widgets use Inherited properties, they are taken from the
   // Navigator's position in the widget hierarchy, not the source or target. We
  
positive.code:   String toString() => '$_heroes';
  }
  
  class HeroController extends NavigatorObserver {
    HeroController({ CreateRectTween createRectTween }) {
      _party = new _HeroParty(
        onQuestFinished: _handleQuestFinished,
  
negative.code:   final Object tag;
  }
  
  /// Signature for a function that takes two [Rect] instances and returns a
  /// [RectTween] that transitions between them.
  ///
  /// This is typically used with a [HeroController] to provide an animation for
  /// [Hero] positions that looks nicer than a linear movement. For example, see
  /// [MaterialRectArcTween].
  typedef RectTween CreateRectTween(Rect begin, Rect end);
  
  class _HeroParty {
  