// @(#)root/graf:$Id$
// Author: Otto Schaile   20/11/99

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//______________________________________________________________________________
//
// This class implements curly or wavy arcs typically used to draw Feynman diagrams.
// Amplitudes and wavelengths may be specified in the constructors,
// via commands or interactively from popup menus.
// The class make use of TCurlyLine by inheritance, ExecuteEvent methods
// are highly inspired from the methods used in TPolyLine and TArc.
// The picture below has been generated by the tutorial feynman.
//Begin_Html
/*
<img src="gif/feynman.gif">
*/
//End_Html
//______________________________________________________________________________

#include "Riostream.h"
#include "TCurlyArc.h"
#include "TROOT.h"
#include "TVirtualPad.h"
#include "TVirtualX.h"
#include "TMath.h"
#include "TPoint.h"

Double_t TCurlyArc::fgDefaultWaveLength = 0.02;
Double_t TCurlyArc::fgDefaultAmplitude  = 0.01;
Bool_t   TCurlyArc::fgDefaultIsCurly    = kTRUE;

ClassImp(TCurlyArc)


//______________________________________________________________________________
TCurlyArc::TCurlyArc()
{
   // Default constructor

   fR1     = 0.;
   fPhimin = 0.;
   fPhimax = 0.;
   fTheta  = 0.;
}


//______________________________________________________________________________
TCurlyArc::TCurlyArc(Double_t x1, Double_t y1,
                   Double_t rad, Double_t phimin, Double_t phimax,
                   Double_t wl, Double_t amp)
         : fR1(rad), fPhimin(phimin),fPhimax(phimax)
{
   // create a new TCurlyarc with center (x1, y1) and radius rad.
   // The wavelength and amplitude are given in percent of the line length
   // phimin and phimax are given in degrees.

   fX1         = x1;
   fY1         = y1;
   fIsCurly    = fgDefaultIsCurly;
   fAmplitude  = amp;
   fWaveLength = wl;
   fTheta      = 0;
   Build();
}


//______________________________________________________________________________
void TCurlyArc::Build()
{
   // Create a curly (Gluon) or wavy (Gamma) arc.

   Double_t pixeltoX = 1;
   Double_t pixeltoY = 1;
   Double_t rPix = fR1;
   if (gPad) {
      Double_t ww = (Double_t)gPad->GetWw();
      Double_t wh = (Double_t)gPad->GetWh();
      Double_t pxrange = gPad->GetAbsWNDC()*ww;
      Double_t pyrange = - gPad->GetAbsHNDC()*wh;
      Double_t xrange  = gPad->GetX2() - gPad->GetX1();
      Double_t yrange  = gPad->GetY2() - gPad->GetY1();
      pixeltoX  = xrange / pxrange;
      pixeltoY  = yrange/pyrange;
      rPix = fR1 / pixeltoX;
   }
   Double_t dang = fPhimax - fPhimin;
   if (dang < 0) dang += 360;
   Double_t length = TMath::Pi() * fR1 * dang/180;
   Double_t x1sav = fX1;
   Double_t y1sav = fY1;
   fX1 = fY1 = 0;
   fX2 = length;
   fY2 = 0;
   TCurlyLine::Build();
   fX1 = x1sav;
   fY1 = y1sav;
   Double_t *xv= GetX();
   Double_t *yv= GetY();
   Double_t xx, yy, angle;
   for(Int_t i = 0; i < fNsteps; i++){
      angle = xv[i] / rPix + fPhimin * TMath::Pi()/180;
      xx    = (yv[i] + rPix) * cos(angle);
      yy    = (yv[i] + rPix) * sin(angle);
      xx *= pixeltoX;
      yy *= TMath::Abs(pixeltoY);
      xv[i] = xx + fX1;
      yv[i] = yy + fY1;
   }
   if (gPad) gPad->Modified();
}


