ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Witold Przygoda (przygoda@psja1.if.uj.edu.pl)
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//*-- Bugfixes: Wolfgang Koenig <w.koenig@gsi.de> 2013
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichRingFind
//
//  Ring recognition algorithms. This class isn't any task but it is called
//  for each event from the HRichAnalysis::execute() function.
//
//////////////////////////////////////////////////////////////////////////////


#include "TList.h"
#include "TRandom.h"

#include "hrichanalysis.h"
#include "hrichanalysispar.h"
#include "hrichgeometrypar.h"
#include "hrichhit.h"
#include "hrichhitcandidate.h"
#include "hrichringfind.h"
#include "hruntimedb.h"

#include <iomanip>
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

ClassImp(HRichRingFind)

//----------------------------------------------------------------------------
HRichRingFind::HRichRingFind()
{
   fClusterLMax4      = 0.;
   fClusterLMax8      = 0.;
   fClusterSize       = 0.;
   fMaxClusterSize    = 0;
   fMaxClusterSum     = 0;
   fMaxThrClusterSize = 0;
   iInnerCount        = 0;
   iInnerPhot4        = 0;
   iInnerPhot8        = 0;
   iMatrixHalfSize    = 0;
   iMatrixSize        = 0;
   iRingImageSize     = 0;
   iRingNr            = 0;
   lx_from            = 0;
   lx_to              = 0;
   ly_from            = 0;
   ly_to              = 0;
   maxCols            = 0;
   maxRows            = 0;
   maxRings           = 0;

   iPadCol.Set(1000);
   iPadPlane.Set(16384);
   iPadPlaneCopy.Set(16384);
   iPadRow.Set(1000);
   iRingTempImage.Set(256);

   pRings          = NULL;
   pAnalysisParams = NULL;
   pGeometryParams = NULL;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::init(HRichAnalysis* showMe)
{

   pAnalysisParams = showMe->getAnalysisPar();
   pGeometryParams = showMe->getGeometryPar();

   iInnerCount   = 0;
   iInnerPhot4   = 0;
   iInnerPhot8   = 0;
   fClusterSize  = 0.;
   fClusterLMax4 = 0.;
   fClusterLMax8 = 0.;
   iRingNr       = 0;
   iRingImageSize = pAnalysisParams->iRingMaskSize;
   iRingTempImage.Set(iRingImageSize * iRingImageSize);
   iPadPlane.Set(pGeometryParams->getPadsNr());
   iPadPlaneCopy.Set(pGeometryParams->getPadsNr());
   iPadCol.Set(pAnalysisParams->maxFiredSectorPads);
   iPadRow.Set(pAnalysisParams->maxFiredSectorPads);
   iPadActive.Set(pGeometryParams->getPadsNr());
   for (Int_t i = 0; i < pGeometryParams->getPadsNr(); ++i) {
      if (pGeometryParams->getPadsPar()->getPad(i)->getPadActive() > 0)
         iPadActive[i] = 1;
      else iPadActive[i] = 0;
   }
   maxCols = showMe->GetPadsXNr();
   maxRows = showMe->GetPadsYNr();

   iMatrixSize = pAnalysisParams->iRingMatrixSize;
   iMatrixHalfSize = iMatrixSize / 2;
   fMaxClusterSize = 0;
   fMaxClusterSum  = 0;
   fMaxThrClusterSize = 0;


   fHitList1.Delete();
   fHitList2.Delete();
   fHitCandidate.Delete();

   if( pAnalysisParams->iSuperiorAlgorithmID < 3) {
      Int_t maxRings1=0;
      Int_t maxRings2=0;
      if (pAnalysisParams->isActiveRingFindFitMatrix) maxRings1 = pAnalysisParams->iHowManyFitMatrixRings;
      if (pAnalysisParams->isActiveRingHoughTransf) maxRings2 = pAnalysisParams->iHowManyHoughTransfRings;
      maxRings = (maxRings1 > maxRings2) ? maxRings1 : maxRings2;
   } else { // sum of rings found by each algorithm is stored
      maxRings = 0;
      if (pAnalysisParams->isActiveRingFindFitMatrix) maxRings += pAnalysisParams->iHowManyFitMatrixRings;
      if (pAnalysisParams->isActiveRingHoughTransf) maxRings += pAnalysisParams->iHowManyHoughTransfRings;
   }

   pRings = new HRichHit[maxRings];
   showMe->pRings = pRings;

   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
HRichRingFind::~HRichRingFind()
{
   if (NULL != pRings) {
      delete [] pRings;
      pRings = NULL;
   }
}
//============================================================================
/*
//----------------------------------------------------------------------------
HRichRingFind::HRichRingFind(const HRichRingFind& source)
{
   cerr << "HRichRingFind object can not be initialized with values of another object!\n";
   cerr << "Default constructor will be called.\n";
   HRichRingFind();
}
//============================================================================

//----------------------------------------------------------------------------
HRichRingFind&
HRichRingFind::operator=(const HRichRingFind& source)
{
   if (this != &source) {
      cerr << "HRichRingFind object can not be assigned!\n";
      cerr << "Default constructor will be called.\n";
      HRichRingFind();
   }
   return *this;
}
//============================================================================
*/
//----------------------------------------------------------------------------
Float_t
HRichRingFind::CalcDistance(Int_t x, Int_t y, const HRichHit& ring)
{
   return sqrt(static_cast<Float_t>((x - ring.iRingX) * (x - ring.iRingX) +
                                    (y - ring.iRingY) * (y - ring.iRingY)));
}
//============================================================================

//----------------------------------------------------------------------------
Float_t
HRichRingFind::CalcDistance(Int_t x1, Int_t y1,
                            Int_t x2, Int_t y2)
{
   return sqrt(static_cast<Float_t>((x1 - x2) * (x1 - x2) +
                                    (y1 - y2) * (y1 - y2)));
}
//============================================================================

//----------------------------------------------------------------------------
Float_t
HRichRingFind::CalcDistance(const HRichHit& ring1, const HRichHit& ring2)
{
   return sqrt(static_cast<Float_t>((ring1.iRingX - ring2.iRingX) *
                                    (ring1.iRingX - ring2.iRingX) +
                                    (ring1.iRingY - ring2.iRingY) *
                                    (ring1.iRingY - ring2.iRingY)));
}
//============================================================================

//----------------------------------------------------------------------------
Float_t
HRichRingFind::CalcDistanceMean(const HRichHit& ring1, const HRichHit& ring2) {
   Float_t dx = ring1.fPadX - ring2.fPadX;
   Float_t dy = ring1.fPadY - ring2.fPadY;
   return sqrt(dx*dx + dy*dy);
}
//============================================================================

//----------------------------------------------------------------------------
Double_t
HRichRingFind::HomogenDistr(Double_t left, Double_t right)
{
   return gRandom->Rndm() * (right - left) + left;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichRingFind::GetAlgorithmNr(HRichAnalysis *showMe)
{
   return (pAnalysisParams->isActiveRingFindFitMatrix +
           pAnalysisParams->isActiveRingHoughTransf);
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichRingFind::Execute(HRichAnalysis *giveMe)
{
// According to the settings in the HRichAnalysisPar parameter
// container, ring finding algorithms are executed.
// - Ring candidates found by the pattern matrix
//   are stored in the list fHitList1
// - Ring candidates found by the hough trasfomation
//   are stored in the list fHitList2
// At the end the two list of candidates are merged according
// to the analysis parameter (see comment in MatchRings)


   if (0 == giveMe->GetLabelNr() || 0 == GetAlgorithmNr(giveMe)) {
      iRingNr = 0;
      CalcFakeContribution(giveMe);
      return (giveMe->iRingNr = iRingNr);
   }

   iRingNr = 0;

   if (1 == pAnalysisParams->isActiveRingFindFitMatrix) {
      RingFindFitMatrix(giveMe, pAnalysisParams->iMinimalFitMatrixRingQuality,
                        pAnalysisParams->iMinimalFitMatrixRingDistance,
                        pAnalysisParams->iHowManyFitMatrixRings);
   }

   if (1 == pAnalysisParams->isActiveRingHoughTransf) {
      RingFindHoughTransf(giveMe, pAnalysisParams->iMinimalHoughTransfRingQuality,
                          pAnalysisParams->iMinimalHoughTransfRingDistance,
                          pAnalysisParams->iHowManyHoughTransfRings);
   }

   CloseMaxRejection(&fHitList1);
   CloseMaxRejection(&fHitList2);

   iRingNr = MatchRings(giveMe, &fHitList1, &fHitList2);
// remove close partner of a pair, if both rings are identical but having different centres
   iRingNr = CleanIdenticalPairs(giveMe);
   return iRingNr;

}
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::RingFindFitMatrix(HRichAnalysis* showMe,
                                 Int_t          minampl,
                                 Int_t          distance,
                                 Int_t          howmanyrings)
{
// Ring recognition algorithm: Pattern Matrix

   Int_t i, j, m;
   Int_t lx, ly;
   Int_t pad;
   Int_t iRingQuality;
   const Int_t iLabelNr = showMe->GetLabelNr();

   HRichLabel* pLabel = NULL;
   HRichHit*   pHit   = NULL;

   if (howmanyrings < 1) {
      Error("RingFindFitMatrix",
            "Pattern matrix algorithm active, but iHowManyFitMatrixRings == %d! Set to 1!",
            howmanyrings);
      howmanyrings = 1;
   }

   iHitCount = 0;
   iPadPlane.Reset();
   iPadPlaneCopy.Reset();
   fHitList1.Delete();

   // loop over all the labels ( the labeling procedure is executed
   // in the hrichanalysis execute fn.)

   for (m = 0; m < iLabelNr; ++m) {
      pLabel = showMe->GetLabel(m);
      //loop over all pads belonging to a given label
      for (j = pLabel->iLowerY; j <= pLabel->iUpperY; ++j) {
         ly_from = ((j - iMatrixHalfSize < 0) ? 0 : j - iMatrixHalfSize);
         ly_to   = ((j + iMatrixHalfSize >= maxRows) ? maxRows - 1 : j + iMatrixHalfSize);

         for (i = pLabel->iLeftX; i <= pLabel->iRightX; ++i) {
            lx_from = ((i - iMatrixHalfSize < 0) ? 0 : i - iMatrixHalfSize);
            lx_to   = ((i + iMatrixHalfSize >= maxCols) ? maxCols - 1 : i + iMatrixHalfSize);

            iRingQuality = 0;

            // the center of the pattern matrix is overlapped to each pad.
            // If the pads in the pattern matrix range belong to the label
            // the corresponding patter matrix quality is summed up
            // to the total quality of this ring candidate.

            for (ly = ly_from; ly <= ly_to; ++ly) {
               for (lx = lx_from; lx <= lx_to; ++lx) {
                  pad = lx + maxCols * ly;
                  if (iPadActive[pad]) {
                     if (showMe->GetPad(pad)->getAmplitude() > 0 &&
                         showMe->GetPad(pad)->getLabel() == pLabel->iSignature) {
                        iRingQuality += pAnalysisParams->
                                        iRingMatrix[lx - i + iMatrixHalfSize + iMatrixSize *
                                                    (ly - j + iMatrixHalfSize)];
                     }
                  }
               }  // end of loop over all pattern matrix pads
            }
            if (iRingQuality > 0) {
               iPadPlane[i + maxCols*j] += iRingQuality;
            }
         }
      }  // end of loops over all pads of given label
   } // end of loops over all labels


   MaxFinding(showMe,  &fHitList1, &iPadPlane, &iPadPlaneCopy, howmanyrings, distance);
   MaxSelector(showMe, &fHitList1, &iPadPlane, &iPadPlaneCopy);
   MaxAnalysis(showMe, &fHitList1, &iPadPlane, &iPadPlaneCopy, minampl);


   for (m = 0; m < fHitList1.GetSize(); ++m) {
      pHit = static_cast<HRichHit*>(fHitList1.At(m));
      CalcRingParameters(showMe, pHit);
      pHit->fTests = TestRing(showMe, pHit, minampl);
   }
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::RingFindHoughTransf(HRichAnalysis* showMe,
                                   Int_t          minampl,
                                   Int_t          distance,
                                   Int_t          howmanyrings)
{
// Ring recognition algorithm: Hough Transform

   Int_t i, j, k, m;
   Int_t nrFired;
   Float_t fDistance;
   Float_t fRingX, fRingY, fRingR;
   Int_t iRingX, iRingY;
   Float_t fDiv;

   HRichHit*       pHit   = NULL;
   HRichLabel*     pLabel = NULL;
   HRichPadSignal* pPad   = NULL;

   if (howmanyrings < 1) {
      Error("RingFindHoughTransf",
            "Pattern matrix algorithm active, but iHowManyHoughTransfRings == %d! Set to 1!",
            howmanyrings);
      howmanyrings = 1;
   }

   iHitCount = 0;
   iPadPlane.Reset();
   iPadPlaneCopy.Reset();
   fHitList2.Delete();

   //loop over alla the labels

   for (m = 0; m < showMe->GetLabelNr(); ++m) {
      pLabel  = showMe->GetLabel(m);
      nrFired = pLabel->iFiredPadsNr;
      k = 0;

      //loop over all the label pads
      for (j = pLabel->iLowerY; j <= pLabel->iUpperY; ++j) {
         for (i = pLabel->iLeftX; i <= pLabel->iRightX; ++i) {
            pPad = showMe->GetPad(i, j);
            if (pPad->getAmplitude() > 0  &&
                pPad->getLabel() == pLabel->iSignature) {
               // the position of the fired pads in the label are stored
               // in the arrays iPadCol[i] iPadRow[i]
               iPadCol[k] = i;
               iPadRow[k] = j;
               k++;
               if (k >  nrFired) exit(1);
            }
	 }
      }

      // 3 loops to obtain all the combinations of three pads.
      // two pads in the triplet must have a distance bigger than
      // half a ring radius and lower than the matrix dimension (diameter)

      for (i = 0; i < nrFired - 2; i++) {
         for (j = i + 1; j < nrFired - 1; j++) {

            d_col_ij = iPadCol[i] - iPadCol[j];
            d_row_ij = iPadRow[i] - iPadRow[j];
            fDistance = sqrt((Float_t)(d_col_ij * d_col_ij + d_row_ij * d_row_ij));

            if (fDistance > pAnalysisParams->iRingRadius / 2 &&
		fDistance < pAnalysisParams->iRingMatrixSize) {

               for (k = j + 1; k < nrFired; k++) {

                  d_col_jk = iPadCol[j] - iPadCol[k];
                  d_row_jk = iPadRow[j] - iPadRow[k];
                  fDistance = sqrt((Float_t)(d_col_jk * d_col_jk + d_row_jk * d_row_jk));

                  if (fDistance > pAnalysisParams->iRingRadius / 2 &&
                      fDistance < pAnalysisParams->iRingMatrixSize) {

                     // ................. create  map .........
                     // for each combination of three pads the center of the ring
                     // that goes trough the pads is calculated

                     fDiv = d_col_jk * d_row_ij - d_col_ij * d_row_jk;

                     if (TMath::Abs(fDiv) >= 2.0) {

                        d2_colrow_jk = iPadCol[j] * iPadCol[j] - iPadCol[k] * iPadCol[k] +
                                       iPadRow[j] * iPadRow[j] - iPadRow[k] * iPadRow[k];
                        d2_colrow_ij = iPadCol[i] * iPadCol[i] - iPadCol[j] * iPadCol[j] +
                                       iPadRow[i] * iPadRow[i] - iPadRow[j] * iPadRow[j];

                        fRingX = 0.5 * ((Float_t)(d2_colrow_jk * d_row_ij -
                                                  d2_colrow_ij * d_row_jk)) / fDiv;

                        fRingY = 0.5 * ((Float_t)(d2_colrow_ij * d_col_jk -
                                                  d2_colrow_jk * d_col_ij)) / fDiv;

                        fRingR = sqrt((iPadCol[i] - fRingX) * (iPadCol[i] - fRingX) +
                                      (iPadRow[i] - fRingY) * (iPadRow[i] - fRingY));

			iRingX = Int_t(fRingX + 0.5F); // BugFix W.Koenig : rounding of x,y was missing (01.03.2013)
                        iRingY = Int_t(fRingY + 0.5F);

                        if (fRingR < (0.5 + pAnalysisParams->iRingRadius + pAnalysisParams->iRingRadiusError) &&
                            fRingR > (0.5 + pAnalysisParams->iRingRadius - pAnalysisParams->iRingRadiusError) &&
                            pLabel->iLeftX <= iRingX &&
                            pLabel->iRightX >= iRingX &&
                            pLabel->iLowerY <= iRingY &&
                            pLabel->iUpperY >= iRingY)
                           iPadPlane[iRingX + maxCols * iRingY] += 1;

                        // this array contains all the centers of the rings each with its
                        // weight ( how many time this pad did correspond to a ring center
                        // for a given three  pads combination.
                     }  // eof create map ...............
                  } // end distance check between 2nd and 3rd selected pad
	       } // end 3rd loop fired pads
	    } // end distance check between first 2 selected pads
	 } // end 2nd loop fired pads
      } // end 1st loop fired pads
   } // end of loop over all labels

   // ..................................... find MAX ..............
   //



   MaxFinding(showMe, &fHitList2, &iPadPlane, &iPadPlaneCopy, howmanyrings, distance);
   MaxSelector(showMe, &fHitList2, &iPadPlane, &iPadPlaneCopy);
   MaxAnalysis(showMe, &fHitList2, &iPadPlane, &iPadPlaneCopy, minampl);


   for (m = 0; m < fHitList2.GetSize(); m++) {
      pHit = (HRichHit*)(fHitList2.At(m));
      CalcRingParameters(showMe, pHit);
      pHit->fTests = TestRing(showMe, pHit, minampl);
   }


} // eof RingFindHoughTransf
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::MaxFinding(HRichAnalysis* showYou,
                          TList*         hitList,
                          TArrayI*       in,
                          TArrayI*       out,
                          Int_t          maxRings,
                          Float_t        distance)
{
// This function looks for local maxima among 8 neighbouring pads in
// the "in"  array (iPadPlabe) "and fills  the output "out" array.
// The iPadPlane contains the pads that correpond to the ring center
// each with its specific weight. Among them the Local Maxima is sought.
// The "out" array is created here in such a way that the amplitude
// of a local maximum is copied from input "in" array (iPdaPlane),
// the pads that are not local maxima are marked with '-1'.
// The pads that havent been fired are marked with '0'.
// The parameters of local maxima are first put to the list fHitCandidate
// of HRichHitCandidate objects. The list is sorted by descending
// ring quality and only the rings that are at a minimal distance
// of "distance" from each other are stored in a "hitList".

   Int_t i, j, k, l, pad, padnear, offset1, offset2;
   Int_t iHitCount = 0;
   Bool_t fMax = kTRUE;
   Int_t iHit = 0;
   HRichLabel *pLabel = NULL;


   fHitCandidate.Delete();
   // loop over all labels
   for (Int_t label = 0; label < showYou->GetLabelNr(); ++label) {
      pLabel = showYou->GetLabel(label);
      // loop over all pads in a given label.
      for (j = pLabel->iLowerY; j <= pLabel->iUpperY; j++) {
         ly_from = ((j - 1 < 0) ? 0 : j - 1);
         ly_to   = ((j + 1 >= maxRows) ? maxRows - 1 : j + 1);

         for (i = pLabel->iLeftX; i <= pLabel->iRightX; i++) {
            lx_from = ((i - 1 < 0) ? 0 : i - 1);
            lx_to   = ((i + 1 >= maxCols) ? maxCols - 1 : i + 1);

            pad = i + maxCols * j;
	    if ((*in)[pad] == 0) {
	       (*out)[pad] = 0;
	       continue;
	    }

	    fMax = kTRUE;

	    // for each pad the weight in the "in" array is compared
	    // with the weights on the 8 neighbouring and local maxima
	    // are defined. centroid of local maximum with 4 neighbores is calculated
	    Int_t nEqualNeighbors = 0; //reset counter for neighbored pads with equal quality
	    Int_t norm = (*in)[pad];
	    Int_t xSum = 0, ySum=0, nearMax=0, nextMaxCount=0;;

	    for (k = ly_from; k <= ly_to; k++) {
	       for (l = lx_from; l <= lx_to; l++) {
		  padnear = l + maxCols * k;
		  if (iPadActive[padnear] && !(l == i && k == j)) {
                     Int_t padHeight=(*in)[padnear];
		     if (padHeight > (*in)[pad]) fMax = kFALSE;
		     else {
			 // search for next+1 neighbors with higher amplitude
			 Bool_t yOk = kTRUE;
			 if(k>j) {
			     offset1 = 1;
			     if(k+offset1 >= maxRows) yOk = kFALSE;
			 } else {
			     offset1 = -1;
			     if(k+offset1 < 0) yOk = kFALSE;
			 }
			 Bool_t xOk = kTRUE;
			 if(l>i) {
			     offset2 = 1;
			     if(l+offset2 >= maxCols) xOk = kFALSE;
			 } else {
			     offset2 = -1;
			     if(l+offset2 < 0) xOk = kFALSE;
			 }
			 if(l==i || k==j) {
			     if(l==i) {
			       if(yOk) {
				 padnear = l + maxCols*(k+offset1);
				 if(yOk && iPadActive[padnear]) {
				   if((*in)[padnear] > padHeight) {
				   // padheight is contaminated by higher neighbor
				     padHeight*= (*in)[pad]/((*in)[pad]+(*in)[padnear]);
				     if((*in)[padnear] > (*in)[pad]) ++nextMaxCount;
				   }
				 }
			       }
			     } else {
			       if(xOk) {
				 padnear = l+offset2 + maxCols * k;
				 if(iPadActive[padnear]) {
				   if((*in)[padnear] > padHeight) {
				   // padheight is contaminated by higher neighbor
				     padHeight*= (*in)[pad]/((*in)[pad]+(*in)[padnear]);
				     if((*in)[padnear] > (*in)[pad]) ++nextMaxCount;
				   }
				 }
			       }
			     }
			 }
			 if (padHeight == (*in)[pad]) ++nEqualNeighbors;
			 if(padHeight > nearMax) nearMax=padHeight;
			 norm += padHeight;
			 xSum += padHeight*(l-i); //weighted mean calculation
			 ySum += padHeight*(k-j);
		     }
	          }
	       }
	    }

	    if (fMax) {
	       // for pad that is a L.M. the weight contained
	       // in the "in" array  is assigned to the "out" array
	       // and the l.m. is added to the temporary list (fHitCandidate).
	       (*out)[pad] = (*in)[pad];
               // take local max + largest height of next neighbour as ring quality criterium
	       HRichHitCandidate * pCand = new HRichHitCandidate(i,j,(*in)[pad]+nearMax,label,++iHitCount);
	       pCand->setXMean(float(xSum)/float(norm)+float(i));
	       pCand->setYMean(float(ySum)/float(norm)+float(j));
	       pCand->setNoEqualNeighbors(nEqualNeighbors);
	       fHitCandidate.Add(pCand);
	    } else (*out)[pad] = -1;

         }
      }  // end of loops over all pads of given label
   } // end of loops over all labels

   // now selection of maxRings with the highest maxima to be processed
   // checking the distance between candidates

   // The l. m. are sorted by descending quality and the distance
   // between the different candidate is checked. It has to be
   // higher than the threshold.

   fHitCandidate.Sort(kSortDescending);
   if (iHitCount >= 1) {
      Float_t dist2 = float(distance*distance);
      Float_t x1, y1, x2, y2;
      for (j = 0; j < iHitCount; j++) {
         HRichHitCandidate* pCand1 = (HRichHitCandidate*)(fHitCandidate.At(j));
         if (iHit < maxRings && pCand1->getA() > 0) {
            iHit++;
            for (i = j + 1; i < iHitCount; i++) {
	       if (iHit < maxRings) {
	          HRichHitCandidate* pCand2 = (HRichHitCandidate*)(fHitCandidate.At(i));
                  if (pCand1->getA() > 0 && pCand2->getA() > 0) {
                     x1 = pCand1->getXMean();
                     y1 = pCand1->getYMean();
                     x2 = pCand2->getXMean();
                     y2 = pCand2->getYMean();
		     Float_t dx = x2-x1;
		     Float_t dy = y2-y1;
                     if (dx*dx+dy*dy <= dist2) pCand2->setA(0);
		  }
	       }
            }
         }
      }
   }

   // the selected l.m. are added to the list hitList
   for (i = 0; i < iHitCount; i++) {
      HRichHitCandidate* pCand = (HRichHitCandidate*)(fHitCandidate.At(i));
      if (iHit>0 && pCand->getA() > 0) {
         j = pCand->getX();
         k = pCand->getY();
         l = pCand->getA();
	 HRichHit * pRichHit = new HRichHit(j, k, l, pCand->getPadLabel(), pCand->getMaxLabel());
         pRichHit->setPadX(pCand->getXMean());
         pRichHit->setPadY(pCand->getYMean());
	 hitList->Add(pRichHit);
         --iHit;
      }
   }

}
//============================================================================
//----------------------------------------------------------------------------
void
HRichRingFind::MaxSelector(HRichAnalysis* showMe,
                           TList*         hitList,
                           TArrayI*       in,
                           TArrayI*       out)
{
// This function is used to label the clusters of the local maxima.
// The pads corresponding to a L.M. were labeled in the MaxFinding
// function and their values stored in "out" array.
// A label is assigned to each L.M. (hit) belonging to the list "hitList"
// (this list has been filled at the end of the member function
// MaxFinding)
// and this label must be now propagated to all pads belonging
// to the L.M cluster. The condition to be fullfilled in order to belong
// to a cluster is that the pads are reachable from the maximum (L.M.)
// in a descending monotonous way. If a pad belongs to more than
// one clusters it is marked with '-2'. At the end all the connected fired pads
// of a local maximum are marked with the label of this maximum (even
// if they are '-2'. In case of a conflict (possible only if two
// maxima are separated by one pad) the label of maximum with
// higher amplitude is assigned to the pads.
// The propagation of a label is done in a similar way as in the case
// of cleaning algorithm (high amplitude clusters).

   Int_t i, j, k, l, m, pad, padnear;
   Int_t fMaxCode;
   HRichHit *pHit = NULL;
   //loop over all the hits
   for (m = 0; m < hitList->GetSize(); m++) {
      pHit = (HRichHit*)(hitList->At(m));
      pad = pHit->iRingX + maxCols * pHit->iRingY;
      fMaxCode = pHit->iRingMaxLabel;
      // the following function labels the pads belonging
      // to the cluster of each l.m..
      MaxMarker(showMe, in, out, pad, fMaxCode);

   } // eof loop over all local maxima


   // this part (below) is to mark also direct neighboring
   // pads of a local maximum even if they are common pads

   for (m = 0; m < hitList->GetSize(); m++) {
      pHit = (HRichHit*)(hitList->At(m));
      i = pHit->iRingX;
      j = pHit->iRingY;
      pad = i + maxCols * j;
      fMaxCode = pHit->iRingMaxLabel;

      ly_from = ((j - 1 < 0) ? 0 : j - 1);
      ly_to   = ((j + 1 >= maxRows) ? maxRows - 1 : j + 1);
      lx_from = ((i - 1 < 0) ? 0 : i - 1);
      lx_to   = ((i + 1 >= maxCols) ? maxCols - 1 : i + 1);

      for (k = ly_from; k <= ly_to; k++) {
         for (l = lx_from; l <= lx_to; l++) {
            padnear = l + maxCols * k;
            if (iPadActive[padnear] && !(l == i && k == j)) {
               if ((*out)[padnear] == -2) {
                  (*out)[padnear] = fMaxCode;
               } else {
                  if ((*out)[padnear] != 0 &&
                      (*out)[padnear] != fMaxCode &&
                      MaxLabAmpl(hitList, (*out)[padnear]) < pHit->iRingQuality) {
                     (*out)[padnear] = fMaxCode;
                  }
               }
            }
         }
      }
   } // eof second loop over all local maxima

}
//============================================================================


//----------------------------------------------------------------------------
void
HRichRingFind::MaxMarker(HRichAnalysis* showYou,
                         TArrayI*       in,
                         TArrayI*       out,
                         Int_t          nowPad,
                         Int_t          maxCode)
{
//
// This function is called by MaxSelector recursively to propagate
// given label "maxCode" of a l.m. to all pads beloning to the l.m cluster.
// All these pads are marked with '-1' in the "out" array.
// If the pad marked earlier by a label from another maximum is reached
// it is marked as a common pad with '-2'.
// The label is propagated as long as the value of the weight of the
// concatenated pads is monotonous.

   Int_t i, j, k, l, padnear, x_from, x_to, y_from, y_to;
   TArrayI iTempMatrix(9);

   i = nowPad % maxCols;
   j = nowPad / maxCols;

   (*out)[nowPad] = maxCode;

   y_from = ((j - 1 < 0) ? 0 : j - 1);
   y_to   = ((j + 1 >= maxRows) ? maxRows - 1 : j + 1);
   x_from = ((i - 1 < 0) ? 0 : i - 1);
   x_to   = ((i + 1 >= maxCols) ? maxCols - 1 : i + 1);
   // loop on the 8-connected pads around the pad "nowPad".
   for (k = y_from; k <= y_to; k++)
      for (l = x_from; l <= x_to; l++) {
         padnear = l + maxCols * k;
         if (iPadActive[padnear] && !(l == i && k == j))
            if ((*in)[padnear] <= (*in)[nowPad]) {
               // if the neighbouring pad has a weight lower
               // than the l.m. it gets the same label as l.m.
               if ((*out)[padnear] == -1) {
                  (*out)[padnear] = maxCode;
                  iTempMatrix[l-i+1 + 3*(k-j+1)] = maxCode;
               } else if ((*out)[padnear] != 0 &&
                          (*out)[padnear] != maxCode) {
                  (*out)[padnear] = -2;
                  iTempMatrix[l-i+1 + 3*(k-j+1)] = -2;
               }
            }
      }
   // this label procedure is reapeated for all the pads that have
   // been already labeled, as long as they are sorrounded by pads
   // with a lower l.m. weight.

   for (k = 0; k < 3; k++)
      for (l = 0; l < 3; l++)
         if (iTempMatrix[l + 3*k] != 0)
            MaxMarker(showYou, in, out,
                      nowPad + l - 1 + maxCols*(k - 1), iTempMatrix[l + 3*k]);

}
//============================================================================
//----------------------------------------------------------------------------
Int_t
HRichRingFind::MaxLabAmpl(TList *hitList, Int_t maxCode)
{
//
// This is an auxiliary function called by MaxSelector only.
// It returns the amplitude of a local maximum labeled with "maxCode".
//
   Int_t m = 0;
   HRichHit *pHit;

   do {
      pHit = (HRichHit*)(hitList->At(m));
      m++;
   } while (pHit->iRingMaxLabel != maxCode);

   return pHit->iRingQuality;
}
//============================================================================


//----------------------------------------------------------------------------
void
HRichRingFind::MaxAnalysis(HRichAnalysis* showMe,
                           TList*         hitList,
                           TArrayI*       in,
                           TArrayI*       out,
                           Int_t          minAmpl)
{
//
// The function analyses local maximum cluster, calculating the mean
// position of a maximum, weighted by the amplitude of pads in cluster,
// also cluster size and the amplitude sum of the pads belonging to a cluster.
// The data are stored in HRichHit structure.
//

   Int_t m, pad;
   Int_t fMaxCode;
   HRichHit *pHit = NULL;

   for (m = 0; m < hitList->GetSize(); ++m) {
      pHit = (HRichHit*)(hitList->At(m));
      pad = pHit->iRingX + maxCols * pHit->iRingY;
      fMaxCode = pHit->iRingMaxLabel;
      xMeanMax = 0.;
      yMeanMax = 0.;
      xPadMeanMax = 0.;
      yPadMeanMax = 0.;
      thetaMeanMax = 0.;
      phiMeanMax = 0.;
      fMaxClusterSize = 0;
      fMaxClusterSum = 0;
      fMaxThrClusterSize = 0;

      MaxCluster(showMe, in, out, pad, fMaxCode, minAmpl);

      xMeanMax /= fMaxClusterSum;
      yMeanMax /= fMaxClusterSum;
      xPadMeanMax /= fMaxClusterSum;
      yPadMeanMax /= fMaxClusterSum;
      thetaMeanMax /= fMaxClusterSum;
      phiMeanMax /= fMaxClusterSum;
      pHit->fX = xMeanMax;
      pHit->fY = yMeanMax;
      pHit->fMeanTheta = thetaMeanMax;
      pHit->fMeanPhi = phiMeanMax;
      pHit->fMaxClusterSize = fMaxClusterSize;
      pHit->fMaxClusterSum = fMaxClusterSum;
      pHit->fMaxThrClusterSize = fMaxThrClusterSize;

   } // eof loop over all local maxima

}
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::MaxCluster(HRichAnalysis* showYou,
                          TArrayI*       in,
                          TArrayI*       out,
                          Int_t          nowPad,
                          Int_t          maxCode,
                          Int_t          minAmpl)
{
//
// Function called recursively from MaxAnalysis to analyse features of local
// maxima clusters; similar to MaxMarker.
//

   Int_t i, j, k, l, padnear, x_from, x_to, y_from, y_to;
   TArrayI iTempMatrix(9);
   HRichPad *pPad = showYou->getGeometryPar()->getPadsPar()->getPad(nowPad);

   xMeanMax += ((*in)[nowPad]) * (pPad->getX());
   yMeanMax += ((*in)[nowPad]) * (pPad->getY());
   // variables below are in pad and pad fraction units
   xPadMeanMax += ((*in)[nowPad]) * ((Float_t)(nowPad % maxCols));
   yPadMeanMax += ((*in)[nowPad]) * ((Float_t)(nowPad / maxCols));
   // variables below are angles
   thetaMeanMax += ((*in)[nowPad]) * (pPad->getTheta());
   phiMeanMax += ((*in)[nowPad]) * (pPad->getPhi(showYou->GetActiveSector()));
   fMaxClusterSize++;
   fMaxClusterSum += (*in)[nowPad];
   if ((*in)[nowPad] > minAmpl) fMaxThrClusterSize++;
   (*out)[nowPad] = 0;

   i = nowPad % maxCols;
   j = nowPad / maxCols;

   y_from = ((j - 1 < 0) ? 0 : j - 1);
   y_to   = ((j + 1 >= maxRows) ? maxRows - 1 : j + 1);
   x_from = ((i - 1 < 0) ? 0 : i - 1);
   x_to   = ((i + 1 >= maxCols) ? maxCols - 1 : i + 1);

   for (k = y_from; k <= y_to; k++)
      for (l = x_from; l <= x_to; l++) {
         padnear = l + maxCols * k;
         if (iPadActive[padnear] && !(l == i && k == j))
            if ((*out)[padnear] == maxCode) {
               (*out)[padnear] = 0;
               iTempMatrix[l-i+1 + 3*(k-j+1)] = 1;
            }
      }
   // here the function MaxCluster is called recursevely
   // in order to take into account all the pads beloning to
   // the cluster in the calculation of the cluster properties.
   for (k = 0; k < 3; k++)
      for (l = 0; l < 3; l++)
         if (iTempMatrix[l + 3*k] > 0)
            MaxCluster(showYou, in, out,
                       nowPad + l - 1 + maxCols*(k - 1), maxCode, minAmpl);
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichRingFind::TestRing(HRichAnalysis* showIt,
                        HRichHit*      hit,
                        Int_t          amplit)
{
//
// All the rings that have been found by the 2 algorithms and then
// further analyzed, are tested.
// There are five tests at the moment and they are active if their
// Status is set to 1 or 2. If Status == 1 a given test is
// performed and the result is stored in the HRichHit structure.
// If Status == 2, the test result must be positive to store
// the hit candidate in the output file. If Status == 0 the test
// is not performed and the information stored in HRichHit can
// be false or true, depending on the test (see tests for details).
//

   Int_t test   = 0;
   Int_t result = 0;
// TestRingCharge is first because it is the only test which can/should be active. W.K.
   result = (Int_t)TestRingCharge(showIt, hit);
   if (pAnalysisParams->isActiveTestCharge == 2 && result==0) return ((test = 3));
   test += 100000 * result;

   result = (Int_t)TestRatio(showIt, hit);
   if (pAnalysisParams->isActiveFiredRingPadsRatio == 2 && result==0) return ((test = 3));
   test += 1000 * result;

   result = (Int_t)TestDensity(showIt, hit);
   if (pAnalysisParams->isActiveTestDensity == 2 && result==0) return ((test = 3));
   test += 1 * result;

   result = (Int_t)TestBorder(&(*showIt), &(*hit), amplit);
   if (pAnalysisParams->isActiveBorderAmplitReduction == 2 && result==0) return ((test = 3));
   test += 10 * result;

   result = (Int_t)TestDynamic(showIt, hit, amplit);
   if (pAnalysisParams->isActiveDynamicThrAmplitude == 2 && result==0) return ((test = 3));
   test += 100 * result;

   result = (Int_t)TestAsymmetry(showIt, hit, amplit);
   if (pAnalysisParams->isActiveTestAsymmetry == 2 && result==0) return ((test = 3));
   test += 10000 * result;

   return test;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestDensity(HRichAnalysis* showYou,
                           HRichHit*      pHit)
{
//
// If density (ratio: fired pads / all active pads) in label larger
// than 2*Sm - see below - exceeds 40%, ring recognition is not performed.
// For small labels like < 2*(pattern matrix surface) this test is not performed.
//

   if (pAnalysisParams->isActiveTestDensity) {
      Int_t iLabelNr = 0, iActivePads = 0,
            iActiveSurface = 0, iMatrixSurface = 0;

      iLabelNr = pHit->iRingFreeParam;
      iActivePads = showYou->GetLabel(iLabelNr)->iFiredPadsNr;
      iActiveSurface = showYou->GetLabel(iLabelNr)->iLabeledPadsNr;
      iMatrixSurface = pAnalysisParams->iRingMaskSize * pAnalysisParams->iRingMaskSize;
      if (0 == iActiveSurface || 0 == iMatrixSurface)
         Error("TestDensity", "possible division by zero");

      if ((Float_t)iActivePads / iActiveSurface > pAnalysisParams->fThresholdDensity &&
          (Float_t)iActiveSurface / (2 * iMatrixSurface) > pAnalysisParams->fSurfaceArea)
         return kFALSE;

      pHit->setTestDens(kTRUE);
   }
   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestBorder(HRichAnalysis* showYou,
                          HRichHit*      pHit,
                          Int_t          amplit)
{
//
// Basic check for the ring amplitude.
// Reduction of the threshold amplitude at the borders of the detector
// is applied, proportionally to the part of a ring which is cut (outside).
// Maximum reduction is by 50% (it means half or more of a ring can be still
// recognised. If there is more than a half of a ring outside it must have
// iRingQuality >= amplit (without any threshold reduction) to be accepted.
// Additionally in this test fBorderFactor is written to a hit !
//

   Float_t fraction = pGeometryParams->getPadsPar()->
                      getPad((UInt_t)pHit->iRingX, (UInt_t)pHit->iRingY)->getAmplitFraction();

   pHit->fBorderFactor = fraction;

   if (!pAnalysisParams->isActiveBorderAmplitReduction && fraction < 0.95)
      if (pHit->iRingQuality < amplit) return kFALSE;

   if (pAnalysisParams->isActiveBorderAmplitReduction && amplit && fraction < 0.95) {

      if (fraction < 0.5) {
         if (pHit->iRingQuality < amplit)  return kFALSE;
      } else if (pHit->iRingQuality < (amplit * fraction)) return kFALSE;

   }
   pHit->setTestBord(kTRUE);
   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestDynamic(HRichAnalysis* showYou,
                           HRichHit*      pHit,
                           Int_t          amplit)
{
//
// The dynamic minimal (threshold) amplitude (quality) is estimated here
// if called with amplit > 0 and for rings that are mainly not outside.
// It is calculated due to highly fenomenological formula:
//
//      threshold Amplitude = amplit * e^( P1*(S/Sm - 1) + P2*(D/P3 - 1) )
//  where
//      P1 - parameter (0.055)
//      P2 - parameter (0.5)
//      Sm = ring pattern matrix surface (in number of pads units)
//      S  = number of pads in given labeled area
//      P3 = mean density (ratio: pads fired / all pads) for ring matrix area ~0.15
//      D  = density of fired pads for given labeled area
//


   Float_t fraction = pGeometryParams->getPadsPar()->
                      getPad((UInt_t)pHit->iRingX, (UInt_t)pHit->iRingY)->getAmplitFraction();

   if (!pAnalysisParams->isActiveDynamicThrAmplitude && fraction >= 0.95)
      if (pHit->iRingQuality < amplit) return kFALSE;


   if (pAnalysisParams->isActiveDynamicThrAmplitude && amplit && fraction >= 0.95) {

      Int_t iDynamicAmplit = 0, iLabelNr = 0;
      Int_t iActivePads = 0, iActiveSurface = 0, iMatrixSurface = 0;

      iLabelNr = pHit->iRingFreeParam;
      iActivePads = showYou->GetLabel(iLabelNr)->iFiredPadsNr;
      iActiveSurface = showYou->GetLabel(iLabelNr)->iLabeledPadsNr;
      iMatrixSurface = pAnalysisParams->iRingMaskSize * pAnalysisParams->iRingMaskSize;
      if (iActiveSurface == 0 || iMatrixSurface == 0)
         Error("TestDynamic", "possible division by zero");

      Float_t fSurfRatio = (Float_t)iActiveSurface / iMatrixSurface;
      Float_t fDensRatio = (Float_t)iActivePads / iActiveSurface;

      if (fSurfRatio <= 1.34 && fDensRatio <= 1.34 * pAnalysisParams->fFormulaParam3) {
         iDynamicAmplit = (Int_t)(amplit * pAnalysisParams->fLowerAmplFactor);
      } else {
         iDynamicAmplit = (Int_t)(amplit * exp(pAnalysisParams->fFormulaParam1 *
                                               (fSurfRatio - 1.) +
                                               pAnalysisParams->fFormulaParam2 *
                                               (fDensRatio / pAnalysisParams->fFormulaParam3 - 1.)));
         if (iDynamicAmplit < amplit) iDynamicAmplit = amplit;
      }
      if (iDynamicAmplit > pHit->iRingQuality) return kFALSE;
   }

   pHit->setTestDyna(kTRUE);

   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestRatio(HRichAnalysis* showYou,
                         HRichHit*      pHit)
{
//
// This part calculates how many fired pads belong to ring in comparison
// with the number of fired pads outside and inside. The area of ringMask
// is scanned. In it the fired pads outside/inside of ring must
// not to exceed i.e.  33% of total number of fired pads in this area -
// at least 67% has to be inside of ring border.
// If ring is outside the test is not done (always positive).
//

   if (pAnalysisParams->isActiveFiredRingPadsRatio &&
       pGeometryParams->getPadsPar()->
       getPad((UInt_t)pHit->iRingX, (UInt_t)pHit->iRingY)->getAmplitFraction() >= 0.95) {

      Int_t k, m, n;
      Int_t iOutRing = 0, iOnRing = 0, iInRing = 0, iAllRing = 0;
      Int_t maskSize = pAnalysisParams->iRingMaskSize;
      Int_t iHalfRingMask = maskSize / 2;
      Int_t iMatrixSurface = maskSize * maskSize;

      for (k = 0; k < iMatrixSurface; k++) {
         m = (k % maskSize) - iHalfRingMask;
         n = (k / maskSize) - iHalfRingMask;
         if (!showYou->IsOut(pHit->iRingX, pHit->iRingY, m, n) &&
             showYou->GetPad(pHit->iRingX + m, pHit->iRingY + n)->getAmplitude() > 0) {
            if (pAnalysisParams->iRingMask[k] == 0) {
               iOutRing++;
            } else {
               if (pAnalysisParams->iRingMask[k] == 1) {
                  iOnRing++;
               } else {
                  if (pAnalysisParams->iRingMask[k] == 2) {
                     iInRing++;
                  }
               }
            }
         }
      }
      iAllRing = iOutRing + iOnRing + iInRing;
      if (float(iOutRing + iInRing) >= pAnalysisParams->fFiredRingPadsRatio * float(iAllRing)) return kFALSE;

   }

   pHit->setTestRati(kTRUE);

   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestAsymmetry(HRichAnalysis* showYou,
                             HRichHit*      pHit,
                             Int_t          amplit)
{
//
// The asymmetry of ring is investigated. The centroid of the ring is
// defined by the difference in X and Y coordinates between the ring center
// and the center of gravity of the ring. In order to get a positive
// decision from the test  the distance must be lower than iRingRadiusError given in input data.
// Then a ring radius is calculated and it also has to fit
// in the value iRingRadius +/- iRingRadiusError.
// If a ring is clearly outside the border the test is not done (always positive).
// REMARK: ring radius and ring centroid are calculated ONLY for rings
// inside the frame! If the ring candidate is placed partially outside
// zero values for its radius and centroid are stored in HRichHit.
//

   if (pAnalysisParams->isActiveTestAsymmetry &&
       pGeometryParams->getPadsPar()->
       getPad((UInt_t)pHit->iRingX, (UInt_t)pHit->iRingY)->getAmplitFraction() >= 0.95) {

      Int_t i, j;

      Int_t maskSize = pAnalysisParams->iRingMaskSize;
      Int_t maxMaskIndex = maskSize - 1;
      Int_t iHalfRingMask = maskSize / 2;

      Float_t iPosX = 0., iPosY = 0.;
      Int_t iHowManyPads = 0;

      //
      // calculation of ring centroid , use larger matrix (iRingMaskSize instead of iRingMatrixSize) W.K. Feb. 2014
      //

      for (j = 0; j < maskSize; j++){
	 Int_t l = j - iHalfRingMask;
	 Bool_t jBorder = (j==0 || j==maxMaskIndex)? kTRUE:kFALSE;
	 for (i = 0; i < maskSize; i++){
	    if((i==0 && jBorder) || (i==maxMaskIndex && jBorder)) continue; // take corners out of quadratic matrix
            Int_t k = i - iHalfRingMask;
	    if (!showYou->IsOut(pHit->iRingX, pHit->iRingY, k, l)){
               if (showYou->GetPad(pHit->iRingX + k,
                                   pHit->iRingY + l)->getAmplitude() > 0) {
                  iPosX += k;
                  iPosY += l;
                  iHowManyPads++;
	       }
	    }
	 }
      }
      if (iHowManyPads == 0){
	  Error("HRichRingFind::TestAsymmetry", "empty ring");
      } else {
	  iPosX /= iHowManyPads;
	  iPosY /= iHowManyPads;
      }

      pHit->fRingCentroid = sqrt(iPosX * iPosX + iPosY * iPosY);

      //
      // calculation of ring radius
      //

      Int_t matrixSize = pAnalysisParams->iRingMatrixSize;
      Int_t iHalfRingMatrix = matrixSize / 2;
      Int_t maskOffset = (maskSize-matrixSize)/2;
      Float_t fRingRadius = 0.0F;
      iHowManyPads = 0;

      for (j = 0; j < matrixSize; j++) {
         Int_t l = j - iHalfRingMatrix;
         for (i = 0; i < matrixSize; i++) {
            Int_t k = i - iHalfRingMatrix;
	    if (!showYou->IsOut(pHit->iRingX, pHit->iRingY, k, l)) {
               if (showYou->GetPad(pHit->iRingX+k, pHit->iRingY+l)->getAmplitude() > 0 &&
                   pAnalysisParams->iRingMask[i+maskOffset + maskSize*(j+maskOffset)] == 1) {

                  // ring radius is calculated as harmonic mean here

		  if (k!=0 && l!=0) {
		      fRingRadius += 1.0F / sqrt(float(k*k + l*l));
		      ++iHowManyPads;
		  }
	       }
	    }
	 }
      }

      if (iHowManyPads > 0){
         fRingRadius = iHowManyPads / fRingRadius;
	 pHit->fRingRadius = fRingRadius;
      }

      if (pHit->fRingCentroid > pAnalysisParams->iRingRadiusError*2.0F ||
          TMath::Abs(fRingRadius - pAnalysisParams->iRingRadius) >
          pAnalysisParams->iRingRadiusError) return kFALSE;

   } else {
      pHit->fRingCentroid = -1.0;
      pHit->fRingRadius = 0.0F;
   }
   pHit->setTestAsym(kTRUE);

   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichRingFind::TestRingCharge(HRichAnalysis* showYou, HRichHit *hit)
{
//
// Average charge of ring candidate is checked, minimum and maximum
// value are set in the richanalysispar.txt.
//
   if (pAnalysisParams->isActiveTestCharge) {
      Float_t scalFac = pAnalysisParams->fAmpCorrFac[showYou->GetActiveSector()];
      Int_t ringMinCharge = pAnalysisParams->fRingMinCharge*scalFac + 0.5F;
      Int_t ringMaxCharge = pAnalysisParams->fRingMaxCharge*scalFac + 0.5F;

      if (hit->iRingPadNr < 1) return kFALSE;
      if (hit->iRingAmplitude / hit->iRingPadNr < ringMinCharge ||
          hit->iRingAmplitude / hit->iRingPadNr > ringMaxCharge) return kFALSE;
   }
   hit->setTestCharge(kTRUE);
   return kTRUE;
}

//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::CalcRingParameters(HRichAnalysis* showMe,
                                  HRichHit*      pHit)
{
//
// This method calculates for each ring candidate:
// 1) the number of fired pads that belong to the ring (all fired
// pads in the region 13X13 centered in the ring center which fall inside the ring mask)
// 2) the total charge of the ring obtained summing up all
// the charges of the pads that belong to the ring.
// 3) the number of photon local maxima among 5 pads, that should correspond
// to the number of photon in one ring
// 4) the number of photon local maxima among 9 pads.
// It is called at the end of the RingFindHoughTransf and RingFindFitMatrix
// function, after the lists of candidate have been filled and all properties
// calculated
// Bug removed by taking the cluster size search out of the calcFakeContribution and into this routine
// Wolfgang Koenig 29. Apr 2013
//

   Int_t i, j, k, l, m,
         iIsPhot4, iIsPhot8, iPhot4Nr, iPhot8Nr, iPad;
   Int_t iNowX, iNowY;

   iPhot4Nr = iPhot8Nr = iPad = 0;
   Int_t iShift = iRingImageSize / 2;


   iRingTempImage.Reset();
   // loop on all the pads
   for (j = 0; j < iRingImageSize; j++)
      for (i = 0; i < iRingImageSize; i++) {
         if (!showMe->IsOut(pHit->iRingX, pHit->iRingY, i-iShift, j-iShift)) {
            pHit->iRingImage[i + iRingImageSize*j] =
               showMe->GetPad(pHit->iRingX + i-iShift, pHit->iRingY + j-iShift)->getAmplitude();
         } else pHit->iRingImage[i + iRingImageSize*j] = 0;
      }
   // iRingImage contains the amplitudes of all the fired pads in
   // the 13X13 Mask centered in the ring center.
   iPhot4Nr = iPhot8Nr = 0;
   iNowX = pHit->iRingX;
   iNowY = pHit->iRingY;
   for (j = 0; j < iRingImageSize; j++) { // loop on all the pads
      for (i = 0; i < iRingImageSize; i++) {
         if (!showMe->IsOut(iNowX, iNowY, i - iShift, j - iShift)) {
            iIsPhot4 = iIsPhot8 = 0;
            m = iNowX + i - iShift + maxCols * (iNowY + j - iShift);
            if (showMe->GetPad(m)->getAmplitude() > 0 &&
                pAnalysisParams->iRingMask[i + iRingImageSize*j] == 1) {
               pHit->iRingPadNr++;
               pHit->iRingAmplitude += showMe->GetPad(m)->getAmplitude();

               //loop on the pad neighbour to determine if the pad
               // is a photon local maxima among the 4 or 8-connected pads.
	       for (k = -1; k < 2; k++) {
	          for (l = -1; l < 2; l++) {
                     if (((l == 0 && abs(k)) || (k == 0 && abs(l))) && !(l == 0 && k == 0) &&
                         !showMe->IsOut(m, l, k) &&
                         showMe->GetPad(m + l, k)->getAmplitude() >=
                         showMe->GetPad(m)->getAmplitude()) {
                        iIsPhot4++;
		     }
		  }
	       }
               if (iIsPhot4 == 0) {
                  iPhot4Nr++;
                  iRingTempImage[i + iRingImageSize*j] += 1;
		  // "iRingTempImage" contains the label of the photon local maximum
		  // =1 if a photon local maxima has only 4 lower neighbors (left,right,top,bottom)
                  // =2 if the photon has 8 lower neighbors Wolfgang Koenig Feb. 2014

               }
	       for (k = -1; k < 2; k++) {
		  for (l = -1; l < 2; l++) {
                     if (abs(l) && abs(k) && !showMe->IsOut(m, l, k) &&
                         showMe->GetPad(m + l, k)->getAmplitude() >=
                         showMe->GetPad(m)->getAmplitude()) {
                        iIsPhot8++;
		     }
		  }
	       }
               if (iIsPhot4 == 0 && iIsPhot8 == 0) {
                  iPhot8Nr++;
                  iRingTempImage[i + iRingImageSize*j] += 1;
               }
            }
	 }
      }
   }

   pHit->iRingLocalMax4 = iPhot4Nr;
   pHit->iRingLocalMax8 = iPhot8Nr;
   // the number of Clusters the ring is composed of is calculated together with some average variables.
   // Still buggy since the size for overlapping clusters is too large. Wolfgang Koenig
   iCount = 0;
   fClusterSize  = 0.;
   fClusterLMax4 = 0.;
   fClusterLMax8 = 0.;
   for (j = 0; j < iRingImageSize; j++) {// loop over all pads belonging to the ring mask
      for (i = 0; i < iRingImageSize; i++) {
	 if (iRingTempImage[i + iRingImageSize*j] > 0) {
	    iInnerCount = iInnerPhot4 = iInnerPhot8 = 0;
	    // the following function calculates the cluster
	    // properties
	    CalcRingClusters(showMe, &iRingTempImage[0], pHit, i, j);
	    if (iInnerCount) {
	       fClusterSize += iInnerCount;
	       fClusterLMax4 += iInnerPhot4;
	       fClusterLMax8 += iInnerPhot8;
	       iCount++;
	    }
	 }
      }
   }
   pHit->iRingClusterNr = iCount;
   if (iCount > 0) {
      pHit->fRingClusterSize  = fClusterSize  / iCount;
      pHit->fRingClusterLMax4 = fClusterLMax4 / iCount;
      pHit->fRingClusterLMax8 = fClusterLMax8 / iCount;
   }
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::CalcRingClusters(HRichAnalysis* showYou,
                                Int_t*       dumpArr,
                                HRichHit*      pHit,
                                Int_t          nowX,
                                Int_t          nowY)
{
//
// the function calculates the total number of pads and photon
// local maxima (4 and 8-connected pads), for all the clusters
// that belong to a ring.
//

    Int_t a, b;
    Int_t iTempMatrix[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};

// "dumpArr" contains the positions of the photon local maxima (it is
// nothing else than the "iRingTempImage" filled in the CalcRingParameter function.
   if (dumpArr[nowX + iRingImageSize*nowY] < 3) {
      ++iInnerCount;
      Int_t nowPadAmpl = pHit->iRingImage[nowX + iRingImageSize*nowY];
      dumpArr[nowX + iRingImageSize*nowY] += 3;
      // each pad already taken into account is marked with the label >= 3 (local maxima get 4 or 5)

      for (b = 0; b < 3; ++b) { // loop over the neighbouring pads
	 Int_t nextY = nowY + b - 1;
	 for (a = 0; a < 3; ++a) {
	    Int_t nextX = nowX + a - 1;
	    if (nextX >= 0 && nextX < iRingImageSize && nextY >= 0 && nextY < iRingImageSize) {
		if (!(a == 1 && b == 1)) {
                  Int_t nextPadAmpl = pHit->iRingImage[nextX + iRingImageSize*nextY];
		  if ( nextPadAmpl > 0) {
                     Int_t padLabel = dumpArr[nextX + iRingImageSize*nextY];
		     if(padLabel == 0 && nextPadAmpl < nowPadAmpl ) {
		        iTempMatrix[a][b] = 1;
		     }
		     if(padLabel==1) {
			++iInnerPhot4; // cluster extends to next local maximum
		     } else {
			if (padLabel == 2) {
			   ++iInnerPhot4;
			   ++iInnerPhot8;
			}
		     }
		  }
	       }
	    }
	 }
      }
      // CalcRingClusters is called for all the pads connected to the neighbours.
      // (See how the pads for the direct hits clusters are connected.)
   
      for (b = 0; b < 3; ++b) {
	 for (a = 0; a < 3; ++a) {
	    if (iTempMatrix[a][b] > 0)
	       CalcRingClusters(showYou, dumpArr, pHit, nowX + a-1, nowY + b-1);
	 }
      }
   }

} // eof CalcRingClusters

//============================================================================
//----------------------------------------------------------------------------
// remove partner of close pairs, if both rings are identical
Int_t HRichRingFind::CleanIdenticalPairs(HRichAnalysis* showMe) {
    const Int_t cleanDist2 = 12; //maximum search distance**2 for identical rings
    Int_t x1, y1, dx, dy;
    for (Int_t i = 1; i < iRingNr; ++i) {
        x1=pRings[i].iRingX;
        y1=pRings[i].iRingY;
        for (Int_t j = 0; j < i; ++j) {
            dx = x1- pRings[j].iRingX;
	    dy = y1- pRings[j].iRingY;
	    if(dx*dx + dy*dy <= cleanDist2) {
		if(pRings[i].iRingPadNr == pRings[j].iRingPadNr &&
		   pRings[i].iRingAmplitude == pRings[j].iRingAmplitude) {
		    for(Int_t k = i+1; k < iRingNr; ++k) pRings[k-1] = pRings[k];
		    --iRingNr;
                    --i;
		    break;
		}
	    }
        }
    }
    return iRingNr;
}

//============================================================================
//----------------------------------------------------------------------------
Int_t
HRichRingFind::MatchRings(HRichAnalysis* showMe,
                          TList*         hitList1,
                          TList*         hitList2)
{
//
// If both algorithms are active and iSuperiorAlgorithmID = 3 then
// hit with iRingAlgorithmIndex = 3 is Pattern Matrix information
// hit with iRingAlgorithmIndex = 4 is Hough Transform information
// iSuperiorAlgorithmID = 3 means all rings found independently by
// two algorithms are stored.
//
// If both algorithms are active and iSuperiorAlgorithmID = 1 or 2 then
// only rings found by both algorithms are stored. If iSuperiorAlgorithmID = 1
// information is taken from Pattern Matrix and iRingAlgorithmIndex = 5.
// If iSuperiorAlgorithmID = 2 information is taken from Hough Transform
// and iRingAlgorithmIndex = 6. This distinction is made because the
// position of a ring found by both algorithms may slightly differ and
// therefore also ring parameters may differ.
//
// If only one algorithm is active then iSuperiorAlgorithmID flag is
// ignored and rings found by the active algorithm are stored.
// If it is Pattern Matrix iRingAlgorithmIndex = 1 and in the case
// of Hough Transform iRingAlgorithmIndex = 2.
//
// In general if iRingAlgorithmIndexis is odd (1,3,5) information on a ring
// found by Pattern Matrix algorithm is stored and if iRingAlgorithmIndexis
// is even (2,4,6) information on a ring found by Hough Transform algorithm
// is stored.
//

   Bool_t iChosen       = kFALSE;
   Bool_t maxRingsFound = kFALSE;

   Int_t i = 0;
   Int_t j = 0;
   Int_t m = 0;
   Int_t listSize1 = 0;
   Int_t listSize2 = 0;

   HRichHit *pHit1 = NULL;
   HRichHit *pHit2 = NULL;

   iRingNr = 0;
   listSize1 = hitList1->GetSize();
   listSize2 = hitList2->GetSize();

//
// --- all rings found by all algorithms will be stored ---
//
   if (GetAlgorithmNr(showMe) == 2 && pAnalysisParams->iSuperiorAlgorithmID == 3) {
      Int_t maxAlgoRings = pAnalysisParams->iHowManyFitMatrixRings;
      for (m = 0; m < listSize1; m++) {
         pHit1 = (HRichHit*)(hitList1->At(m));
         if (pHit1->fTests != 3) {
            if (iRingNr >= maxAlgoRings) break;
            pRings[iRingNr] = *pHit1;
            pRings[iRingNr].iRingAlgorithmIndex = 3;
            pRings[iRingNr].iRingPatMat = pHit1->iRingQuality;
            pRings[iRingNr].iRingHouTra = 0;
            iRingNr++;
         }
      }
      maxAlgoRings = pAnalysisParams->iHowManyHoughTransfRings;
      for (m = 0; m < listSize2; m++) {
         pHit2 = (HRichHit*)(hitList2->At(m));
         if (pHit2->fTests != 3) {
            if (iRingNr >= maxAlgoRings) break;
            pRings[iRingNr] = *pHit2;
            pRings[iRingNr].iRingAlgorithmIndex = 4;
            pRings[iRingNr].iRingPatMat = 0;
            pRings[iRingNr].iRingHouTra = pHit2->iRingQuality;
            iRingNr++;
         }
      }
      CalcFakeContribution(showMe);
      return (showMe->iRingNr = iRingNr);
   }

//
// --- only rings found by both algorithms stored ---
//
   if (GetAlgorithmNr(showMe) == 2) {
      Float_t maxAlgoDist = 1.5F;
      maxRingsFound = kFALSE;
      for (i = 0; i < listSize1; i++) {
         pHit1 = (HRichHit*)(hitList1->At(i));
         if (pHit1->fTests != 3 && pHit1->iRingQuality > 0) {
            for (j = 0; j < listSize2; j++) {
               pHit2 = (HRichHit*)(hitList2->At(j));
               iChosen = kFALSE;
               if (pHit2->fTests != 3 && pHit2->iRingQuality > 0) {
                  // if the two rings are so close to each other to be the same.
                  if (CalcDistanceMean(*pHit1, *pHit2) <= maxAlgoDist) {
                     if (iRingNr >= maxRings) { // should never happen
                        maxRingsFound = kTRUE;
                        break;
                     }
                     if (pAnalysisParams->iSuperiorAlgorithmID == 1) {
                        pRings[iRingNr] = *pHit1;
                        pRings[iRingNr].iRingPatMat = pHit1->iRingQuality;
                        pRings[iRingNr].iRingHouTra = pHit2->iRingQuality;
                        pRings[iRingNr].iRingAlgorithmIndex = 5;
                     } else {
                        pRings[iRingNr] = *pHit2;
                        pRings[iRingNr].iRingPatMat = pHit1->iRingQuality;
                        pRings[iRingNr].iRingHouTra = pHit2->iRingQuality;
                        pRings[iRingNr].iRingAlgorithmIndex = 6;
                     }
                     iRingNr++;
                     iChosen = kTRUE;
                  }
               }
               if (kTRUE == iChosen) break;
            }
         }
         if (kTRUE == maxRingsFound) break;
      }
      CalcFakeContribution(showMe);

      return (showMe->iRingNr = iRingNr);
   }

//
// --- rings found by selected algorithm ---
//
   if (GetAlgorithmNr(showMe) == 1) {
      if (pAnalysisParams->isActiveRingFindFitMatrix) {
         Int_t maxAlgoRings = pAnalysisParams->iHowManyFitMatrixRings;
         for (m = 0; m < listSize1; m++) {
            pHit1 = (HRichHit*)(hitList1->At(m));
            if (pHit1->fTests != 3) {
               if (iRingNr >= maxAlgoRings) break;
               pRings[m] = *pHit1;
               pRings[m].iRingAlgorithmIndex = 1;
               pRings[m].iRingPatMat = pHit1->iRingQuality;
               pRings[m].iRingHouTra = 0;
               iRingNr++;
            }
         }
         CalcFakeContribution(showMe);
         return (showMe->iRingNr = iRingNr);
      }
      if (pAnalysisParams->isActiveRingHoughTransf) {
         Int_t maxAlgoRings = pAnalysisParams->iHowManyHoughTransfRings;
         for (m = 0; m < listSize2; m++) {
            pHit2 = (HRichHit*)(hitList2->At(m));
            if (pHit2->fTests != 3) {
               if (iRingNr >= maxAlgoRings) break;
               pRings[m] = *pHit2;
               pRings[m].iRingAlgorithmIndex = 2;
               pRings[m].iRingHouTra = pHit2->iRingQuality;
               pRings[m].iRingPatMat = 0;
               iRingNr++;
            }
         }
         CalcFakeContribution(showMe);
         return (showMe->iRingNr = iRingNr);
      }
   }

   return (showMe->iRingNr = 0); // this should never happen
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::CalcFakeContribution(HRichAnalysis *showMe)
{

   if (iRingNr == 0 &&
       pGeometryParams->getPadsPar()->getActivePadsNr() > iRingImageSize*iRingImageSize) {

      // If any ring is not found a random position iNowX, iNowY is drawn and
      // treated as if it were a ring centre. Local maxima (4- and 8-connected)
      // are calculated as well as the number of fired pads. This gives
      // the estimation of fakes contribution in real rings (number of fake
      // fired pads and fake local maxima).
      Int_t i, j, k, l, m,
            iIsPhot4, iIsPhot8, iPhot4Nr, iPhot8Nr, iPad;
      iPhot4Nr = iPhot8Nr = iPad = 0;
      Int_t iShift = iRingImageSize / 2;
      Int_t iNowX, iNowY;

      do {// center of the fake ring
         iNowX = (Int_t)HomogenDistr(pAnalysisParams->iRingRadius,
                                     maxCols - pAnalysisParams->iRingRadius);
         iNowY = (Int_t)HomogenDistr(pAnalysisParams->iRingRadius,
                                     maxRows - pAnalysisParams->iRingRadius);
      } while (showMe->IsOut(iNowX, iNowY, 0, 0));

      for (j = 0; j < iRingImageSize; j++)
         for (i = 0; i < iRingImageSize; i++)
            if (!showMe->IsOut(iNowX, iNowY, i - iShift, j - iShift)) {
               iIsPhot4 = iIsPhot8 = 0;
               m = iNowX + i - iShift + maxCols * (iNowY + j - iShift);
               if (showMe->GetPad(m)->getAmplitude() > 0 &&
                   pAnalysisParams->iRingMask[i + (iRingImageSize)*j] == 1) {
                  iPad++;
                  for (k = -1; k < 2; k++)
                     for (l = -1; l < 2; l++)
                        if (((l == 0 && abs(k)) ||
                             (k == 0 && abs(l))) &&
                            !(l == 0 && k == 0) &&
                            !showMe->IsOut(m, l, k) &&
                            showMe->GetPad(m + l, k)->getAmplitude() >=
                            showMe->GetPad(m)->getAmplitude())
                           iIsPhot4++;
                  if (iIsPhot4 == 0) iPhot4Nr++;
                  for (k = -1; k < 2; k++)
                     for (l = -1; l < 2; l++)
                        if (abs(l) && abs(k) &&
                            !showMe->IsOut(m, l, k) &&
                            showMe->GetPad(m + l, k)->getAmplitude()
                            >= showMe->GetPad(m)->getAmplitude())
                           iIsPhot8++;
                  if (iIsPhot4 == 0 && iIsPhot8 == 0) iPhot8Nr++;
               }
            }

      showMe->iFakePad = iPad;
      showMe->iFakeLocalMax4 = iPhot4Nr;
      showMe->iFakeLocalMax8 = iPhot8Nr;

   } // end of condition with iRingNr
} // eof CalcRingParameters
//============================================================================

//----------------------------------------------------------------------------
void
HRichRingFind::CloseMaxRejection(TList *hitList)
{
//
// this method tests the quality of candidates close
// to bright rings. Picking up some intensity of the
// bright ring fakes could be identified.
// If the quality of these "fakes" candidates is too
// low compared with the quality of the bright ring
// the candidates are rejected ( if the isActiveFakesRejection
// is equal 2) or stored and labeled with a flag.
// If the quality of the 2 compared rings is similar
// the centroid of both is checked, if one of the two is
// very assymmetric is rejected.

   Int_t listSize = hitList->GetSize();
   HRichHit *pHit1 = NULL;
   HRichHit *pHit2 = NULL;

   if (pAnalysisParams-> isActiveFakesRejection) {
      Float_t maxFakeDistSquared = pAnalysisParams->iRingRadius * pAnalysisParams->iRingRadius * 4.2F; // d = 8.2
      Float_t fakeQualityRatio = pAnalysisParams->fFakeQualityRatio;
      Float_t fakeCentroidCut = pAnalysisParams->fFakeCentroidCut;
   
      for (Int_t i = 0; i < listSize ; i++) {
	 pHit1 = (HRichHit*)(hitList->At(i));
	 if (pHit1->fTests != 3) {
	    for (Int_t j = 0; j < listSize ; j++) {
	       pHit2 = (HRichHit*)(hitList->At(j));
	       if (pHit2->fTests != 3) {
		  Int_t dx = pHit1->iRingX - pHit2->iRingX;
		  Int_t dy = pHit1->iRingY - pHit2->iRingY;
		  Float_t distSquared = dx * dx + dy * dy;
		  if (distSquared < maxFakeDistSquared && i != j) {
		     // only candidates whose distance is lower then ring diameter are compared
		     if (pHit1->iRingQuality + pHit2->iRingQuality == 0)
			Error("CloseMaxRejection", "division by zero"); // should never happen
		     Float_t dQ = (Float_t)(pHit1->iRingQuality - pHit2->iRingQuality)
			        / (Float_t)(pHit1->iRingQuality + pHit2->iRingQuality);

		     if (pHit2->getCentroid() > pHit1->getCentroid() + 0.5F) {
			if (dQ > fakeQualityRatio || pHit2->getCentroid() >= fakeCentroidCut) {
			   pHit2->setRejFake(0);
			}
			continue;
		     }
		     if (pHit1->getCentroid() > pHit2->getCentroid() + 0.5F) {
			if (dQ < -fakeQualityRatio || pHit1->getCentroid() >= fakeCentroidCut) {
			   pHit1->setRejFake(0);
			}
			continue;
		     }
		  }
	       }
	    }// end second loop on the ring list
	 }
      }//end first loop on the ring list
   } // end check isActive flag

   for (Int_t i = 0; i < listSize ; i++) {
      pHit1 = (HRichHit*)(hitList->At(i));
//    if ((2 == pAnalysisParams-> isActiveFakesRejection && 0 == pHit1->getRejFake()) || 3 == pHit1-> fTests) {
      if (0 == pHit1->getRejFake() || 3 == pHit1-> fTests) {
         pHit1-> fTests = 3;
      } else {
         pHit1-> fTests += pHit1->getRejFake() * 1000000;
      }
   }

}
//============================================================================

 hrichringfind.cc:1
 hrichringfind.cc:2
 hrichringfind.cc:3
 hrichringfind.cc:4
 hrichringfind.cc:5
 hrichringfind.cc:6
 hrichringfind.cc:7
 hrichringfind.cc:8
 hrichringfind.cc:9
 hrichringfind.cc:10
 hrichringfind.cc:11
 hrichringfind.cc:12
 hrichringfind.cc:13
 hrichringfind.cc:14
 hrichringfind.cc:15
 hrichringfind.cc:16
 hrichringfind.cc:17
 hrichringfind.cc:18
 hrichringfind.cc:19
 hrichringfind.cc:20
 hrichringfind.cc:21
 hrichringfind.cc:22
 hrichringfind.cc:23
 hrichringfind.cc:24
 hrichringfind.cc:25
 hrichringfind.cc:26
 hrichringfind.cc:27
 hrichringfind.cc:28
 hrichringfind.cc:29
 hrichringfind.cc:30
 hrichringfind.cc:31
 hrichringfind.cc:32
 hrichringfind.cc:33
 hrichringfind.cc:34
 hrichringfind.cc:35
 hrichringfind.cc:36
 hrichringfind.cc:37
 hrichringfind.cc:38
 hrichringfind.cc:39
 hrichringfind.cc:40
 hrichringfind.cc:41
 hrichringfind.cc:42
 hrichringfind.cc:43
 hrichringfind.cc:44
 hrichringfind.cc:45
 hrichringfind.cc:46
 hrichringfind.cc:47
 hrichringfind.cc:48
 hrichringfind.cc:49
 hrichringfind.cc:50
 hrichringfind.cc:51
 hrichringfind.cc:52
 hrichringfind.cc:53
 hrichringfind.cc:54
 hrichringfind.cc:55
 hrichringfind.cc:56
 hrichringfind.cc:57
 hrichringfind.cc:58
 hrichringfind.cc:59
 hrichringfind.cc:60
 hrichringfind.cc:61
 hrichringfind.cc:62
 hrichringfind.cc:63
 hrichringfind.cc:64
 hrichringfind.cc:65
 hrichringfind.cc:66
 hrichringfind.cc:67
 hrichringfind.cc:68
 hrichringfind.cc:69
 hrichringfind.cc:70
 hrichringfind.cc:71
 hrichringfind.cc:72
 hrichringfind.cc:73
 hrichringfind.cc:74
 hrichringfind.cc:75
 hrichringfind.cc:76
 hrichringfind.cc:77
 hrichringfind.cc:78
 hrichringfind.cc:79
 hrichringfind.cc:80
 hrichringfind.cc:81
 hrichringfind.cc:82
 hrichringfind.cc:83
 hrichringfind.cc:84
 hrichringfind.cc:85
 hrichringfind.cc:86
 hrichringfind.cc:87
 hrichringfind.cc:88
 hrichringfind.cc:89
 hrichringfind.cc:90
 hrichringfind.cc:91
 hrichringfind.cc:92
 hrichringfind.cc:93
 hrichringfind.cc:94
 hrichringfind.cc:95
 hrichringfind.cc:96
 hrichringfind.cc:97
 hrichringfind.cc:98
 hrichringfind.cc:99
 hrichringfind.cc:100
 hrichringfind.cc:101
 hrichringfind.cc:102
 hrichringfind.cc:103
 hrichringfind.cc:104
 hrichringfind.cc:105
 hrichringfind.cc:106
 hrichringfind.cc:107
 hrichringfind.cc:108
 hrichringfind.cc:109
 hrichringfind.cc:110
 hrichringfind.cc:111
 hrichringfind.cc:112
 hrichringfind.cc:113
 hrichringfind.cc:114
 hrichringfind.cc:115
 hrichringfind.cc:116
 hrichringfind.cc:117
 hrichringfind.cc:118
 hrichringfind.cc:119
 hrichringfind.cc:120
 hrichringfind.cc:121
 hrichringfind.cc:122
 hrichringfind.cc:123
 hrichringfind.cc:124
 hrichringfind.cc:125
 hrichringfind.cc:126
 hrichringfind.cc:127
 hrichringfind.cc:128
 hrichringfind.cc:129
 hrichringfind.cc:130
 hrichringfind.cc:131
 hrichringfind.cc:132
 hrichringfind.cc:133
 hrichringfind.cc:134
 hrichringfind.cc:135
 hrichringfind.cc:136
 hrichringfind.cc:137
 hrichringfind.cc:138
 hrichringfind.cc:139
 hrichringfind.cc:140
 hrichringfind.cc:141
 hrichringfind.cc:142
 hrichringfind.cc:143
 hrichringfind.cc:144
 hrichringfind.cc:145
 hrichringfind.cc:146
 hrichringfind.cc:147
 hrichringfind.cc:148
 hrichringfind.cc:149
 hrichringfind.cc:150
 hrichringfind.cc:151
 hrichringfind.cc:152
 hrichringfind.cc:153
 hrichringfind.cc:154
 hrichringfind.cc:155
 hrichringfind.cc:156
 hrichringfind.cc:157
 hrichringfind.cc:158
 hrichringfind.cc:159
 hrichringfind.cc:160
 hrichringfind.cc:161
 hrichringfind.cc:162
 hrichringfind.cc:163
 hrichringfind.cc:164
 hrichringfind.cc:165
 hrichringfind.cc:166
 hrichringfind.cc:167
 hrichringfind.cc:168
 hrichringfind.cc:169
 hrichringfind.cc:170
 hrichringfind.cc:171
 hrichringfind.cc:172
 hrichringfind.cc:173
 hrichringfind.cc:174
 hrichringfind.cc:175
 hrichringfind.cc:176
 hrichringfind.cc:177
 hrichringfind.cc:178
 hrichringfind.cc:179
 hrichringfind.cc:180
 hrichringfind.cc:181
 hrichringfind.cc:182
 hrichringfind.cc:183
 hrichringfind.cc:184
 hrichringfind.cc:185
 hrichringfind.cc:186
 hrichringfind.cc:187
 hrichringfind.cc:188
 hrichringfind.cc:189
 hrichringfind.cc:190
 hrichringfind.cc:191
 hrichringfind.cc:192
 hrichringfind.cc:193
 hrichringfind.cc:194
 hrichringfind.cc:195
 hrichringfind.cc:196
 hrichringfind.cc:197
 hrichringfind.cc:198
 hrichringfind.cc:199
 hrichringfind.cc:200
 hrichringfind.cc:201
 hrichringfind.cc:202
 hrichringfind.cc:203
 hrichringfind.cc:204
 hrichringfind.cc:205
 hrichringfind.cc:206
 hrichringfind.cc:207
 hrichringfind.cc:208
 hrichringfind.cc:209
 hrichringfind.cc:210
 hrichringfind.cc:211
 hrichringfind.cc:212
 hrichringfind.cc:213
 hrichringfind.cc:214
 hrichringfind.cc:215
 hrichringfind.cc:216
 hrichringfind.cc:217
 hrichringfind.cc:218
 hrichringfind.cc:219
 hrichringfind.cc:220
 hrichringfind.cc:221
 hrichringfind.cc:222
 hrichringfind.cc:223
 hrichringfind.cc:224
 hrichringfind.cc:225
 hrichringfind.cc:226
 hrichringfind.cc:227
 hrichringfind.cc:228
 hrichringfind.cc:229
 hrichringfind.cc:230
 hrichringfind.cc:231
 hrichringfind.cc:232
 hrichringfind.cc:233
 hrichringfind.cc:234
 hrichringfind.cc:235
 hrichringfind.cc:236
 hrichringfind.cc:237
 hrichringfind.cc:238
 hrichringfind.cc:239
 hrichringfind.cc:240
 hrichringfind.cc:241
 hrichringfind.cc:242
 hrichringfind.cc:243
 hrichringfind.cc:244
 hrichringfind.cc:245
 hrichringfind.cc:246
 hrichringfind.cc:247
 hrichringfind.cc:248
 hrichringfind.cc:249
 hrichringfind.cc:250
 hrichringfind.cc:251
 hrichringfind.cc:252
 hrichringfind.cc:253
 hrichringfind.cc:254
 hrichringfind.cc:255
 hrichringfind.cc:256
 hrichringfind.cc:257
 hrichringfind.cc:258
 hrichringfind.cc:259
 hrichringfind.cc:260
 hrichringfind.cc:261
 hrichringfind.cc:262
 hrichringfind.cc:263
 hrichringfind.cc:264
 hrichringfind.cc:265
 hrichringfind.cc:266
 hrichringfind.cc:267
 hrichringfind.cc:268
 hrichringfind.cc:269
 hrichringfind.cc:270
 hrichringfind.cc:271
 hrichringfind.cc:272
 hrichringfind.cc:273
 hrichringfind.cc:274
 hrichringfind.cc:275
 hrichringfind.cc:276
 hrichringfind.cc:277
 hrichringfind.cc:278
 hrichringfind.cc:279
 hrichringfind.cc:280
 hrichringfind.cc:281
 hrichringfind.cc:282
 hrichringfind.cc:283
 hrichringfind.cc:284
 hrichringfind.cc:285
 hrichringfind.cc:286
 hrichringfind.cc:287
 hrichringfind.cc:288
 hrichringfind.cc:289
 hrichringfind.cc:290
 hrichringfind.cc:291
 hrichringfind.cc:292
 hrichringfind.cc:293
 hrichringfind.cc:294
 hrichringfind.cc:295
 hrichringfind.cc:296
 hrichringfind.cc:297
 hrichringfind.cc:298
 hrichringfind.cc:299
 hrichringfind.cc:300
 hrichringfind.cc:301
 hrichringfind.cc:302
 hrichringfind.cc:303
 hrichringfind.cc:304
 hrichringfind.cc:305
 hrichringfind.cc:306
 hrichringfind.cc:307
 hrichringfind.cc:308
 hrichringfind.cc:309
 hrichringfind.cc:310
 hrichringfind.cc:311
 hrichringfind.cc:312
 hrichringfind.cc:313
 hrichringfind.cc:314
 hrichringfind.cc:315
 hrichringfind.cc:316
 hrichringfind.cc:317
 hrichringfind.cc:318
 hrichringfind.cc:319
 hrichringfind.cc:320
 hrichringfind.cc:321
 hrichringfind.cc:322
 hrichringfind.cc:323
 hrichringfind.cc:324
 hrichringfind.cc:325
 hrichringfind.cc:326
 hrichringfind.cc:327
 hrichringfind.cc:328
 hrichringfind.cc:329
 hrichringfind.cc:330
 hrichringfind.cc:331
 hrichringfind.cc:332
 hrichringfind.cc:333
 hrichringfind.cc:334
 hrichringfind.cc:335
 hrichringfind.cc:336
 hrichringfind.cc:337
 hrichringfind.cc:338
 hrichringfind.cc:339
 hrichringfind.cc:340
 hrichringfind.cc:341
 hrichringfind.cc:342
 hrichringfind.cc:343
 hrichringfind.cc:344
 hrichringfind.cc:345
 hrichringfind.cc:346
 hrichringfind.cc:347
 hrichringfind.cc:348
 hrichringfind.cc:349
 hrichringfind.cc:350
 hrichringfind.cc:351
 hrichringfind.cc:352
 hrichringfind.cc:353
 hrichringfind.cc:354
 hrichringfind.cc:355
 hrichringfind.cc:356
 hrichringfind.cc:357
 hrichringfind.cc:358
 hrichringfind.cc:359
 hrichringfind.cc:360
 hrichringfind.cc:361
 hrichringfind.cc:362
 hrichringfind.cc:363
 hrichringfind.cc:364
 hrichringfind.cc:365
 hrichringfind.cc:366
 hrichringfind.cc:367
 hrichringfind.cc:368
 hrichringfind.cc:369
 hrichringfind.cc:370
 hrichringfind.cc:371
 hrichringfind.cc:372
 hrichringfind.cc:373
 hrichringfind.cc:374
 hrichringfind.cc:375
 hrichringfind.cc:376
 hrichringfind.cc:377
 hrichringfind.cc:378
 hrichringfind.cc:379
 hrichringfind.cc:380
 hrichringfind.cc:381
 hrichringfind.cc:382
 hrichringfind.cc:383
 hrichringfind.cc:384
 hrichringfind.cc:385
 hrichringfind.cc:386
 hrichringfind.cc:387
 hrichringfind.cc:388
 hrichringfind.cc:389
 hrichringfind.cc:390
 hrichringfind.cc:391
 hrichringfind.cc:392
 hrichringfind.cc:393
 hrichringfind.cc:394
 hrichringfind.cc:395
 hrichringfind.cc:396
 hrichringfind.cc:397
 hrichringfind.cc:398
 hrichringfind.cc:399
 hrichringfind.cc:400
 hrichringfind.cc:401
 hrichringfind.cc:402
 hrichringfind.cc:403
 hrichringfind.cc:404
 hrichringfind.cc:405
 hrichringfind.cc:406
 hrichringfind.cc:407
 hrichringfind.cc:408
 hrichringfind.cc:409
 hrichringfind.cc:410
 hrichringfind.cc:411
 hrichringfind.cc:412
 hrichringfind.cc:413
 hrichringfind.cc:414
 hrichringfind.cc:415
 hrichringfind.cc:416
 hrichringfind.cc:417
 hrichringfind.cc:418
 hrichringfind.cc:419
 hrichringfind.cc:420
 hrichringfind.cc:421
 hrichringfind.cc:422
 hrichringfind.cc:423
 hrichringfind.cc:424
 hrichringfind.cc:425
 hrichringfind.cc:426
 hrichringfind.cc:427
 hrichringfind.cc:428
 hrichringfind.cc:429
 hrichringfind.cc:430
 hrichringfind.cc:431
 hrichringfind.cc:432
 hrichringfind.cc:433
 hrichringfind.cc:434
 hrichringfind.cc:435
 hrichringfind.cc:436
 hrichringfind.cc:437
 hrichringfind.cc:438
 hrichringfind.cc:439
 hrichringfind.cc:440
 hrichringfind.cc:441
 hrichringfind.cc:442
 hrichringfind.cc:443
 hrichringfind.cc:444
 hrichringfind.cc:445
 hrichringfind.cc:446
 hrichringfind.cc:447
 hrichringfind.cc:448
 hrichringfind.cc:449
 hrichringfind.cc:450
 hrichringfind.cc:451
 hrichringfind.cc:452
 hrichringfind.cc:453
 hrichringfind.cc:454
 hrichringfind.cc:455
 hrichringfind.cc:456
 hrichringfind.cc:457
 hrichringfind.cc:458
 hrichringfind.cc:459
 hrichringfind.cc:460
 hrichringfind.cc:461
 hrichringfind.cc:462
 hrichringfind.cc:463
 hrichringfind.cc:464
 hrichringfind.cc:465
 hrichringfind.cc:466
 hrichringfind.cc:467
 hrichringfind.cc:468
 hrichringfind.cc:469
 hrichringfind.cc:470
 hrichringfind.cc:471
 hrichringfind.cc:472
 hrichringfind.cc:473
 hrichringfind.cc:474
 hrichringfind.cc:475
 hrichringfind.cc:476
 hrichringfind.cc:477
 hrichringfind.cc:478
 hrichringfind.cc:479
 hrichringfind.cc:480
 hrichringfind.cc:481
 hrichringfind.cc:482
 hrichringfind.cc:483
 hrichringfind.cc:484
 hrichringfind.cc:485
 hrichringfind.cc:486
 hrichringfind.cc:487
 hrichringfind.cc:488
 hrichringfind.cc:489
 hrichringfind.cc:490
 hrichringfind.cc:491
 hrichringfind.cc:492
 hrichringfind.cc:493
 hrichringfind.cc:494
 hrichringfind.cc:495
 hrichringfind.cc:496
 hrichringfind.cc:497
 hrichringfind.cc:498
 hrichringfind.cc:499
 hrichringfind.cc:500
 hrichringfind.cc:501
 hrichringfind.cc:502
 hrichringfind.cc:503
 hrichringfind.cc:504
 hrichringfind.cc:505
 hrichringfind.cc:506
 hrichringfind.cc:507
 hrichringfind.cc:508
 hrichringfind.cc:509
 hrichringfind.cc:510
 hrichringfind.cc:511
 hrichringfind.cc:512
 hrichringfind.cc:513
 hrichringfind.cc:514
 hrichringfind.cc:515
 hrichringfind.cc:516
 hrichringfind.cc:517
 hrichringfind.cc:518
 hrichringfind.cc:519
 hrichringfind.cc:520
 hrichringfind.cc:521
 hrichringfind.cc:522
 hrichringfind.cc:523
 hrichringfind.cc:524
 hrichringfind.cc:525
 hrichringfind.cc:526
 hrichringfind.cc:527
 hrichringfind.cc:528
 hrichringfind.cc:529
 hrichringfind.cc:530
 hrichringfind.cc:531
 hrichringfind.cc:532
 hrichringfind.cc:533
 hrichringfind.cc:534
 hrichringfind.cc:535
 hrichringfind.cc:536
 hrichringfind.cc:537
 hrichringfind.cc:538
 hrichringfind.cc:539
 hrichringfind.cc:540
 hrichringfind.cc:541
 hrichringfind.cc:542
 hrichringfind.cc:543
 hrichringfind.cc:544
 hrichringfind.cc:545
 hrichringfind.cc:546
 hrichringfind.cc:547
 hrichringfind.cc:548
 hrichringfind.cc:549
 hrichringfind.cc:550
 hrichringfind.cc:551
 hrichringfind.cc:552
 hrichringfind.cc:553
 hrichringfind.cc:554
 hrichringfind.cc:555
 hrichringfind.cc:556
 hrichringfind.cc:557
 hrichringfind.cc:558
 hrichringfind.cc:559
 hrichringfind.cc:560
 hrichringfind.cc:561
 hrichringfind.cc:562
 hrichringfind.cc:563
 hrichringfind.cc:564
 hrichringfind.cc:565
 hrichringfind.cc:566
 hrichringfind.cc:567
 hrichringfind.cc:568
 hrichringfind.cc:569
 hrichringfind.cc:570
 hrichringfind.cc:571
 hrichringfind.cc:572
 hrichringfind.cc:573
 hrichringfind.cc:574
 hrichringfind.cc:575
 hrichringfind.cc:576
 hrichringfind.cc:577
 hrichringfind.cc:578
 hrichringfind.cc:579
 hrichringfind.cc:580
 hrichringfind.cc:581
 hrichringfind.cc:582
 hrichringfind.cc:583
 hrichringfind.cc:584
 hrichringfind.cc:585
 hrichringfind.cc:586
 hrichringfind.cc:587
 hrichringfind.cc:588
 hrichringfind.cc:589
 hrichringfind.cc:590
 hrichringfind.cc:591
 hrichringfind.cc:592
 hrichringfind.cc:593
 hrichringfind.cc:594
 hrichringfind.cc:595
 hrichringfind.cc:596
 hrichringfind.cc:597
 hrichringfind.cc:598
 hrichringfind.cc:599
 hrichringfind.cc:600
 hrichringfind.cc:601
 hrichringfind.cc:602
 hrichringfind.cc:603
 hrichringfind.cc:604
 hrichringfind.cc:605
 hrichringfind.cc:606
 hrichringfind.cc:607
 hrichringfind.cc:608
 hrichringfind.cc:609
 hrichringfind.cc:610
 hrichringfind.cc:611
 hrichringfind.cc:612
 hrichringfind.cc:613
 hrichringfind.cc:614
 hrichringfind.cc:615
 hrichringfind.cc:616
 hrichringfind.cc:617
 hrichringfind.cc:618
 hrichringfind.cc:619
 hrichringfind.cc:620
 hrichringfind.cc:621
 hrichringfind.cc:622
 hrichringfind.cc:623
 hrichringfind.cc:624
 hrichringfind.cc:625
 hrichringfind.cc:626
 hrichringfind.cc:627
 hrichringfind.cc:628
 hrichringfind.cc:629
 hrichringfind.cc:630
 hrichringfind.cc:631
 hrichringfind.cc:632
 hrichringfind.cc:633
 hrichringfind.cc:634
 hrichringfind.cc:635
 hrichringfind.cc:636
 hrichringfind.cc:637
 hrichringfind.cc:638
 hrichringfind.cc:639
 hrichringfind.cc:640
 hrichringfind.cc:641
 hrichringfind.cc:642
 hrichringfind.cc:643
 hrichringfind.cc:644
 hrichringfind.cc:645
 hrichringfind.cc:646
 hrichringfind.cc:647
 hrichringfind.cc:648
 hrichringfind.cc:649
 hrichringfind.cc:650
 hrichringfind.cc:651
 hrichringfind.cc:652
 hrichringfind.cc:653
 hrichringfind.cc:654
 hrichringfind.cc:655
 hrichringfind.cc:656
 hrichringfind.cc:657
 hrichringfind.cc:658
 hrichringfind.cc:659
 hrichringfind.cc:660
 hrichringfind.cc:661
 hrichringfind.cc:662
 hrichringfind.cc:663
 hrichringfind.cc:664
 hrichringfind.cc:665
 hrichringfind.cc:666
 hrichringfind.cc:667
 hrichringfind.cc:668
 hrichringfind.cc:669
 hrichringfind.cc:670
 hrichringfind.cc:671
 hrichringfind.cc:672
 hrichringfind.cc:673
 hrichringfind.cc:674
 hrichringfind.cc:675
 hrichringfind.cc:676
 hrichringfind.cc:677
 hrichringfind.cc:678
 hrichringfind.cc:679
 hrichringfind.cc:680
 hrichringfind.cc:681
 hrichringfind.cc:682
 hrichringfind.cc:683
 hrichringfind.cc:684
 hrichringfind.cc:685
 hrichringfind.cc:686
 hrichringfind.cc:687
 hrichringfind.cc:688
 hrichringfind.cc:689
 hrichringfind.cc:690
 hrichringfind.cc:691
 hrichringfind.cc:692
 hrichringfind.cc:693
 hrichringfind.cc:694
 hrichringfind.cc:695
 hrichringfind.cc:696
 hrichringfind.cc:697
 hrichringfind.cc:698
 hrichringfind.cc:699
 hrichringfind.cc:700
 hrichringfind.cc:701
 hrichringfind.cc:702
 hrichringfind.cc:703
 hrichringfind.cc:704
 hrichringfind.cc:705
 hrichringfind.cc:706
 hrichringfind.cc:707
 hrichringfind.cc:708
 hrichringfind.cc:709
 hrichringfind.cc:710
 hrichringfind.cc:711
 hrichringfind.cc:712
 hrichringfind.cc:713
 hrichringfind.cc:714
 hrichringfind.cc:715
 hrichringfind.cc:716
 hrichringfind.cc:717
 hrichringfind.cc:718
 hrichringfind.cc:719
 hrichringfind.cc:720
 hrichringfind.cc:721
 hrichringfind.cc:722
 hrichringfind.cc:723
 hrichringfind.cc:724
 hrichringfind.cc:725
 hrichringfind.cc:726
 hrichringfind.cc:727
 hrichringfind.cc:728
 hrichringfind.cc:729
 hrichringfind.cc:730
 hrichringfind.cc:731
 hrichringfind.cc:732
 hrichringfind.cc:733
 hrichringfind.cc:734
 hrichringfind.cc:735
 hrichringfind.cc:736
 hrichringfind.cc:737
 hrichringfind.cc:738
 hrichringfind.cc:739
 hrichringfind.cc:740
 hrichringfind.cc:741
 hrichringfind.cc:742
 hrichringfind.cc:743
 hrichringfind.cc:744
 hrichringfind.cc:745
 hrichringfind.cc:746
 hrichringfind.cc:747
 hrichringfind.cc:748
 hrichringfind.cc:749
 hrichringfind.cc:750
 hrichringfind.cc:751
 hrichringfind.cc:752
 hrichringfind.cc:753
 hrichringfind.cc:754
 hrichringfind.cc:755
 hrichringfind.cc:756
 hrichringfind.cc:757
 hrichringfind.cc:758
 hrichringfind.cc:759
 hrichringfind.cc:760
 hrichringfind.cc:761
 hrichringfind.cc:762
 hrichringfind.cc:763
 hrichringfind.cc:764
 hrichringfind.cc:765
 hrichringfind.cc:766
 hrichringfind.cc:767
 hrichringfind.cc:768
 hrichringfind.cc:769
 hrichringfind.cc:770
 hrichringfind.cc:771
 hrichringfind.cc:772
 hrichringfind.cc:773
 hrichringfind.cc:774
 hrichringfind.cc:775
 hrichringfind.cc:776
 hrichringfind.cc:777
 hrichringfind.cc:778
 hrichringfind.cc:779
 hrichringfind.cc:780
 hrichringfind.cc:781
 hrichringfind.cc:782
 hrichringfind.cc:783
 hrichringfind.cc:784
 hrichringfind.cc:785
 hrichringfind.cc:786
 hrichringfind.cc:787
 hrichringfind.cc:788
 hrichringfind.cc:789
 hrichringfind.cc:790
 hrichringfind.cc:791
 hrichringfind.cc:792
 hrichringfind.cc:793
 hrichringfind.cc:794
 hrichringfind.cc:795
 hrichringfind.cc:796
 hrichringfind.cc:797
 hrichringfind.cc:798
 hrichringfind.cc:799
 hrichringfind.cc:800
 hrichringfind.cc:801
 hrichringfind.cc:802
 hrichringfind.cc:803
 hrichringfind.cc:804
 hrichringfind.cc:805
 hrichringfind.cc:806
 hrichringfind.cc:807
 hrichringfind.cc:808
 hrichringfind.cc:809
 hrichringfind.cc:810
 hrichringfind.cc:811
 hrichringfind.cc:812
 hrichringfind.cc:813
 hrichringfind.cc:814
 hrichringfind.cc:815
 hrichringfind.cc:816
 hrichringfind.cc:817
 hrichringfind.cc:818
 hrichringfind.cc:819
 hrichringfind.cc:820
 hrichringfind.cc:821
 hrichringfind.cc:822
 hrichringfind.cc:823
 hrichringfind.cc:824
 hrichringfind.cc:825
 hrichringfind.cc:826
 hrichringfind.cc:827
 hrichringfind.cc:828
 hrichringfind.cc:829
 hrichringfind.cc:830
 hrichringfind.cc:831
 hrichringfind.cc:832
 hrichringfind.cc:833
 hrichringfind.cc:834
 hrichringfind.cc:835
 hrichringfind.cc:836
 hrichringfind.cc:837
 hrichringfind.cc:838
 hrichringfind.cc:839
 hrichringfind.cc:840
 hrichringfind.cc:841
 hrichringfind.cc:842
 hrichringfind.cc:843
 hrichringfind.cc:844
 hrichringfind.cc:845
 hrichringfind.cc:846
 hrichringfind.cc:847
 hrichringfind.cc:848
 hrichringfind.cc:849
 hrichringfind.cc:850
 hrichringfind.cc:851
 hrichringfind.cc:852
 hrichringfind.cc:853
 hrichringfind.cc:854
 hrichringfind.cc:855
 hrichringfind.cc:856
 hrichringfind.cc:857
 hrichringfind.cc:858
 hrichringfind.cc:859
 hrichringfind.cc:860
 hrichringfind.cc:861
 hrichringfind.cc:862
 hrichringfind.cc:863
 hrichringfind.cc:864
 hrichringfind.cc:865
 hrichringfind.cc:866
 hrichringfind.cc:867
 hrichringfind.cc:868
 hrichringfind.cc:869
 hrichringfind.cc:870
 hrichringfind.cc:871
 hrichringfind.cc:872
 hrichringfind.cc:873
 hrichringfind.cc:874
 hrichringfind.cc:875
 hrichringfind.cc:876
 hrichringfind.cc:877
 hrichringfind.cc:878
 hrichringfind.cc:879
 hrichringfind.cc:880
 hrichringfind.cc:881
 hrichringfind.cc:882
 hrichringfind.cc:883
 hrichringfind.cc:884
 hrichringfind.cc:885
 hrichringfind.cc:886
 hrichringfind.cc:887
 hrichringfind.cc:888
 hrichringfind.cc:889
 hrichringfind.cc:890
 hrichringfind.cc:891
 hrichringfind.cc:892
 hrichringfind.cc:893
 hrichringfind.cc:894
 hrichringfind.cc:895
 hrichringfind.cc:896
 hrichringfind.cc:897
 hrichringfind.cc:898
 hrichringfind.cc:899
 hrichringfind.cc:900
 hrichringfind.cc:901
 hrichringfind.cc:902
 hrichringfind.cc:903
 hrichringfind.cc:904
 hrichringfind.cc:905
 hrichringfind.cc:906
 hrichringfind.cc:907
 hrichringfind.cc:908
 hrichringfind.cc:909
 hrichringfind.cc:910
 hrichringfind.cc:911
 hrichringfind.cc:912
 hrichringfind.cc:913
 hrichringfind.cc:914
 hrichringfind.cc:915
 hrichringfind.cc:916
 hrichringfind.cc:917
 hrichringfind.cc:918
 hrichringfind.cc:919
 hrichringfind.cc:920
 hrichringfind.cc:921
 hrichringfind.cc:922
 hrichringfind.cc:923
 hrichringfind.cc:924
 hrichringfind.cc:925
 hrichringfind.cc:926
 hrichringfind.cc:927
 hrichringfind.cc:928
 hrichringfind.cc:929
 hrichringfind.cc:930
 hrichringfind.cc:931
 hrichringfind.cc:932
 hrichringfind.cc:933
 hrichringfind.cc:934
 hrichringfind.cc:935
 hrichringfind.cc:936
 hrichringfind.cc:937
 hrichringfind.cc:938
 hrichringfind.cc:939
 hrichringfind.cc:940
 hrichringfind.cc:941
 hrichringfind.cc:942
 hrichringfind.cc:943
 hrichringfind.cc:944
 hrichringfind.cc:945
 hrichringfind.cc:946
 hrichringfind.cc:947
 hrichringfind.cc:948
 hrichringfind.cc:949
 hrichringfind.cc:950
 hrichringfind.cc:951
 hrichringfind.cc:952
 hrichringfind.cc:953
 hrichringfind.cc:954
 hrichringfind.cc:955
 hrichringfind.cc:956
 hrichringfind.cc:957
 hrichringfind.cc:958
 hrichringfind.cc:959
 hrichringfind.cc:960
 hrichringfind.cc:961
 hrichringfind.cc:962
 hrichringfind.cc:963
 hrichringfind.cc:964
 hrichringfind.cc:965
 hrichringfind.cc:966
 hrichringfind.cc:967
 hrichringfind.cc:968
 hrichringfind.cc:969
 hrichringfind.cc:970
 hrichringfind.cc:971
 hrichringfind.cc:972
 hrichringfind.cc:973
 hrichringfind.cc:974
 hrichringfind.cc:975
 hrichringfind.cc:976
 hrichringfind.cc:977
 hrichringfind.cc:978
 hrichringfind.cc:979
 hrichringfind.cc:980
 hrichringfind.cc:981
 hrichringfind.cc:982
 hrichringfind.cc:983
 hrichringfind.cc:984
 hrichringfind.cc:985
 hrichringfind.cc:986
 hrichringfind.cc:987
 hrichringfind.cc:988
 hrichringfind.cc:989
 hrichringfind.cc:990
 hrichringfind.cc:991
 hrichringfind.cc:992
 hrichringfind.cc:993
 hrichringfind.cc:994
 hrichringfind.cc:995
 hrichringfind.cc:996
 hrichringfind.cc:997
 hrichringfind.cc:998
 hrichringfind.cc:999
 hrichringfind.cc:1000
 hrichringfind.cc:1001
 hrichringfind.cc:1002
 hrichringfind.cc:1003
 hrichringfind.cc:1004
 hrichringfind.cc:1005
 hrichringfind.cc:1006
 hrichringfind.cc:1007
 hrichringfind.cc:1008
 hrichringfind.cc:1009
 hrichringfind.cc:1010
 hrichringfind.cc:1011
 hrichringfind.cc:1012
 hrichringfind.cc:1013
 hrichringfind.cc:1014
 hrichringfind.cc:1015
 hrichringfind.cc:1016
 hrichringfind.cc:1017
 hrichringfind.cc:1018
 hrichringfind.cc:1019
 hrichringfind.cc:1020
 hrichringfind.cc:1021
 hrichringfind.cc:1022
 hrichringfind.cc:1023
 hrichringfind.cc:1024
 hrichringfind.cc:1025
 hrichringfind.cc:1026
 hrichringfind.cc:1027
 hrichringfind.cc:1028
 hrichringfind.cc:1029
 hrichringfind.cc:1030
 hrichringfind.cc:1031
 hrichringfind.cc:1032
 hrichringfind.cc:1033
 hrichringfind.cc:1034
 hrichringfind.cc:1035
 hrichringfind.cc:1036
 hrichringfind.cc:1037
 hrichringfind.cc:1038
 hrichringfind.cc:1039
 hrichringfind.cc:1040
 hrichringfind.cc:1041
 hrichringfind.cc:1042
 hrichringfind.cc:1043
 hrichringfind.cc:1044
 hrichringfind.cc:1045
 hrichringfind.cc:1046
 hrichringfind.cc:1047
 hrichringfind.cc:1048
 hrichringfind.cc:1049
 hrichringfind.cc:1050
 hrichringfind.cc:1051
 hrichringfind.cc:1052
 hrichringfind.cc:1053
 hrichringfind.cc:1054
 hrichringfind.cc:1055
 hrichringfind.cc:1056
 hrichringfind.cc:1057
 hrichringfind.cc:1058
 hrichringfind.cc:1059
 hrichringfind.cc:1060
 hrichringfind.cc:1061
 hrichringfind.cc:1062
 hrichringfind.cc:1063
 hrichringfind.cc:1064
 hrichringfind.cc:1065
 hrichringfind.cc:1066
 hrichringfind.cc:1067
 hrichringfind.cc:1068
 hrichringfind.cc:1069
 hrichringfind.cc:1070
 hrichringfind.cc:1071
 hrichringfind.cc:1072
 hrichringfind.cc:1073
 hrichringfind.cc:1074
 hrichringfind.cc:1075
 hrichringfind.cc:1076
 hrichringfind.cc:1077
 hrichringfind.cc:1078
 hrichringfind.cc:1079
 hrichringfind.cc:1080
 hrichringfind.cc:1081
 hrichringfind.cc:1082
 hrichringfind.cc:1083
 hrichringfind.cc:1084
 hrichringfind.cc:1085
 hrichringfind.cc:1086
 hrichringfind.cc:1087
 hrichringfind.cc:1088
 hrichringfind.cc:1089
 hrichringfind.cc:1090
 hrichringfind.cc:1091
 hrichringfind.cc:1092
 hrichringfind.cc:1093
 hrichringfind.cc:1094
 hrichringfind.cc:1095
 hrichringfind.cc:1096
 hrichringfind.cc:1097
 hrichringfind.cc:1098
 hrichringfind.cc:1099
 hrichringfind.cc:1100
 hrichringfind.cc:1101
 hrichringfind.cc:1102
 hrichringfind.cc:1103
 hrichringfind.cc:1104
 hrichringfind.cc:1105
 hrichringfind.cc:1106
 hrichringfind.cc:1107
 hrichringfind.cc:1108
 hrichringfind.cc:1109
 hrichringfind.cc:1110
 hrichringfind.cc:1111
 hrichringfind.cc:1112
 hrichringfind.cc:1113
 hrichringfind.cc:1114
 hrichringfind.cc:1115
 hrichringfind.cc:1116
 hrichringfind.cc:1117
 hrichringfind.cc:1118
 hrichringfind.cc:1119
 hrichringfind.cc:1120
 hrichringfind.cc:1121
 hrichringfind.cc:1122
 hrichringfind.cc:1123
 hrichringfind.cc:1124
 hrichringfind.cc:1125
 hrichringfind.cc:1126
 hrichringfind.cc:1127
 hrichringfind.cc:1128
 hrichringfind.cc:1129
 hrichringfind.cc:1130
 hrichringfind.cc:1131
 hrichringfind.cc:1132
 hrichringfind.cc:1133
 hrichringfind.cc:1134
 hrichringfind.cc:1135
 hrichringfind.cc:1136
 hrichringfind.cc:1137
 hrichringfind.cc:1138
 hrichringfind.cc:1139
 hrichringfind.cc:1140
 hrichringfind.cc:1141
 hrichringfind.cc:1142
 hrichringfind.cc:1143
 hrichringfind.cc:1144
 hrichringfind.cc:1145
 hrichringfind.cc:1146
 hrichringfind.cc:1147
 hrichringfind.cc:1148
 hrichringfind.cc:1149
 hrichringfind.cc:1150
 hrichringfind.cc:1151
 hrichringfind.cc:1152
 hrichringfind.cc:1153
 hrichringfind.cc:1154
 hrichringfind.cc:1155
 hrichringfind.cc:1156
 hrichringfind.cc:1157
 hrichringfind.cc:1158
 hrichringfind.cc:1159
 hrichringfind.cc:1160
 hrichringfind.cc:1161
 hrichringfind.cc:1162
 hrichringfind.cc:1163
 hrichringfind.cc:1164
 hrichringfind.cc:1165
 hrichringfind.cc:1166
 hrichringfind.cc:1167
 hrichringfind.cc:1168
 hrichringfind.cc:1169
 hrichringfind.cc:1170
 hrichringfind.cc:1171
 hrichringfind.cc:1172
 hrichringfind.cc:1173
 hrichringfind.cc:1174
 hrichringfind.cc:1175
 hrichringfind.cc:1176
 hrichringfind.cc:1177
 hrichringfind.cc:1178
 hrichringfind.cc:1179
 hrichringfind.cc:1180
 hrichringfind.cc:1181
 hrichringfind.cc:1182
 hrichringfind.cc:1183
 hrichringfind.cc:1184
 hrichringfind.cc:1185
 hrichringfind.cc:1186
 hrichringfind.cc:1187
 hrichringfind.cc:1188
 hrichringfind.cc:1189
 hrichringfind.cc:1190
 hrichringfind.cc:1191
 hrichringfind.cc:1192
 hrichringfind.cc:1193
 hrichringfind.cc:1194
 hrichringfind.cc:1195
 hrichringfind.cc:1196
 hrichringfind.cc:1197
 hrichringfind.cc:1198
 hrichringfind.cc:1199
 hrichringfind.cc:1200
 hrichringfind.cc:1201
 hrichringfind.cc:1202
 hrichringfind.cc:1203
 hrichringfind.cc:1204
 hrichringfind.cc:1205
 hrichringfind.cc:1206
 hrichringfind.cc:1207
 hrichringfind.cc:1208
 hrichringfind.cc:1209
 hrichringfind.cc:1210
 hrichringfind.cc:1211
 hrichringfind.cc:1212
 hrichringfind.cc:1213
 hrichringfind.cc:1214
 hrichringfind.cc:1215
 hrichringfind.cc:1216
 hrichringfind.cc:1217
 hrichringfind.cc:1218
 hrichringfind.cc:1219
 hrichringfind.cc:1220
 hrichringfind.cc:1221
 hrichringfind.cc:1222
 hrichringfind.cc:1223
 hrichringfind.cc:1224
 hrichringfind.cc:1225
 hrichringfind.cc:1226
 hrichringfind.cc:1227
 hrichringfind.cc:1228
 hrichringfind.cc:1229
 hrichringfind.cc:1230
 hrichringfind.cc:1231
 hrichringfind.cc:1232
 hrichringfind.cc:1233
 hrichringfind.cc:1234
 hrichringfind.cc:1235
 hrichringfind.cc:1236
 hrichringfind.cc:1237
 hrichringfind.cc:1238
 hrichringfind.cc:1239
 hrichringfind.cc:1240
 hrichringfind.cc:1241
 hrichringfind.cc:1242
 hrichringfind.cc:1243
 hrichringfind.cc:1244
 hrichringfind.cc:1245
 hrichringfind.cc:1246
 hrichringfind.cc:1247
 hrichringfind.cc:1248
 hrichringfind.cc:1249
 hrichringfind.cc:1250
 hrichringfind.cc:1251
 hrichringfind.cc:1252
 hrichringfind.cc:1253
 hrichringfind.cc:1254
 hrichringfind.cc:1255
 hrichringfind.cc:1256
 hrichringfind.cc:1257
 hrichringfind.cc:1258
 hrichringfind.cc:1259
 hrichringfind.cc:1260
 hrichringfind.cc:1261
 hrichringfind.cc:1262
 hrichringfind.cc:1263
 hrichringfind.cc:1264
 hrichringfind.cc:1265
 hrichringfind.cc:1266
 hrichringfind.cc:1267
 hrichringfind.cc:1268
 hrichringfind.cc:1269
 hrichringfind.cc:1270
 hrichringfind.cc:1271
 hrichringfind.cc:1272
 hrichringfind.cc:1273
 hrichringfind.cc:1274
 hrichringfind.cc:1275
 hrichringfind.cc:1276
 hrichringfind.cc:1277
 hrichringfind.cc:1278
 hrichringfind.cc:1279
 hrichringfind.cc:1280
 hrichringfind.cc:1281
 hrichringfind.cc:1282
 hrichringfind.cc:1283
 hrichringfind.cc:1284
 hrichringfind.cc:1285
 hrichringfind.cc:1286
 hrichringfind.cc:1287
 hrichringfind.cc:1288
 hrichringfind.cc:1289
 hrichringfind.cc:1290
 hrichringfind.cc:1291
 hrichringfind.cc:1292
 hrichringfind.cc:1293
 hrichringfind.cc:1294
 hrichringfind.cc:1295
 hrichringfind.cc:1296
 hrichringfind.cc:1297
 hrichringfind.cc:1298
 hrichringfind.cc:1299
 hrichringfind.cc:1300
 hrichringfind.cc:1301
 hrichringfind.cc:1302
 hrichringfind.cc:1303
 hrichringfind.cc:1304
 hrichringfind.cc:1305
 hrichringfind.cc:1306
 hrichringfind.cc:1307
 hrichringfind.cc:1308
 hrichringfind.cc:1309
 hrichringfind.cc:1310
 hrichringfind.cc:1311
 hrichringfind.cc:1312
 hrichringfind.cc:1313
 hrichringfind.cc:1314
 hrichringfind.cc:1315
 hrichringfind.cc:1316
 hrichringfind.cc:1317
 hrichringfind.cc:1318
 hrichringfind.cc:1319
 hrichringfind.cc:1320
 hrichringfind.cc:1321
 hrichringfind.cc:1322
 hrichringfind.cc:1323
 hrichringfind.cc:1324
 hrichringfind.cc:1325
 hrichringfind.cc:1326
 hrichringfind.cc:1327
 hrichringfind.cc:1328
 hrichringfind.cc:1329
 hrichringfind.cc:1330
 hrichringfind.cc:1331
 hrichringfind.cc:1332
 hrichringfind.cc:1333
 hrichringfind.cc:1334
 hrichringfind.cc:1335
 hrichringfind.cc:1336
 hrichringfind.cc:1337
 hrichringfind.cc:1338
 hrichringfind.cc:1339
 hrichringfind.cc:1340
 hrichringfind.cc:1341
 hrichringfind.cc:1342
 hrichringfind.cc:1343
 hrichringfind.cc:1344
 hrichringfind.cc:1345
 hrichringfind.cc:1346
 hrichringfind.cc:1347
 hrichringfind.cc:1348
 hrichringfind.cc:1349
 hrichringfind.cc:1350
 hrichringfind.cc:1351
 hrichringfind.cc:1352
 hrichringfind.cc:1353
 hrichringfind.cc:1354
 hrichringfind.cc:1355
 hrichringfind.cc:1356
 hrichringfind.cc:1357
 hrichringfind.cc:1358
 hrichringfind.cc:1359
 hrichringfind.cc:1360
 hrichringfind.cc:1361
 hrichringfind.cc:1362
 hrichringfind.cc:1363
 hrichringfind.cc:1364
 hrichringfind.cc:1365
 hrichringfind.cc:1366
 hrichringfind.cc:1367
 hrichringfind.cc:1368
 hrichringfind.cc:1369
 hrichringfind.cc:1370
 hrichringfind.cc:1371
 hrichringfind.cc:1372
 hrichringfind.cc:1373
 hrichringfind.cc:1374
 hrichringfind.cc:1375
 hrichringfind.cc:1376
 hrichringfind.cc:1377
 hrichringfind.cc:1378
 hrichringfind.cc:1379
 hrichringfind.cc:1380
 hrichringfind.cc:1381
 hrichringfind.cc:1382
 hrichringfind.cc:1383
 hrichringfind.cc:1384
 hrichringfind.cc:1385
 hrichringfind.cc:1386
 hrichringfind.cc:1387
 hrichringfind.cc:1388
 hrichringfind.cc:1389
 hrichringfind.cc:1390
 hrichringfind.cc:1391
 hrichringfind.cc:1392
 hrichringfind.cc:1393
 hrichringfind.cc:1394
 hrichringfind.cc:1395
 hrichringfind.cc:1396
 hrichringfind.cc:1397
 hrichringfind.cc:1398
 hrichringfind.cc:1399
 hrichringfind.cc:1400
 hrichringfind.cc:1401
 hrichringfind.cc:1402
 hrichringfind.cc:1403
 hrichringfind.cc:1404
 hrichringfind.cc:1405
 hrichringfind.cc:1406
 hrichringfind.cc:1407
 hrichringfind.cc:1408
 hrichringfind.cc:1409
 hrichringfind.cc:1410
 hrichringfind.cc:1411
 hrichringfind.cc:1412
 hrichringfind.cc:1413
 hrichringfind.cc:1414
 hrichringfind.cc:1415
 hrichringfind.cc:1416
 hrichringfind.cc:1417
 hrichringfind.cc:1418
 hrichringfind.cc:1419
 hrichringfind.cc:1420
 hrichringfind.cc:1421
 hrichringfind.cc:1422
 hrichringfind.cc:1423
 hrichringfind.cc:1424
 hrichringfind.cc:1425
 hrichringfind.cc:1426
 hrichringfind.cc:1427
 hrichringfind.cc:1428
 hrichringfind.cc:1429
 hrichringfind.cc:1430
 hrichringfind.cc:1431
 hrichringfind.cc:1432
 hrichringfind.cc:1433
 hrichringfind.cc:1434
 hrichringfind.cc:1435
 hrichringfind.cc:1436
 hrichringfind.cc:1437
 hrichringfind.cc:1438
 hrichringfind.cc:1439
 hrichringfind.cc:1440
 hrichringfind.cc:1441
 hrichringfind.cc:1442
 hrichringfind.cc:1443
 hrichringfind.cc:1444
 hrichringfind.cc:1445
 hrichringfind.cc:1446
 hrichringfind.cc:1447
 hrichringfind.cc:1448
 hrichringfind.cc:1449
 hrichringfind.cc:1450
 hrichringfind.cc:1451
 hrichringfind.cc:1452
 hrichringfind.cc:1453
 hrichringfind.cc:1454
 hrichringfind.cc:1455
 hrichringfind.cc:1456
 hrichringfind.cc:1457
 hrichringfind.cc:1458
 hrichringfind.cc:1459
 hrichringfind.cc:1460
 hrichringfind.cc:1461
 hrichringfind.cc:1462
 hrichringfind.cc:1463
 hrichringfind.cc:1464
 hrichringfind.cc:1465
 hrichringfind.cc:1466
 hrichringfind.cc:1467
 hrichringfind.cc:1468
 hrichringfind.cc:1469
 hrichringfind.cc:1470
 hrichringfind.cc:1471
 hrichringfind.cc:1472
 hrichringfind.cc:1473
 hrichringfind.cc:1474
 hrichringfind.cc:1475
 hrichringfind.cc:1476
 hrichringfind.cc:1477
 hrichringfind.cc:1478
 hrichringfind.cc:1479
 hrichringfind.cc:1480
 hrichringfind.cc:1481
 hrichringfind.cc:1482
 hrichringfind.cc:1483
 hrichringfind.cc:1484
 hrichringfind.cc:1485
 hrichringfind.cc:1486
 hrichringfind.cc:1487
 hrichringfind.cc:1488
 hrichringfind.cc:1489
 hrichringfind.cc:1490
 hrichringfind.cc:1491
 hrichringfind.cc:1492
 hrichringfind.cc:1493
 hrichringfind.cc:1494
 hrichringfind.cc:1495
 hrichringfind.cc:1496
 hrichringfind.cc:1497
 hrichringfind.cc:1498
 hrichringfind.cc:1499
 hrichringfind.cc:1500
 hrichringfind.cc:1501
 hrichringfind.cc:1502
 hrichringfind.cc:1503
 hrichringfind.cc:1504
 hrichringfind.cc:1505
 hrichringfind.cc:1506
 hrichringfind.cc:1507
 hrichringfind.cc:1508
 hrichringfind.cc:1509
 hrichringfind.cc:1510
 hrichringfind.cc:1511
 hrichringfind.cc:1512
 hrichringfind.cc:1513
 hrichringfind.cc:1514
 hrichringfind.cc:1515
 hrichringfind.cc:1516
 hrichringfind.cc:1517
 hrichringfind.cc:1518
 hrichringfind.cc:1519
 hrichringfind.cc:1520
 hrichringfind.cc:1521
 hrichringfind.cc:1522
 hrichringfind.cc:1523
 hrichringfind.cc:1524
 hrichringfind.cc:1525
 hrichringfind.cc:1526
 hrichringfind.cc:1527
 hrichringfind.cc:1528
 hrichringfind.cc:1529
 hrichringfind.cc:1530
 hrichringfind.cc:1531
 hrichringfind.cc:1532
 hrichringfind.cc:1533
 hrichringfind.cc:1534
 hrichringfind.cc:1535
 hrichringfind.cc:1536
 hrichringfind.cc:1537
 hrichringfind.cc:1538
 hrichringfind.cc:1539
 hrichringfind.cc:1540
 hrichringfind.cc:1541
 hrichringfind.cc:1542
 hrichringfind.cc:1543
 hrichringfind.cc:1544
 hrichringfind.cc:1545
 hrichringfind.cc:1546
 hrichringfind.cc:1547
 hrichringfind.cc:1548
 hrichringfind.cc:1549
 hrichringfind.cc:1550
 hrichringfind.cc:1551
 hrichringfind.cc:1552
 hrichringfind.cc:1553
 hrichringfind.cc:1554
 hrichringfind.cc:1555
 hrichringfind.cc:1556
 hrichringfind.cc:1557
 hrichringfind.cc:1558
 hrichringfind.cc:1559
 hrichringfind.cc:1560
 hrichringfind.cc:1561
 hrichringfind.cc:1562
 hrichringfind.cc:1563
 hrichringfind.cc:1564
 hrichringfind.cc:1565
 hrichringfind.cc:1566
 hrichringfind.cc:1567
 hrichringfind.cc:1568
 hrichringfind.cc:1569
 hrichringfind.cc:1570
 hrichringfind.cc:1571
 hrichringfind.cc:1572
 hrichringfind.cc:1573
 hrichringfind.cc:1574
 hrichringfind.cc:1575
 hrichringfind.cc:1576
 hrichringfind.cc:1577
 hrichringfind.cc:1578
 hrichringfind.cc:1579
 hrichringfind.cc:1580
 hrichringfind.cc:1581
 hrichringfind.cc:1582
 hrichringfind.cc:1583
 hrichringfind.cc:1584
 hrichringfind.cc:1585
 hrichringfind.cc:1586
 hrichringfind.cc:1587
 hrichringfind.cc:1588
 hrichringfind.cc:1589
 hrichringfind.cc:1590
 hrichringfind.cc:1591
 hrichringfind.cc:1592
 hrichringfind.cc:1593
 hrichringfind.cc:1594
 hrichringfind.cc:1595
 hrichringfind.cc:1596
 hrichringfind.cc:1597
 hrichringfind.cc:1598
 hrichringfind.cc:1599
 hrichringfind.cc:1600
 hrichringfind.cc:1601
 hrichringfind.cc:1602
 hrichringfind.cc:1603
 hrichringfind.cc:1604
 hrichringfind.cc:1605
 hrichringfind.cc:1606
 hrichringfind.cc:1607
 hrichringfind.cc:1608
 hrichringfind.cc:1609
 hrichringfind.cc:1610
 hrichringfind.cc:1611
 hrichringfind.cc:1612
 hrichringfind.cc:1613
 hrichringfind.cc:1614
 hrichringfind.cc:1615
 hrichringfind.cc:1616
 hrichringfind.cc:1617
 hrichringfind.cc:1618
 hrichringfind.cc:1619
 hrichringfind.cc:1620
 hrichringfind.cc:1621
 hrichringfind.cc:1622
 hrichringfind.cc:1623
 hrichringfind.cc:1624
 hrichringfind.cc:1625
 hrichringfind.cc:1626
 hrichringfind.cc:1627
 hrichringfind.cc:1628
 hrichringfind.cc:1629
 hrichringfind.cc:1630
 hrichringfind.cc:1631
 hrichringfind.cc:1632
 hrichringfind.cc:1633
 hrichringfind.cc:1634
 hrichringfind.cc:1635
 hrichringfind.cc:1636
 hrichringfind.cc:1637
 hrichringfind.cc:1638
 hrichringfind.cc:1639
 hrichringfind.cc:1640
 hrichringfind.cc:1641
 hrichringfind.cc:1642
 hrichringfind.cc:1643
 hrichringfind.cc:1644
 hrichringfind.cc:1645
 hrichringfind.cc:1646
 hrichringfind.cc:1647
 hrichringfind.cc:1648
 hrichringfind.cc:1649
 hrichringfind.cc:1650
 hrichringfind.cc:1651
 hrichringfind.cc:1652
 hrichringfind.cc:1653
 hrichringfind.cc:1654
 hrichringfind.cc:1655
 hrichringfind.cc:1656
 hrichringfind.cc:1657
 hrichringfind.cc:1658
 hrichringfind.cc:1659
 hrichringfind.cc:1660
 hrichringfind.cc:1661
 hrichringfind.cc:1662
 hrichringfind.cc:1663
 hrichringfind.cc:1664
 hrichringfind.cc:1665
 hrichringfind.cc:1666
 hrichringfind.cc:1667
 hrichringfind.cc:1668
 hrichringfind.cc:1669
 hrichringfind.cc:1670
 hrichringfind.cc:1671
 hrichringfind.cc:1672
 hrichringfind.cc:1673
 hrichringfind.cc:1674
 hrichringfind.cc:1675
 hrichringfind.cc:1676
 hrichringfind.cc:1677
 hrichringfind.cc:1678
 hrichringfind.cc:1679
 hrichringfind.cc:1680
 hrichringfind.cc:1681
 hrichringfind.cc:1682
 hrichringfind.cc:1683
 hrichringfind.cc:1684
 hrichringfind.cc:1685
 hrichringfind.cc:1686
 hrichringfind.cc:1687
 hrichringfind.cc:1688
 hrichringfind.cc:1689
 hrichringfind.cc:1690
 hrichringfind.cc:1691
 hrichringfind.cc:1692
 hrichringfind.cc:1693
 hrichringfind.cc:1694
 hrichringfind.cc:1695
 hrichringfind.cc:1696
 hrichringfind.cc:1697
 hrichringfind.cc:1698
 hrichringfind.cc:1699
 hrichringfind.cc:1700
 hrichringfind.cc:1701
 hrichringfind.cc:1702
 hrichringfind.cc:1703
 hrichringfind.cc:1704
 hrichringfind.cc:1705
 hrichringfind.cc:1706
 hrichringfind.cc:1707
 hrichringfind.cc:1708
 hrichringfind.cc:1709
 hrichringfind.cc:1710
 hrichringfind.cc:1711
 hrichringfind.cc:1712
 hrichringfind.cc:1713
 hrichringfind.cc:1714
 hrichringfind.cc:1715
 hrichringfind.cc:1716
 hrichringfind.cc:1717
 hrichringfind.cc:1718
 hrichringfind.cc:1719
 hrichringfind.cc:1720
 hrichringfind.cc:1721
 hrichringfind.cc:1722
 hrichringfind.cc:1723
 hrichringfind.cc:1724
 hrichringfind.cc:1725
 hrichringfind.cc:1726
 hrichringfind.cc:1727
 hrichringfind.cc:1728
 hrichringfind.cc:1729
 hrichringfind.cc:1730
 hrichringfind.cc:1731
 hrichringfind.cc:1732
 hrichringfind.cc:1733
 hrichringfind.cc:1734
 hrichringfind.cc:1735
 hrichringfind.cc:1736
 hrichringfind.cc:1737
 hrichringfind.cc:1738
 hrichringfind.cc:1739
 hrichringfind.cc:1740
 hrichringfind.cc:1741
 hrichringfind.cc:1742
 hrichringfind.cc:1743
 hrichringfind.cc:1744
 hrichringfind.cc:1745
 hrichringfind.cc:1746
 hrichringfind.cc:1747
 hrichringfind.cc:1748
 hrichringfind.cc:1749
 hrichringfind.cc:1750
 hrichringfind.cc:1751
 hrichringfind.cc:1752
 hrichringfind.cc:1753
 hrichringfind.cc:1754
 hrichringfind.cc:1755
 hrichringfind.cc:1756
 hrichringfind.cc:1757
 hrichringfind.cc:1758
 hrichringfind.cc:1759
 hrichringfind.cc:1760
 hrichringfind.cc:1761
 hrichringfind.cc:1762
 hrichringfind.cc:1763
 hrichringfind.cc:1764
 hrichringfind.cc:1765
 hrichringfind.cc:1766
 hrichringfind.cc:1767
 hrichringfind.cc:1768
 hrichringfind.cc:1769
 hrichringfind.cc:1770
 hrichringfind.cc:1771
 hrichringfind.cc:1772
 hrichringfind.cc:1773
 hrichringfind.cc:1774
 hrichringfind.cc:1775
 hrichringfind.cc:1776
 hrichringfind.cc:1777
 hrichringfind.cc:1778
 hrichringfind.cc:1779
 hrichringfind.cc:1780
 hrichringfind.cc:1781
 hrichringfind.cc:1782
 hrichringfind.cc:1783
 hrichringfind.cc:1784
 hrichringfind.cc:1785
 hrichringfind.cc:1786
 hrichringfind.cc:1787
 hrichringfind.cc:1788
 hrichringfind.cc:1789
 hrichringfind.cc:1790
 hrichringfind.cc:1791
 hrichringfind.cc:1792
 hrichringfind.cc:1793
 hrichringfind.cc:1794
 hrichringfind.cc:1795
 hrichringfind.cc:1796
 hrichringfind.cc:1797
 hrichringfind.cc:1798
 hrichringfind.cc:1799
 hrichringfind.cc:1800
 hrichringfind.cc:1801
 hrichringfind.cc:1802
 hrichringfind.cc:1803
 hrichringfind.cc:1804
 hrichringfind.cc:1805
 hrichringfind.cc:1806
 hrichringfind.cc:1807
 hrichringfind.cc:1808
 hrichringfind.cc:1809
 hrichringfind.cc:1810
 hrichringfind.cc:1811
 hrichringfind.cc:1812
 hrichringfind.cc:1813
 hrichringfind.cc:1814
 hrichringfind.cc:1815
 hrichringfind.cc:1816
 hrichringfind.cc:1817
 hrichringfind.cc:1818
 hrichringfind.cc:1819
 hrichringfind.cc:1820
 hrichringfind.cc:1821
 hrichringfind.cc:1822
 hrichringfind.cc:1823
 hrichringfind.cc:1824
 hrichringfind.cc:1825
 hrichringfind.cc:1826
 hrichringfind.cc:1827
 hrichringfind.cc:1828