ROOT logo
using namespace std;
#include "honlinemonhist.h"
#include "honlinehistarray.h"
#include "honlinetrendhist.h"
#include <iostream> 
#include <iomanip>
#include "TObjString.h"
#include "TList.h"

ClassImp(HOnlineMonHistAddon)
ClassImp(HOnlineMonHist)
ClassImp(HOnlineMonHist2)

HOnlineMonHistAddon::HOnlineMonHistAddon (const Char_t* name,
			      const Char_t* title,
			      Int_t active,Int_t resetable,
			      Int_t nbinsX,Float_t xlo,Float_t xup,
			      Int_t nbinsY,Float_t ylo,Float_t yup)
    : TNamed(name,title)
{
    arraySize1=0;
    arraySize2=0;
    directory="no";
    XTitle="no";
    YTitle="no";
    ZTitle="no";
    Option="no";
    HistType="";
    format="";
    
    nBinsX      =nbinsX;
    Xlo         =xlo;
    Xup         =xup;
    nBinsY      =nbinsY;
    Ylo         =ylo;
    Yup         =yup;
    fIsActive   =active;
    fisResetable=resetable;
    refreshrate =500;
    send        =1;
    stat        =0;
    max         =-99;
    min         =-99;
    linecol     =0;
    linestyle   =0;
    fillcol     =0;
    fillstyle   =0;
    markercol   =0;
    markerstyle =0;
    markersize  =0;

    logX        =0;
    logY        =0;
    logZ        =0;
    gridX       =0;
    gridY       =0;
    drawSame    = kFALSE;

    legend = 0;
    legxmin =-1;
    legymin =-1;
    legxmax =-1;
    legymax =-1;
    legform ="no";

}
HOnlineMonHistAddon::HOnlineMonHistAddon (Text_t* txt)
{
    arraySize1=0;
    arraySize2=0;
    directory="no";
    XTitle="no";
    YTitle="no";
    ZTitle="no";
    Option="no";
    HistType="";
    format="";
    
    nBinsX      =0;
    Xlo         =0;
    Xup         =0;
    nBinsY      =0;
    Ylo         =0;
    Yup         =0;
    fIsActive   =1;
    fisResetable=1;
    refreshrate =500;
    send        =1;
    stat        =0;
    max         =-99;
    min         =-99;
    linecol     =0;
    linestyle   =0;
    fillcol     =0;
    fillstyle   =0;
    markercol   =0;
    markerstyle =0;
    markersize  =0;

    logX        =0;
    logY        =0;
    logZ        =0;
    gridX       =0;
    gridY       =0;
    drawSame    = kFALSE;

    legend = 0;
    legxmin =-1;
    legymin =-1;
    legxmax =-1;
    legymax =-1;
    legform ="no";
    read(txt);
    send=1;
}
void HOnlineMonHistAddon::copySet(HOnlineMonHistAddon& add)
{
    SetName(add.GetName());
    SetTitle(add.GetTitle());

    arraySize1  =add.getSize1();
    arraySize2  =add.getSize2();
    directory   =add.getDirectory();
    XTitle      =add.getXTitle();
    YTitle      =add.getYTitle();
    ZTitle      =add.getZTitle();
    Option      =add.getOption();
    HistType    =add.getHistType();

    nBinsX      =add.getNBinsX();
    Xlo         =add.getXLo();
    Xup         =add.getXUp();
    nBinsY      =add.getNBinsY();
    Ylo         =add.getYLo();
    Yup         =add.getYUp();
    fIsActive   =add.getActive();
    fisResetable=add.getResetable();
    refreshrate =add.getRefreshRate();
    send        =add.getSend();
    stat        =add.getStat();
    max         =add.getMax();
    min         =add.getMin();

    linecol     =add.getLineCol();
    linestyle   =add.getLineStyle();
    fillcol     =add.getFillCol();
    fillstyle   =add.getFillStyle();
    markercol   =add.getMarkerCol();
    markerstyle =add.getMarkerStyle();
    markersize  =add.getMarkerSize();

    logX        =add.getLogX();
    logY        =add.getLogY();
    logZ        =add.getLogZ();
    gridX       =add.getGridX();
    gridY       =add.getGridY();
    drawSame    =add.getDrawSame();

    add.getLegDim(legxmin,legymin,legxmax,legymax,legform);

}
void HOnlineMonHistAddon::getSet(HOnlineMonHistAddon& add)
{
    add.setSize1(arraySize1);
    add.setSize2(arraySize2);
    add.setDirectory(directory);
    add.setXTitle(XTitle);
    add.setYTitle(YTitle);
    add.setZTitle(ZTitle);
    add.setOption(Option);
    add.setHistType(HistType);

    add.setNBinsX(nBinsX);
    add.setXLo(Xlo );
    add.setXUp(Xup);
    add.setNBinsY(nBinsY);
    add.setYLo(Ylo);
    add.setYUp(Yup);
    add.setActive(fIsActive);
    add.setResetable(fisResetable);
    add.setRefreshRate(refreshrate);
    add.setSend(send);
    add.setStat(stat);
    add.setMax(max);
    add.setMin(min);

    add.setLineCol(linecol);
    add.setLineStyle(linestyle);
    add.setFillCol(fillcol);
    add.setFillStyle(fillstyle);
    add.setMarkerCol(markercol);
    add.setMarkerStyle(markerstyle);
    add.setMarkerSize(markersize);

    add.setLogX(logX);
    add.setLogY(logY);
    add.setLogZ(logZ);
    add.setGridX(gridX);
    add.setGridY(gridY);
    add.setDrawSame(drawSame);

    add.setLegDim(legxmin,legymin,legxmax,legymax,legform);

}
void HOnlineMonHistAddon::read(const Text_t* txt)
{

    Char_t array [100];
    Char_t array1[100];
    Char_t array2[100];

    TString s1=txt;
    Ssiz_t len=s1.Length();
    if(len!=0)
    {
	TObjArray* myarguments = s1.Tokenize(" ");
	TObjString *stemp;
	TString argument;

	TIterator* myiter=myarguments->MakeIterator();

	// iterate over the lis of arguments and compare the
	// to known key words.
	while ((stemp=(TObjString*)myiter->Next())!= 0)
	{
	    argument=stemp->GetString();
	    if(argument.Contains("FORMAT#")==1)
	    {
		argument.ReplaceAll("FORMAT#","");
		format=argument;
	    }
	    else if(argument.Contains("TYPE#")==1)
	    {
		argument.ReplaceAll("TYPE#","");
		HistType=argument;
	    }
	    else if(argument.Contains("NAME#")==1)
	    {
		argument.ReplaceAll("NAME#","");
		this->SetName(argument);
	    }
	    else if(argument.Contains("TITLE#")==1)
	    {
		argument.ReplaceAll("TITLE#","");
		this->SetTitle(argument);
	    }
	    else if(argument.Contains("ACTIVE#")==1)
	    {
		argument.ReplaceAll("ACTIVE#","");
		sscanf(argument.Data(),"%i",&fIsActive);
	    }
	    else if(argument.Contains("RESET#")==1)
	    {
		argument.ReplaceAll("RESET#","");
		sscanf(argument.Data(),"%i",&fisResetable);
	    }
	    else if(argument.Contains("REFRESH#")==1)
	    {
		argument.ReplaceAll("REFRESH#","");
		sscanf(argument.Data(),"%i",&refreshrate);
	    }
	    else if(argument.Contains("BIN#")==1)
	    {
		argument.ReplaceAll("BIN#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%f%f%i%f%f",&nBinsX,&Xlo,&Xup,&nBinsY,&Ylo,&Yup);
	    }
	    else if(argument.Contains("SIZE#")==1)
	    {
		argument.ReplaceAll("SIZE#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i",&arraySize1,&arraySize2);
	    }
	    else if(argument.Contains("AXIS#")==1)
	    {
		argument.ReplaceAll("AXIS#","");
		argument.ReplaceAll(":"," ");

		sscanf(argument.Data(),"%s%s%s",array,array1,array2);
		XTitle=array;
		XTitle.ReplaceAll("_"," ");
		YTitle=array1;
		YTitle.ReplaceAll("_"," ");
		ZTitle=array2;
		ZTitle.ReplaceAll("_"," ");
	    }
	    else if(argument.Contains("DIR#")==1)
	    {
		argument.ReplaceAll("DIR#","");
		directory=argument;
	    }
	    else if(argument.Contains("OPT#")==1)
	    {
		argument.ReplaceAll("OPT#","");
		Option=argument;
	    }
	    else if(argument.Contains("STATS#")==1)
	    {
		argument.ReplaceAll("STATS#","");
		sscanf(argument.Data(),"%i",&stat);
	    }
	    else if(argument.Contains("LOG#")==1)
	    {
		argument.ReplaceAll("LOG#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i%i",&logX,&logY,&logZ);
	    }
	    else if(argument.Contains("GRID#")==1)
	    {
		argument.ReplaceAll("GRID#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i",&gridX,&gridY);
	    }
	    else if(argument.Contains("LINE#")==1)
	    {
		argument.ReplaceAll("LINE#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i",&linecol,&linestyle);
	    }
	    else if(argument.Contains("FILL#")==1)
	    {
		argument.ReplaceAll("FILL#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i",&fillcol,&fillstyle);
	    }
	    else if(argument.Contains("MARKER#")==1)
	    {
		argument.ReplaceAll("MARKER#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i%f",&markercol,&markerstyle,&markersize);
	    }
	    else if(argument.Contains("RANGE#")==1)
	    {
		argument.ReplaceAll("RANGE#","");
		argument.ReplaceAll(":"," ");
		sscanf(argument.Data(),"%i%i",&min,&max);
	    }
	    else if(argument.Contains("LEGEND#")==1)
	    {
		argument.ReplaceAll("LEGEND#","");
		argument.ReplaceAll(":"," ");
                Char_t format[100];
		sscanf(argument.Data(),"%f%f%f%f%s",&legxmin,&legymin,&legxmax,&legymax,format);
                legform = format;
	    }
	    else
	    {
		Error("HOnlineMonHistAddon:read()","unknown argument %s in addon %s!",argument.Data(),GetName());
	    }
	}
	delete myiter;

	myarguments->Delete();
        delete myarguments;
    }
}
void HOnlineMonHistAddon::getText(Text_t* txt)
{
    Char_t temp[20];
    TString s2;
    TString s="FORMAT#";
           s+=format;
	   s+=" TYPE#";
	   s+=HistType;
	   s+=" NAME#";
	   s+=GetName();
	   s+=" TITLE#";
	   s+=GetTitle();
	   s+=" ACTIVE#";
	   s+=fIsActive;
	   s+=" RESET#";
	   s+=fisResetable;
	   s+=" REFRESH#";
	   s+=refreshrate;
	   s+=" BIN#";
	   s+=nBinsX;
	   s+=":";
	   sprintf(temp,"%f",Xlo);
	   s+=temp;
	   s+=":";
	   sprintf(temp,"%f",Xup);
	   s+=temp;
	   s+=":";
	   s+=nBinsY;
	   s+=":";
	   sprintf(temp,"%f",Ylo);
	   s+=temp;
	   s+=":";
	   sprintf(temp,"%f",Yup);
	   s+=temp;
	   s+=" SIZE#";
	   s+=arraySize1;
	   s+=":";
	   s+=arraySize2;
	   s+=" AXIS#";
	   s2=XTitle;
	   s2.ReplaceAll(" ","_");
	   s+=s2;
	   s+=":";
	   s2=YTitle;
	   s2.ReplaceAll(" ","_");
	   s+=s2;
	   s+=":";
	   s2=ZTitle;
	   s2.ReplaceAll(" ","_");
	   s+=s2;
	   s+=" DIR#";
	   s+=directory;
	   s+=" OPT#";
	   s+=Option;
	   s+=" STATS#";
	   s+=stat;
           s+=" LOG#";
	   s+=logX;
	   s+=":";
	   s+=logY;
	   s+=":";
	   s+=logZ;
           s+=" GRID#";
	   s+=gridX;
	   s+=":";
	   s+=gridY;
           s+=" LINE#";
	   s+=linecol;
	   s+=":";
	   s+=linestyle;
           s+=" FILL#";
	   s+=fillcol;
	   s+=":";
	   s+=fillstyle;
           s+=" MARKER#";
	   s+=markercol;
	   s+=":";
	   s+=markerstyle;
	   s+=":";
	   sprintf(temp,"%f",markersize);
           s+=temp;
	   s+=" RANGE#";
	   s+=max;
	   s+=":";
	   s+=min;
	   TString leg = Form("LEGEND#%f:%f:%f:%f:%s",legxmin,legymin,legxmax,legymax,legform.Data());
           s+=leg;


 	   sprintf(txt,"%s",s.Data());
}
void HOnlineMonHistAddon::setHist(TH1* p)
{
	if(XTitle.CompareTo("no")!=0)p->SetXTitle(XTitle);
        if(YTitle.CompareTo("no")!=0)p->SetYTitle(YTitle);
        if(Option.CompareTo("no")!=0)p->SetOption(Option);
        p->SetStats(stat);
	if(linecol!=0)p->SetLineColor(linecol);
        if(linestyle!=0)p->SetLineStyle(linestyle);
        if(fillcol!=0)p->SetFillColor(fillcol);
        if(fillstyle!=0)p->SetFillStyle(fillstyle);
        if(markercol!=0)p->SetMarkerColor(markercol);
        if(markerstyle!=0)p->SetMarkerStyle(markerstyle);
        if(markersize!=0)p->SetMarkerSize(markersize);
        if(max!=-99)p->SetMaximum(max);
        if(min!=-99)p->SetMinimum(min);
};
void HOnlineMonHistAddon::setHist(TH2* p)
{
	if(XTitle.CompareTo("no")!=0)p->SetXTitle(XTitle);
        if(YTitle.CompareTo("no")!=0)p->SetYTitle(YTitle);
        if(ZTitle.CompareTo("no")!=0)p->SetZTitle(ZTitle);
	if(Option.CompareTo("no")!=0)p->SetOption(Option);
        p->SetStats(stat);
        if(max!=-99)p->SetMaximum(max);
        if(min!=-99)p->SetMinimum(min);
};
void HOnlineMonHistAddon::setCanvas(TCanvas* c)
{
    c->SetGrid(gridX,gridY);
    c->SetLogx(logX);
    c->SetLogy(logY);
    c->SetLogz(logZ);
}

