ROOT logo
//*-- Author : Joern Wuestenfeld
//*-- Modified : 15/04/2002 by Joern Wuestenfeld
//*-- Modified : 04/04/2002 by Joern Wuestenfeld
//*-- Modified : 28/03/2002 by Joern Wuestenfeld
//*-- Modified : 27/02/2003 by Joern Wuestenfeld
//*-- Modified : 07/05/2003 by Joern Wuestenfeld

//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////
//
//  HMessageMgr
//
//  This class manages three different outputs for all kind of messages.
//  Besides the standart output, which is the default, one can also
//  write the messages to a file, or via a socket to a remote logging process.
//
//  The usage of this class should be done via the four macros that are defined
//  in the hmessagemgr.h file.
//  DEBUG_msg(level, det, text)
//  ERROR_msg(det, text)
//  WARNING_msg(level, det, text)
//  INFO_msg(level, det, text)
//
//  The meaning of the parameters is:
//  level - level of this message, never set it to zero because this means
//          no message at all will be printed
//  det   - detector which sends this message, can be one of:
//          DET_RICH DET_START DET_MDC DET_TOF DET_TOFINO DET_SHOWER
//          DET_TRIGGER
//  text  - text to print
//
/////////////////////////////////////////////////////
using namespace std;
#include "TSystem.h"
#include "hmessagemgr.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>


HMessageMgr::HMessageMgr(const Char_t *name, const Char_t *title)
    : TNamed(name,title)
{
    /// This is the default constructor inherited from TNamed.
    //
    //  Sets default logging to stdout and stderr.
    //  The default levels are: no debugging, but all of error, warning and info.
    //  param name Name of the object
    //  param title Title of the object




    msgFile = NULL;
    errorFile = NULL;
    msgSocket = NULL;
    errorSocket = NULL;
    file = NULL;

    debugLevel = 0;
    warningLevel = LEVELMAX;
    infoLevel = LEVELMAX;
    detectorMsg = DET_ALL;
    line = 0;
    screen = kFALSE;
    file = new char[2000];
}

HMessageMgr::~HMessageMgr(void)
{
    // Resets the message logging to ist default.
    //  Closses all loggfiles or open sockets, and loggs further messages to
    //  stdout and stderr.
    //  Also the loglevels are set to the same values as in the constructor.
    setDefault();
    delete [] file;
    file = NULL;
}

Bool_t HMessageMgr::setDefault(void)
{
    //  Closses all loggfiles or open sockets, and loggs further messages to
    //  stdout and stderr.
    //  Also the loglevels are set to the same values as in the constructor.
    if(msgFile)
    {
	delete msgFile;
    }
    if(errorFile)
    {
	delete errorFile;
    }
    if(msgSocket)
    {
	msgSocket->Close();
	delete msgSocket;
	msgSocket = NULL;
    }
    if(errorSocket)
    {
	errorSocket->Close();
	delete errorSocket;
	errorSocket = NULL;
    }

    debugLevel = 0;
    warningLevel = LEVELMAX;
    infoLevel = LEVELMAX;
    detectorMsg = DET_ALL;
    screen = kFALSE;

    return kTRUE;
}

Bool_t HMessageMgr::setFile(const Char_t *dir)
{
    // Sets the logfile.
    // Input is the directory to where to log to.
    // The filename is derived from the name of this object, that is given
    // when creating it.
    // Two files are created. One with extension .msg for all messages of
    // type info, warning and debug.
    // The other one with extension .err fo the error messages.
    // param dir Directory where to store the logfiles.
    // retval setFile Returns kTRUE if file could be opened, otherwise kFALSE.

    Char_t *fname;

    fname = (Char_t *)calloc(1,2048);
    if(msgFile)
    {
	delete msgFile;
	msgFile = NULL;
    }
    if(errorFile)
    {
	delete errorFile;
	errorFile  = NULL;
    }
    if(!msgFile)
    {
	if((UInt_t)strlen(dir) > (UInt_t)(2048 - fName.Length() + 5))
	{
	    free(fname);
	    return kFALSE;
	}
	else
	{
	    sprintf(fname,"%s%s%s",dir,fName.Data(),".msg");
	}
	msgFile = new ofstream(fname,ios::out);
	if(!msgFile)
	{
	    free(fname);
	    return kFALSE;
	}
    }
    else
    {
	free(fname);
	return kFALSE;
    }
    if(!errorFile)
    {
	if((UInt_t )strlen(dir) > (UInt_t)(2048 - fName.Length() + 5))
	{
	    free(fname);
	    return kFALSE;
	}
	else
	{
	    sprintf(fname,"%s%s%s",dir,fName.Data(),".err");
	}
	errorFile = new ofstream(fname,ios::out);
	if(!errorFile)
	{
	    free(fname);
	    if(msgFile)
	    {
		msgFile->close();
		msgFile = NULL;
	    }
	    return kFALSE;
	}
    }
    else
    {
	free(fname);
	return kFALSE;
    }

    return kTRUE;
}

Bool_t HMessageMgr::setPort(const Char_t *host, Int_t port)
{
    // Opens two socket connections to a logging server on the specified host.
    // The passed port is used for the message logging. Errors are send to
    // the portaddress port + 10.
    // eventually opened logfiles are closed, if the connection could be opened.
    // Otherwise the current logging stays active.
    // param host Name of the host to send the logmessages to.
    // param port Port to use for communication with remote process.
    // retval setPort Returns kTRUE if remote process could be contacted, otherwise
    // kFALSE is returned.

    msgSocket = new TSocket(host,port);
    errorSocket = new TSocket(host,port+10);
    thisHost = new TString(gSystem->HostName());
    if(msgSocket->IsValid() && errorSocket->IsValid())
    {
	if(msgFile)
	{
	    msgFile->close();
	    msgFile = NULL;
	}
	if(errorFile)
	{
	    errorFile->close();
	    errorFile = NULL;
	}
	msgSocket->Send(thisHost->Data());
	errorSocket->Send(thisHost->Data());
	return kTRUE;
    }
    else
    {
	delete msgSocket;
	delete errorSocket;
	msgSocket = NULL;
	errorSocket = NULL;
	return kFALSE;
    }
}

