ROOT logo
// @(#)root/proofx:$Id: TProofServLite.cxx 31840 2009-12-11 10:01:17Z ganis $
// Author: Gerardo Ganis  12/12/2005

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofServLite                                                       //
//                                                                      //
// TProofServLite is the version of the PROOF worker server for local   //
// running. The client starts directly the desired number of these      //
// workers; the master and daemons are eliminated, optimizing the number//
// of messages exchanged and created / destroyed.                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"
#include "RConfig.h"
#include "Riostream.h"

#ifdef WIN32
   #include <io.h>
   typedef long off_t;
   #include <snprintf.h>
#else
#include <netinet/in.h>
#endif
#include <sys/types.h>
#include <cstdlib>

#include "TProofServLite.h"
#include "TObjString.h"
#include "TEnv.h"
#include "TError.h"
#include "TException.h"
#include "THashList.h"
#include "TInterpreter.h"
#include "TMessage.h"
#include "TProofDebug.h"
#include "TProof.h"
#include "TProofPlayer.h"
#include "TProofQueryResult.h"
#include "TRegexp.h"
#include "TClass.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TPluginManager.h"
#include "TSocket.h"
#include "TTimeStamp.h"
#include "compiledata.h"


// debug hook
static volatile Int_t gProofServDebug = 1;

//----- Interrupt signal handler -----------------------------------------------
//______________________________________________________________________________
class TProofServLiteInterruptHandler : public TSignalHandler {
   TProofServLite  *fServ;
public:
   TProofServLiteInterruptHandler(TProofServLite *s)
      : TSignalHandler(kSigUrgent, kFALSE) { fServ = s; }
   Bool_t  Notify();
};

//______________________________________________________________________________
Bool_t TProofServLiteInterruptHandler::Notify()
{
   // Handle urgent data

   fServ->HandleUrgentData();
   if (TROOT::Initialized()) {
      Throw(GetSignal());
   }
   return kTRUE;
}

//----- SigPipe signal handler -------------------------------------------------
//______________________________________________________________________________
class TProofServLiteSigPipeHandler : public TSignalHandler {
   TProofServLite  *fServ;
public:
   TProofServLiteSigPipeHandler(TProofServLite *s) : TSignalHandler(kSigPipe, kFALSE)
      { fServ = s; }
   Bool_t  Notify();
};

//______________________________________________________________________________
Bool_t TProofServLiteSigPipeHandler::Notify()
{
   // Handle sig pipe

   fServ->HandleSigPipe();
   return kTRUE;
}

//----- Termination signal handler ---------------------------------------------
//______________________________________________________________________________
class TProofServLiteTerminationHandler : public TSignalHandler {
   TProofServLite  *fServ;
public:
   TProofServLiteTerminationHandler(TProofServLite *s)
      : TSignalHandler(kSigTermination, kFALSE) { fServ = s; }
   Bool_t  Notify();
};

//______________________________________________________________________________
Bool_t TProofServLiteTerminationHandler::Notify()
{
   // Handle termination

   Printf("TProofServLiteTerminationHandler::Notify: wake up!");

   fServ->HandleTermination();
   return kTRUE;
}

//----- Seg violation signal handler ---------------------------------------------
//______________________________________________________________________________
class TProofServLiteSegViolationHandler : public TSignalHandler {
   TProofServLite  *fServ;
public:
   TProofServLiteSegViolationHandler(TProofServLite *s)
      : TSignalHandler(kSigSegmentationViolation, kFALSE) { fServ = s; }
   Bool_t  Notify();
};

//______________________________________________________________________________
Bool_t TProofServLiteSegViolationHandler::Notify()
{
   // Handle seg violation

   Printf("**** ");
   Printf("**** Segmentation violation: terminating ****");
   Printf("**** ");
   fServ->HandleTermination();
   return kTRUE;
}

//----- Input handler for messages from parent or master -----------------------
//______________________________________________________________________________
class TProofServLiteInputHandler : public TFileHandler {
   TProofServLite  *fServ;
public:
   TProofServLiteInputHandler(TProofServLite *s, Int_t fd) : TFileHandler(fd, 1)
      { fServ = s; }
   Bool_t Notify();
   Bool_t ReadNotify() { return Notify(); }
};

//______________________________________________________________________________
Bool_t TProofServLiteInputHandler::Notify()
{
   // Handle input on the socket

   fServ->HandleSocketInput();

   return kTRUE;
}

ClassImp(TProofServLite)

// Hook to the constructor. This is needed to avoid using the plugin manager
// which may create problems in multi-threaded environments.
extern "C" {
   TApplication *GetTProofServLite(Int_t *argc, char **argv, FILE *flog)
   { return new TProofServLite(argc, argv, flog); }
}