HOnlineMonHistAddon* HOnlineMonHistAddon::createHist()
{
    TString format = getFormat();
    TString type   = getHistType();

    HOnlineMonHistAddon* addon = 0 ;
    if     (format == "array") {
	if(type.Contains("1") ) { addon = new HOnlineHistArray (*this); }
	else                    { addon = new HOnlineHistArray2(*this); }
    }
    else if(format == "trend")      { addon = new HOnlineTrendHist (*this); }
    else if(format == "trendarray") { addon = new HOnlineTrendArray(*this); }
    else if(format == "mon")    {
	if(type.Contains("1") ) {  addon = new HOnlineMonHist (*this); }
	else                    {  addon = new HOnlineMonHist2(*this); }
    }
    else   {
	Error("createHist()","Unknown format of histogram: %s for hist %s !",format.Data(),addon->GetName());
    }
    return addon;
}



void HOnlineMonHistAddon::draw(Bool_t allowHiddenZero)  {
    Error("HOnlineMonHistAddon::draw()" ,"virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
}
void HOnlineMonHistAddon::reset(Int_t level,Int_t count){
    Error("HOnlineMonHistAddon::reset()","virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
}
void HOnlineMonHistAddon::add(HOnlineMonHistAddon*)           {
    Error("HOnlineMonHistAddon::add()"  ,"virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
}
void HOnlineMonHistAddon::fill(Stat_t  i,Stat_t j){
    Error("HOnlineMonHistAddon::fill(Stat_t  i,Stat_t j)"  ,"virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
}
void HOnlineMonHistAddon::fill(Int_t,Int_t,Stat_t,Stat_t){
    Error("HOnlineMonHistAddon::fill(Int_t,Int_t,Stat_t,Stat_t)"  ,"virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
}
TH1* HOnlineMonHistAddon::getP(Int_t s,Int_t m)         {
    Error("HOnlineMonHistAddon::getP()" ,"virtual function called!");
    cerr << GetName() << " *** " << GetTitle() << endl;
    return(0);
}
HOnlineMonHistAddon::~HOnlineMonHistAddon(){}


//###############################################################################################



HOnlineMonHist::HOnlineMonHist(const Char_t* name,
		   const Char_t* title,
		   Int_t active,Int_t resetable,
		   Int_t nbinsX,Float_t xlo,Float_t xup)
:  HOnlineMonHistAddon(name,title,active,resetable,
		 nbinsX,xlo,xup,0,0,0)
{
   h=0;
}
HOnlineMonHist::HOnlineMonHist(HOnlineMonHistAddon& add)
{
    copySet(add);
    h=0;
    create();
}
void HOnlineMonHist::reset(Int_t level,Int_t count)
{
    switch (level)
    {
    case 0:   h->Reset();
    break;
    case 1:   if(getResetable()==1)h->Reset();
    break;
    case 2:   if(getResetable()==1 && count%getRefreshRate()==0 && count>0){h->Reset();}
    break;
    default : Error("HOnlineMonHist::reset","UNKNOWN ARGUMENT: Level= %i !",level);
    }
}
void HOnlineMonHist::add(HOnlineMonHistAddon* h2){h->Add(((HOnlineMonHist*)h2)->getP());}

void HOnlineMonHist::draw(Bool_t allowHiddenZero)
{
    TString opt=h->GetOption();
    if(!drawSame){
	if(opt.CompareTo("")==0)       h->Draw();
	else if(opt.CompareTo("p")==0) h->Draw("p");
	else if(opt.CompareTo("pl")==0)h->Draw("pl");
	h->Draw();
    }  else {
	if(opt.CompareTo("")==0)       h->Draw("same");
	else if(opt.CompareTo("p")==0) h->Draw("psame");
	else if(opt.CompareTo("pl")==0)h->Draw("plsame");
	h->Draw();
    }
}

void HOnlineMonHist::create()
{
    if(fIsActive==1)
    {
	if(HistType.CompareTo("1S")==0)h=new TH1S(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup);
	if(HistType.CompareTo("1F")==0)h=new TH1F(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup);
	if(HistType.CompareTo("1D")==0)h=new TH1D(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup);
        h->SetDirectory(0);
	setHist(h);
    }
}

void  HOnlineMonHist::getMinMax(Double_t& min,Double_t& max)
{
    min =  1e200;
    max = -1e200;
    for(Int_t i = 0; i < h->GetNbinsX(); i++ ) {
	Double_t val = h->GetBinContent(i+1);
	if(val < min) min = val;
	if(val > max) max = val;

    }
}


HOnlineMonHist::~HOnlineMonHist(){if(h)delete h;h=0;}

//###############################################################################################

HOnlineMonHist2::HOnlineMonHist2(const Char_t* name,
			   const Char_t* title,
			   Int_t active,Int_t resetable,
			   Int_t nbinsX,Float_t xlo,Float_t xup,
			   Int_t nbinsY,Float_t ylo,Float_t yup)
:  HOnlineMonHistAddon(name,title,active,resetable,
		       nbinsX,xlo,xup,
		       nbinsY,ylo,yup)
{
  h=0;
}

HOnlineMonHist2::HOnlineMonHist2(HOnlineMonHistAddon& add)
{
    copySet(add);
    h=0;
    create();
}

void HOnlineMonHist2::reset(Int_t level,Int_t count)
{
    switch (level)
    {
    case 0:   h->Reset();
    break;
    case 1:   if(getResetable()==1)h->Reset();
    break;
    case 2:   if(getResetable()==1 && count%getRefreshRate()==0 && count>0){h->Reset();}
    break;
    default : Error("HOnlineMonHist2::reset","UNKNOWN ARGUMENT: Level= %i !",level);
    }
}

void HOnlineMonHist2::add(HOnlineMonHistAddon* h2){h->Add(((HOnlineMonHist2*)h2)->getP());}

void HOnlineMonHist2::draw(Bool_t allowHiddenZero)
{
    if(!drawSame)h->Draw();
    else         h->Draw("same");
}

void HOnlineMonHist2::create()
{
    if(fIsActive==1)
    {
	if(HistType.CompareTo("2S")==0)h=new TH2S(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup,nBinsY,Ylo,Yup);
	if(HistType.CompareTo("2F")==0)h=new TH2F(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup,nBinsY,Ylo,Yup);
	if(HistType.CompareTo("2D")==0)h=new TH2D(this->GetName(),this->GetTitle(),nBinsX,Xlo,Xup,nBinsY,Ylo,Yup);
        h->SetDirectory(0);
	setHist(h);
    };
}

void  HOnlineMonHist2::getMinMax(Double_t& min,Double_t& max)
{
    min =  1e200;
    max = -1e200;
    for(Int_t i = 0; i < h->GetNbinsX(); i++ ) {
	for(Int_t j = 0; j < h->GetNbinsY(); j++ ) {
	    Double_t val = h->GetBinContent(i+1,j+1);
	    if(val < min) min = val;
	    if(val > max) max = val;

	}
    }
}

HOnlineMonHist2::~HOnlineMonHist2(){if(h)delete h;h=0;}
 honlinemonhist.cc:1
 honlinemonhist.cc:2
 honlinemonhist.cc:3
 honlinemonhist.cc:4
 honlinemonhist.cc:5
 honlinemonhist.cc:6
 honlinemonhist.cc:7
 honlinemonhist.cc:8
 honlinemonhist.cc:9
 honlinemonhist.cc:10
 honlinemonhist.cc:11
 honlinemonhist.cc:12
 honlinemonhist.cc:13
 honlinemonhist.cc:14
 honlinemonhist.cc:15
 honlinemonhist.cc:16
 honlinemonhist.cc:17
 honlinemonhist.cc:18
 honlinemonhist.cc:19
 honlinemonhist.cc:20
 honlinemonhist.cc:21
 honlinemonhist.cc:22
 honlinemonhist.cc:23
 honlinemonhist.cc:24
 honlinemonhist.cc:25
 honlinemonhist.cc:26
 honlinemonhist.cc:27
 honlinemonhist.cc:28
 honlinemonhist.cc:29
 honlinemonhist.cc:30
 honlinemonhist.cc:31
 honlinemonhist.cc:32
 honlinemonhist.cc:33
 honlinemonhist.cc:34
 honlinemonhist.cc:35
 honlinemonhist.cc:36
 honlinemonhist.cc:37
 honlinemonhist.cc:38
 honlinemonhist.cc:39
 honlinemonhist.cc:40
 honlinemonhist.cc:41
 honlinemonhist.cc:42
 honlinemonhist.cc:43
 honlinemonhist.cc:44
 honlinemonhist.cc:45
 honlinemonhist.cc:46
 honlinemonhist.cc:47
 honlinemonhist.cc:48
 honlinemonhist.cc:49
 honlinemonhist.cc:50
 honlinemonhist.cc:51
 honlinemonhist.cc:52
 honlinemonhist.cc:53
 honlinemonhist.cc:54
 honlinemonhist.cc:55
 honlinemonhist.cc:56
 honlinemonhist.cc:57
 honlinemonhist.cc:58
 honlinemonhist.cc:59
 honlinemonhist.cc:60
 honlinemonhist.cc:61
 honlinemonhist.cc:62
 honlinemonhist.cc:63
 honlinemonhist.cc:64
 honlinemonhist.cc:65
 honlinemonhist.cc:66
 honlinemonhist.cc:67
 honlinemonhist.cc:68
 honlinemonhist.cc:69
 honlinemonhist.cc:70
 honlinemonhist.cc:71
 honlinemonhist.cc:72
 honlinemonhist.cc:73
 honlinemonhist.cc:74
 honlinemonhist.cc:75
 honlinemonhist.cc:76
 honlinemonhist.cc:77
 honlinemonhist.cc:78
 honlinemonhist.cc:79
 honlinemonhist.cc:80
 honlinemonhist.cc:81
 honlinemonhist.cc:82
 honlinemonhist.cc:83
 honlinemonhist.cc:84
 honlinemonhist.cc:85
 honlinemonhist.cc:86
 honlinemonhist.cc:87
 honlinemonhist.cc:88
 honlinemonhist.cc:89
 honlinemonhist.cc:90
 honlinemonhist.cc:91
 honlinemonhist.cc:92
 honlinemonhist.cc:93
 honlinemonhist.cc:94
 honlinemonhist.cc:95
 honlinemonhist.cc:96
 honlinemonhist.cc:97
 honlinemonhist.cc:98
 honlinemonhist.cc:99
 honlinemonhist.cc:100
 honlinemonhist.cc:101
 honlinemonhist.cc:102
 honlinemonhist.cc:103
 honlinemonhist.cc:104
 honlinemonhist.cc:105
 honlinemonhist.cc:106
 honlinemonhist.cc:107
 honlinemonhist.cc:108
 honlinemonhist.cc:109
 honlinemonhist.cc:110
 honlinemonhist.cc:111
 honlinemonhist.cc:112
 honlinemonhist.cc:113
 honlinemonhist.cc:114
 honlinemonhist.cc:115
 honlinemonhist.cc:116
 honlinemonhist.cc:117
 honlinemonhist.cc:118
 honlinemonhist.cc:119
 honlinemonhist.cc:120
 honlinemonhist.cc:121
 honlinemonhist.cc:122
 honlinemonhist.cc:123
 honlinemonhist.cc:124
 honlinemonhist.cc:125
 honlinemonhist.cc:126
 honlinemonhist.cc:127
 honlinemonhist.cc:128
 honlinemonhist.cc:129
 honlinemonhist.cc:130
 honlinemonhist.cc:131
 honlinemonhist.cc:132
 honlinemonhist.cc:133
 honlinemonhist.cc:134
 honlinemonhist.cc:135
 honlinemonhist.cc:136
 honlinemonhist.cc:137
 honlinemonhist.cc:138
 honlinemonhist.cc:139
 honlinemonhist.cc:140
 honlinemonhist.cc:141
 honlinemonhist.cc:142
 honlinemonhist.cc:143
 honlinemonhist.cc:144
 honlinemonhist.cc:145
 honlinemonhist.cc:146
 honlinemonhist.cc:147
 honlinemonhist.cc:148
 honlinemonhist.cc:149
 honlinemonhist.cc:150
 honlinemonhist.cc:151
 honlinemonhist.cc:152
 honlinemonhist.cc:153
 honlinemonhist.cc:154
 honlinemonhist.cc:155
 honlinemonhist.cc:156
 honlinemonhist.cc:157
 honlinemonhist.cc:158
 honlinemonhist.cc:159
 honlinemonhist.cc:160
 honlinemonhist.cc:161
 honlinemonhist.cc:162
 honlinemonhist.cc:163
 honlinemonhist.cc:164
 honlinemonhist.cc:165
 honlinemonhist.cc:166
 honlinemonhist.cc:167
 honlinemonhist.cc:168
 honlinemonhist.cc:169
 honlinemonhist.cc:170
 honlinemonhist.cc:171
 honlinemonhist.cc:172
 honlinemonhist.cc:173
 honlinemonhist.cc:174
 honlinemonhist.cc:175
 honlinemonhist.cc:176
 honlinemonhist.cc:177
 honlinemonhist.cc:178
 honlinemonhist.cc:179
 honlinemonhist.cc:180
 honlinemonhist.cc:181
 honlinemonhist.cc:182
 honlinemonhist.cc:183
 honlinemonhist.cc:184
 honlinemonhist.cc:185
 honlinemonhist.cc:186
 honlinemonhist.cc:187
 honlinemonhist.cc:188
 honlinemonhist.cc:189
 honlinemonhist.cc:190
 honlinemonhist.cc:191
 honlinemonhist.cc:192
 honlinemonhist.cc:193
 honlinemonhist.cc:194
 honlinemonhist.cc:195
 honlinemonhist.cc:196
 honlinemonhist.cc:197
 honlinemonhist.cc:198
 honlinemonhist.cc:199
 honlinemonhist.cc:200
 honlinemonhist.cc:201
 honlinemonhist.cc:202
 honlinemonhist.cc:203
 honlinemonhist.cc:204
 honlinemonhist.cc:205
 honlinemonhist.cc:206
 honlinemonhist.cc:207
 honlinemonhist.cc:208
 honlinemonhist.cc:209
 honlinemonhist.cc:210
 honlinemonhist.cc:211
 honlinemonhist.cc:212
 honlinemonhist.cc:213
 honlinemonhist.cc:214
 honlinemonhist.cc:215
 honlinemonhist.cc:216
 honlinemonhist.cc:217
 honlinemonhist.cc:218
 honlinemonhist.cc:219
 honlinemonhist.cc:220
 honlinemonhist.cc:221
 honlinemonhist.cc:222
 honlinemonhist.cc:223
 honlinemonhist.cc:224
 honlinemonhist.cc:225
 honlinemonhist.cc:226
 honlinemonhist.cc:227
 honlinemonhist.cc:228
 honlinemonhist.cc:229
 honlinemonhist.cc:230
 honlinemonhist.cc:231
 honlinemonhist.cc:232
 honlinemonhist.cc:233
 honlinemonhist.cc:234
 honlinemonhist.cc:235
 honlinemonhist.cc:236
 honlinemonhist.cc:237
 honlinemonhist.cc:238
 honlinemonhist.cc:239
 honlinemonhist.cc:240
 honlinemonhist.cc:241
 honlinemonhist.cc:242
 honlinemonhist.cc:243
 honlinemonhist.cc:244
 honlinemonhist.cc:245
 honlinemonhist.cc:246
 honlinemonhist.cc:247
 honlinemonhist.cc:248
 honlinemonhist.cc:249
 honlinemonhist.cc:250
 honlinemonhist.cc:251
 honlinemonhist.cc:252
 honlinemonhist.cc:253
 honlinemonhist.cc:254
 honlinemonhist.cc:255
 honlinemonhist.cc:256
 honlinemonhist.cc:257
 honlinemonhist.cc:258
 honlinemonhist.cc:259
 honlinemonhist.cc:260
 honlinemonhist.cc:261
 honlinemonhist.cc:262
 honlinemonhist.cc:263
 honlinemonhist.cc:264
 honlinemonhist.cc:265
 honlinemonhist.cc:266
 honlinemonhist.cc:267
 honlinemonhist.cc:268
 honlinemonhist.cc:269
 honlinemonhist.cc:270
 honlinemonhist.cc:271
 honlinemonhist.cc:272
 honlinemonhist.cc:273
 honlinemonhist.cc:274
 honlinemonhist.cc:275
 honlinemonhist.cc:276
 honlinemonhist.cc:277
 honlinemonhist.cc:278
 honlinemonhist.cc:279
 honlinemonhist.cc:280
 honlinemonhist.cc:281
 honlinemonhist.cc:282
 honlinemonhist.cc:283
 honlinemonhist.cc:284
 honlinemonhist.cc:285
 honlinemonhist.cc:286
 honlinemonhist.cc:287
 honlinemonhist.cc:288
 honlinemonhist.cc:289
 honlinemonhist.cc:290
 honlinemonhist.cc:291
 honlinemonhist.cc:292
 honlinemonhist.cc:293
 honlinemonhist.cc:294
 honlinemonhist.cc:295
 honlinemonhist.cc:296
 honlinemonhist.cc:297
 honlinemonhist.cc:298
 honlinemonhist.cc:299
 honlinemonhist.cc:300
 honlinemonhist.cc:301
 honlinemonhist.cc:302
 honlinemonhist.cc:303
 honlinemonhist.cc:304
 honlinemonhist.cc:305
 honlinemonhist.cc:306
 honlinemonhist.cc:307
 honlinemonhist.cc:308
 honlinemonhist.cc:309
 honlinemonhist.cc:310
 honlinemonhist.cc:311
 honlinemonhist.cc:312
 honlinemonhist.cc:313
 honlinemonhist.cc:314
 honlinemonhist.cc:315
 honlinemonhist.cc:316
 honlinemonhist.cc:317
 honlinemonhist.cc:318
 honlinemonhist.cc:319
 honlinemonhist.cc:320
 honlinemonhist.cc:321
 honlinemonhist.cc:322
 honlinemonhist.cc:323
 honlinemonhist.cc:324
 honlinemonhist.cc:325
 honlinemonhist.cc:326
 honlinemonhist.cc:327
 honlinemonhist.cc:328
 honlinemonhist.cc:329
 honlinemonhist.cc:330
 honlinemonhist.cc:331
 honlinemonhist.cc:332
 honlinemonhist.cc:333
 honlinemonhist.cc:334
 honlinemonhist.cc:335
 honlinemonhist.cc:336
 honlinemonhist.cc:337
 honlinemonhist.cc:338
 honlinemonhist.cc:339
 honlinemonhist.cc:340
 honlinemonhist.cc:341
 honlinemonhist.cc:342
 honlinemonhist.cc:343
 honlinemonhist.cc:344
 honlinemonhist.cc:345
 honlinemonhist.cc:346
 honlinemonhist.cc:347
 honlinemonhist.cc:348
 honlinemonhist.cc:349
 honlinemonhist.cc:350
 honlinemonhist.cc:351
 honlinemonhist.cc:352
 honlinemonhist.cc:353
 honlinemonhist.cc:354
 honlinemonhist.cc:355
 honlinemonhist.cc:356
 honlinemonhist.cc:357
 honlinemonhist.cc:358
 honlinemonhist.cc:359
 honlinemonhist.cc:360
 honlinemonhist.cc:361
 honlinemonhist.cc:362
 honlinemonhist.cc:363
 honlinemonhist.cc:364
 honlinemonhist.cc:365
 honlinemonhist.cc:366
 honlinemonhist.cc:367
 honlinemonhist.cc:368
 honlinemonhist.cc:369
 honlinemonhist.cc:370
 honlinemonhist.cc:371
 honlinemonhist.cc:372
 honlinemonhist.cc:373
 honlinemonhist.cc:374
 honlinemonhist.cc:375
 honlinemonhist.cc:376
 honlinemonhist.cc:377
 honlinemonhist.cc:378
 honlinemonhist.cc:379
 honlinemonhist.cc:380
 honlinemonhist.cc:381
 honlinemonhist.cc:382
 honlinemonhist.cc:383
 honlinemonhist.cc:384
 honlinemonhist.cc:385
 honlinemonhist.cc:386
 honlinemonhist.cc:387
 honlinemonhist.cc:388
 honlinemonhist.cc:389
 honlinemonhist.cc:390
 honlinemonhist.cc:391
 honlinemonhist.cc:392
 honlinemonhist.cc:393
 honlinemonhist.cc:394
 honlinemonhist.cc:395
 honlinemonhist.cc:396
 honlinemonhist.cc:397
 honlinemonhist.cc:398
 honlinemonhist.cc:399
 honlinemonhist.cc:400
 honlinemonhist.cc:401
 honlinemonhist.cc:402
 honlinemonhist.cc:403
 honlinemonhist.cc:404
 honlinemonhist.cc:405
 honlinemonhist.cc:406
 honlinemonhist.cc:407
 honlinemonhist.cc:408
 honlinemonhist.cc:409
 honlinemonhist.cc:410
 honlinemonhist.cc:411
 honlinemonhist.cc:412
 honlinemonhist.cc:413
 honlinemonhist.cc:414
 honlinemonhist.cc:415
 honlinemonhist.cc:416
 honlinemonhist.cc:417
 honlinemonhist.cc:418
 honlinemonhist.cc:419
 honlinemonhist.cc:420
 honlinemonhist.cc:421
 honlinemonhist.cc:422
 honlinemonhist.cc:423
 honlinemonhist.cc:424
 honlinemonhist.cc:425
 honlinemonhist.cc:426
 honlinemonhist.cc:427
 honlinemonhist.cc:428
 honlinemonhist.cc:429
 honlinemonhist.cc:430
 honlinemonhist.cc:431
 honlinemonhist.cc:432
 honlinemonhist.cc:433
 honlinemonhist.cc:434
 honlinemonhist.cc:435
 honlinemonhist.cc:436
 honlinemonhist.cc:437
 honlinemonhist.cc:438
 honlinemonhist.cc:439
 honlinemonhist.cc:440
 honlinemonhist.cc:441
 honlinemonhist.cc:442
 honlinemonhist.cc:443
 honlinemonhist.cc:444
 honlinemonhist.cc:445
 honlinemonhist.cc:446
 honlinemonhist.cc:447
 honlinemonhist.cc:448
 honlinemonhist.cc:449
 honlinemonhist.cc:450
 honlinemonhist.cc:451
 honlinemonhist.cc:452
 honlinemonhist.cc:453
 honlinemonhist.cc:454
 honlinemonhist.cc:455
 honlinemonhist.cc:456
 honlinemonhist.cc:457
 honlinemonhist.cc:458
 honlinemonhist.cc:459
 honlinemonhist.cc:460
 honlinemonhist.cc:461
 honlinemonhist.cc:462
 honlinemonhist.cc:463
 honlinemonhist.cc:464
 honlinemonhist.cc:465
 honlinemonhist.cc:466
 honlinemonhist.cc:467
 honlinemonhist.cc:468
 honlinemonhist.cc:469
 honlinemonhist.cc:470
 honlinemonhist.cc:471
 honlinemonhist.cc:472
 honlinemonhist.cc:473
 honlinemonhist.cc:474
 honlinemonhist.cc:475
 honlinemonhist.cc:476
 honlinemonhist.cc:477
 honlinemonhist.cc:478
 honlinemonhist.cc:479
 honlinemonhist.cc:480
 honlinemonhist.cc:481
 honlinemonhist.cc:482
 honlinemonhist.cc:483
 honlinemonhist.cc:484
 honlinemonhist.cc:485
 honlinemonhist.cc:486
 honlinemonhist.cc:487
 honlinemonhist.cc:488
 honlinemonhist.cc:489
 honlinemonhist.cc:490
 honlinemonhist.cc:491
 honlinemonhist.cc:492
 honlinemonhist.cc:493
 honlinemonhist.cc:494
 honlinemonhist.cc:495
 honlinemonhist.cc:496
 honlinemonhist.cc:497
 honlinemonhist.cc:498
 honlinemonhist.cc:499
 honlinemonhist.cc:500
 honlinemonhist.cc:501
 honlinemonhist.cc:502
 honlinemonhist.cc:503
 honlinemonhist.cc:504
 honlinemonhist.cc:505
 honlinemonhist.cc:506
 honlinemonhist.cc:507
 honlinemonhist.cc:508
 honlinemonhist.cc:509
 honlinemonhist.cc:510
 honlinemonhist.cc:511
 honlinemonhist.cc:512
 honlinemonhist.cc:513
 honlinemonhist.cc:514
 honlinemonhist.cc:515
 honlinemonhist.cc:516
 honlinemonhist.cc:517
 honlinemonhist.cc:518
 honlinemonhist.cc:519
 honlinemonhist.cc:520
 honlinemonhist.cc:521
 honlinemonhist.cc:522
 honlinemonhist.cc:523
 honlinemonhist.cc:524
 honlinemonhist.cc:525
 honlinemonhist.cc:526
 honlinemonhist.cc:527
 honlinemonhist.cc:528
 honlinemonhist.cc:529
 honlinemonhist.cc:530
 honlinemonhist.cc:531
 honlinemonhist.cc:532
 honlinemonhist.cc:533
 honlinemonhist.cc:534
 honlinemonhist.cc:535
 honlinemonhist.cc:536
 honlinemonhist.cc:537
 honlinemonhist.cc:538
 honlinemonhist.cc:539
 honlinemonhist.cc:540
 honlinemonhist.cc:541
 honlinemonhist.cc:542
 honlinemonhist.cc:543
 honlinemonhist.cc:544
 honlinemonhist.cc:545
 honlinemonhist.cc:546
 honlinemonhist.cc:547
 honlinemonhist.cc:548
 honlinemonhist.cc:549
 honlinemonhist.cc:550
 honlinemonhist.cc:551
 honlinemonhist.cc:552
 honlinemonhist.cc:553
 honlinemonhist.cc:554
 honlinemonhist.cc:555
 honlinemonhist.cc:556
 honlinemonhist.cc:557
 honlinemonhist.cc:558
 honlinemonhist.cc:559
 honlinemonhist.cc:560
 honlinemonhist.cc:561
 honlinemonhist.cc:562
 honlinemonhist.cc:563
 honlinemonhist.cc:564
 honlinemonhist.cc:565
 honlinemonhist.cc:566
 honlinemonhist.cc:567
 honlinemonhist.cc:568
 honlinemonhist.cc:569
 honlinemonhist.cc:570
 honlinemonhist.cc:571
 honlinemonhist.cc:572
 honlinemonhist.cc:573
 honlinemonhist.cc:574
 honlinemonhist.cc:575
 honlinemonhist.cc:576
 honlinemonhist.cc:577
 honlinemonhist.cc:578
 honlinemonhist.cc:579
 honlinemonhist.cc:580
 honlinemonhist.cc:581
 honlinemonhist.cc:582
 honlinemonhist.cc:583
 honlinemonhist.cc:584
 honlinemonhist.cc:585
 honlinemonhist.cc:586
 honlinemonhist.cc:587
 honlinemonhist.cc:588
 honlinemonhist.cc:589
 honlinemonhist.cc:590
 honlinemonhist.cc:591
 honlinemonhist.cc:592
 honlinemonhist.cc:593
 honlinemonhist.cc:594
 honlinemonhist.cc:595
 honlinemonhist.cc:596
 honlinemonhist.cc:597
 honlinemonhist.cc:598
 honlinemonhist.cc:599
 honlinemonhist.cc:600
 honlinemonhist.cc:601
 honlinemonhist.cc:602
 honlinemonhist.cc:603
 honlinemonhist.cc:604
 honlinemonhist.cc:605
 honlinemonhist.cc:606
 honlinemonhist.cc:607
 honlinemonhist.cc:608
 honlinemonhist.cc:609
 honlinemonhist.cc:610
 honlinemonhist.cc:611
 honlinemonhist.cc:612
 honlinemonhist.cc:613
 honlinemonhist.cc:614
 honlinemonhist.cc:615
 honlinemonhist.cc:616
 honlinemonhist.cc:617
 honlinemonhist.cc:618
 honlinemonhist.cc:619
 honlinemonhist.cc:620
 honlinemonhist.cc:621
 honlinemonhist.cc:622
 honlinemonhist.cc:623
 honlinemonhist.cc:624
 honlinemonhist.cc:625
 honlinemonhist.cc:626
 honlinemonhist.cc:627
 honlinemonhist.cc:628
 honlinemonhist.cc:629
 honlinemonhist.cc:630
 honlinemonhist.cc:631
 honlinemonhist.cc:632
 honlinemonhist.cc:633
 honlinemonhist.cc:634
 honlinemonhist.cc:635
 honlinemonhist.cc:636
 honlinemonhist.cc:637
 honlinemonhist.cc:638
 honlinemonhist.cc:639
 honlinemonhist.cc:640
 honlinemonhist.cc:641
 honlinemonhist.cc:642
 honlinemonhist.cc:643
 honlinemonhist.cc:644
 honlinemonhist.cc:645
 honlinemonhist.cc:646
 honlinemonhist.cc:647
 honlinemonhist.cc:648
 honlinemonhist.cc:649
 honlinemonhist.cc:650
 honlinemonhist.cc:651
 honlinemonhist.cc:652
 honlinemonhist.cc:653
 honlinemonhist.cc:654
 honlinemonhist.cc:655
 honlinemonhist.cc:656
 honlinemonhist.cc:657
 honlinemonhist.cc:658
 honlinemonhist.cc:659
 honlinemonhist.cc:660
 honlinemonhist.cc:661
 honlinemonhist.cc:662
 honlinemonhist.cc:663
 honlinemonhist.cc:664
 honlinemonhist.cc:665
 honlinemonhist.cc:666
 honlinemonhist.cc:667
 honlinemonhist.cc:668
 honlinemonhist.cc:669
 honlinemonhist.cc:670
 honlinemonhist.cc:671
 honlinemonhist.cc:672
 honlinemonhist.cc:673
 honlinemonhist.cc:674
 honlinemonhist.cc:675
 honlinemonhist.cc:676
 honlinemonhist.cc:677
 honlinemonhist.cc:678
 honlinemonhist.cc:679
 honlinemonhist.cc:680