Bool_t HMessageMgr::switchOff(void)
{
    // Switches of the logging completly by setting the output to /dev/null.
    // Could probably done also by redirecting stdout and stderr to /dev/null.
    // Currently opened files or sockets are closed.
    // retval switchOff Returns kTRUE on succsess, kFALSE otherwise.

    Char_t *fname;

    fname = (Char_t *)calloc(1,2048);
    setDefault();
    if(msgFile)
    {
	delete msgFile;
	msgFile = NULL;
    }
    if(errorFile)
    {
	delete errorFile;
	errorFile  = NULL;
    }
    if(!msgFile)
    {
	sprintf(fname,"%s","/dev/null");
    }
    msgFile = new ofstream(fname,ios::out);
    if(!msgFile)
    {
	free(fname);
	return kFALSE;
    }
    else
    {
	free(fname);
	return kFALSE;
    }
    if(!errorFile)
    {
	sprintf(fname,"%s","/dev/null");
    }
    errorFile = new ofstream(fname,ios::out);
    if(!errorFile)
    {
	free(fname);
	return kFALSE;
    }
    else
    {
	free(fname);
	return kFALSE;
    }

    return kTRUE;
}

void HMessageMgr::setDebugLevel(Char_t level)
{
    // Sets the level of debug messages to level.
    // param level Level of debugging, max 10 min 0.

    if(level > 10)
	debugLevel = 10;
    else
	if(level <= 0)
	    debugLevel = 1;
	else
	    debugLevel = level;
}

void HMessageMgr::setInfoLevel(Char_t level)
{
    // Sets the level of info messages to level.
    // param level Level of information, max 10 min 0.

    if(level > 1)
	infoLevel = 10;
    else
	if(level <= 0)
	    infoLevel = 1;
	else
	    infoLevel = level;
}

void HMessageMgr::setWarningLevel(Char_t level)
{
    // Sets the level of warning messages to level.
    //  param level Level of warning, max 10 min 0.
    if(level > 10)
	warningLevel = 10;
    else
	if(level <= 0)
	    warningLevel = 1;
	else
	    warningLevel = level;
}

/// Selects for which detector messages should be displayed.
/**
 \param det An or'd pattern of the DET_* constants.
 */
void HMessageMgr::enableDetectorMsg(Int_t det)
{
    // Selects for which detector messages should be displayed.
    // param det An or'd pattern of the DET_* constants.
    detectorMsg = det;
}

void HMessageMgr::messageSeperator(const Char_t *seperator, Int_t num)
{
    // This function prints a line with character seperator.
    // The seperator character is repeated num times on this line.
    // param seperator character to be used as seperator
    // param num How often the character is to be repeated on the same line.
    Int_t i;

    msg1 = (Char_t *)calloc(1,num+2);
    for(i=0;i<num;i++)
    {
	strcat(msg1,seperator);
    }
    write(msg1);
    free(msg1);
}

void HMessageMgr::hydraErrorHandler(Int_t level, Bool_t abort, const Char_t *location, const Char_t *msg)
{
    // Message handler for ROOT. Can be installed via gSystem->SetErrorHandler()
    // Used by all ROOT classes to do message logging.
    // Gives a common message layout.
    // param level Level of logging
    // param abort Wether to abort the execution after the printing of the message
    // param location Location of the message
    // param msg Text to be printed.
    if (level < gErrorIgnoreLevel)
	return;

    if((level >= kError) | (level >= kSysError) | (level >= kFatal))
    {
	gHades->getMsg()->error(10,DET_ALL,location,msg);
    }
    else
	if(level >= kWarning)
	{
	    gHades->getMsg()->warning(10,DET_ALL,location,msg);
	}
	else
	    if(level >= kInfo)
	    {
		gHades->getMsg()->info(10,DET_ALL,location,msg);
	    }
}

/// This function should never be called directly, use the DEBUG macro instead.
/**
 This function writes a debug message to the output.
 It looks like this example:<br>
 debug  <Hades          >:No input specified<p>
 \param level Level of message logging
 \param det One of the DET_* constants that defines the detector printing this message.
 \param className Name of the class that prints this message.
 \param text Text to 'print.
 */
void HMessageMgr::debug(Char_t level, Int_t det, const Char_t *className, const Char_t *text)
{
    // This function should never be called directly, use the DEBUG macro instead.
    // This function writes a debug message to the output.
    // It looks like this example:<br>
    // debug  <Hades          >:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to 'print.
    if(level <= 0)
	level = 1;
    if((level <= debugLevel) && (detectorMsg & det))
    {
	msg1 = (Char_t*)calloc(1,strlen((Char_t *)text)+30);
	if(msg1)
	{
	    if(line == 0)
		sprintf(msg1,"%7s%s%s%s%s","debug","<",className,">: ",text);
	    else
		sprintf(msg1,"%7s%s%s %s%s%d%s%s","debug","<",className,file,":",line,">:",text);
	    write(msg1);
	    free(msg1);
	}
    }
}

void HMessageMgr::error(Char_t level, Int_t det, const Char_t *className, const Char_t *text)
{
    // This function should never be called directly, use the ERROR macro instead.
    // This function writes a error message to the output.
    // It looks like this example:<br>
    // error  <Hades          >:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    if(level <= 0)
	level = 1;
    if(detectorMsg & det)
    {
	msg1 = (Char_t*)calloc(1,strlen((Char_t *)text)+30);
	if(msg1)
	{
	    sprintf(msg1,"%7s%s%s%s%s","error","<",className,">: ",text);
	    ewrite(msg1);
	    free(msg1);
	}
    }
}

void HMessageMgr::warning(Char_t level, Int_t det, const Char_t *className, const Char_t *text)
{
    // This function should never be called directly, use the WARNING macro instead.
    // This function writes a warning message to the output.
    // It looks like this example:<br>
    // warning<Hades          >:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    if(level <= 0)
	level = 1;
    if((level <= warningLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t*)calloc(1,strlen((Char_t *)text)+strlen(className)+15);
	if(msg1)
	{
	    sprintf(msg1,"%7s%s%s%s%s","warning","<",className,">: ",text);
	    write(msg1);
	    free(msg1);
	}
    }
}

