anchor.diff:        };
   
     bool operator ==(dynamic other) => other is DialogEvent &&
  -      alias == other.alias &&
  +      name == other.name &&
         dialog == other.dialog &&
         from == other.from &&
         to == other.to &&
         replies == other.replies;
  +
  +  int get hashCode => quiver.hashObjects([name, dialog, from, to, replies]);
   }
   
   class Replies {
  
positive.code:   Future<DialogEvent> add(String dialog,
        {String from,
        String to,
        Duration delay: Duration.ZERO,
        Replies replies: const _NoReplies()}) {
      var event = new DialogEvent(dialog, from: from, to: to, replies: replies);
  
      if (replies.modal) {
        _run.changeMode(this, new MustReplyMode(_run, event, this));
      }
  
      return _run.emit(event, delay: delay);
  
negative.code:       {String reply,
        String forDialog,
        String forDialogTo,
        String forDialogFrom,
        String forDialogNamed}) {
      var conditions = [];
  
      if (_notNull(reply)) {
        conditions.add((e) => e.reply == reply);
      }
  
      if (_notNull(forDialogNamed)) {
        conditions.add((e) => e.dialogEvent.name == forDialogNamed);
      } else {
        if (_notNull(forDialog)) {
          conditions.add((e) => e.dialogEvent.dialog == forDialog);
        }
  
        if (_notNull(forDialogTo)) {
          conditions.add((e) => e.dialogEvent.to == forDialogTo);
        }
  
        if (_notNull(forDialogFrom)) {
          conditions.add((e) => e.dialogEvent.from == forDialogFrom);
        }
  
        if (conditions.isEmpty) {
          throw new ArgumentError("Must pass at least one criteria for a reply.");
        }
      }
  
      return replies.firstWhere((e) => conditions.every((c) => c(e)));
  