anchor.diff:      }
       this._socketBuilder = socketBuilder;
       this._rootingtable = new KRootingTable(kBucketSize);
  +    if(ai == null) {
  +      this._ai = new KNodeAI();
  +    } else {
  +      this._ai = ai;
  +    }
     }
   
     Future start({String ip: "0.0.0.0", int port: 28080}) {
  
positive.code:   KId _nodeId = null;
    KId get nodeId => _nodeId;
    List<SendInfo> queryInfo = [];
  
    KNode(HetiSocketBuilder socketBuilder, {int kBucketSize: 8, List<int> nodeIdAsList: null}) {
      if (nodeIdAsList == null) {
        _nodeId = KId.createIDAtRandom();
      } else {
  
negative.code:     return new Future(() {
        if (_udpSocket == null) {
          return null;
        } else {
          return _udpSocket.close();
        }
      }).whenComplete((){
        _ai.stop(this);
      });
    }
  }
  
  class KNodeAI {
    
    start(KNode node) {
      
    }
    
    stop(KNode node) {
      
    }
    onReceiveQuery(KNode node, HetiReceiveUdpInfo info, KrpcMessage message) {
      
    }
    onReceiveResponse(KNode node, HetiReceiveUdpInfo info, KrpcMessage message) {
      
    }
    onReceiveUnknown(KNode node, HetiReceiveUdpInfo info, KrpcMessage message) {
      
    }
  }
  
  