void HMessageMgr::info(Char_t level, Int_t det, const Char_t *className, const Char_t *text)
{
    // This function should never be called directly, use the INFO macro instead.
    // This function writes a info message to the output.
    //  It looks like this example:<br>
    //  info<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    if(level <= 0)
	level = 1;
    if((level <= infoLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t*)calloc(1,strlen((Char_t *)text)+30);
	if(msg1)
	{
	    sprintf(msg1,"%7s%s%s%s%s","info","<",className,">: ",text);
	    write(msg1);
	    free(msg1);
	}
    }
}

void HMessageMgr::debug(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...)
{
    // This function put out an error message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // debug<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if((level <= debugLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	if(line == 0)
	    sprintf(msg1,"%7s%s%s%s","debug","<",className,">:");
	else
	    sprintf(msg1,"%7s%s%s %s%s%d%s","debug","<",className,file,":",line,">: ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::error(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...)
{
    // This function put out an error message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    //  The output looks like:<br>
    //  error<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if(detectorMsg & det)
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s%s%s%s","error","<",className,">: ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	ewrite(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::warning(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...)
{
    // This function put out an warning message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // warning<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;
    UInt_t size1,size2;

    if(level <= 0)
	level = 1;
    if((level <= warningLevel)  && (detectorMsg & det))
    {
	size2 = strlen(text)+2048;
	size1 = strlen(className) + size2 + 15;
	msg2 = (Char_t *)calloc(1,size2);
	msg1 = (Char_t *)calloc(1,size1);
	sprintf(msg1,"%7s%s%s%s","warning","<",className,">: ");
	va_start(ap,text);
	vsnprintf(msg2,size2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::info(Int_t level, Int_t det, const Char_t *className, const Char_t *text, ...)
{
    // This function put out an info message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    //  The output looks like:<br>
    //  info<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text

    va_list ap;

    if(level <= 0)
	level = 1;
    if((level <= infoLevel)  && (detectorMsg & det))
    {


	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s%s%s%s","info","<",className,">: ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::debugB(Char_t level, Int_t det, const Char_t *text, ...)
{
    // This function put out an error message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // debug<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param className Name of the class that prints this message.
    // param file Filename that prints the message.
    // param line Linenumber from where the message is printed.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if((level <= debugLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s%s%s %s%d%s","debug","<",file,":",line,">: ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::errorB(Char_t level, Int_t det, const Char_t *text, ...)
{
    // This function put out an error message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // error<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if(detectorMsg & det)
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s","error :");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	ewrite(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::warningB(Char_t level, Int_t det, const Char_t *text, ...)
{
    // This function put out an warning message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // warning<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;
    UInt_t size1,size2;

    if(level <= 0)
	level = 1;
    if((level <= warningLevel)  && (detectorMsg & det))
    {
	size2 = strlen(text)+2048;
	size1 = size2 + 15;
	msg2 = (Char_t *)calloc(1,size2);
	msg1 = (Char_t *)calloc(1,size1);
	sprintf(msg1,"%7s","warning : ");
	va_start(ap,text);
	vsnprintf(msg2,size2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::infoB(Char_t level, Int_t det, const Char_t *text, ...)
{
    // This function put out an info message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // info<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if((level <= infoLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s","info : ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}

void HMessageMgr::debug(Int_t level, Int_t det, const Char_t * className, const Char_t *file, Int_t line, const Char_t *text, ...)
{
    // This function put out an error message including some variable arguments.
    // The text parameter takes the standart parameters as in printf().
    // The output looks like:<br>
    // debug<         Hades>:No input specified<p>
    // param level Level of message logging
    // param det One of the DET_* constants that defines the detector printing this message.
    // param file Filename that prints the message.
    // param line Linenumber from where the message is printed.
    // param text Text to print.
    // param ... Variable number of arguments, that will be used to fill the text
    va_list ap;

    if(level <= 0)
	level = 1;
    if((level <= debugLevel)  && (detectorMsg & det))
    {
	msg1 = (Char_t *)calloc(1,2048);
	msg2 = (Char_t *)calloc(1,2048);
	sprintf(msg1,"%7s%s%s %s%s%d%s","debug","<",className,file,":",line,">: ");
	va_start(ap,text);
	vsprintf(msg2,text,ap);
	va_end(ap);
	strcat(msg1,msg2);
	write(msg1);
	free(msg1);
	free(msg2);
    }
}


void HMessageMgr::write(const Char_t *text)
{
    // Internal function used to write to the correct output.
    // Used for info, warning and debug messages.
    // Adds the name of the host the code is running on, if output is send via
    // socket to a remote logging process.
    // If screen is set to kTRUE the output is writen to stdout in addition to
    // the logfile.
    // param text Text to be writen to specified target.
    Char_t *msg;

    if(msgFile)
    {
	msgFile->write(text,strlen(text));
	if(screen)
	    cout << text << endl;
    }
    else
    {
	if(msgSocket)
	{
	    msg =(Char_t *)calloc(1,strlen(text) + 20);
	    sprintf(msg,"<%10s>%s",thisHost->Data(),text);
	    msgSocket->Send(msg);
	    free(msg);
	}
	else
	{
	    cout << text << endl;
	}
    }
}

void HMessageMgr::ewrite(const Char_t *text)
{
    // Internal function used to write to the correct output.
    // Used for error messages.
    // Adds the name of the host the code is running on, if output is send via
    // socket to a remote logging process.
    // If screen is set to kTRUE the output is writen to stdout in addition to
    // the logfile.
    // param text Text to be writen to specified target.
    Char_t *msg;

    if(errorFile)
    {
	errorFile->write(text,strlen(text));
	if(screen)
	    cout << text << endl;
    }
    else
    {
	if(errorSocket)
	{
	    msg =(Char_t *)calloc(1,strlen(text) + 20);
	    sprintf(msg,"<%10s>%s",thisHost->Data(),text);
	    errorSocket->Send(msg);
	    free(msg);
	}
	else
	{
	    cerr << text << endl;
	}
    }
}

void HMessageMgr::setF(const Char_t *name)
{
    // Sets the filename for the debug messages.
    // The filenames are printed when the debug level is set.
    // param name Name of the file that wants to print a message soon.
    if(name && (strlen(name) != 0))
	strncpy(file, name,1999);
    else strcpy(file, "");
}

void HMessageMgr::setL(Int_t num)
{
    // Sets the linenumber for the debug message.
    // The linenumber is printed when the debug level is set.
    // param num Linenumber of message.
    line = num;
}

ClassImp(HMessageMgr)
 hmessagemgr.cc:1
 hmessagemgr.cc:2
 hmessagemgr.cc:3
 hmessagemgr.cc:4
 hmessagemgr.cc:5
 hmessagemgr.cc:6
 hmessagemgr.cc:7
 hmessagemgr.cc:8
 hmessagemgr.cc:9
 hmessagemgr.cc:10
 hmessagemgr.cc:11
 hmessagemgr.cc:12
 hmessagemgr.cc:13
 hmessagemgr.cc:14
 hmessagemgr.cc:15
 hmessagemgr.cc:16
 hmessagemgr.cc:17
 hmessagemgr.cc:18
 hmessagemgr.cc:19
 hmessagemgr.cc:20
 hmessagemgr.cc:21
 hmessagemgr.cc:22
 hmessagemgr.cc:23
 hmessagemgr.cc:24
 hmessagemgr.cc:25
 hmessagemgr.cc:26
 hmessagemgr.cc:27
 hmessagemgr.cc:28
 hmessagemgr.cc:29
 hmessagemgr.cc:30
 hmessagemgr.cc:31
 hmessagemgr.cc:32
 hmessagemgr.cc:33
 hmessagemgr.cc:34
 hmessagemgr.cc:35
 hmessagemgr.cc:36
 hmessagemgr.cc:37
 hmessagemgr.cc:38
 hmessagemgr.cc:39
 hmessagemgr.cc:40
 hmessagemgr.cc:41
 hmessagemgr.cc:42
 hmessagemgr.cc:43
 hmessagemgr.cc:44
 hmessagemgr.cc:45
 hmessagemgr.cc:46
 hmessagemgr.cc:47
 hmessagemgr.cc:48
 hmessagemgr.cc:49
 hmessagemgr.cc:50
 hmessagemgr.cc:51
 hmessagemgr.cc:52
 hmessagemgr.cc:53
 hmessagemgr.cc:54
 hmessagemgr.cc:55
 hmessagemgr.cc:56
 hmessagemgr.cc:57
 hmessagemgr.cc:58
 hmessagemgr.cc:59
 hmessagemgr.cc:60
 hmessagemgr.cc:61
 hmessagemgr.cc:62
 hmessagemgr.cc:63
 hmessagemgr.cc:64
 hmessagemgr.cc:65
 hmessagemgr.cc:66
 hmessagemgr.cc:67
 hmessagemgr.cc:68
 hmessagemgr.cc:69
 hmessagemgr.cc:70
 hmessagemgr.cc:71
 hmessagemgr.cc:72
 hmessagemgr.cc:73
 hmessagemgr.cc:74
 hmessagemgr.cc:75
 hmessagemgr.cc:76
 hmessagemgr.cc:77
 hmessagemgr.cc:78
 hmessagemgr.cc:79
 hmessagemgr.cc:80
 hmessagemgr.cc:81
 hmessagemgr.cc:82
 hmessagemgr.cc:83
 hmessagemgr.cc:84
 hmessagemgr.cc:85
 hmessagemgr.cc:86
 hmessagemgr.cc:87
 hmessagemgr.cc:88
 hmessagemgr.cc:89
 hmessagemgr.cc:90
 hmessagemgr.cc:91
 hmessagemgr.cc:92
 hmessagemgr.cc:93
 hmessagemgr.cc:94
 hmessagemgr.cc:95
 hmessagemgr.cc:96
 hmessagemgr.cc:97
 hmessagemgr.cc:98
 hmessagemgr.cc:99
 hmessagemgr.cc:100
 hmessagemgr.cc:101
 hmessagemgr.cc:102
 hmessagemgr.cc:103
 hmessagemgr.cc:104
 hmessagemgr.cc:105
 hmessagemgr.cc:106
 hmessagemgr.cc:107
 hmessagemgr.cc:108
 hmessagemgr.cc:109
 hmessagemgr.cc:110
 hmessagemgr.cc:111
 hmessagemgr.cc:112
 hmessagemgr.cc:113
 hmessagemgr.cc:114
 hmessagemgr.cc:115
 hmessagemgr.cc:116
 hmessagemgr.cc:117
 hmessagemgr.cc:118
 hmessagemgr.cc:119
 hmessagemgr.cc:120
 hmessagemgr.cc:121
 hmessagemgr.cc:122
 hmessagemgr.cc:123
 hmessagemgr.cc:124
 hmessagemgr.cc:125
 hmessagemgr.cc:126
 hmessagemgr.cc:127
 hmessagemgr.cc:128
 hmessagemgr.cc:129
 hmessagemgr.cc:130
 hmessagemgr.cc:131
 hmessagemgr.cc:132
 hmessagemgr.cc:133
 hmessagemgr.cc:134
 hmessagemgr.cc:135
 hmessagemgr.cc:136
 hmessagemgr.cc:137
 hmessagemgr.cc:138
 hmessagemgr.cc:139
 hmessagemgr.cc:140
 hmessagemgr.cc:141
 hmessagemgr.cc:142
 hmessagemgr.cc:143
 hmessagemgr.cc:144
 hmessagemgr.cc:145
 hmessagemgr.cc:146
 hmessagemgr.cc:147
 hmessagemgr.cc:148
 hmessagemgr.cc:149
 hmessagemgr.cc:150
 hmessagemgr.cc:151
 hmessagemgr.cc:152
 hmessagemgr.cc:153
 hmessagemgr.cc:154
 hmessagemgr.cc:155
 hmessagemgr.cc:156
 hmessagemgr.cc:157
 hmessagemgr.cc:158
 hmessagemgr.cc:159
 hmessagemgr.cc:160
 hmessagemgr.cc:161
 hmessagemgr.cc:162
 hmessagemgr.cc:163
 hmessagemgr.cc:164
 hmessagemgr.cc:165
 hmessagemgr.cc:166
 hmessagemgr.cc:167
 hmessagemgr.cc:168
 hmessagemgr.cc:169
 hmessagemgr.cc:170
 hmessagemgr.cc:171
 hmessagemgr.cc:172
 hmessagemgr.cc:173
 hmessagemgr.cc:174
 hmessagemgr.cc:175
 hmessagemgr.cc:176
 hmessagemgr.cc:177
 hmessagemgr.cc:178
 hmessagemgr.cc:179
 hmessagemgr.cc:180
 hmessagemgr.cc:181
 hmessagemgr.cc:182
 hmessagemgr.cc:183
 hmessagemgr.cc:184
 hmessagemgr.cc:185
 hmessagemgr.cc:186
 hmessagemgr.cc:187
 hmessagemgr.cc:188
 hmessagemgr.cc:189
 hmessagemgr.cc:190
 hmessagemgr.cc:191
 hmessagemgr.cc:192
 hmessagemgr.cc:193
 hmessagemgr.cc:194
 hmessagemgr.cc:195
 hmessagemgr.cc:196
 hmessagemgr.cc:197
 hmessagemgr.cc:198
 hmessagemgr.cc:199
 hmessagemgr.cc:200
 hmessagemgr.cc:201
 hmessagemgr.cc:202
 hmessagemgr.cc:203
 hmessagemgr.cc:204
 hmessagemgr.cc:205
 hmessagemgr.cc:206
 hmessagemgr.cc:207
 hmessagemgr.cc:208
 hmessagemgr.cc:209
 hmessagemgr.cc:210
 hmessagemgr.cc:211
 hmessagemgr.cc:212
 hmessagemgr.cc:213
 hmessagemgr.cc:214
 hmessagemgr.cc:215
 hmessagemgr.cc:216
 hmessagemgr.cc:217
 hmessagemgr.cc:218
 hmessagemgr.cc:219
 hmessagemgr.cc:220
 hmessagemgr.cc:221
 hmessagemgr.cc:222
 hmessagemgr.cc:223
 hmessagemgr.cc:224
 hmessagemgr.cc:225
 hmessagemgr.cc:226
 hmessagemgr.cc:227
 hmessagemgr.cc:228
 hmessagemgr.cc:229
 hmessagemgr.cc:230
 hmessagemgr.cc:231
 hmessagemgr.cc:232
 hmessagemgr.cc:233
 hmessagemgr.cc:234
 hmessagemgr.cc:235
 hmessagemgr.cc:236
 hmessagemgr.cc:237
 hmessagemgr.cc:238
 hmessagemgr.cc:239
 hmessagemgr.cc:240
 hmessagemgr.cc:241
 hmessagemgr.cc:242
 hmessagemgr.cc:243
 hmessagemgr.cc:244
 hmessagemgr.cc:245
 hmessagemgr.cc:246
 hmessagemgr.cc:247
 hmessagemgr.cc:248
 hmessagemgr.cc:249
 hmessagemgr.cc:250
 hmessagemgr.cc:251
 hmessagemgr.cc:252
 hmessagemgr.cc:253
 hmessagemgr.cc:254
 hmessagemgr.cc:255
 hmessagemgr.cc:256
 hmessagemgr.cc:257
 hmessagemgr.cc:258
 hmessagemgr.cc:259
 hmessagemgr.cc:260
 hmessagemgr.cc:261
 hmessagemgr.cc:262
 hmessagemgr.cc:263
 hmessagemgr.cc:264
 hmessagemgr.cc:265
 hmessagemgr.cc:266
 hmessagemgr.cc:267
 hmessagemgr.cc:268
 hmessagemgr.cc:269
 hmessagemgr.cc:270
 hmessagemgr.cc:271
 hmessagemgr.cc:272
 hmessagemgr.cc:273
 hmessagemgr.cc:274
 hmessagemgr.cc:275
 hmessagemgr.cc:276
 hmessagemgr.cc:277
 hmessagemgr.cc:278
 hmessagemgr.cc:279
 hmessagemgr.cc:280
 hmessagemgr.cc:281
 hmessagemgr.cc:282
 hmessagemgr.cc:283
 hmessagemgr.cc:284
 hmessagemgr.cc:285
 hmessagemgr.cc:286
 hmessagemgr.cc:287
 hmessagemgr.cc:288
 hmessagemgr.cc:289
 hmessagemgr.cc:290
 hmessagemgr.cc:291
 hmessagemgr.cc:292
 hmessagemgr.cc:293
 hmessagemgr.cc:294
 hmessagemgr.cc:295
 hmessagemgr.cc:296
 hmessagemgr.cc:297
 hmessagemgr.cc:298
 hmessagemgr.cc:299
 hmessagemgr.cc:300
 hmessagemgr.cc:301
 hmessagemgr.cc:302
 hmessagemgr.cc:303
 hmessagemgr.cc:304
 hmessagemgr.cc:305
 hmessagemgr.cc:306
 hmessagemgr.cc:307
 hmessagemgr.cc:308
 hmessagemgr.cc:309
 hmessagemgr.cc:310
 hmessagemgr.cc:311
 hmessagemgr.cc:312
 hmessagemgr.cc:313
 hmessagemgr.cc:314
 hmessagemgr.cc:315
 hmessagemgr.cc:316
 hmessagemgr.cc:317
 hmessagemgr.cc:318
 hmessagemgr.cc:319
 hmessagemgr.cc:320
 hmessagemgr.cc:321
 hmessagemgr.cc:322
 hmessagemgr.cc:323
 hmessagemgr.cc:324
 hmessagemgr.cc:325
 hmessagemgr.cc:326
 hmessagemgr.cc:327
 hmessagemgr.cc:328
 hmessagemgr.cc:329
 hmessagemgr.cc:330
 hmessagemgr.cc:331
 hmessagemgr.cc:332
 hmessagemgr.cc:333
 hmessagemgr.cc:334
 hmessagemgr.cc:335
 hmessagemgr.cc:336
 hmessagemgr.cc:337
 hmessagemgr.cc:338
 hmessagemgr.cc:339
 hmessagemgr.cc:340
 hmessagemgr.cc:341
 hmessagemgr.cc:342
 hmessagemgr.cc:343
 hmessagemgr.cc:344
 hmessagemgr.cc:345
 hmessagemgr.cc:346
 hmessagemgr.cc:347
 hmessagemgr.cc:348
 hmessagemgr.cc:349
 hmessagemgr.cc:350
 hmessagemgr.cc:351
 hmessagemgr.cc:352
 hmessagemgr.cc:353
 hmessagemgr.cc:354
 hmessagemgr.cc:355
 hmessagemgr.cc:356
 hmessagemgr.cc:357
 hmessagemgr.cc:358
 hmessagemgr.cc:359
 hmessagemgr.cc:360
 hmessagemgr.cc:361
 hmessagemgr.cc:362
 hmessagemgr.cc:363
 hmessagemgr.cc:364
 hmessagemgr.cc:365
 hmessagemgr.cc:366
 hmessagemgr.cc:367
 hmessagemgr.cc:368
 hmessagemgr.cc:369
 hmessagemgr.cc:370
 hmessagemgr.cc:371
 hmessagemgr.cc:372
 hmessagemgr.cc:373
 hmessagemgr.cc:374
 hmessagemgr.cc:375
 hmessagemgr.cc:376
 hmessagemgr.cc:377
 hmessagemgr.cc:378
 hmessagemgr.cc:379
 hmessagemgr.cc:380
 hmessagemgr.cc:381
 hmessagemgr.cc:382
 hmessagemgr.cc:383
 hmessagemgr.cc:384
 hmessagemgr.cc:385
 hmessagemgr.cc:386
 hmessagemgr.cc:387
 hmessagemgr.cc:388
 hmessagemgr.cc:389
 hmessagemgr.cc:390
 hmessagemgr.cc:391
 hmessagemgr.cc:392
 hmessagemgr.cc:393
 hmessagemgr.cc:394
 hmessagemgr.cc:395
 hmessagemgr.cc:396
 hmessagemgr.cc:397
 hmessagemgr.cc:398
 hmessagemgr.cc:399
 hmessagemgr.cc:400
 hmessagemgr.cc:401
 hmessagemgr.cc:402
 hmessagemgr.cc:403
 hmessagemgr.cc:404
 hmessagemgr.cc:405
 hmessagemgr.cc:406
 hmessagemgr.cc:407
 hmessagemgr.cc:408
 hmessagemgr.cc:409
 hmessagemgr.cc:410
 hmessagemgr.cc:411
 hmessagemgr.cc:412
 hmessagemgr.cc:413
 hmessagemgr.cc:414
 hmessagemgr.cc:415
 hmessagemgr.cc:416
 hmessagemgr.cc:417
 hmessagemgr.cc:418
 hmessagemgr.cc:419
 hmessagemgr.cc:420
 hmessagemgr.cc:421
 hmessagemgr.cc:422
 hmessagemgr.cc:423
 hmessagemgr.cc:424
 hmessagemgr.cc:425
 hmessagemgr.cc:426
 hmessagemgr.cc:427
 hmessagemgr.cc:428
 hmessagemgr.cc:429
 hmessagemgr.cc:430
 hmessagemgr.cc:431
 hmessagemgr.cc:432
 hmessagemgr.cc:433
 hmessagemgr.cc:434
 hmessagemgr.cc:435
 hmessagemgr.cc:436
 hmessagemgr.cc:437
 hmessagemgr.cc:438
 hmessagemgr.cc:439
 hmessagemgr.cc:440
 hmessagemgr.cc:441
 hmessagemgr.cc:442
 hmessagemgr.cc:443
 hmessagemgr.cc:444
 hmessagemgr.cc:445
 hmessagemgr.cc:446
 hmessagemgr.cc:447
 hmessagemgr.cc:448
 hmessagemgr.cc:449
 hmessagemgr.cc:450
 hmessagemgr.cc:451
 hmessagemgr.cc:452
 hmessagemgr.cc:453
 hmessagemgr.cc:454
 hmessagemgr.cc:455
 hmessagemgr.cc:456
 hmessagemgr.cc:457
 hmessagemgr.cc:458
 hmessagemgr.cc:459
 hmessagemgr.cc:460
 hmessagemgr.cc:461
 hmessagemgr.cc:462
 hmessagemgr.cc:463
 hmessagemgr.cc:464
 hmessagemgr.cc:465
 hmessagemgr.cc:466
 hmessagemgr.cc:467
 hmessagemgr.cc:468
 hmessagemgr.cc:469
 hmessagemgr.cc:470
 hmessagemgr.cc:471
 hmessagemgr.cc:472
 hmessagemgr.cc:473
 hmessagemgr.cc:474
 hmessagemgr.cc:475
 hmessagemgr.cc:476
 hmessagemgr.cc:477
 hmessagemgr.cc:478
 hmessagemgr.cc:479
 hmessagemgr.cc:480
 hmessagemgr.cc:481
 hmessagemgr.cc:482
 hmessagemgr.cc:483
 hmessagemgr.cc:484
 hmessagemgr.cc:485
 hmessagemgr.cc:486
 hmessagemgr.cc:487
 hmessagemgr.cc:488
 hmessagemgr.cc:489
 hmessagemgr.cc:490
 hmessagemgr.cc:491
 hmessagemgr.cc:492
 hmessagemgr.cc:493
 hmessagemgr.cc:494
 hmessagemgr.cc:495
 hmessagemgr.cc:496
 hmessagemgr.cc:497
 hmessagemgr.cc:498
 hmessagemgr.cc:499
 hmessagemgr.cc:500
 hmessagemgr.cc:501
 hmessagemgr.cc:502
 hmessagemgr.cc:503
 hmessagemgr.cc:504
 hmessagemgr.cc:505
 hmessagemgr.cc:506
 hmessagemgr.cc:507
 hmessagemgr.cc:508
 hmessagemgr.cc:509
 hmessagemgr.cc:510
 hmessagemgr.cc:511
 hmessagemgr.cc:512
 hmessagemgr.cc:513
 hmessagemgr.cc:514
 hmessagemgr.cc:515
 hmessagemgr.cc:516
 hmessagemgr.cc:517
 hmessagemgr.cc:518
 hmessagemgr.cc:519
 hmessagemgr.cc:520
 hmessagemgr.cc:521
 hmessagemgr.cc:522
 hmessagemgr.cc:523
 hmessagemgr.cc:524
 hmessagemgr.cc:525
 hmessagemgr.cc:526
 hmessagemgr.cc:527
 hmessagemgr.cc:528
 hmessagemgr.cc:529
 hmessagemgr.cc:530
 hmessagemgr.cc:531
 hmessagemgr.cc:532
 hmessagemgr.cc:533
 hmessagemgr.cc:534
 hmessagemgr.cc:535
 hmessagemgr.cc:536
 hmessagemgr.cc:537
 hmessagemgr.cc:538
 hmessagemgr.cc:539
 hmessagemgr.cc:540
 hmessagemgr.cc:541
 hmessagemgr.cc:542
 hmessagemgr.cc:543
 hmessagemgr.cc:544
 hmessagemgr.cc:545
 hmessagemgr.cc:546
 hmessagemgr.cc:547
 hmessagemgr.cc:548
 hmessagemgr.cc:549
 hmessagemgr.cc:550
 hmessagemgr.cc:551
 hmessagemgr.cc:552
 hmessagemgr.cc:553
 hmessagemgr.cc:554
 hmessagemgr.cc:555
 hmessagemgr.cc:556
 hmessagemgr.cc:557
 hmessagemgr.cc:558
 hmessagemgr.cc:559
 hmessagemgr.cc:560
 hmessagemgr.cc:561
 hmessagemgr.cc:562
 hmessagemgr.cc:563
 hmessagemgr.cc:564
 hmessagemgr.cc:565
 hmessagemgr.cc:566
 hmessagemgr.cc:567
 hmessagemgr.cc:568
 hmessagemgr.cc:569
 hmessagemgr.cc:570
 hmessagemgr.cc:571
 hmessagemgr.cc:572
 hmessagemgr.cc:573
 hmessagemgr.cc:574
 hmessagemgr.cc:575
 hmessagemgr.cc:576
 hmessagemgr.cc:577
 hmessagemgr.cc:578
 hmessagemgr.cc:579
 hmessagemgr.cc:580
 hmessagemgr.cc:581
 hmessagemgr.cc:582
 hmessagemgr.cc:583
 hmessagemgr.cc:584
 hmessagemgr.cc:585
 hmessagemgr.cc:586
 hmessagemgr.cc:587
 hmessagemgr.cc:588
 hmessagemgr.cc:589
 hmessagemgr.cc:590
 hmessagemgr.cc:591
 hmessagemgr.cc:592
 hmessagemgr.cc:593
 hmessagemgr.cc:594
 hmessagemgr.cc:595
 hmessagemgr.cc:596
 hmessagemgr.cc:597
 hmessagemgr.cc:598
 hmessagemgr.cc:599
 hmessagemgr.cc:600
 hmessagemgr.cc:601
 hmessagemgr.cc:602
 hmessagemgr.cc:603
 hmessagemgr.cc:604
 hmessagemgr.cc:605
 hmessagemgr.cc:606
 hmessagemgr.cc:607
 hmessagemgr.cc:608
 hmessagemgr.cc:609
 hmessagemgr.cc:610
 hmessagemgr.cc:611
 hmessagemgr.cc:612
 hmessagemgr.cc:613
 hmessagemgr.cc:614
 hmessagemgr.cc:615
 hmessagemgr.cc:616
 hmessagemgr.cc:617
 hmessagemgr.cc:618
 hmessagemgr.cc:619
 hmessagemgr.cc:620
 hmessagemgr.cc:621
 hmessagemgr.cc:622
 hmessagemgr.cc:623
 hmessagemgr.cc:624
 hmessagemgr.cc:625
 hmessagemgr.cc:626
 hmessagemgr.cc:627
 hmessagemgr.cc:628
 hmessagemgr.cc:629
 hmessagemgr.cc:630
 hmessagemgr.cc:631
 hmessagemgr.cc:632
 hmessagemgr.cc:633
 hmessagemgr.cc:634
 hmessagemgr.cc:635
 hmessagemgr.cc:636
 hmessagemgr.cc:637
 hmessagemgr.cc:638
 hmessagemgr.cc:639
 hmessagemgr.cc:640
 hmessagemgr.cc:641
 hmessagemgr.cc:642
 hmessagemgr.cc:643
 hmessagemgr.cc:644
 hmessagemgr.cc:645
 hmessagemgr.cc:646
 hmessagemgr.cc:647
 hmessagemgr.cc:648
 hmessagemgr.cc:649
 hmessagemgr.cc:650
 hmessagemgr.cc:651
 hmessagemgr.cc:652
 hmessagemgr.cc:653
 hmessagemgr.cc:654
 hmessagemgr.cc:655
 hmessagemgr.cc:656
 hmessagemgr.cc:657
 hmessagemgr.cc:658
 hmessagemgr.cc:659
 hmessagemgr.cc:660
 hmessagemgr.cc:661
 hmessagemgr.cc:662
 hmessagemgr.cc:663
 hmessagemgr.cc:664
 hmessagemgr.cc:665
 hmessagemgr.cc:666
 hmessagemgr.cc:667
 hmessagemgr.cc:668
 hmessagemgr.cc:669
 hmessagemgr.cc:670
 hmessagemgr.cc:671
 hmessagemgr.cc:672
 hmessagemgr.cc:673
 hmessagemgr.cc:674
 hmessagemgr.cc:675
 hmessagemgr.cc:676
 hmessagemgr.cc:677
 hmessagemgr.cc:678
 hmessagemgr.cc:679
 hmessagemgr.cc:680
 hmessagemgr.cc:681
 hmessagemgr.cc:682
 hmessagemgr.cc:683
 hmessagemgr.cc:684
 hmessagemgr.cc:685
 hmessagemgr.cc:686
 hmessagemgr.cc:687
 hmessagemgr.cc:688
 hmessagemgr.cc:689
 hmessagemgr.cc:690
 hmessagemgr.cc:691
 hmessagemgr.cc:692
 hmessagemgr.cc:693
 hmessagemgr.cc:694
 hmessagemgr.cc:695
 hmessagemgr.cc:696
 hmessagemgr.cc:697
 hmessagemgr.cc:698
 hmessagemgr.cc:699
 hmessagemgr.cc:700
 hmessagemgr.cc:701
 hmessagemgr.cc:702
 hmessagemgr.cc:703
 hmessagemgr.cc:704
 hmessagemgr.cc:705
 hmessagemgr.cc:706
 hmessagemgr.cc:707
 hmessagemgr.cc:708
 hmessagemgr.cc:709
 hmessagemgr.cc:710
 hmessagemgr.cc:711
 hmessagemgr.cc:712
 hmessagemgr.cc:713
 hmessagemgr.cc:714
 hmessagemgr.cc:715
 hmessagemgr.cc:716
 hmessagemgr.cc:717
 hmessagemgr.cc:718
 hmessagemgr.cc:719
 hmessagemgr.cc:720
 hmessagemgr.cc:721
 hmessagemgr.cc:722
 hmessagemgr.cc:723
 hmessagemgr.cc:724
 hmessagemgr.cc:725
 hmessagemgr.cc:726
 hmessagemgr.cc:727
 hmessagemgr.cc:728
 hmessagemgr.cc:729
 hmessagemgr.cc:730
 hmessagemgr.cc:731
 hmessagemgr.cc:732
 hmessagemgr.cc:733
 hmessagemgr.cc:734
 hmessagemgr.cc:735
 hmessagemgr.cc:736
 hmessagemgr.cc:737
 hmessagemgr.cc:738
 hmessagemgr.cc:739
 hmessagemgr.cc:740
 hmessagemgr.cc:741
 hmessagemgr.cc:742
 hmessagemgr.cc:743
 hmessagemgr.cc:744
 hmessagemgr.cc:745
 hmessagemgr.cc:746
 hmessagemgr.cc:747
 hmessagemgr.cc:748
 hmessagemgr.cc:749
 hmessagemgr.cc:750
 hmessagemgr.cc:751
 hmessagemgr.cc:752
 hmessagemgr.cc:753
 hmessagemgr.cc:754
 hmessagemgr.cc:755
 hmessagemgr.cc:756
 hmessagemgr.cc:757
 hmessagemgr.cc:758
 hmessagemgr.cc:759
 hmessagemgr.cc:760
 hmessagemgr.cc:761
 hmessagemgr.cc:762
 hmessagemgr.cc:763
 hmessagemgr.cc:764
 hmessagemgr.cc:765
 hmessagemgr.cc:766
 hmessagemgr.cc:767
 hmessagemgr.cc:768
 hmessagemgr.cc:769
 hmessagemgr.cc:770
 hmessagemgr.cc:771
 hmessagemgr.cc:772
 hmessagemgr.cc:773
 hmessagemgr.cc:774
 hmessagemgr.cc:775
 hmessagemgr.cc:776
 hmessagemgr.cc:777
 hmessagemgr.cc:778
 hmessagemgr.cc:779
 hmessagemgr.cc:780
 hmessagemgr.cc:781
 hmessagemgr.cc:782
 hmessagemgr.cc:783
 hmessagemgr.cc:784
 hmessagemgr.cc:785
 hmessagemgr.cc:786
 hmessagemgr.cc:787
 hmessagemgr.cc:788
 hmessagemgr.cc:789
 hmessagemgr.cc:790
 hmessagemgr.cc:791
 hmessagemgr.cc:792
 hmessagemgr.cc:793
 hmessagemgr.cc:794
 hmessagemgr.cc:795
 hmessagemgr.cc:796
 hmessagemgr.cc:797
 hmessagemgr.cc:798
 hmessagemgr.cc:799
 hmessagemgr.cc:800
 hmessagemgr.cc:801
 hmessagemgr.cc:802
 hmessagemgr.cc:803
 hmessagemgr.cc:804
 hmessagemgr.cc:805
 hmessagemgr.cc:806
 hmessagemgr.cc:807
 hmessagemgr.cc:808
 hmessagemgr.cc:809
 hmessagemgr.cc:810
 hmessagemgr.cc:811
 hmessagemgr.cc:812
 hmessagemgr.cc:813
 hmessagemgr.cc:814
 hmessagemgr.cc:815
 hmessagemgr.cc:816
 hmessagemgr.cc:817
 hmessagemgr.cc:818
 hmessagemgr.cc:819
 hmessagemgr.cc:820
 hmessagemgr.cc:821
 hmessagemgr.cc:822
 hmessagemgr.cc:823
 hmessagemgr.cc:824
 hmessagemgr.cc:825
 hmessagemgr.cc:826
 hmessagemgr.cc:827
 hmessagemgr.cc:828
 hmessagemgr.cc:829
 hmessagemgr.cc:830
 hmessagemgr.cc:831
 hmessagemgr.cc:832
 hmessagemgr.cc:833
 hmessagemgr.cc:834
 hmessagemgr.cc:835
 hmessagemgr.cc:836
 hmessagemgr.cc:837
 hmessagemgr.cc:838
 hmessagemgr.cc:839
 hmessagemgr.cc:840
 hmessagemgr.cc:841
 hmessagemgr.cc:842
 hmessagemgr.cc:843
 hmessagemgr.cc:844
 hmessagemgr.cc:845
 hmessagemgr.cc:846
 hmessagemgr.cc:847
 hmessagemgr.cc:848
 hmessagemgr.cc:849
 hmessagemgr.cc:850
 hmessagemgr.cc:851
 hmessagemgr.cc:852
 hmessagemgr.cc:853
 hmessagemgr.cc:854
 hmessagemgr.cc:855
 hmessagemgr.cc:856
 hmessagemgr.cc:857
 hmessagemgr.cc:858
 hmessagemgr.cc:859
 hmessagemgr.cc:860
 hmessagemgr.cc:861
 hmessagemgr.cc:862
 hmessagemgr.cc:863
 hmessagemgr.cc:864