ROOT logo
//
//
// Last change: 19.4.06  B. Spruck

#include "htrbbaseunpacker.h"
#include "htrblookup.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////////
//                     HTrbBaseUnpacker
//            Base class for TRB data unpacking.
//  Any detector connected to TRB board should use this class to decode the subevent. 
//  Decode() method fills the arrays with information about: 
//  channel number (0-127), 
//  measured time, 
//  measured ADC.
//
//  The goal is to provide data which can be directly used by subsystems 
//  (tof, start, hodo, wall) in order to directly fill raw categories.
//
//  The most important information is stored in:	   
//  trbLeadingTime[ TrbChanNb ][ hitNb ],
//  trbADC[ TrbChanNb ][ hitNb ]. 
//  trbLeadingMult[ TrbChanNb ]
//
//  In case of Leading and Trailing mode the leading time and trailing time 
//  are delivered in separate data words. In this mode it can happen that 
//  a trailing time is missing. In such case trailing time is set to -1000000 
//  and ADC is set to -1. 
//
//  The information in Arrays is ordered in following way:
//  1. Leading Time has to exist -> fill trbLeadingTime[ TrbChanNb ][ hitNb ];
//  2. If Trailing time is found we try to marge it with last Leading Time.
//     If Trailing time does not exist trbLeadingTime[ TrbChanNb ][ hitNb ] = -1000000
//     If more than 1 Trailing time exist for one Leading Time the last one is used.
//  3. ADC is calculated only if Trailing time exist. 
//
//  Max. number of hits per channel is currently set to 10. 
//
//
//  In addition this class should perform basic data corrections and error handling.
//  (in preparation)
/////////////////////////////////////////////////////////////////////////////////


ClassImp(HTrbBaseUnpacker)

HTrbBaseUnpacker::HTrbBaseUnpacker(UInt_t id)  {
  // constructor
  debugFlag=0;
  subEvtId=id;
  trbDataVer=0;
  quietMode=false;
  reportCritical=false;
  lookup=0;
  clearAll();
}

void HTrbBaseUnpacker::clearAll(void){
  for(Int_t i=0; i<128; i++){
    for(Int_t k=0; k<10; k++){
      trbLeadingTime[i][k]  = -1000000;
      trbTrailingTime[i][k] = -1000000;
      trbADC[i][k]=-1; 
    }    
  //--  trbDataExtension[i]=0;
    trbLeadingMult[i]=0;  
    trbTrailingMult[i]=0;  
    trbTrailingTotalMult[i]=0;
  }
}

Int_t HTrbBaseUnpacker::correctRefTimeCh31(void){
  ///////////////////////////////////////////
  //
  // Reference signal from channel 31 of TDC
  // ist used for correction of corresponding TDC chns
  // this is not the final version of
  // hardware design
  // call this function only if channel 31 contains
  // reference time
  ///////////////////////////////////////////
  Int_t refCh; //= (Int_t)(chan / 32); // this will give one of the channels
  Int_t corrTime;
  // now do correction
  // scann all arrays which contain time data and do correction
  // Corr. Times are  stored in:
  // trbLeadingTime[refCh][0]  first hit !!!
  // where refCh = 31, 63, 95, 127;

  for(Int_t jj=0; jj<4; jj++){// For all TDC chips
    Int_t jo;// j offset
    Bool_t flag;
    // First check if there is ANY data on a TDC, if not, skip it
    flag=false;
    jo=jj*32;
    for(Int_t ll=0; ll<32; ll++){// For all TDC channels
      if( trbLeadingMult[jo+ll]>0){ flag=true; break;}
    }
    if(!flag) continue;

    // Yes there is data, now check reference
    refCh = jo+31;// gives ref Channel back

    corrTime = trbLeadingTime[refCh][0];

    // Think about it! no ref time means -> reject, other suggestions?
    if(corrTime <= -1000000 ){
//#warning "This Info message should be active for the beamtime!!!!!"
      if(!quietMode){
        Info("correctRefTimeCh31","No Ref Time! TRBid 0x%x TDC %d",subEvtId,jj);
      }
      corrTime=-1000000;// very big negative ... this means we do not have ref. time
//      continue; // this means we do not have ref. time
    }

    for(Int_t ll=0; ll<32; ll++){// For all TDC channels
      Int_t ii;
      ii=jo+ll;
      for(Int_t kk=0; kk<10; kk++){
        trbLeadingTime[ii][kk]  = trbLeadingTime[ii][kk] - corrTime + 40000;// We want poitive times here; 20000 ~ 2us
        trbTrailingTime[ii][kk] = trbTrailingTime[ii][kk] - corrTime + 40000;// thats bigger than max time window of TDC
      }
    }
  }

  return 0;
}

Int_t HTrbBaseUnpacker::correctRefTimeCh127(void){
  ///////////////////////////////////////////
  //
  // Reference signal from channel 127 (last in TRB)
  // ist used for correction of ALL TDCs
  // this is not the final version of
  // hardware design
  // call this function only if channel 127 contains
  // reference time
  ///////////////////////////////////////////
  Int_t corrTime;
  // now do correction
  // trbLeadingTime[127][0]  first hit !!!

  corrTime = trbLeadingTime[127][0];
  
  // Think about it! no ref time means -> reject, other suggestions?
  if(corrTime <= -1000000 ){
//#warning "This Info message should be active for the beamtime!!!!!"
    if(!quietMode){
      Info("correctRefTimeCh127","No Ref Time! TRBid 0x%x",subEvtId);
    }
      corrTime=-1000000;// very big negative ... this means we do not have ref. time
//    return 0; // this means we do not have ref. time
  }

  for(Int_t jj=0; jj<128; jj++){// For all channels
    for(Int_t kk=0; kk<10; kk++){
      trbLeadingTime[jj][kk]  = trbLeadingTime[jj][kk] - corrTime + 40000;// We want poitive times here; 20000 ~ 2us
      trbTrailingTime[jj][kk] = trbTrailingTime[jj][kk] - corrTime + 40000;// thats bigger than max time window of TDC
    }
  }

  return 0;
}

