anchor.diff:          res.externalIp;
           m.globalIP = res.externalIp;
         });
  -    });
  -  });
  -}
  +      int baseExternalPort = externalPort + 50;
  +      a() {
  +        pppDevice.requestAddPortMapping(externalPort, hetima.UPnpPPPDevice.VALUE_PORT_MAPPING_PROTOCOL_TCP, localPort, localAddress, hetima.UPnpPPPDevice.VALUE_ENABLE, "HetimaDelphinium", 0).then((hetima.UPnpAddPortMappingResponse res) {
  +          if (200 == res.resultCode) {
  +            m.globalPort = "${externalPort}";
  +            return;
  +          }
  +          if (-500 == res.resultCode) {
  +            externalPort++;
  +            if (externalPort < baseExternalPort) {
  +              a();
  +            }
  +          }
  +        });
  +      }
  +      ;
  +      a();
  +    });
  +  });
  +}
  +
  +void stopPortMap() {
  +  hetima.UpnpDeviceSearcher.createInstance(new hetimacl.HetiSocketBuilderChrome()).then((hetima.UpnpDeviceSearcher searcher) {
  +    searcher.searchWanPPPDevice().then((int e) {
  +      if (searcher.deviceInfoList.length <= 0) {
  +        return;
  +      }
  +      hetima.UPnpDeviceInfo info = searcher.deviceInfoList.first;
  +      hetima.UPnpPPPDevice pppDevice = new hetima.UPnpPPPDevice(info);
  +      pppDevice.requestGetExternalIPAddress().then((hetima.UPnpGetExternalIPAddressResponse res) {
  +        res.externalIp;
  +        m.globalIP = res.externalIp;
  +      });
  +      int baseExternalPort = externalPort + 50;
  +
  +      pppDevice.requestDeletePortMapping(externalPort, hetima.UPnpPPPDevice.VALUE_PORT_MAPPING_PROTOCOL_TCP);
  +    });
  +  });
  +}
  +
  +
   async.Future<int> startLocalIp() {
     async.Completer<int> completer = new async.Completer();
     (new hetimacl.HetiSocketBuilderChrome()).getNetworkInterfaces().then((List<hetima.HetiNetworkInterface> l) {
       // search 24
  -    for(hetima.HetiNetworkInterface i in l) {
  -      if(i.prefixLength == 24 && !i.address.startsWith("127")) {
  +    for (hetima.HetiNetworkInterface i in l) {
  +      if (i.prefixLength == 24 && !i.address.startsWith("127")) {
           m.localIP = i.address;
  +        localAddress = i.address;
           completer.complete(0);
           return;
         }
       }
       //
  -    for(hetima.HetiNetworkInterface i in l) {
  -      if(i.prefixLength == 64) {
  +    for (hetima.HetiNetworkInterface i in l) {
  +      if (i.prefixLength == 64) {
           m.localIP = i.address;
  +        localAddress = i.address;
           completer.complete(0);
           return;
         }
       }
  -  }).catchError((e){
  +  }).catchError((e) {
       completer.completeError(e);
     });
     return completer.future;
  
positive.code:   }
  
    _retryBind().then((hetima.HetiHttpServer server) {
      m.localPort = "${port}";
      _server = server;
      completer.complete(0);
      server.onNewRequest().listen((hetima.HetiHttpServerRequest req) {
  
negative.code:         startResponse(req.socket, fileList[path]);
        }
      });
    }).catchError((e) {
      completer.completeError(e);
    });
    return completer.future;
  