ROOT logo
#include "honlineclientservercom.h"
#include "TThread.h"
#include "TStopwatch.h"

#include "hades.h"
#include "hdatasource.h"

#include <iostream>
#include <vector>
using namespace std;

ClassImp(HOnlineClientServerCom);

Int_t   HOnlineClientServerCom::fEvtCtInterval = 100;
Float_t HOnlineClientServerCom::fSpeed         = 0;
Bool_t  HOnlineClientServerCom::isInit         = kFALSE;
Bool_t  HOnlineClientServerCom::doStop         = kFALSE;


HOnlineClientServerCom::HOnlineClientServerCom(TString name, TString hostname, Int_t port) {
    this->SetName(name);
    monitor = 0;
    serversocket = 0;
    fPort = port;
    fHostname = hostname;
    fTimeout = 1000;
    fDebug = kFALSE;
    fEvtCtInterval = 100;
    fSpeed         = 0;
    eventLoopThread = NULL;
    isInit = kFALSE;
    doStop = kFALSE;
    masterClient = NULL;
}
//--------------------------------------------------------------------------
Bool_t HOnlineClientServerCom::init() {
    serversocket = new TServerSocket(fPort, kFALSE);  // before true
    if (!serversocket->IsValid()) {
	return kFALSE;
    }
    monitor = new TMonitor;
    monitor->Add(serversocket);
    return kTRUE;
}
//--------------------------------------------------------------------------
HOnlineClientServerCom::~HOnlineClientServerCom()
{
    // destroys the object. the eventloop thread
    // is deleted too
    TThread* self = TThread::Self();
    self->Lock();
    serversocket->Close();
    delete monitor;
    socketlist.Delete();
    delete serversocket;
    serversocket = 0;
    monitor = 0;

    TThread::Delete(eventLoopThread);
    delete eventLoopThread;

    self->UnLock();
}
//--------------------------------------------------------------------------
Bool_t HOnlineClientServerCom::sendListToClient(TSocket* socket, TList* list)
{
    if (!socket->IsValid()) return kFALSE;

    TMessage answer(kMESS_OBJECT);
    answer.WriteObject(list);

    if (socket->Send(answer) <= 0) return kFALSE;

    return kTRUE;
}
//--------------------------------------------------------------------------
Bool_t HOnlineClientServerCom::sendHistToClient(TSocket* socket, HOnlineMonHistAddon* hist) {
    if (!socket->IsValid()) return kFALSE;

    TMessage answer(kMESS_OBJECT);
    answer.WriteObject(hist);

    if (socket->Send(answer) <= 0) return kFALSE;

    return kTRUE;
}
//--------------------------------------------------------------------------
Bool_t HOnlineClientServerCom::sendTextToClient(TSocket* socket, TString msg) {
    if (!socket->IsValid()) return kFALSE;

    TMessage answer(kMESS_STRING);
    answer.WriteTString(msg);

    if (socket->Send(answer) <= 0) return kFALSE;

    return kTRUE;
}
//--------------------------------------------------------------------------
Bool_t HOnlineClientServerCom::processClientRequests()
{
    // evalutates the list of connections to the server

    TList* wr = new TList();  // sockets waiting for writing
    TList* rr = new TList();  // sockets waiting for reading

    // number of sockets waiting
    Int_t numSockets = monitor->Select(rr, wr, fTimeout);

    if(fDebug) TThread::Printf("HOnlineClientServerCom:: number of sockets waiting: %d", numSockets);

    if (numSockets == 0) {
	// nothing to do
	return kFALSE;
    }

    // sockets are waiting for reading
    for(Int_t i=0;i<rr->LastIndex()+1;i++) {
	// process sockets
	TSocket* s = (TSocket*) rr->At(i);

	if(s->IsA() == TServerSocket::Class()) {
	    // open connection
	    TSocket *sock = ((TServerSocket*)s)->Accept();
	    monitor->Add(sock); // Add socket to monitor
	    socketlist.Add(sock); // Add socket to list
	    TThread::Printf("HOnlineClientServerCom:: connection from client %s accepted",(sock->GetInetAddress()).GetHostName());

            if(!masterClient) masterClient = sock;

	} else {
	    TMessage* mess = 0;
	    Int_t rcode = s->Recv(mess);

	    if (rcode <= 0) {
		// close connection
		TString client = (s->GetInetAddress()).GetHostName();
		monitor->Remove(s);
		socketlist.Remove(s);
		s->Close();
		delete s;
		s = 0;
		delete mess;
		mess = 0;
		TThread::Printf("HOnlineClientServerCom:: connection from client %s closed",client.Data());
	    } else {
		// process request
		if (mess->What() == kMESS_STRING) {
		    TString str;
		    mess->ReadTString(str);
		    TObjString* objstr = new TObjString();
		    objstr->SetString(str);
		    clientRequests.Add(objstr, s);
		}

		delete mess;
		mess = 0;
	    }
	}
    }

    delete wr;
    delete rr;

    return kTRUE;
}
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------
Int_t HOnlineClientServerCom::processClients(TList& histpool) {
    //-----------------------------------------------------------------------
    // process client requests and send histos to client
    // the known commands ( start with : CMD ..) are processed
    // first and second the request for the histograms to
    // be transfered to the client. The requests are handled
    // asynchoniously to the eventloop (the eventloop is not stopped
    // while processing).


    while(isInit == kFALSE) {
	TThread::Printf("HOnlineClientServerCom:: Waiting for first eventLoop ...");
	TThread::Sleep(1);
    }


    while(1)
    {

	if (processClientRequests())
	{

	    TIterator* myiter = clientRequests.MakeIterator();
	    TObjString* mapkey;
	    TString histname2send;
	    TSocket* socket;
	    HOnlineMonHistAddon* hist2send;

	    //-----------------------------------------------------------------------
            // first process commands
	    while ((mapkey=(TObjString*)myiter->Next()) != 0)
	    {
		socket = (TSocket*) clientRequests.GetValue(mapkey);
		TString recvstring = mapkey->GetString();

		if(recvstring.BeginsWith("CMD "))
		{

		    //-----------------------------------------------------------------------
		    // PROCESSING COMMAND

		    //-----------------------------------------------------------------------
		    // COMMAND: CMD speed
                    if (recvstring.CompareTo("CMD speed") == 0) {
			sendTextToClient(socket,Form("%5.2f evts/s",fSpeed));
		    }
		    //-----------------------------------------------------------------------
		    // COMMAND: CMD filename
                    if (recvstring.CompareTo("CMD filename") == 0) {
                        TString filename = "no file yet";
			HDataSource* source = gHades->getDataSource();
			if(source){
			    filename = gHades->getDataSource()->getCurrentFileName();
			}
			sendTextToClient(socket,filename);
		    }
		    //-----------------------------------------------------------------------
		    // COMMAND: CMD ismaster
		    if (recvstring.CompareTo("CMD ismaster") == 0) {
			TThread::Printf("HOnlineClientServerCom:: received command '%s' from host '%s'", recvstring.Data(), (socket->GetInetAddress()).GetHostName());

			TString message = "no";
			if(socket == masterClient ) {
			    message = "yes";
			    TThread::Printf("HOnlineClientServerCom:: This client is considered as Master client");
			} else {
                           TThread::Printf("HOnlineClientServerCom:: This client is considered as Slave client");
			}
			sendTextToClient(socket,message);
		    }
		    //-----------------------------------------------------------------------
		    // COMMAND: CMD setmaster
                    if (recvstring.CompareTo("CMD setmaster") == 0) {
			TThread::Printf("HOnlineClientServerCom:: received command '%s' from host '%s'", recvstring.Data(), (socket->GetInetAddress()).GetHostName());
                        TThread::Printf("HOnlineClientServerCom:: This client is set as Master client");
			masterClient = socket;
			TString message = "ok";
			sendTextToClient(socket,message);
		    }
		    //-----------------------------------------------------------------------
		    // COMMAND: CMD histlist
		    if (recvstring.CompareTo("CMD histlist") == 0) {
			// create and send TList* with histogram names to client
			TList* listhistname = new TList();
			for(Int_t i=0;i<histpool.LastIndex()+1;i++) {
			    TString tmpname = ((HOnlineMonHistAddon*)histpool.At(i))->GetName();
			    TObjString* tmpobj = new TObjString();
			    tmpobj->SetString(tmpname);
			    listhistname->Add(tmpobj);
			}
			if (!sendListToClient(socket, listhistname)) {
			    TThread::Printf("HOnlineClientServerCom:: Error: could not send list of histogram names to client");
			}
			listhistname->Delete();
			listhistname = 0;
		    }

		    //-----------------------------------------------------------------------
		    // COMMAND: CMD stop
		    if (recvstring.CompareTo("CMD stop") == 0) {

			// received command, process command
			TThread::Printf("HOnlineClientServerCom:: received command '%s' from host '%s'", recvstring.Data(), (socket->GetInetAddress()).GetHostName());

			if(masterClient!=socket){
 
			    TThread::Printf("HOnlineClientServerCom:: THIS CLIENT IS NOT THE MASTER! WILL BE IGNORED!");
			    sendTextToClient(socket,"IGNORED");
			} else {


			    // stop the server
			    TThread::Printf("HOnlineClientServerCom:: stopping server... Received command 'stop' from host '%s'", (socket->GetInetAddress()).GetHostName());

			    // stop the eventloop thread
			    doStop = kTRUE;
			    Int_t ct = 0;

			    TThread::EState state = eventLoopThread->GetState();
			    while(state != TThread::kCanceledState && ct < 10) {
				ct++;
				TThread::Printf("HOnlineClientServerCom:: Waiting for eventLoop to finish .... n time %i",ct);
				state = eventLoopThread->GetState();
				TThread::Sleep(1);
			    }
			    if(ct == 10) {
				TThread::Printf("HOnlineClientServerCom:: EventLoop seems to be hanging .... finishing anyway.");
			    }
			    TThread::Ps();

			    return -1;
			}
		    }

		    //-----------------------------------------------------------------------
		    // COMMAND: CMD resetall
		    if (recvstring.CompareTo("CMD resetall") == 0) {

			TThread::Printf("HOnlineClientServerCom:: reset all histograms ... Received command 'resetall' from host '%s'", (socket->GetInetAddress()).GetHostName());

			if(masterClient!=socket){
 
			    TThread::Printf("HOnlineClientServerCom:: THIS CLIENT IS NOT THE MASTER! WILL BE IGNORED!");
			    sendTextToClient(socket,"IGNORED");

			} else {
			    // reset histograms
			    TThread* self = TThread::Self();
			    self->Lock();

			    HOnlineMonHistAddon* addon;
			    TIterator* it  = histpool.MakeIterator();
			    while( ((addon = (HOnlineMonHistAddon*) it->Next()) != 0) ) {
				if(addon->getActive() != 0) addon->reset(0,0); // full reset no matter if is resetable
			    }
			    delete it;
			    sendTextToClient(socket,"resetdone");
			    self->UnLock();
			}
		    }

		    delete (TObjString*) (clientRequests.Remove(mapkey));
		}
	    }
	    //-----------------------------------------------------------------------



	    //-----------------------------------------------------------------------
            // second process histogram requests
	    myiter->Reset();

 	    while ((mapkey=(TObjString*)myiter->Next()) != 0)
	    {
		socket = (TSocket*) clientRequests.GetValue(mapkey);
		TString recvstring = mapkey->GetString();

		if(recvstring.BeginsWith("CMD ")) {
                   // do nothing
		} else {

		    //-----------------------------------------------------------------------
		    // PROCESSING HISTOGRAM REQUEST

		    // received no command, it must be the name of a histogram
		    // which should be send to the client
		    TString histname2send = recvstring;
		    hist2send = (HOnlineMonHistAddon*) histpool.FindObject(histname2send.Data());
		    if (hist2send == 0) {
			TString errmsg = "ERROR: Can't find requested histogram '";
			errmsg += histname2send;
			errmsg += "' in list of active histograms.";
			TThread::Printf("HOnlineClientServerCom:: %s",errmsg.Data());

			if (!sendTextToClient(socket, errmsg)) {
			    // error occurred
			    TThread::Printf("HOnlineClientServerCom:: ERROR: could not send text %s to client %s '",errmsg.Data(),(socket->GetInetAddress()).GetHostName());
			}
			delete (TObjString*) (clientRequests.Remove(mapkey));
		    } else {
			if (!sendHistToClient(socket, hist2send)) {
			    // error occurred
			    TThread::Printf("HOnlineClientServerCom:: ERROR: could not send histogram %s to client %s",hist2send->GetName(),(socket->GetInetAddress()).GetHostName());
			}
			delete (TObjString*) (clientRequests.Remove(mapkey));
		    }
		}
	    } // end mapping keys
	    //-----------------------------------------------------------------------


	    delete myiter;


	} // end process clients
	//-----------------------------------------------------------------------


    } // end while

    return 0;
}
//--------------------------------------------------------------------------

