ROOT logo
#include "htime.h"
#include "hades.h"
#include "hevent.h"
#include "heventheader.h"
#include "TRegexp.h"
#include "TSystem.h"
#include <cstdio>
//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////
// HTime
//
// Helper class to extract the time and date from
// hld file names and runids.
///////////////////////////////////////////////////////////

ClassImp(HTime)

HTime::HTime(){;}
HTime::~HTime(){;}


Bool_t HTime::isHldName(TString name,Bool_t EvtBuilder,Bool_t silent)
{
    TString file = name;
    Int_t minLength = 15;
    if(!EvtBuilder) minLength = 13;

    if(file.Length() < minLength) {
	if(!silent)printf("IsHldName() : Filename = %s is shorter than %i Characters, cannot be a correct hld name!\n",file.Data(),minLength);
        return kFALSE;
    }

    TRegexp reg ("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"); // match 13 didgits
    TRegexp reg1("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"); // match 11 didgits

    Ssiz_t ext;
    Ssiz_t i = 0;
    Ssiz_t out;


    if( EvtBuilder)out = file.Index(reg ,&ext,i);
    else           out = file.Index(reg1,&ext,i);


    if(out > 1 && ext == minLength-2){ // 13/11 digits + 2 char in front matched
	return kTRUE;
    } else {
	if(!silent) printf("isHldName() : Filename = %s does not match 2Char+%i digits, cannot be a correct hld name!\n",file.Data(),minLength-2);
	return kFALSE;
    }
}


TString HTime::stripFileName(TString name,Bool_t removeEvtBuilder, Bool_t silent)
{
    // removes path and extension (.root,.hld,.evt)
    // and returns the new name. Assumes that the
    // filename is composed like 'something+[2char+13digit}+something.root'
    // if removeEvtBuilder=kTRUE the last 2 digits for the evt builder
    // will be removed
    TString file = gSystem->BaseName(name);
    TRegexp reg("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"); // match 13 didgits

    Ssiz_t ext;
    Ssiz_t i = 0;

    Ssiz_t out = file.Index(reg,&ext,i);


    if(out > 1 && ext == 13){ // 13 digits + 2 char in front matched

       file.Replace(0 ,out - 2,"");        // cut leading stuff

       if(file.Length() < 15) {
	   if(!silent)printf("stripFileName() : Filename = %s is shorter than 15 Characters, cannot be a correct hld name!\n",file.Data());
	   file = "";

       } else { //
	   file.Replace(15,file.Length() - 15,"");
           if(removeEvtBuilder)  file.Remove(file.Length()-2,2);

       }
    } else {
	if(!silent)printf("stripFileName() : Filename = %s does not match 2Char+13 digits, cannot be a correct hld name!\n",file.Data());
        file = "";
    }

    return file;
}


void HTime::dayOfYearToDate(Int_t year,Int_t dayOfYear,Int_t& month,Int_t& day,Bool_t print)
{
    // calulates from year (like 2011) and day of year (like 227)
    // the corresounding month (1-12) and day (1-31) of month.

    if(year < 2000) year+=2000;

    month    =0;
    day      =0;

    struct tm begin;
    time_t time_of_day;

    begin.tm_year  = year-1900;   // only years since 1900
    begin.tm_mon   = 0;           // counting from 0
    begin.tm_mday  = 1;           // counting from 1
    begin.tm_hour  = 0;
    begin.tm_min   = 0;
    begin.tm_sec   = 0;
    begin.tm_isdst = -1;          // 1= active, 0 =not active, -1 not available

    time_of_day = mktime(&begin);

    time_of_day += (dayOfYear-1)*24*60*60;

    tm* filetime = gmtime(&time_of_day);

    month=filetime->tm_mon+1;
    day  =filetime->tm_mday+1;

    if(print){ printf("dayOfYearToDate : y = %04i, day of y = %3i ===> month = %02i, day = %02i \n",year,dayOfYear,month,day); }
}

void HTime::splitFileName(TString name,TString& type,Int_t& year,Int_t& dayOfYear,Int_t& hour,Int_t& minute,Int_t& second,Int_t& evtbuild,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    // into components like
    // type=be
    // year (since 2000), dayOfYear (1-366), hour (0-23),minutes (0-59),second (0-59)
    // evtbuilder number
    // The time stamp is given in local time of the event builder (time zone = +1)
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , type %s, y = %02i, day of y = %03i, time %02i:%02i:%02i, evtbuild %2i \n"
	       ,name.Data(),type.Data(),year,dayOfYear,hour,minute,second,evtbuild );
    }
}

TString HTime::getTypeFileName(TString name,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    Int_t year,dayOfYear,hour,minute,second,evtbuild;
    TString type;
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , type = %s \n",name.Data(),type.Data());
    }
    return type;
}

Int_t HTime::getYearFileName(TString name,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    TString type;
    Int_t year,dayOfYear,hour,minute,second,evtbuild;
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , y = %04i \n",name.Data(),year);
    }
    return year;
}