//______________________________________________________________________________
Int_t TCurlyArc::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to an arc.
   //
   //  Compute the closest distance of approach from point px,py to this arc.
   //  The distance is computed in pixels units.
   //

   // Compute distance of point to center of arc
   Int_t pxc    = gPad->XtoAbsPixel(fX1);
   Int_t pyc    = gPad->YtoAbsPixel(fY1);
   Double_t dist = TMath::Sqrt(Double_t((pxc-px)*(pxc-px)+(pyc-py)*(pyc-py)));
   Double_t cosa = (px - pxc)/dist;
   Double_t sina = (pyc - py)/dist;
   Double_t phi  = TMath::ATan2(sina,cosa);
   if (phi < 0) phi += 2 * TMath::Pi();
   phi = phi * 180 / TMath::Pi();
   if (fPhimax > fPhimin){
      if (phi < fPhimin || phi > fPhimax) return 9999;
   } else {
      if (phi > fPhimin && phi < fPhimax) return 9999;
   }
   Int_t pxr = gPad->XtoPixel(fR1)- gPad->XtoPixel(0);
   Double_t distr = TMath::Abs(dist-pxr);
   return Int_t(distr);
}


//______________________________________________________________________________
void TCurlyArc::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   //  This member function is called when a TCurlyArc is clicked with the locator
   //
   //  If Left button clicked on one of the line end points, this point
   //     follows the cursor until button is released.
   //
   //  if Middle button clicked, the line is moved parallel to itself
   //     until the button is released.

   if (!gPad) return;

   Int_t kMaxDiff = 10;
   const Int_t np = 10;
   const Double_t pi = TMath::Pi();
   static Int_t x[np+3], y[np+3];
   static Int_t px1,py1,npe,r1;
   static Int_t pxold, pyold;
   Int_t i, dpx, dpy;
   Double_t angle,dx,dy,dphi,rLx,rRx;
   Double_t  phi0;
   static Bool_t pTop, pL, pR, pBot, pINSIDE;
   static Int_t pTx,pTy,pLx,pLy,pRx,pRy,pBx,pBy;

   Bool_t opaque  = gPad->OpaqueMoving();

   switch (event) {

   case kArrowKeyPress:
   case kButton1Down:
      if (!opaque) {
         gVirtualX->SetLineColor(-1);
         TAttLine::Modify();
         dphi = (fPhimax-fPhimin) * pi / 180;
         if (dphi<0) dphi += 2 * pi;
         dphi /= np;
         phi0 = fPhimin * pi / 180;
         for (i=0;i<=np;i++) {
            angle = Double_t(i)*dphi + phi0;
            dx    = fR1*TMath::Cos(angle);
            dy    = fR1*TMath::Sin(angle);
            Int_t rpixY = gPad->XtoAbsPixel(dy) - gPad->XtoAbsPixel(0);
            x[i]  = gPad->XtoAbsPixel(fX1 + dx);
            y[i]  = gPad->YtoAbsPixel(fY1) + rpixY;
         }
         if (fPhimax-fPhimin >= 360 ) {
            x[np+1] = x[0];
            y[np+1] = y[0];
            npe = np;
         } else {
            x[np+1]   = gPad->XtoAbsPixel(fX1);
            y[np+1]   = gPad->YtoAbsPixel(fY1);
            x[np+2] = x[0];
            y[np+2] = y[0];
            npe = np + 2;
         }
      }
      px1 = gPad->XtoAbsPixel(fX1);
      py1 = gPad->YtoAbsPixel(fY1);
      pTx = pBx = px1;
      pLy = pRy = py1;
      pLx = gPad->XtoAbsPixel(-fR1+fX1);
      pRx = gPad->XtoAbsPixel( fR1+fX1);
      r1 = TMath::Abs(pLx-pRx)/2;
      // a circle in pixels, radius measured along X
      pTy = gPad->YtoAbsPixel(fY1) + r1;
      pBy = gPad->YtoAbsPixel(fY1) - r1;

      if (!opaque) {
         gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
         gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
         gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
         gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
         gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
         gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
         gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
         gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
         gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
         gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
         gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
         gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
         gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
         gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
         gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
         gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
      }
      // No break !!!

   case kMouseMotion:
      px1 = gPad->XtoAbsPixel(fX1);
      py1 = gPad->YtoAbsPixel(fY1);
      pTx = pBx = px1;
      pLy = pRy = py1;
      pLx = gPad->XtoAbsPixel(-fR1+fX1);
      pRx = gPad->XtoAbsPixel( fR1+fX1);

      pTy = gPad->YtoAbsPixel(fY1) + TMath::Abs(pLx-pRx)/2;
      pBy = gPad->YtoAbsPixel(fY1) - TMath::Abs(pLx-pRx)/2;

      pTop = pL = pR = pBot = pINSIDE = kFALSE;
      if ((TMath::Abs(px - pTx) < kMaxDiff) &&
          (TMath::Abs(py - pTy) < kMaxDiff)) {             // top edge
         pTop = kTRUE;
         gPad->SetCursor(kTopSide);
      }
      else
      if ((TMath::Abs(px - pBx) < kMaxDiff) &&
          (TMath::Abs(py - pBy) < kMaxDiff)) {             // bottom edge
         pBot = kTRUE;
         gPad->SetCursor(kBottomSide);
      }
      else
      if ((TMath::Abs(py - pLy) < kMaxDiff) &&
          (TMath::Abs(px - pLx) < kMaxDiff)) {             // left edge
         pL = kTRUE;
         gPad->SetCursor(kLeftSide);
      }
      else
      if ((TMath::Abs(py - pRy) < kMaxDiff) &&
          (TMath::Abs(px - pRx) < kMaxDiff)) {             // right edge
         pR = kTRUE;
         gPad->SetCursor(kRightSide);
      }
      else {pINSIDE= kTRUE; gPad->SetCursor(kMove); }
      pxold = px;  pyold = py;

      break;

   case kArrowKeyRelease:
   case kButton1Motion:
      if (!opaque) {
         gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
         gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
         gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
         gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
         gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
         gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
         gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
         gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
         gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
         gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
         gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
         gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
         gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
         gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
         gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
         gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
         for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
      }
      if (pTop) {
         r1 += (py - pyold);
      }
      if (pBot) {
         r1 -= (py - pyold);
      }
      if (pL) {
         r1 -= (px - pxold);
      }
      if (pR) {
         r1 += (px - pxold);
      }
      if (pTop || pBot || pL || pR) {
         if (!opaque) {
            gVirtualX->SetLineColor(-1);
            TAttLine::Modify();
            dphi = (fPhimax-fPhimin) * pi / 180;
            if (dphi<0) dphi += 2 * pi;
            dphi /= np;
            phi0 = fPhimin * pi / 180;
            Double_t ur1 = r1;
            Int_t pX1   = gPad->XtoAbsPixel(fX1);
            Int_t pY1   = gPad->YtoAbsPixel(fY1);
            for (i=0;i<=np;i++) {
               angle = Double_t(i)*dphi + phi0;
               dx    = ur1 * TMath::Cos(angle);
               dy    = ur1 * TMath::Sin(angle);
               x[i]  = pX1 + (Int_t)dx;
               y[i]  = pY1 + (Int_t)dy;
            }
            if (fPhimax-fPhimin >= 360 ) {
               x[np+1] = x[0];
               y[np+1] = y[0];
               npe = np;
            } else {
               x[np+1]   = pX1;
               y[np+1]   = pY1;
               x[np+2] = x[0];
               y[np+2] = y[0];
               npe = np + 2;
            }
            for (i=0;i<npe;i++) {
               gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
            }
         }
         else {
            this->SetStartPoint(gPad->AbsPixeltoX(px1), gPad->AbsPixeltoY(py1));
            this->SetRadius(TMath::Abs(gPad->AbsPixeltoX(px1-r1)-gPad->AbsPixeltoX(px1+r1))/2);
            if (pTop) gPad->ShowGuidelines(this, event, 't', true);
            if (pBot) gPad->ShowGuidelines(this, event, 'b', true);
            if (pL) gPad->ShowGuidelines(this, event, 'l', true);
            if (pR) gPad->ShowGuidelines(this, event, 'r', true);
            gPad->Modified(kTRUE);
            gPad->Update();
         }
      }
      if (pINSIDE) {
         dpx  = px-pxold;  dpy = py-pyold;
         px1 += dpx; py1 += dpy;
         if (!opaque) {
            for (i=0;i<=npe;i++) { x[i] += dpx; y[i] += dpy;}
            for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
         } else {
            this->SetStartPoint(gPad->AbsPixeltoX(px1), gPad->AbsPixeltoY(py1));
            gPad->ShowGuidelines(this, event, 'i', true);
            gPad->Modified(kTRUE);
            gPad->Update();
         }
      }
      pTx = pBx = px1;
      pRx = px1+r1;
      pLx = px1-r1;
      pRy = pLy = py1;
      pTy = py1-r1;
      pBy = py1+r1;
      if (!opaque) {
         gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
         gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
         gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
         gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
         gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
         gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
         gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
         gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
         gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
         gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
         gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
         gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
         gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
         gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
         gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
         gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
      }
      pxold = px;
      pyold = py;
      break;

   case kButton1Up:
      if (opaque) {
         gPad->ShowGuidelines(this, event);
      } else {
         fX1 = gPad->AbsPixeltoX(px1);
         fY1 = gPad->AbsPixeltoY(py1);
         rLx = gPad->AbsPixeltoX(px1+r1);
         rRx = gPad->AbsPixeltoX(px1-r1);
         fR1 = TMath::Abs(rRx-rLx)/2;
      }
      Build();
      gPad->Modified(kTRUE);
      if (!opaque) gVirtualX->SetLineColor(-1);
   }
}