Int_t HTrbBaseUnpacker::correctOverflow(void){
  ///////////////////////////////////////////
  // TDC overflow has to be corrected
  ///////////////////////////////////////////
  // This is not necessary if the substract window bit is set in the TDCs
  return 0;
}


Bool_t HTrbBaseUnpacker::fill_pair(Int_t ch,Int_t time,Int_t length)
{
   ///////////////////////////////////////////
   // Stores the given time in the next data element
   // and sets the multiplicity.
   // Return false if 10 hits are already stored.
   ///////////////////////////////////////////

   if( trbLeadingMult[ch]<10){
      trbLeadingTime[ch][trbLeadingMult[ch]]=time;
      trbTrailingTime[ch][trbLeadingMult[ch]]=time+length;
   }
   trbLeadingMult[ch]++;
   trbTrailingMult[ch]=trbLeadingMult[ch];

   return(trbLeadingMult[ch]<=10);
}

Bool_t HTrbBaseUnpacker::fill_lead(Int_t ch,Int_t time)
{
   ///////////////////////////////////////////
   // Stores the given time in the next data element
   // and sets the multiplicity.
   // Return false if 10 hits are already stored.
   ///////////////////////////////////////////

   if( trbLeadingMult[ch]<10){
      trbLeadingTime[ch][trbLeadingMult[ch]]=time;
   }
   trbLeadingMult[ch]++;

   return(trbLeadingMult[ch]<=10);
}

Bool_t HTrbBaseUnpacker::fill_trail(Int_t ch,Int_t time)
{
   ///////////////////////////////////////////
   // Calculates the time between trailing and LAST(!) leading hit.
   // No other check if its really the right one,
   // i am depending on the TDC to deliver the right order
   // Return kFALSE if no leading yet or more than 4 Hits
   ///////////////////////////////////////////

   trbTrailingTotalMult[ch]++;
   
   Int_t m;// Leading Multiplicity
   m=trbLeadingMult[ch];
   if(m==0) return kFALSE;

   if( m<=10){
      if( trbTrailingMult[ch]!=m){
         trbTrailingTime[ch][m-1]=time;
         trbADC[ch][m-1] = time - trbLeadingTime[ch][m-1];
			if(trbADC[ch][m-1]<0){
				// cerr << "!!!!!!!!!!!!!!!!! WIDTH < 0 can not be!!! "<<time<<" - "<< trbLeadingTime[ch][m-1]<<endl;
				// this is eigther an big error or oan overflow because off too big time windows...
				// we guess the best
				trbADC[ch][m-1]+=0x80000;// correct for overflow
			}
      }else{
         return kFALSE;// In this case we already have one trailing
      }
   }
   trbTrailingMult[ch]=m;

   return(trbTrailingMult[ch]<=10);
}

void HTrbBaseUnpacker::PrintTdcError(UInt_t e, UInt_t subEvntId)
{
   const Char_t *e_str[15]={
      "Hit lost in group 0 from read-out FIFO overflow",
      "Hit lost in group 0 from L1 buffer overflow",
      "Hit error have been detected in group 0",
      "Hit lost in group 1 from read-out FIFO overflow",
      "Hit lost in group 1 from L1 buffer overflow",
      "Hit error have been detected in group 1",
      "Hit lost in group 2 from read-out FIFO overflow",
      "Hit lost in group 2 from L1 buffer overflow",
      "Hit error have been detected in group 2",
      "Hit lost in group 3 from read-out FIFO overflow",
      "Hit lost in group 3 from L1 buffer overflow",
      "Hit error have been detected in group 3",
      "Hits rejected because of programmed event size limit",
      "Event lost (trigger FIFO overflow)",
      "Internal fatal chip error has been detected"
   };

   if(e==0) return;// No Error

   cout << "=== TRB/TDC Error analysis: TRB id = " <<subEvntId<< endl;
   for(Int_t i=0; i<15; i++){
      if( e&0x1){
         cout << e_str[i] << endl;
      }
      e>>=1;
   }
   cout << "===" << endl;
}