/* -------------------------------------------------------------------------- */
void* HOnlineClientServerCom::ThreadEventLoop(void* arg) {
    
    // This function is executed in a separat thread.
    // it will run the HADES eventloop in an enless loop
    // for 1 event and call the fill functions provided
    // by the list. The loop is finished if the last event
    // is reached or the client request for stop server.

    vector < fillptrHOnlineClientServerCom >& fillfunctions = *((vector < fillptrHOnlineClientServerCom >*) arg);
    Int_t count = 0;
    Bool_t rc = 0;

    TStopwatch timer;
    timer.Start();
    while(rc == 0 && !doStop) {

	//------------------- EVENTLOOP---------------------------------------
	if(!gHades->eventLoop(1)) {

	    TThread::Printf("HOnlineClientServerCom:: Reached last Event!");
	    rc = -1 ; continue ;
	}
	count++;
	if(count%100 == 0){
           Float_t time = timer.RealTime();
	   if(time > 0.0001) fSpeed = 100./time;
           else              fSpeed = 0;
	   timer.Reset();
	   timer.Start();
	}

        if(count>=1) isInit = kTRUE;

	if(fEvtCtInterval!=-1 && count%fEvtCtInterval == 0 ){ TThread::Printf("Event %i",count);}

	//TThread* self = TThread::Self();
	//self->Lock();

	for(UInt_t i = 0; i < fillfunctions.size(); i++){ // call the fill functionwith event number
	    fillptrHOnlineClientServerCom func = fillfunctions[i];
	    (*func)(count);
	}

	//self->UnLock();
	//--------------------------------------------------------------------

    }
    TThread::Printf("HOnlineClientServerCom:: eventLoopThread finsihed!");
    return 0;
}