//______________________________________________________________________________
void TCurlyArc::SavePrimitive(std::ostream &out, Option_t * /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   if (gROOT->ClassSaved(TCurlyArc::Class())) {
      out<<"   ";
   } else {
      out<<"   TCurlyArc *";
   }
   out<<"curlyarc = new TCurlyArc("
     <<fX1<<","<<fY1<<","<<fR1<<","<<fPhimin<<","<<fPhimax<<","
      <<fWaveLength<<","<<fAmplitude<<");"<<std::endl;
   if (!fIsCurly) {
      out<<"   curlyarc->SetWavy();"<<std::endl;
   }
   SaveLineAttributes(out,"curlyarc",1,1,1);
   out<<"   curlyarc->Draw();"<<std::endl;
}


//______________________________________________________________________________
void TCurlyArc::SetCenter(Double_t x, Double_t y)
{
   // Set Curly Arc center.

   fX1 = x;
   fY1 = y;
   Build();
}


//______________________________________________________________________________
void TCurlyArc::SetRadius(Double_t x)
{
   // Set Curly Arc radius.

   fR1 = x;
   Build();
}


//______________________________________________________________________________
void TCurlyArc::SetPhimin(Double_t x)
{
   // Set Curly Arc minimum Phi.

   fPhimin = x;
   Build();
}