//______________________________________________________________________________
TProofServLite::TProofServLite(Int_t *argc, char **argv, FILE *flog)
            : TProofServ(argc, argv, flog)
{
   // Main constructor

   fInterruptHandler = 0;
   fTerminated = kFALSE;
}

//______________________________________________________________________________
Int_t TProofServLite::CreateServer()
{
   // Finalize the server setup. If master, create the TProof instance to talk
   // the worker or submaster nodes.
   // Return 0 on success, -1 on error

   if (gProofDebugLevel > 0)
      Info("CreateServer", "starting server creation");

   // Get file descriptor for log file
   if (fLogFile) {
      // Use the file already open by pmain
      if ((fLogFileDes = fileno(fLogFile)) < 0) {
         Error("CreateServer", "resolving the log file description number");
         return -1;
      }
   }

   // Get socket to be used to call back our xpd
   fSockPath = gEnv->GetValue("ProofServ.OpenSock", "");
   if (fSockPath.Length() <= 0) {
      Error("CreateServer", "Socket setup by xpd undefined");
      return -1;
   }
   TString entity = gEnv->GetValue("ProofServ.Entity", "");
   if (entity.Length() > 0)
      fSockPath.Insert(0,Form("%s/", entity.Data()));

   // Call back the client
   fSocket = new TSocket(fSockPath);
   if (!fSocket || !(fSocket->IsValid())) {
      Error("CreateServer", "Failed to open connection to the client");
      return -1;
   }

   // Send our ordinal, to allow the client to identify us
   TMessage msg;
   msg << fOrdinal;
   fSocket->Send(msg);

   // Get socket descriptor
   Int_t sock = fSocket->GetDescriptor();

   // Install interrupt and message input handlers
   fInterruptHandler = new TProofServLiteInterruptHandler(this);
   gSystem->AddSignalHandler(fInterruptHandler);
   gSystem->AddFileHandler(new TProofServLiteInputHandler(this, sock));

   // Wait (loop) in worker node to allow debugger to connect
   if (gEnv->GetValue("Proof.GdbHook",0) == 2) {
      while (gProofServDebug)
         ;
   }

   if (gProofDebugLevel > 0)
      Info("CreateServer", "Service: %s, ConfDir: %s, IsMaster: %d",
           fService.Data(), fConfDir.Data(), (Int_t)fMasterServ);

   if (Setup() == -1) {
      // Setup failure
      Terminate(0);
      SendLogFile();
      return -1;
   }

   if (!fLogFile) {
      RedirectOutput();
      // If for some reason we failed setting a redirection file for the logs
      // we cannot continue
      if (!fLogFile || (fLogFileDes = fileno(fLogFile)) < 0) {
         Terminate(0);
         SendLogFile(-98);
         return -1;
      }
   }

   // Everybody expects iostream to be available, so load it...
   ProcessLine("#include <iostream>", kTRUE);
   ProcessLine("#include <_string>",kTRUE); // for std::string iostream.

   // Allow the usage of ClassDef and ClassImp in interpreted macros
   ProcessLine("#include <RtypesCint.h>", kTRUE);

   // Disallow the interpretation of Rtypes.h, TError.h and TGenericClassInfo.h
   ProcessLine("#define ROOT_Rtypes 0", kTRUE);
   ProcessLine("#define ROOT_TError 0", kTRUE);
   ProcessLine("#define ROOT_TGenericClassInfo 0", kTRUE);

   // Load user functions
   const char *logon;
   logon = gEnv->GetValue("Proof.Load", (char *)0);
   if (logon) {
      char *mac = gSystem->Which(TROOT::GetMacroPath(), logon, kReadPermission);
      if (mac)
         ProcessLine(Form(".L %s", logon), kTRUE);
      delete [] mac;
   }

   // Execute logon macro
   logon = gEnv->GetValue("Proof.Logon", (char *)0);
   if (logon && !NoLogOpt()) {
      char *mac = gSystem->Which(TROOT::GetMacroPath(), logon, kReadPermission);
      if (mac)
         ProcessFile(logon);
      delete [] mac;
   }

   // Save current interpreter context
   gInterpreter->SaveContext();
   gInterpreter->SaveGlobalsContext();

   // Done
   return 0;
}

//______________________________________________________________________________
TProofServLite::~TProofServLite()
{
   // Cleanup. Not really necessary since after this dtor there is no
   // live anyway.

   delete fSocket;
}

//______________________________________________________________________________
void TProofServLite::HandleSigPipe()
{
   // Called when the client is not alive anymore; terminate the session.

   Terminate(0);  // will not return from here....
}

//______________________________________________________________________________
void TProofServLite::HandleTermination()
{
   // Called when the client is not alive anymore; terminate the session.

   Terminate(0);  // will not return from here....
}