Int_t HTime::getDayFileName(TString name,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    TString type;
    Int_t year,dayOfYear,hour,minute,second,evtbuild;
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , day of y = %03i \n",name.Data(),dayOfYear);
    }
    return dayOfYear;
}

void HTime::getTimeFileName(TString name,Int_t& hour,Int_t& minute,Int_t& second,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    TString type;
    Int_t year,dayOfYear,evtbuild;
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , time %02i:%02i:%02i \n",name.Data(),hour,minute,second);
    }
}

Int_t HTime::getEvtBuilderFileName(TString name,Bool_t print)
{
    // splits the file name like 'be1122719211201'
    TString type;
    Int_t year,dayOfYear,hour,minute,second,evtbuild;
    Char_t t[5];
    sscanf(name.Data(),"%2s%2d%3d%2d%2d%2d%2d",t,&year,&dayOfYear,&hour,&minute,&second,&evtbuild);
    type = t;
    if(print) {
	printf("splitFileName : file = %s , evtbuild %02i\n",name.Data(),evtbuild);
    }
    return evtbuild;
}

time_t HTime::fileNameToTime(TString name, Bool_t print)
{
    // splits the file name like 'be1122719211201'
    // into components and returns the corresponding
    // time_t (seconds from 1.1.1970).
    // The time stamp is given in local time of
    // the event builder (time zone = +1)
    // For help with the time functions (time_t ...)
    // lookup man pages ctime,localtime,gmtime etc.
    // use gmtime()/localtime() to convert to broken down time struct.

    TString type;
    Int_t y,doy,h,min,sec,evbuild;

    splitFileName(name,type,y,doy,h,min,sec,evbuild);

    Int_t month,day;
    dayOfYearToDate(y+2000,doy,month,day);

    struct tm t;
    time_t time_of_day;
    time_t gtime_of_day;

    t.tm_year  = y+100;   // only years since  1900
    t.tm_mon   = month-1; // counting from 0   0-11
    t.tm_mday  = day;     // counting from 1   1-31
    t.tm_hour  = h;       //                   0-23
    t.tm_min   = min;     //                   0-59
    t.tm_sec   = sec;     //                   0-59 (leap 60)
    t.tm_isdst = 0;       //                  1=daylight saving time active  , 0 =not active, -1 not available find out from local timezone
                          //                  ~ endmarch - end october
    time_of_day = mktime(&t);           // local time
    gtime_of_day = time_of_day - 3600;  // gmtime :  +1 timezone substracted


    struct tm* t2 = gmtime(&gtime_of_day);  // we nee to compare to findout if DST was used

    if(t2->tm_hour+2 == h) { // we have to use summer time (+1 time zone + summer shift)

	t.tm_year  = y+100;   // only years since  1900
	t.tm_mon   = month-1; // counting from 0   0-11
	t.tm_mday  = day;     // counting from 1   1-31
	t.tm_hour  = h;       //                   0-23
	t.tm_min   = min;     //                   0-59
	t.tm_sec   = sec;     //                   0-59 (leap 60)
	t.tm_isdst = 1;
	time_of_day = mktime(&t);
    }

    if(print) { cout<<"fileNameToTime : time = "<<time_of_day<<" , "<<flush; printf("%s\n",ctime(&time_of_day)); }
    return time_of_day;
}

Int_t HTime::isDST(TString name)
{
    // expects the file name like 'be1122719211201'
    // returns 1 if DST (summer time) was active
    // or 0 if incative while the file was recorded

    TString type;
    Int_t y,doy,h,min,sec,evbuild;

    splitFileName(name,type,y,doy,h,min,sec,evbuild);

    Int_t month,day;
    dayOfYearToDate(y+2000,doy,month,day);

    struct tm t;
    time_t time_of_day;
    time_t gtime_of_day;

    Int_t isDST = 0;

    t.tm_year  = y+100;   // only years since  1900
    t.tm_mon   = month-1; // counting from 0   0-11
    t.tm_mday  = day;     // counting from 1   1-31
    t.tm_hour  = h;       //                   0-23
    t.tm_min   = min;     //                   0-59
    t.tm_sec   = sec;     //                   0-59 (leap 60)
    t.tm_isdst = 0;       //                  1=daylight saving time active  , 0 =not active, -1 not available find out from local timezone
                          //                  ~ endmarch - end october
    time_of_day = mktime(&t);           // local time
    gtime_of_day = time_of_day - 3600;  // gmtime :  +1 timezone substracted


    struct tm* t2 = gmtime(&gtime_of_day);  // we nee to compare to findout if DST was used

    if(t2->tm_hour+2 == h) { // we have to use summer time (+1 time zone + summer shift)

	t.tm_year  = y+100;   // only years since  1900
	t.tm_mon   = month-1; // counting from 0   0-11
	t.tm_mday  = day;     // counting from 1   1-31
	t.tm_hour  = h;       //                   0-23
	t.tm_min   = min;     //                   0-59
	t.tm_sec   = sec;     //                   0-59 (leap 60)
	t.tm_isdst = 1;
	time_of_day = mktime(&t);
        isDST = 1;
    }

    return isDST;
}