Int_t HTrbBaseUnpacker::decode(void)
{
   clearAll();


   Int_t TdcId;
   Int_t nCountTDC = 0;

   UInt_t nEvtNr = 0;

   UInt_t nSizeCounter = 0;
   UInt_t nTdcEvtId = 0;
   UInt_t TdcDataLen=0;

   UInt_t uBlockSize=0;

   UInt_t* data = pSubEvt->getData();
   UInt_t* end  = pSubEvt->getEnd();

   if(debugFlag > 0){

      //Loop over all data in this subevt
      cout<<hex<<"data word: "<<*data<<dec<<"  --Subevent Header"<<endl;
   }

   // first word in subevent contains info about subevent size 0xbeef_6a_20 (magic,EvtId,length)
   // should be used for checking the subevent.

   if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
      printf("=== Unpacker start SubEvtId: %d\n===Header: %X  Nr:%d  Len:%d\n",subEvtId,*data>>16,nEvtNr,uBlockSize);
   }

   trbDataVer=0;
   trbExtensionSize=0;
   trbDataPairFlag=false;

   if(((*data >> 24) & 0xFF)!=0xBE) { // WE HAVE NEW DATA FORMAT 
                                      // check which data version we have (0xBE - old version)
     nSizeCounter++; // first header
     
     /* limit the size information from the TRB to 16bit length */ 
     uBlockSize=*data&0xFFFF;          
     nEvtNr=(*data>>16)&0xFF;
     data ++;
     nSizeCounter++;
     Int_t nData;
     trbDataVer = (*data>>24)&0xFF;
     trbDataPairFlag = (*data>>16)&0x1;
     trbExtensionSize = *data&0x0000FFFF;
     if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
       printf("=== Unpacker NewHeader: %08X  Ver:%d  Ext:%d Pair:%d\n",*data,trbDataVer,trbExtensionSize,(Int_t)trbDataPairFlag);
     }
     if(trbExtensionSize != 0){
       for(Int_t ext_cycle=0; ext_cycle<trbExtensionSize; ext_cycle++){
          data++;
          nSizeCounter++;
          nData = *data;
          if(trbExtensionSize < 128) {
             trbDataExtension[ext_cycle] = nData; 
          }
          else{
             cout<<"--TRBBASEUNPACKER-SubEventId= "<<subEvtId<<" too many data words, limit is 128"<<endl;
          }
       }
     }
   }
   else { // HERE WE HAVE OLD DATA FORMAT
   if((*data&0xFFFF0000)==0xBE010000){ 
      if(!quietMode)Error("TRB unpack","TRB Buffer overflow, Data truncated. No lethal error, but please report if error is persistend!!!");
      return(kFALSE);
   }

   // BEEF has been replaced ny BE00 before the Beamtime, I only need it for
   // analysis of test files ... remove after Beamtime
   if((*data&0xFFFF0000)!=0xBEEF0000 && (*data&0xFFFF0000)!=0xBE000000){
      if(!quietMode)Error("TRB unpack","NO $BEEF FOUND!!!");
//      exit();
   }
   uBlockSize=*data&0xFF;
   nEvtNr=(*data>>8)&0xFF;

   if(nEvtNr!=(UInt_t)pSubEvt->getTrigNr()){
       if(!quietMode){
	   Error("TRB unpack","TRB EvtNr!=pSubEvt->getTrigNr() ********* Event Mixing *********");
	   printf("=== %d != %d \n",nEvtNr,(UInt_t)pSubEvt->getTrigNr());
       }
      return(kFALSE);
   }

//   if(uBlockSize<10){
#warning "Change value to 10 if all TRBs have 4 TDCs after beamtime may06"
   if(uBlockSize<8){
      if(!quietMode)printf("Error in TRB unpack: Suspicious length (too small for header/trailer of tdcs) %d , might be a overflow!\n",uBlockSize);
   }

     nSizeCounter++;// First one already processed
   } // end of the OLD data format
   while ( ++data<end && *data!=0x0 )
   {
      UInt_t dataword;
      dataword=*data;//[ii];

      nSizeCounter++;

      if(dataword==0xDEADFACE){
         if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
            printf("TRB unpack: Found DEADFACE -> break %08X %08X\n",*data,*end);
         }
         break;
      }

      TdcId=(dataword>>24)&0xF;// might be wrong for TRB board
      TdcId=nCountTDC;


      if(TdcDataLen>0) TdcDataLen++;

      switch(dataword>>28){// Raw TDC Data
         case 0:{// Group Header
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found GLOBAL Header $%08X\n",dataword);
            } 
            if(!quietMode)Info("TRB unpack","Global Header not expected!");
            break;
         }
         case 1:{// Group Trailer
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found GLOBAL Trailer $%08X\n",dataword);
            }
            if(!quietMode)Info("TRB unpack","Global Trailer not expected!");
            break;
         }
         case 2:{// TDC Header
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found TDC %d Header $%04X $%04X\n",TdcId,(dataword>>12)&0xFFF,dataword&0xFFF);
            }
            if( nCountTDC>0 && nTdcEvtId!=((dataword>>12)&0xFFF)){
               if(!quietMode)Error("TRB unpack","TDCs have different EventIds ******* Event Mixing *******");
               if(!quietMode)printf("nTdcEvtId: %06X   dataword:  %06X  nEvtNr: %02X\n" , nTdcEvtId ,((dataword>>12)&0xFFF),nEvtNr);
//               exit();
//               return(kFALSE);
            }
            if( nEvtNr!=((dataword>>12)&0xFF)){
               if(!quietMode)Error("TRB unpack","TDC EventIds != Main EventId ******* Event Mixing *******");
               if(!quietMode)printf("nTdcEvtId: %06X   dataword:  %06X  nEvtNr: %02X\n" , nTdcEvtId ,((dataword>>12)&0xFFF),nEvtNr);
//               exit();
//               return(kFALSE);
            }
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("nTdcEvtId: %06X   dataword:  %06X  nEvtNr: %02X\n" , nTdcEvtId ,((dataword>>12)&0xFFF),nEvtNr);
            }
            nTdcEvtId=(dataword>>12)&0xFFF;

            TdcDataLen=1;
            break;
         }
         case 3:{// TDC Trailer
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found TDC %d Trailer $%04X $%04X\n",TdcId,(dataword>>12)&0xFFF,dataword&0xFFF);
            }
            if(TdcDataLen!=(dataword&0xFFF)){
               if(!quietMode)Error("TRB unpack","TdcDataLen!= length in Trailer!");
               if(!quietMode)printf("TRB unpack: TdcDataLen %d != %d ",TdcDataLen,dataword&0xFFF);
            }
            TdcDataLen=0;
            if( nTdcEvtId!=((dataword>>12)&0xFFF)){
               if(!quietMode)Error("TRB unpack","TDC Header and Trailer have different EventIds");
//               exit();
//               return(kFALSE);
            }
            nCountTDC++;
            break;
         }
         case 4:{// TDC DATA Leading
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found TDC %d Lead Data $%08X\n",TdcId,dataword);
            }
            Int_t nData, nChannel;
            nChannel=(dataword>>19)&0x1f; // decode channel
            nChannel+=TdcId*32;
            nData=dataword&0x7ffff;   // decode 19bit data
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("(Chan,Data) %3d, %d\n",nChannel,nData);
            }
            // this is for SINGLE LEADING/TRAILING EDGE measurements only!!!
            // No check if the order is correct!!!
            // i am depending on the TDC to deliver the right order
            if(trbDataPairFlag){
               if(!fill_pair(nChannel,nData&0xFFFF,(nData>>12)&0x7F)){
                  //printf("Too many Hits\n");
               }
            }else{// Leading as usual
               if(!fill_lead(nChannel,nData)){
                  //printf("Too many Hits\n");
               }
            }
            break;
         }
         case 5:{// TDC DATA Trailing
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("TRB unpack: Found TDC %d Trail Data $%08X\n",TdcId,dataword);
            } 
            Int_t nData, nChannel;
            nChannel=(dataword>>19)&0x1f; // decode channel
            nChannel+=TdcId*32;
            nData=dataword&0x7ffff;   // decode 19bit data
            if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
               printf("(Chan,Data) %3d, %d\n",nChannel,nData);
            }
            // this is for SINGLE LEADING/TRAILING EDGE measurements only!!!
            // No check if the order is correct!!!
            // i am depending on the TDC to deliver the right order
            if(!fill_trail(nChannel,nData)){
               //printf("Trailing without Leading or Too many Hits\n");
            }
            break;
         }
         case 6:{// TDC ERROR
            if((dataword&0x7FFF)==0x1000){// special case for non fatal errors
               if(!quietMode)Info("TRB unpack","TDC Event Size Limit exceeded!\n");
               if(!quietMode)printf("(TDC %d Error Event Size Limit: $%08X)\n",TdcId,dataword);
            }else{
               if(!quietMode)Info("TRB unpack","Found TDC Error(s)!\n");
               if(!quietMode)printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
               if(!quietMode){
                 PrintTdcError(dataword&0x7FFF,subEvtId);
               }else if(reportCritical && (dataword&0x6000)!=0){
                  Error("TRB unpack","Found CRITICAL error");
                  if((dataword&0x2000)!=0){
                    Error("TRB unpack","Event lost (trigger FIFO overflow)");
                    printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
                  }else if((dataword&0x4000)!=0){
                    printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
                    Error("TRB unpack","Internal fatal chip error has been detected");                    
                  }
               }
            }
            break;
         }
         case 7:{// Debug Info
            if(!quietMode)Error("TRB unpack","Found DEBUG Info");
            if(!quietMode)printf("TRB unpack: TDC %d: Found Debug Info $%08X",TdcId,dataword);
            break;
         }
         default:{// not defined!
            if(!quietMode)Error("TRB unpack","Found UNDEFINED data");
            if(!quietMode)printf("TRB unpack: TDC %d: Found undefined $%08X",TdcId,dataword);
            break;
         }
      }
   }

   if(nCountTDC!=4){
      if( nCountTDC<4){
#warning "Comment this in after may06 beamtime"
//         Error("TRB unpack","TDC count <4 -> TDC data missing!!!");
      }else{
         if(!quietMode)Error("TRB unpack","TDC count >4 -> additional TDC data!!!");
      }
   }

   if(uBlockSize!=nSizeCounter){
      cout<<" --Blok size ="<<uBlockSize<<" , counter Size: "<<nSizeCounter <<endl; 
      if(!quietMode)Error("TRB unpack","Blocksize!=Counted words!!!");
   }
   if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))){
      printf("==== Unpacker end (%d)\n\n",subEvtId);
   }
   return(kTRUE);
}
 htrbbaseunpacker.cc:1
 htrbbaseunpacker.cc:2
 htrbbaseunpacker.cc:3
 htrbbaseunpacker.cc:4
 htrbbaseunpacker.cc:5
 htrbbaseunpacker.cc:6
 htrbbaseunpacker.cc:7
 htrbbaseunpacker.cc:8
 htrbbaseunpacker.cc:9
 htrbbaseunpacker.cc:10
 htrbbaseunpacker.cc:11
 htrbbaseunpacker.cc:12
 htrbbaseunpacker.cc:13
 htrbbaseunpacker.cc:14
 htrbbaseunpacker.cc:15
 htrbbaseunpacker.cc:16
 htrbbaseunpacker.cc:17
 htrbbaseunpacker.cc:18
 htrbbaseunpacker.cc:19
 htrbbaseunpacker.cc:20
 htrbbaseunpacker.cc:21
 htrbbaseunpacker.cc:22
 htrbbaseunpacker.cc:23
 htrbbaseunpacker.cc:24
 htrbbaseunpacker.cc:25
 htrbbaseunpacker.cc:26
 htrbbaseunpacker.cc:27
 htrbbaseunpacker.cc:28
 htrbbaseunpacker.cc:29
 htrbbaseunpacker.cc:30
 htrbbaseunpacker.cc:31
 htrbbaseunpacker.cc:32
 htrbbaseunpacker.cc:33
 htrbbaseunpacker.cc:34
 htrbbaseunpacker.cc:35
 htrbbaseunpacker.cc:36
 htrbbaseunpacker.cc:37
 htrbbaseunpacker.cc:38
 htrbbaseunpacker.cc:39
 htrbbaseunpacker.cc:40
 htrbbaseunpacker.cc:41
 htrbbaseunpacker.cc:42
 htrbbaseunpacker.cc:43
 htrbbaseunpacker.cc:44
 htrbbaseunpacker.cc:45
 htrbbaseunpacker.cc:46
 htrbbaseunpacker.cc:47
 htrbbaseunpacker.cc:48
 htrbbaseunpacker.cc:49
 htrbbaseunpacker.cc:50
 htrbbaseunpacker.cc:51
 htrbbaseunpacker.cc:52
 htrbbaseunpacker.cc:53
 htrbbaseunpacker.cc:54
 htrbbaseunpacker.cc:55
 htrbbaseunpacker.cc:56
 htrbbaseunpacker.cc:57
 htrbbaseunpacker.cc:58
 htrbbaseunpacker.cc:59
 htrbbaseunpacker.cc:60
 htrbbaseunpacker.cc:61
 htrbbaseunpacker.cc:62
 htrbbaseunpacker.cc:63
 htrbbaseunpacker.cc:64
 htrbbaseunpacker.cc:65
 htrbbaseunpacker.cc:66
 htrbbaseunpacker.cc:67
 htrbbaseunpacker.cc:68
 htrbbaseunpacker.cc:69
 htrbbaseunpacker.cc:70
 htrbbaseunpacker.cc:71
 htrbbaseunpacker.cc:72
 htrbbaseunpacker.cc:73
 htrbbaseunpacker.cc:74
 htrbbaseunpacker.cc:75
 htrbbaseunpacker.cc:76
 htrbbaseunpacker.cc:77
 htrbbaseunpacker.cc:78
 htrbbaseunpacker.cc:79
 htrbbaseunpacker.cc:80
 htrbbaseunpacker.cc:81
 htrbbaseunpacker.cc:82
 htrbbaseunpacker.cc:83
 htrbbaseunpacker.cc:84
 htrbbaseunpacker.cc:85
 htrbbaseunpacker.cc:86
 htrbbaseunpacker.cc:87
 htrbbaseunpacker.cc:88
 htrbbaseunpacker.cc:89
 htrbbaseunpacker.cc:90
 htrbbaseunpacker.cc:91
 htrbbaseunpacker.cc:92
 htrbbaseunpacker.cc:93
 htrbbaseunpacker.cc:94
 htrbbaseunpacker.cc:95
 htrbbaseunpacker.cc:96
 htrbbaseunpacker.cc:97
 htrbbaseunpacker.cc:98
 htrbbaseunpacker.cc:99
 htrbbaseunpacker.cc:100
 htrbbaseunpacker.cc:101
 htrbbaseunpacker.cc:102
 htrbbaseunpacker.cc:103
 htrbbaseunpacker.cc:104
 htrbbaseunpacker.cc:105
 htrbbaseunpacker.cc:106
 htrbbaseunpacker.cc:107
 htrbbaseunpacker.cc:108
 htrbbaseunpacker.cc:109
 htrbbaseunpacker.cc:110
 htrbbaseunpacker.cc:111
 htrbbaseunpacker.cc:112
 htrbbaseunpacker.cc:113
 htrbbaseunpacker.cc:114
 htrbbaseunpacker.cc:115
 htrbbaseunpacker.cc:116
 htrbbaseunpacker.cc:117
 htrbbaseunpacker.cc:118
 htrbbaseunpacker.cc:119
 htrbbaseunpacker.cc:120
 htrbbaseunpacker.cc:121
 htrbbaseunpacker.cc:122
 htrbbaseunpacker.cc:123
 htrbbaseunpacker.cc:124
 htrbbaseunpacker.cc:125
 htrbbaseunpacker.cc:126
 htrbbaseunpacker.cc:127
 htrbbaseunpacker.cc:128
 htrbbaseunpacker.cc:129
 htrbbaseunpacker.cc:130
 htrbbaseunpacker.cc:131
 htrbbaseunpacker.cc:132
 htrbbaseunpacker.cc:133
 htrbbaseunpacker.cc:134
 htrbbaseunpacker.cc:135
 htrbbaseunpacker.cc:136
 htrbbaseunpacker.cc:137
 htrbbaseunpacker.cc:138
 htrbbaseunpacker.cc:139
 htrbbaseunpacker.cc:140
 htrbbaseunpacker.cc:141
 htrbbaseunpacker.cc:142
 htrbbaseunpacker.cc:143
 htrbbaseunpacker.cc:144
 htrbbaseunpacker.cc:145
 htrbbaseunpacker.cc:146
 htrbbaseunpacker.cc:147
 htrbbaseunpacker.cc:148
 htrbbaseunpacker.cc:149
 htrbbaseunpacker.cc:150
 htrbbaseunpacker.cc:151
 htrbbaseunpacker.cc:152
 htrbbaseunpacker.cc:153
 htrbbaseunpacker.cc:154
 htrbbaseunpacker.cc:155
 htrbbaseunpacker.cc:156
 htrbbaseunpacker.cc:157
 htrbbaseunpacker.cc:158
 htrbbaseunpacker.cc:159
 htrbbaseunpacker.cc:160
 htrbbaseunpacker.cc:161
 htrbbaseunpacker.cc:162
 htrbbaseunpacker.cc:163
 htrbbaseunpacker.cc:164
 htrbbaseunpacker.cc:165
 htrbbaseunpacker.cc:166
 htrbbaseunpacker.cc:167
 htrbbaseunpacker.cc:168
 htrbbaseunpacker.cc:169
 htrbbaseunpacker.cc:170
 htrbbaseunpacker.cc:171
 htrbbaseunpacker.cc:172
 htrbbaseunpacker.cc:173
 htrbbaseunpacker.cc:174
 htrbbaseunpacker.cc:175
 htrbbaseunpacker.cc:176
 htrbbaseunpacker.cc:177
 htrbbaseunpacker.cc:178
 htrbbaseunpacker.cc:179
 htrbbaseunpacker.cc:180
 htrbbaseunpacker.cc:181
 htrbbaseunpacker.cc:182
 htrbbaseunpacker.cc:183
 htrbbaseunpacker.cc:184
 htrbbaseunpacker.cc:185
 htrbbaseunpacker.cc:186
 htrbbaseunpacker.cc:187
 htrbbaseunpacker.cc:188
 htrbbaseunpacker.cc:189
 htrbbaseunpacker.cc:190
 htrbbaseunpacker.cc:191
 htrbbaseunpacker.cc:192
 htrbbaseunpacker.cc:193
 htrbbaseunpacker.cc:194
 htrbbaseunpacker.cc:195
 htrbbaseunpacker.cc:196
 htrbbaseunpacker.cc:197
 htrbbaseunpacker.cc:198
 htrbbaseunpacker.cc:199
 htrbbaseunpacker.cc:200
 htrbbaseunpacker.cc:201
 htrbbaseunpacker.cc:202
 htrbbaseunpacker.cc:203
 htrbbaseunpacker.cc:204
 htrbbaseunpacker.cc:205
 htrbbaseunpacker.cc:206
 htrbbaseunpacker.cc:207
 htrbbaseunpacker.cc:208
 htrbbaseunpacker.cc:209
 htrbbaseunpacker.cc:210
 htrbbaseunpacker.cc:211
 htrbbaseunpacker.cc:212
 htrbbaseunpacker.cc:213
 htrbbaseunpacker.cc:214
 htrbbaseunpacker.cc:215
 htrbbaseunpacker.cc:216
 htrbbaseunpacker.cc:217
 htrbbaseunpacker.cc:218
 htrbbaseunpacker.cc:219
 htrbbaseunpacker.cc:220
 htrbbaseunpacker.cc:221
 htrbbaseunpacker.cc:222
 htrbbaseunpacker.cc:223
 htrbbaseunpacker.cc:224
 htrbbaseunpacker.cc:225
 htrbbaseunpacker.cc:226
 htrbbaseunpacker.cc:227
 htrbbaseunpacker.cc:228
 htrbbaseunpacker.cc:229
 htrbbaseunpacker.cc:230
 htrbbaseunpacker.cc:231
 htrbbaseunpacker.cc:232
 htrbbaseunpacker.cc:233
 htrbbaseunpacker.cc:234
 htrbbaseunpacker.cc:235
 htrbbaseunpacker.cc:236
 htrbbaseunpacker.cc:237
 htrbbaseunpacker.cc:238
 htrbbaseunpacker.cc:239
 htrbbaseunpacker.cc:240
 htrbbaseunpacker.cc:241
 htrbbaseunpacker.cc:242
 htrbbaseunpacker.cc:243
 htrbbaseunpacker.cc:244
 htrbbaseunpacker.cc:245
 htrbbaseunpacker.cc:246
 htrbbaseunpacker.cc:247
 htrbbaseunpacker.cc:248
 htrbbaseunpacker.cc:249
 htrbbaseunpacker.cc:250
 htrbbaseunpacker.cc:251
 htrbbaseunpacker.cc:252
 htrbbaseunpacker.cc:253
 htrbbaseunpacker.cc:254
 htrbbaseunpacker.cc:255
 htrbbaseunpacker.cc:256
 htrbbaseunpacker.cc:257
 htrbbaseunpacker.cc:258
 htrbbaseunpacker.cc:259
 htrbbaseunpacker.cc:260
 htrbbaseunpacker.cc:261
 htrbbaseunpacker.cc:262
 htrbbaseunpacker.cc:263
 htrbbaseunpacker.cc:264
 htrbbaseunpacker.cc:265
 htrbbaseunpacker.cc:266
 htrbbaseunpacker.cc:267
 htrbbaseunpacker.cc:268
 htrbbaseunpacker.cc:269
 htrbbaseunpacker.cc:270
 htrbbaseunpacker.cc:271
 htrbbaseunpacker.cc:272
 htrbbaseunpacker.cc:273
 htrbbaseunpacker.cc:274
 htrbbaseunpacker.cc:275
 htrbbaseunpacker.cc:276
 htrbbaseunpacker.cc:277
 htrbbaseunpacker.cc:278
 htrbbaseunpacker.cc:279
 htrbbaseunpacker.cc:280
 htrbbaseunpacker.cc:281
 htrbbaseunpacker.cc:282
 htrbbaseunpacker.cc:283
 htrbbaseunpacker.cc:284
 htrbbaseunpacker.cc:285
 htrbbaseunpacker.cc:286
 htrbbaseunpacker.cc:287
 htrbbaseunpacker.cc:288
 htrbbaseunpacker.cc:289
 htrbbaseunpacker.cc:290
 htrbbaseunpacker.cc:291
 htrbbaseunpacker.cc:292
 htrbbaseunpacker.cc:293
 htrbbaseunpacker.cc:294
 htrbbaseunpacker.cc:295
 htrbbaseunpacker.cc:296
 htrbbaseunpacker.cc:297
 htrbbaseunpacker.cc:298
 htrbbaseunpacker.cc:299
 htrbbaseunpacker.cc:300
 htrbbaseunpacker.cc:301
 htrbbaseunpacker.cc:302
 htrbbaseunpacker.cc:303
 htrbbaseunpacker.cc:304
 htrbbaseunpacker.cc:305
 htrbbaseunpacker.cc:306
 htrbbaseunpacker.cc:307
 htrbbaseunpacker.cc:308
 htrbbaseunpacker.cc:309
 htrbbaseunpacker.cc:310
 htrbbaseunpacker.cc:311
 htrbbaseunpacker.cc:312
 htrbbaseunpacker.cc:313
 htrbbaseunpacker.cc:314
 htrbbaseunpacker.cc:315
 htrbbaseunpacker.cc:316
 htrbbaseunpacker.cc:317
 htrbbaseunpacker.cc:318
 htrbbaseunpacker.cc:319
 htrbbaseunpacker.cc:320
 htrbbaseunpacker.cc:321
 htrbbaseunpacker.cc:322
 htrbbaseunpacker.cc:323
 htrbbaseunpacker.cc:324
 htrbbaseunpacker.cc:325
 htrbbaseunpacker.cc:326
 htrbbaseunpacker.cc:327
 htrbbaseunpacker.cc:328
 htrbbaseunpacker.cc:329
 htrbbaseunpacker.cc:330
 htrbbaseunpacker.cc:331
 htrbbaseunpacker.cc:332
 htrbbaseunpacker.cc:333
 htrbbaseunpacker.cc:334
 htrbbaseunpacker.cc:335
 htrbbaseunpacker.cc:336
 htrbbaseunpacker.cc:337
 htrbbaseunpacker.cc:338
 htrbbaseunpacker.cc:339
 htrbbaseunpacker.cc:340
 htrbbaseunpacker.cc:341
 htrbbaseunpacker.cc:342
 htrbbaseunpacker.cc:343
 htrbbaseunpacker.cc:344
 htrbbaseunpacker.cc:345
 htrbbaseunpacker.cc:346
 htrbbaseunpacker.cc:347
 htrbbaseunpacker.cc:348
 htrbbaseunpacker.cc:349
 htrbbaseunpacker.cc:350
 htrbbaseunpacker.cc:351
 htrbbaseunpacker.cc:352
 htrbbaseunpacker.cc:353
 htrbbaseunpacker.cc:354
 htrbbaseunpacker.cc:355
 htrbbaseunpacker.cc:356
 htrbbaseunpacker.cc:357
 htrbbaseunpacker.cc:358
 htrbbaseunpacker.cc:359
 htrbbaseunpacker.cc:360
 htrbbaseunpacker.cc:361
 htrbbaseunpacker.cc:362
 htrbbaseunpacker.cc:363
 htrbbaseunpacker.cc:364
 htrbbaseunpacker.cc:365
 htrbbaseunpacker.cc:366
 htrbbaseunpacker.cc:367
 htrbbaseunpacker.cc:368
 htrbbaseunpacker.cc:369
 htrbbaseunpacker.cc:370
 htrbbaseunpacker.cc:371
 htrbbaseunpacker.cc:372
 htrbbaseunpacker.cc:373
 htrbbaseunpacker.cc:374
 htrbbaseunpacker.cc:375
 htrbbaseunpacker.cc:376
 htrbbaseunpacker.cc:377
 htrbbaseunpacker.cc:378
 htrbbaseunpacker.cc:379
 htrbbaseunpacker.cc:380
 htrbbaseunpacker.cc:381
 htrbbaseunpacker.cc:382
 htrbbaseunpacker.cc:383
 htrbbaseunpacker.cc:384
 htrbbaseunpacker.cc:385
 htrbbaseunpacker.cc:386
 htrbbaseunpacker.cc:387
 htrbbaseunpacker.cc:388
 htrbbaseunpacker.cc:389
 htrbbaseunpacker.cc:390
 htrbbaseunpacker.cc:391
 htrbbaseunpacker.cc:392
 htrbbaseunpacker.cc:393
 htrbbaseunpacker.cc:394
 htrbbaseunpacker.cc:395
 htrbbaseunpacker.cc:396
 htrbbaseunpacker.cc:397
 htrbbaseunpacker.cc:398
 htrbbaseunpacker.cc:399
 htrbbaseunpacker.cc:400
 htrbbaseunpacker.cc:401
 htrbbaseunpacker.cc:402
 htrbbaseunpacker.cc:403
 htrbbaseunpacker.cc:404
 htrbbaseunpacker.cc:405
 htrbbaseunpacker.cc:406
 htrbbaseunpacker.cc:407
 htrbbaseunpacker.cc:408
 htrbbaseunpacker.cc:409
 htrbbaseunpacker.cc:410
 htrbbaseunpacker.cc:411
 htrbbaseunpacker.cc:412
 htrbbaseunpacker.cc:413
 htrbbaseunpacker.cc:414
 htrbbaseunpacker.cc:415
 htrbbaseunpacker.cc:416
 htrbbaseunpacker.cc:417
 htrbbaseunpacker.cc:418
 htrbbaseunpacker.cc:419
 htrbbaseunpacker.cc:420
 htrbbaseunpacker.cc:421
 htrbbaseunpacker.cc:422
 htrbbaseunpacker.cc:423
 htrbbaseunpacker.cc:424
 htrbbaseunpacker.cc:425
 htrbbaseunpacker.cc:426
 htrbbaseunpacker.cc:427
 htrbbaseunpacker.cc:428
 htrbbaseunpacker.cc:429
 htrbbaseunpacker.cc:430
 htrbbaseunpacker.cc:431
 htrbbaseunpacker.cc:432
 htrbbaseunpacker.cc:433
 htrbbaseunpacker.cc:434
 htrbbaseunpacker.cc:435
 htrbbaseunpacker.cc:436
 htrbbaseunpacker.cc:437
 htrbbaseunpacker.cc:438
 htrbbaseunpacker.cc:439
 htrbbaseunpacker.cc:440
 htrbbaseunpacker.cc:441
 htrbbaseunpacker.cc:442
 htrbbaseunpacker.cc:443
 htrbbaseunpacker.cc:444
 htrbbaseunpacker.cc:445
 htrbbaseunpacker.cc:446
 htrbbaseunpacker.cc:447
 htrbbaseunpacker.cc:448
 htrbbaseunpacker.cc:449
 htrbbaseunpacker.cc:450
 htrbbaseunpacker.cc:451
 htrbbaseunpacker.cc:452
 htrbbaseunpacker.cc:453
 htrbbaseunpacker.cc:454
 htrbbaseunpacker.cc:455
 htrbbaseunpacker.cc:456
 htrbbaseunpacker.cc:457
 htrbbaseunpacker.cc:458
 htrbbaseunpacker.cc:459
 htrbbaseunpacker.cc:460
 htrbbaseunpacker.cc:461
 htrbbaseunpacker.cc:462
 htrbbaseunpacker.cc:463
 htrbbaseunpacker.cc:464
 htrbbaseunpacker.cc:465
 htrbbaseunpacker.cc:466
 htrbbaseunpacker.cc:467
 htrbbaseunpacker.cc:468
 htrbbaseunpacker.cc:469
 htrbbaseunpacker.cc:470
 htrbbaseunpacker.cc:471
 htrbbaseunpacker.cc:472
 htrbbaseunpacker.cc:473
 htrbbaseunpacker.cc:474
 htrbbaseunpacker.cc:475
 htrbbaseunpacker.cc:476
 htrbbaseunpacker.cc:477
 htrbbaseunpacker.cc:478
 htrbbaseunpacker.cc:479
 htrbbaseunpacker.cc:480
 htrbbaseunpacker.cc:481
 htrbbaseunpacker.cc:482
 htrbbaseunpacker.cc:483
 htrbbaseunpacker.cc:484
 htrbbaseunpacker.cc:485
 htrbbaseunpacker.cc:486
 htrbbaseunpacker.cc:487
 htrbbaseunpacker.cc:488
 htrbbaseunpacker.cc:489
 htrbbaseunpacker.cc:490
 htrbbaseunpacker.cc:491
 htrbbaseunpacker.cc:492
 htrbbaseunpacker.cc:493
 htrbbaseunpacker.cc:494
 htrbbaseunpacker.cc:495
 htrbbaseunpacker.cc:496
 htrbbaseunpacker.cc:497
 htrbbaseunpacker.cc:498
 htrbbaseunpacker.cc:499
 htrbbaseunpacker.cc:500
 htrbbaseunpacker.cc:501
 htrbbaseunpacker.cc:502
 htrbbaseunpacker.cc:503
 htrbbaseunpacker.cc:504
 htrbbaseunpacker.cc:505
 htrbbaseunpacker.cc:506
 htrbbaseunpacker.cc:507
 htrbbaseunpacker.cc:508
 htrbbaseunpacker.cc:509
 htrbbaseunpacker.cc:510
 htrbbaseunpacker.cc:511
 htrbbaseunpacker.cc:512
 htrbbaseunpacker.cc:513
 htrbbaseunpacker.cc:514
 htrbbaseunpacker.cc:515
 htrbbaseunpacker.cc:516
 htrbbaseunpacker.cc:517
 htrbbaseunpacker.cc:518
 htrbbaseunpacker.cc:519
 htrbbaseunpacker.cc:520
 htrbbaseunpacker.cc:521
 htrbbaseunpacker.cc:522
 htrbbaseunpacker.cc:523
 htrbbaseunpacker.cc:524
 htrbbaseunpacker.cc:525
 htrbbaseunpacker.cc:526
 htrbbaseunpacker.cc:527
 htrbbaseunpacker.cc:528
 htrbbaseunpacker.cc:529
 htrbbaseunpacker.cc:530
 htrbbaseunpacker.cc:531
 htrbbaseunpacker.cc:532
 htrbbaseunpacker.cc:533
 htrbbaseunpacker.cc:534
 htrbbaseunpacker.cc:535
 htrbbaseunpacker.cc:536
 htrbbaseunpacker.cc:537
 htrbbaseunpacker.cc:538
 htrbbaseunpacker.cc:539
 htrbbaseunpacker.cc:540
 htrbbaseunpacker.cc:541
 htrbbaseunpacker.cc:542
 htrbbaseunpacker.cc:543
 htrbbaseunpacker.cc:544
 htrbbaseunpacker.cc:545
 htrbbaseunpacker.cc:546
 htrbbaseunpacker.cc:547
 htrbbaseunpacker.cc:548
 htrbbaseunpacker.cc:549
 htrbbaseunpacker.cc:550
 htrbbaseunpacker.cc:551
 htrbbaseunpacker.cc:552
 htrbbaseunpacker.cc:553