//______________________________________________________________________________
void TCurlyArc::SetPhimax(Double_t x)
{
   // Set Curly Arc maximum Phi.

   fPhimax = x;
   Build();
}


//______________________________________________________________________________
void TCurlyArc::SetDefaultWaveLength(Double_t WaveLength)
{
   // Set default wave length.

   fgDefaultWaveLength = WaveLength;
}


//______________________________________________________________________________
void TCurlyArc::SetDefaultAmplitude(Double_t Amplitude)
{
   // Set default wave amplitude.

   fgDefaultAmplitude = Amplitude ;
}


//______________________________________________________________________________
void TCurlyArc::SetDefaultIsCurly(Bool_t IsCurly)
{
   // Set default "IsCurly".

   fgDefaultIsCurly = IsCurly;
}


//______________________________________________________________________________
Double_t TCurlyArc::GetDefaultWaveLength()
{
   // Get default wave length.

   return fgDefaultWaveLength;
}


//______________________________________________________________________________
Double_t TCurlyArc::GetDefaultAmplitude()
{
   // Get default wave amplitude.

   return fgDefaultAmplitude;
}


//______________________________________________________________________________
Bool_t TCurlyArc::GetDefaultIsCurly()
{
   // Get default "IsCurly".

   return fgDefaultIsCurly;
}