void HOnlineClientServerCom::eventLoop(vector < fillptrHOnlineClientServerCom >*  fillfunctions)
{
    // thread to run the HADES eventloop in backgorund
    // while HOnlineClientServerCom communicates with the
    // clients

     // start eventloop thread
    if (!eventLoopThread) {
        eventLoopThread = new TThread("eventloopThread", ( void(*) (void*) )&ThreadEventLoop, (void*) fillfunctions);
        eventLoopThread->Run();
        TThread::Ps();
    }
}

 honlineclientservercom.cc:1
 honlineclientservercom.cc:2
 honlineclientservercom.cc:3
 honlineclientservercom.cc:4
 honlineclientservercom.cc:5
 honlineclientservercom.cc:6
 honlineclientservercom.cc:7
 honlineclientservercom.cc:8
 honlineclientservercom.cc:9
 honlineclientservercom.cc:10
 honlineclientservercom.cc:11
 honlineclientservercom.cc:12
 honlineclientservercom.cc:13
 honlineclientservercom.cc:14
 honlineclientservercom.cc:15
 honlineclientservercom.cc:16
 honlineclientservercom.cc:17
 honlineclientservercom.cc:18
 honlineclientservercom.cc:19
 honlineclientservercom.cc:20
 honlineclientservercom.cc:21
 honlineclientservercom.cc:22
 honlineclientservercom.cc:23
 honlineclientservercom.cc:24
 honlineclientservercom.cc:25
 honlineclientservercom.cc:26
 honlineclientservercom.cc:27
 honlineclientservercom.cc:28
 honlineclientservercom.cc:29
 honlineclientservercom.cc:30
 honlineclientservercom.cc:31
 honlineclientservercom.cc:32
 honlineclientservercom.cc:33
 honlineclientservercom.cc:34
 honlineclientservercom.cc:35
 honlineclientservercom.cc:36
 honlineclientservercom.cc:37
 honlineclientservercom.cc:38
 honlineclientservercom.cc:39
 honlineclientservercom.cc:40
 honlineclientservercom.cc:41
 honlineclientservercom.cc:42
 honlineclientservercom.cc:43
 honlineclientservercom.cc:44
 honlineclientservercom.cc:45
 honlineclientservercom.cc:46
 honlineclientservercom.cc:47
 honlineclientservercom.cc:48
 honlineclientservercom.cc:49
 honlineclientservercom.cc:50
 honlineclientservercom.cc:51
 honlineclientservercom.cc:52
 honlineclientservercom.cc:53
 honlineclientservercom.cc:54
 honlineclientservercom.cc:55
 honlineclientservercom.cc:56
 honlineclientservercom.cc:57
 honlineclientservercom.cc:58
 honlineclientservercom.cc:59
 honlineclientservercom.cc:60
 honlineclientservercom.cc:61
 honlineclientservercom.cc:62
 honlineclientservercom.cc:63
 honlineclientservercom.cc:64
 honlineclientservercom.cc:65
 honlineclientservercom.cc:66
 honlineclientservercom.cc:67
 honlineclientservercom.cc:68
 honlineclientservercom.cc:69
 honlineclientservercom.cc:70
 honlineclientservercom.cc:71
 honlineclientservercom.cc:72
 honlineclientservercom.cc:73
 honlineclientservercom.cc:74
 honlineclientservercom.cc:75
 honlineclientservercom.cc:76
 honlineclientservercom.cc:77
 honlineclientservercom.cc:78
 honlineclientservercom.cc:79
 honlineclientservercom.cc:80
 honlineclientservercom.cc:81
 honlineclientservercom.cc:82
 honlineclientservercom.cc:83
 honlineclientservercom.cc:84
 honlineclientservercom.cc:85
 honlineclientservercom.cc:86
 honlineclientservercom.cc:87
 honlineclientservercom.cc:88
 honlineclientservercom.cc:89
 honlineclientservercom.cc:90
 honlineclientservercom.cc:91
 honlineclientservercom.cc:92
 honlineclientservercom.cc:93
 honlineclientservercom.cc:94
 honlineclientservercom.cc:95
 honlineclientservercom.cc:96
 honlineclientservercom.cc:97
 honlineclientservercom.cc:98
 honlineclientservercom.cc:99
 honlineclientservercom.cc:100
 honlineclientservercom.cc:101
 honlineclientservercom.cc:102
 honlineclientservercom.cc:103
 honlineclientservercom.cc:104
 honlineclientservercom.cc:105
 honlineclientservercom.cc:106
 honlineclientservercom.cc:107
 honlineclientservercom.cc:108
 honlineclientservercom.cc:109
 honlineclientservercom.cc:110
 honlineclientservercom.cc:111
 honlineclientservercom.cc:112
 honlineclientservercom.cc:113
 honlineclientservercom.cc:114
 honlineclientservercom.cc:115
 honlineclientservercom.cc:116
 honlineclientservercom.cc:117
 honlineclientservercom.cc:118
 honlineclientservercom.cc:119
 honlineclientservercom.cc:120
 honlineclientservercom.cc:121
 honlineclientservercom.cc:122
 honlineclientservercom.cc:123
 honlineclientservercom.cc:124
 honlineclientservercom.cc:125
 honlineclientservercom.cc:126
 honlineclientservercom.cc:127
 honlineclientservercom.cc:128
 honlineclientservercom.cc:129
 honlineclientservercom.cc:130
 honlineclientservercom.cc:131
 honlineclientservercom.cc:132
 honlineclientservercom.cc:133
 honlineclientservercom.cc:134
 honlineclientservercom.cc:135
 honlineclientservercom.cc:136
 honlineclientservercom.cc:137
 honlineclientservercom.cc:138
 honlineclientservercom.cc:139
 honlineclientservercom.cc:140
 honlineclientservercom.cc:141
 honlineclientservercom.cc:142
 honlineclientservercom.cc:143
 honlineclientservercom.cc:144
 honlineclientservercom.cc:145
 honlineclientservercom.cc:146
 honlineclientservercom.cc:147
 honlineclientservercom.cc:148
 honlineclientservercom.cc:149
 honlineclientservercom.cc:150
 honlineclientservercom.cc:151
 honlineclientservercom.cc:152
 honlineclientservercom.cc:153
 honlineclientservercom.cc:154
 honlineclientservercom.cc:155
 honlineclientservercom.cc:156
 honlineclientservercom.cc:157
 honlineclientservercom.cc:158
 honlineclientservercom.cc:159
 honlineclientservercom.cc:160
 honlineclientservercom.cc:161
 honlineclientservercom.cc:162
 honlineclientservercom.cc:163
 honlineclientservercom.cc:164
 honlineclientservercom.cc:165
 honlineclientservercom.cc:166
 honlineclientservercom.cc:167
 honlineclientservercom.cc:168
 honlineclientservercom.cc:169
 honlineclientservercom.cc:170
 honlineclientservercom.cc:171
 honlineclientservercom.cc:172
 honlineclientservercom.cc:173
 honlineclientservercom.cc:174
 honlineclientservercom.cc:175
 honlineclientservercom.cc:176
 honlineclientservercom.cc:177
 honlineclientservercom.cc:178
 honlineclientservercom.cc:179
 honlineclientservercom.cc:180
 honlineclientservercom.cc:181
 honlineclientservercom.cc:182
 honlineclientservercom.cc:183
 honlineclientservercom.cc:184
 honlineclientservercom.cc:185
 honlineclientservercom.cc:186
 honlineclientservercom.cc:187
 honlineclientservercom.cc:188
 honlineclientservercom.cc:189
 honlineclientservercom.cc:190
 honlineclientservercom.cc:191
 honlineclientservercom.cc:192
 honlineclientservercom.cc:193
 honlineclientservercom.cc:194
 honlineclientservercom.cc:195
 honlineclientservercom.cc:196
 honlineclientservercom.cc:197
 honlineclientservercom.cc:198
 honlineclientservercom.cc:199
 honlineclientservercom.cc:200
 honlineclientservercom.cc:201
 honlineclientservercom.cc:202
 honlineclientservercom.cc:203
 honlineclientservercom.cc:204
 honlineclientservercom.cc:205
 honlineclientservercom.cc:206
 honlineclientservercom.cc:207
 honlineclientservercom.cc:208
 honlineclientservercom.cc:209
 honlineclientservercom.cc:210
 honlineclientservercom.cc:211
 honlineclientservercom.cc:212
 honlineclientservercom.cc:213
 honlineclientservercom.cc:214
 honlineclientservercom.cc:215
 honlineclientservercom.cc:216
 honlineclientservercom.cc:217
 honlineclientservercom.cc:218
 honlineclientservercom.cc:219
 honlineclientservercom.cc:220
 honlineclientservercom.cc:221
 honlineclientservercom.cc:222
 honlineclientservercom.cc:223
 honlineclientservercom.cc:224
 honlineclientservercom.cc:225
 honlineclientservercom.cc:226
 honlineclientservercom.cc:227
 honlineclientservercom.cc:228
 honlineclientservercom.cc:229
 honlineclientservercom.cc:230
 honlineclientservercom.cc:231
 honlineclientservercom.cc:232
 honlineclientservercom.cc:233
 honlineclientservercom.cc:234
 honlineclientservercom.cc:235
 honlineclientservercom.cc:236
 honlineclientservercom.cc:237
 honlineclientservercom.cc:238
 honlineclientservercom.cc:239
 honlineclientservercom.cc:240
 honlineclientservercom.cc:241
 honlineclientservercom.cc:242
 honlineclientservercom.cc:243
 honlineclientservercom.cc:244
 honlineclientservercom.cc:245
 honlineclientservercom.cc:246
 honlineclientservercom.cc:247
 honlineclientservercom.cc:248
 honlineclientservercom.cc:249
 honlineclientservercom.cc:250
 honlineclientservercom.cc:251
 honlineclientservercom.cc:252
 honlineclientservercom.cc:253
 honlineclientservercom.cc:254
 honlineclientservercom.cc:255
 honlineclientservercom.cc:256
 honlineclientservercom.cc:257
 honlineclientservercom.cc:258
 honlineclientservercom.cc:259
 honlineclientservercom.cc:260
 honlineclientservercom.cc:261
 honlineclientservercom.cc:262
 honlineclientservercom.cc:263
 honlineclientservercom.cc:264
 honlineclientservercom.cc:265
 honlineclientservercom.cc:266
 honlineclientservercom.cc:267
 honlineclientservercom.cc:268
 honlineclientservercom.cc:269
 honlineclientservercom.cc:270
 honlineclientservercom.cc:271
 honlineclientservercom.cc:272
 honlineclientservercom.cc:273
 honlineclientservercom.cc:274
 honlineclientservercom.cc:275
 honlineclientservercom.cc:276
 honlineclientservercom.cc:277
 honlineclientservercom.cc:278
 honlineclientservercom.cc:279
 honlineclientservercom.cc:280
 honlineclientservercom.cc:281
 honlineclientservercom.cc:282
 honlineclientservercom.cc:283
 honlineclientservercom.cc:284
 honlineclientservercom.cc:285
 honlineclientservercom.cc:286
 honlineclientservercom.cc:287
 honlineclientservercom.cc:288
 honlineclientservercom.cc:289
 honlineclientservercom.cc:290
 honlineclientservercom.cc:291
 honlineclientservercom.cc:292
 honlineclientservercom.cc:293
 honlineclientservercom.cc:294
 honlineclientservercom.cc:295
 honlineclientservercom.cc:296
 honlineclientservercom.cc:297
 honlineclientservercom.cc:298
 honlineclientservercom.cc:299
 honlineclientservercom.cc:300
 honlineclientservercom.cc:301
 honlineclientservercom.cc:302
 honlineclientservercom.cc:303
 honlineclientservercom.cc:304
 honlineclientservercom.cc:305
 honlineclientservercom.cc:306
 honlineclientservercom.cc:307
 honlineclientservercom.cc:308
 honlineclientservercom.cc:309
 honlineclientservercom.cc:310
 honlineclientservercom.cc:311
 honlineclientservercom.cc:312
 honlineclientservercom.cc:313
 honlineclientservercom.cc:314
 honlineclientservercom.cc:315
 honlineclientservercom.cc:316
 honlineclientservercom.cc:317
 honlineclientservercom.cc:318
 honlineclientservercom.cc:319
 honlineclientservercom.cc:320
 honlineclientservercom.cc:321
 honlineclientservercom.cc:322
 honlineclientservercom.cc:323
 honlineclientservercom.cc:324
 honlineclientservercom.cc:325
 honlineclientservercom.cc:326
 honlineclientservercom.cc:327
 honlineclientservercom.cc:328
 honlineclientservercom.cc:329
 honlineclientservercom.cc:330
 honlineclientservercom.cc:331
 honlineclientservercom.cc:332
 honlineclientservercom.cc:333
 honlineclientservercom.cc:334
 honlineclientservercom.cc:335
 honlineclientservercom.cc:336
 honlineclientservercom.cc:337
 honlineclientservercom.cc:338
 honlineclientservercom.cc:339
 honlineclientservercom.cc:340
 honlineclientservercom.cc:341
 honlineclientservercom.cc:342
 honlineclientservercom.cc:343
 honlineclientservercom.cc:344
 honlineclientservercom.cc:345
 honlineclientservercom.cc:346
 honlineclientservercom.cc:347
 honlineclientservercom.cc:348
 honlineclientservercom.cc:349
 honlineclientservercom.cc:350
 honlineclientservercom.cc:351
 honlineclientservercom.cc:352
 honlineclientservercom.cc:353
 honlineclientservercom.cc:354
 honlineclientservercom.cc:355
 honlineclientservercom.cc:356
 honlineclientservercom.cc:357
 honlineclientservercom.cc:358
 honlineclientservercom.cc:359
 honlineclientservercom.cc:360
 honlineclientservercom.cc:361
 honlineclientservercom.cc:362
 honlineclientservercom.cc:363
 honlineclientservercom.cc:364
 honlineclientservercom.cc:365
 honlineclientservercom.cc:366
 honlineclientservercom.cc:367
 honlineclientservercom.cc:368
 honlineclientservercom.cc:369
 honlineclientservercom.cc:370
 honlineclientservercom.cc:371
 honlineclientservercom.cc:372
 honlineclientservercom.cc:373
 honlineclientservercom.cc:374
 honlineclientservercom.cc:375
 honlineclientservercom.cc:376
 honlineclientservercom.cc:377
 honlineclientservercom.cc:378
 honlineclientservercom.cc:379
 honlineclientservercom.cc:380
 honlineclientservercom.cc:381
 honlineclientservercom.cc:382
 honlineclientservercom.cc:383
 honlineclientservercom.cc:384
 honlineclientservercom.cc:385
 honlineclientservercom.cc:386
 honlineclientservercom.cc:387
 honlineclientservercom.cc:388
 honlineclientservercom.cc:389
 honlineclientservercom.cc:390
 honlineclientservercom.cc:391
 honlineclientservercom.cc:392
 honlineclientservercom.cc:393
 honlineclientservercom.cc:394
 honlineclientservercom.cc:395
 honlineclientservercom.cc:396
 honlineclientservercom.cc:397
 honlineclientservercom.cc:398
 honlineclientservercom.cc:399
 honlineclientservercom.cc:400
 honlineclientservercom.cc:401
 honlineclientservercom.cc:402
 honlineclientservercom.cc:403
 honlineclientservercom.cc:404
 honlineclientservercom.cc:405
 honlineclientservercom.cc:406
 honlineclientservercom.cc:407
 honlineclientservercom.cc:408
 honlineclientservercom.cc:409
 honlineclientservercom.cc:410
 honlineclientservercom.cc:411
 honlineclientservercom.cc:412
 honlineclientservercom.cc:413
 honlineclientservercom.cc:414
 honlineclientservercom.cc:415
 honlineclientservercom.cc:416
 honlineclientservercom.cc:417
 honlineclientservercom.cc:418
 honlineclientservercom.cc:419
 honlineclientservercom.cc:420
 honlineclientservercom.cc:421
 honlineclientservercom.cc:422
 honlineclientservercom.cc:423
 honlineclientservercom.cc:424
 honlineclientservercom.cc:425
 honlineclientservercom.cc:426
 honlineclientservercom.cc:427
 honlineclientservercom.cc:428
 honlineclientservercom.cc:429
 honlineclientservercom.cc:430
 honlineclientservercom.cc:431
 honlineclientservercom.cc:432
 honlineclientservercom.cc:433
 honlineclientservercom.cc:434
 honlineclientservercom.cc:435
 honlineclientservercom.cc:436
 honlineclientservercom.cc:437
 honlineclientservercom.cc:438
 honlineclientservercom.cc:439
 honlineclientservercom.cc:440
 honlineclientservercom.cc:441
 honlineclientservercom.cc:442
 honlineclientservercom.cc:443
 honlineclientservercom.cc:444
 honlineclientservercom.cc:445
 honlineclientservercom.cc:446
 honlineclientservercom.cc:447
 honlineclientservercom.cc:448
 honlineclientservercom.cc:449
 honlineclientservercom.cc:450
 honlineclientservercom.cc:451
 honlineclientservercom.cc:452
 honlineclientservercom.cc:453
 honlineclientservercom.cc:454
 honlineclientservercom.cc:455
 honlineclientservercom.cc:456
 honlineclientservercom.cc:457
 honlineclientservercom.cc:458