//______________________________________________________________________________
Int_t TProofServLite::Setup()
{
   // Print the ProofServ logo on standard output.
   // Return 0 on success, -1 on error

   char str[512];

   if (IsMaster()) {
      snprintf(str, 512, "**** Welcome to the PROOF server @ %s ****", gSystem->HostName());
   } else {
      snprintf(str, 512, "**** PROOF worker server @ %s started ****", gSystem->HostName());
   }

   if (fSocket->Send(str) != 1+static_cast<Int_t>(strlen(str))) {
      Error("Setup", "failed to send proof server startup message");
      return -1;
   }

   // Get client protocol
   if ((fProtocol = gEnv->GetValue("ProofServ.ClientVersion", -1)) < 0) {
      Error("Setup", "remote proof protocol missing");
      return -1;
   }

   // The local user
   UserGroup_t *pw = gSystem->GetUserInfo();
   if (pw) {
      fUser = pw->fUser;
      delete pw;
   }

   // Work dir and ...
   fWorkDir = gEnv->GetValue("ProofServ.Sandbox", Form("~/%s", kPROOF_WorkDir));

   // Get Session tags
   fTopSessionTag = gEnv->GetValue("ProofServ.SessionTag", "-1");
   fSessionTag = Form("%s-%s-%d-%d", fOrdinal.Data(), gSystem->HostName(),
                                     TTimeStamp().GetSec(), gSystem->GetPid());
   if (gProofDebugLevel > 0)
      Info("Setup", "session tag is %s", fSessionTag.Data());
   if (fTopSessionTag.IsNull()) fTopSessionTag = fSessionTag;

   // Send session tag to client
   TMessage m(kPROOF_SESSIONTAG);
   m << fSessionTag;
   fSocket->Send(m);

   // Get Session dir (sandbox)
   if ((fSessionDir = gEnv->GetValue("ProofServ.SessionDir", "-1")) == "-1") {
      Error("Setup", "Session dir missing");
      return -1;
   }

   // Link the session tag to the log file
   if (gSystem->Getenv("ROOTPROOFLOGFILE")) {
      TString logfile = gSystem->Getenv("ROOTPROOFLOGFILE");
      Int_t iord = logfile.Index(Form("-%s", fOrdinal.Data()));
      if (iord != kNPOS) logfile.Remove(iord);
      logfile += Form("-%s.log", fSessionTag.Data());
      gSystem->Symlink(gSystem->Getenv("ROOTPROOFLOGFILE"), logfile);
   }

   // Goto to the main PROOF working directory
   char *workdir = gSystem->ExpandPathName(fWorkDir.Data());
   fWorkDir = workdir;
   delete [] workdir;
   if (gProofDebugLevel > 0)
      Info("Setup", "working directory set to %s", fWorkDir.Data());

   // Common setup
   if (SetupCommon() != 0) {
      Error("Setup", "common setup failed");
      return -1;
   }

   // Check every two hours if client is still alive
   fSocket->SetOption(kKeepAlive, 1);

   // Install SigPipe handler to handle kKeepAlive failure
   gSystem->AddSignalHandler(new TProofServLiteSigPipeHandler(this));

   // Install Termination handler
   gSystem->AddSignalHandler(new TProofServLiteTerminationHandler(this));

   // Install seg violation handler
   gSystem->AddSignalHandler(new TProofServLiteSegViolationHandler(this));

   // Done
   return 0;
}

//______________________________________________________________________________
void TProofServLite::Terminate(Int_t status)
{
   // Terminate the proof server.
   if (fTerminated)
      // Avoid doubling the exit operations
      exit(1);
   fTerminated = kTRUE;

   // Notify
   Info("Terminate", "starting session termination operations ...");

   // Cleanup session directory
   if (status == 0) {
      // make sure we remain in a "connected" directory
      gSystem->ChangeDirectory("/");
      // needed in case fSessionDir is on NFS ?!
      gSystem->MakeDirectory(fSessionDir+"/.delete");
      gSystem->Exec(Form("%s %s", kRM, fSessionDir.Data()));
   }

   // Remove input and signal handlers to avoid spurious "signals"
   // for closing activities executed upon exit()
   gSystem->RemoveSignalHandler(fInterruptHandler);

   // Stop processing events (set a flag to exit the event loop)
   gSystem->ExitLoop();

   // Notify
   Printf("Terminate: termination operations ended: quitting!");
}

