anchor.diff:  }
   
   class TraceSummary {
  +  final int numSymbols;
  +
     Map<String, TraceSymbol> _symbols = {};
     List _events = [];
     List<TraceSymbol> _stack = [];
     List<TraceSymbol> _topExclusive = [];
     List<TraceSymbol> _topInclusive = [];
  +  bool _marked = false;
  +  int _totalSamples = 0;
  +
  +  TraceSummary(this.numSymbols);
   
     void _processEventsFromFile(String name) {
       var file = new File(name);
  
positive.code:       symbol = new TraceSymbol(name);
        _symbols[name] = symbol;
      }
      // Start at 1 because 0 will always be the isolate.
      for (var i = 1; i < _stack.length; i++) {
        // Bump inclusive count for all frames.
        symbol.inclusive++;
      }
      _stack.add(symbol);
      if (_stack.length > 1) {
        // Only if we aren't the isolate.
        symbol.exclusive++;
      }
    }
  
    void _processEnd(Map event) {
  
negative.code:     _print();
    }
  
    String _pad(String input, int minLength) {
      int length = input.length;
      for (int i = 0; i < minLength - length; i++) {
        input = ' $input';
      }
      return input;
    }
  
    static const TICKS_LENGTH = 10;
    static const PERCENT_LENGTH = 7;
  
    void _printSymbol(int t, String name) {
      String ticks = t.toString();
      ticks = _pad(ticks, TICKS_LENGTH);
      double total = (t / _totalSamples);
      String percent = (total * 100.0).toStringAsFixed(2);
      percent = _pad(percent, PERCENT_LENGTH);
      print('$ticks  $percent  $name');
    }
  
    void _print() {
      print('Top ${numSymbols} inclusive symbols');
      print('--------------------------');
      print('     ticks  percent  name');
      _topInclusive.getRange(0, numSymbols).forEach((a) {
        _printSymbol(a.inclusive, a.name);
      });
      print('');
      print('Top ${numSymbols} exclusive symbols');
      print('--------------------------');
      print('     ticks  percent  name');
      _topExclusive.getRange(0, numSymbols).forEach((a) {
        _printSymbol(a.exclusive, a.name);
      });
    }
  }
  
  main(List<String> arguments) {
    if (arguments.length < 1) {
      print('${Platform.executable} ${Platform.script} <input> [symbol count]');
      return;
    }
    String input = arguments[0];
    int numSymbols = 10;
    if (arguments.length >= 2) {
      numSymbols = int.parse(arguments[1]);
    }
    TraceSummary ts = new TraceSummary(numSymbols);
    ts.summarize(input);
  }
  