//______________________________________________________________________________
Rectangle_t TCurlyArc::GetBBox()
{
   // Return the bounding Box of the Line

   Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());

   Rectangle_t BBox;
   BBox.fX = gPad->XtoPixel(fX1-fR1);
   BBox.fY = gPad->YtoPixel(fY1+R2);
   BBox.fWidth = gPad->XtoPixel(fX1+fR1)-gPad->XtoPixel(fX1-fR1);
   BBox.fHeight = gPad->YtoPixel(fY1-R2)-gPad->YtoPixel(fY1+R2);
   return (BBox);
}


//______________________________________________________________________________
TPoint TCurlyArc::GetBBoxCenter()
{
   // Return the center of the BoundingBox as TPoint in pixels

   TPoint p;
   p.SetX(gPad->XtoPixel(fX1));
   p.SetY(gPad->YtoPixel(fY1));
   return(p);
}

//______________________________________________________________________________
void TCurlyArc::SetBBoxCenter(const TPoint &p)
{
   // Set center of the BoundingBox

   fX1 = gPad->PixeltoX(p.GetX());
   fY1 = gPad->PixeltoY(p.GetY()-gPad->VtoPixel(0));
   Build();
}

//______________________________________________________________________________
void TCurlyArc::SetBBoxCenterX(const Int_t x)
{
   // Set X coordinate of the center of the BoundingBox

   fX1 = gPad->PixeltoX(x);
   Build();
}

//______________________________________________________________________________
void TCurlyArc::SetBBoxCenterY(const Int_t y)
{
   // Set Y coordinate of the center of the BoundingBox

   fY1 = gPad->PixeltoY(y-gPad->VtoPixel(0));
   Build();
}

//_______________________________________________________________________________
void TCurlyArc::SetBBoxX1(const Int_t x)
{
   // Set lefthandside of BoundingBox to a value
   // (resize in x direction on left)

   Double_t x1 = gPad->PixeltoX(x);
   if (x1>fX1+fR1) return;

   fR1 = (fX1+fR1-x1)*0.5;
   fX1 = x1 + fR1;
}

//_______________________________________________________________________________
void TCurlyArc::SetBBoxX2(const Int_t x)
{
   // Set righthandside of BoundingBox to a value
   // (resize in x direction on right)

   Double_t x2 = gPad->PixeltoX(x);
   if (x2<fX1-fR1) return;

   fR1 = (x2-fX1+fR1)*0.5;
   fX1 = x2-fR1;
}

//_______________________________________________________________________________
void TCurlyArc::SetBBoxY1(const Int_t y)
{
   // Set top of BoundingBox to a value (resize in y direction on top)

   Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());

   Double_t y1 = gPad->PixeltoY(y-gPad->VtoPixel(0));
   if (y1<fY1-R2) return;

   fR1 = (y1-fY1+R2)*0.5 / (TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1()));
   fY1 = y1-R2;
}

//_______________________________________________________________________________
void TCurlyArc::SetBBoxY2(const Int_t y)
{
   // Set bottom of BoundingBox to a value
   // (resize in y direction on bottom)

   Double_t R2 = fR1 * TMath::Abs(gPad->GetY2()-gPad->GetY1())/TMath::Abs(gPad->GetX2()-gPad->GetX1());

   Double_t y2 = gPad->PixeltoY(y-gPad->VtoPixel(0));

   if (y2>fY1+R2) return;

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