//______________________________________________________________________________
void TProofServLite::HandleFork(TMessage *mess)
{
   // Cloning itself via fork.

   if (!mess) {
      Error("HandleFork", "empty message!");
      return;
   }

   // Extract the ordinals of the clones
   TString clones;
   (*mess) >> clones;
   PDB(kGlobal, 1)
      Info("HandleFork", "cloning to %s", clones.Data());

   TString clone;
   Int_t from = 0;
   while (clones.Tokenize(clone, from, " ")) {

      Int_t rc = 0;
      // Fork
      if ((rc = Fork()) < 0) {
         Error("HandleFork", "failed to fork %s", clone.Data());
         return;
      }

      // If the child, finalize the setup and return
      if (rc == 0) {
         SetupOnFork(clone.Data());
         return;
      }
   }

   // Done
   return;
}

//______________________________________________________________________________
Int_t TProofServLite::SetupOnFork(const char *ord)
{
   // Finalize the server setup afetr forking.
   // Return 0 on success, -1 on error

   if (gProofDebugLevel > 0)
      Info("SetupOnFork", "finalizing setup of %s", ord);

   // Set the ordinal
   fOrdinal = ord;
   TString sord;
   sord.Form("-%s", fOrdinal.Data());

   // Close the current log file
   if (fLogFile) {
      fclose(fLogFile);
      fLogFileDes = -1;
   }

   TString sdir = gSystem->DirName(fSessionDir.Data());
   RedirectOutput(sdir.Data(), "a");
   // If for some reason we failed setting a redirection file for the logs
   // we cannot continue
   if (!fLogFile || (fLogFileDes = fileno(fLogFile)) < 0) {
      Terminate(0);
      return -1;
   }
   FlushLogFile();

   // Eliminate existing symlink
   void *dirp = gSystem->OpenDirectory(sdir);
   if (dirp) {
      TString ent;
      const char *e = 0;
      while ((e = gSystem->GetDirEntry(dirp))) {
         ent.Form("%s/%s", sdir.Data(), e);
         FileStat_t st;
         gSystem->GetPathInfo(ent.Data(), st);
         if (st.fIsLink && ent.Contains(sord)) {
            PDB(kGlobal, 1)
               Info("SetupOnFork","unlinking: %s", ent.Data());
            gSystem->Unlink(ent);
         }
      }
      gSystem->FreeDirectory(dirp);
   }

   // The session tag
   fSessionTag.Form("%s-%d-%d", gSystem->HostName(), (int)time(0), gSystem->GetPid());

   // Create new symlink
   TString logfile = gSystem->Getenv("ROOTPROOFLOGFILE");
   logfile.ReplaceAll("-0.0", sord.Data());
   gSystem->Setenv("ROOTPROOFLOGFILE", logfile);
   Int_t iord = logfile.Index(sord.Data());
   if (iord != kNPOS) logfile.Remove(iord + sord.Length());
   logfile += Form("-%s.log", fSessionTag.Data());
   gSystem->Symlink(gSystem->Getenv("ROOTPROOFLOGFILE"), logfile);

   // Get socket to be used to call back our xpd
   fSockPath = gEnv->GetValue("ProofServ.OpenSock", "");
   if (fSockPath.Length() <= 0) {
      Error("CreateServer", "Socket setup by xpd undefined");
      return -1;
   }
   TString entity = gEnv->GetValue("ProofServ.Entity", "");
   if (entity.Length() > 0)
      fSockPath.Insert(0,Form("%s/", entity.Data()));

   // Call back the client
   fSocket = new TSocket(fSockPath);
   if (!fSocket || !(fSocket->IsValid())) {
      Error("CreateServer", "Failed to open connection to the client");
      return -1;
   }

   // Send our ordinal, to allow the client to identify us
   TMessage msg;
   msg << fOrdinal;
   fSocket->Send(msg);

   // Get socket descriptor
   Int_t sock = fSocket->GetDescriptor();

   // Install interrupt and message input handlers
   fInterruptHandler = new TProofServLiteInterruptHandler(this);
   gSystem->AddSignalHandler(fInterruptHandler);
   gSystem->AddFileHandler(new TProofServLiteInputHandler(this, sock));

   // Wait (loop) in worker node to allow debugger to connect
   if (gEnv->GetValue("Proof.GdbHook",0) == 2) {
      while (gProofServDebug)
         ;
   }

   if (gProofDebugLevel > 0)
      Info("SetupOnFork", "Service: %s, ConfDir: %s, IsMaster: %d",
           fService.Data(), fConfDir.Data(), (Int_t)fMasterServ);

   if (Setup() == -1) {
      // Setup failure
      Terminate(0);
      SendLogFile();
      return -1;
   }

   // Disallow the interpretation of Rtypes.h, TError.h and TGenericClassInfo.h
   ProcessLine("#define ROOT_Rtypes 0", kTRUE);
   ProcessLine("#define ROOT_TError 0", kTRUE);
   ProcessLine("#define ROOT_TGenericClassInfo 0", kTRUE);

   // Save current interpreter context
   gInterpreter->SaveContext();
   gInterpreter->SaveGlobalsContext();

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