time_t HTime::runIdToTime(time_t runid, Int_t timezone, Bool_t print)
{
    // recalulates the runID to time (add offset 1200000000)
    // The time stamp is given in local time of
    // the event builder (time zone = +1). Since there
    // is no way to determine from the runID allone
    // if summer/winter time (DST) has been used while
    // recording your have to provide your
    // local time zone.
    // For help with the time functions (time_t ...)
    // lookup man pages ctime,localtime,gmtime etc.
    // use gmtime()/localtime() to convert to broken down
    // time struct.

    time_t t = runid;

    t += 1200000000;

    Int_t diff = 1 - timezone;

    t -= 3600 * diff;

    if(print) { cout<<"runIdToTime : runID "<<runid<<" , timezone ="<<timezone<<" , time = "<<t<<" , "<<flush; printf("%s\n",ctime(&t)); }

    return t;
}


void HTime::runIdToBrokenTime(Int_t runid,
			      Int_t& year,Int_t& month,Int_t& day,
			      Int_t& hour,Int_t& min  ,Int_t& sec,
			      Int_t timezone,Bool_t print)
{
    // recalulates the runID to broken time (year since 0, month 1-12,
    // day 1-31, min 0-59, sec 0-59)
    // The time stamp is given in local time of
    // the event builder (time zone = +1). Since there
    // is no way to determine from the runID allone
    // if summer/winter time (DST) has been used while
    // recording your have to provide your
    // local time zone.
    // For help with the time functions (time_t ...)
    // lookup man pages ctime,localtime,gmtime etc.
    // use gmtime()/localtime() to convert to broken down
    // time struct.

    time_t t = HTime::runIdToTime(runid,timezone,kFALSE);
    struct tm* t2 = gmtime(&t);



    year =  t2->tm_year     + 1900;   // since 1900
    month=  t2->tm_mon      + 1;      // 0-11
    day  =  t2->tm_mday;              // 1-31
    hour =  t2->tm_hour + timezone;   // 0-23
    min  =  t2->tm_min;               // 0-59
    sec  =  t2->tm_sec;               // 0-59

    if(print) {
	cout<<"runIdToBrokenTime : runID "<<runid<<" , timezone ="<<timezone
	    <<flush;
	printf(", %02i.%02i.%i, %02i:%02i:%02i\n",day,month,year,hour,min,sec);
    }
}

time_t HTime::getTimeFromEvtHeader(Bool_t print)
{
    // recalulates the time and date from the EventHeader
    // written by the CTS to unix time stamp.
    // For help with the time functions (time_t ...)
    // lookup man pages ctime,localtime,gmtime etc.
    // use gmtime()/localtime() to convert to broken down
    // time struct.

    time_t eventTime = 0;
    if(gHades && gHades->getCurrentEvent()){

	HEventHeader* evtHeader = gHades->getCurrentEvent()->getHeader();

	UInt_t evtHeaderTime = evtHeader->getTime();
	UInt_t evtHeaderDate = evtHeader->getDate();

	Int_t year = ((evtHeaderDate>>16) & 0xFF);
	Int_t month= ((evtHeaderDate>>8) & 0xFF);
	Int_t day  = (evtHeaderDate & 0xFF);

	Int_t hour = ((evtHeaderTime>>16) & 0xFF);
	Int_t min  = ((evtHeaderTime>>8) & 0xFF);
	Int_t sec  = (evtHeaderTime & 0xFF);

	struct tm t;
	time_t gtime;

	t.tm_year  = year;    // only years since  1900
	t.tm_mon   = month;   // counting from 0   0-11
	t.tm_mday  = day;     // counting from 1   1-31
	t.tm_hour  = hour;    //                   0-23
	t.tm_min   = min;     //                   0-59
	t.tm_sec   = sec;     //                   0-59 (leap 60)
	t.tm_isdst = 0;       //                  1=daylight saving time active  , 0 =not active, -1 not available find out from local timezone
                              //                  ~ endmarch - end october
	eventTime = mktime(&t);           // local time
	gtime = eventTime;//  no subtraction - 3600;  // gmtime :  +1 timezone substracted
	struct tm* t2 = gmtime(&gtime);  // we nee to compare to findout if DST was used

	if(t2->tm_hour+2 == hour) { // we have to use summer time (+1 time zone + summer shift)
	    t.tm_year  = year;   // only years since  1900
	    t.tm_mon   = month;  // counting from 0   0-11
	    t.tm_mday  = day;    // counting from 1   1-31
	    t.tm_hour  = hour;   //                   0-23
	    t.tm_min   = min;    //                   0-59
	    t.tm_sec   = sec;    //                   0-59 (leap 60)
	    t.tm_isdst = 1;
	    eventTime = mktime(&t);
	}
    }
    if(print) { cout<<"timeFromEventHeader : time = "<<eventTime<<" , "<<flush; printf("%s\n",ctime(&eventTime)); }
    return eventTime;
}

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