ROOT logo
// $Id: GledNS.cxx 2800 2012-06-29 06:34:53Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "GledNS.h"
#include <Glasses/ZGlass.h>
#include <Stones/ZMIR.h>
#include <Ephra/Saturn.h>
#include <Gled/GMutex.h>
#include <Gled/Gled.h>

#include <TMessage.h>
#include <TDirectory.h>
#include <TFile.h>
#include <TSystem.h>
#include <TVirtualMutex.h>

#include <TROOT.h>
#include <TClass.h>
#include <TRealData.h>
#include <TDataMember.h>
#include <TPRegexp.h>


#include <stack>

#include <G__ci.h> // CINT's G__ global functions.
#include <dlfcn.h> // Needed for FindSymbol, CINT's version does not
		   // work until the first library is actually loaded.

/**************************************************************************/

int G_DEBUG = 0;

struct FD_pair
{
  TFile* file; TDirectory* dir;
  FD_pair(TFile* f, TDirectory* d) : file(f), dir(d) {}
};

namespace GledNS
{
  TDirectory* GledRoot = 0;

  stack<FD_pair>	FDstack;
  GMutex		FDmutex(GMutex::recursive);

  lStr_t        LibSetList;     // List of libsets in reverse init order.
  hLid2pLSI_t	Lid2LSInfo;	// Catalog of libsets by LibSet ID.
  hName2Lid_t	Name2Lid;	// Catalog of libsets by name.
  hName2Fid_t	Name2Fid;	// Catalog of glasses by name.

} // namespace GledNS

// FDmutex will disappear once threads are ok in root

void GledNS::InitFD(TFile* file, TDirectory* dir)
{
  FDstack.push(FD_pair(file, dir));
}

void GledNS::PushFD()
{
  FDmutex.Lock();
  FDstack.push(FD_pair(gFile, gDirectory));
}

void GledNS::PopFD()
{
  gFile = FDstack.top().file;
  if(FDstack.top().dir != 0) {
    FDstack.top().dir->cd();
  } else {
    // dump some error
  }
  FDstack.pop();
  FDmutex.Unlock();
}

/**************************************************************************/

Int_t GledNS::LoadSoSet(const TString& lib_set)
{
  TString libname = FabricateLibName(lib_set);
  Int_t ret = LoadSo(libname);
  if (ret)
  {
    ISmess(GForm("GledNS::LoadSoSet loading %s as %s returned %d",
		  lib_set.Data(), libname.Data(), ret));
  }
  if (ret < 0) return ret;

  ret = InitSoSet(lib_set);

  if (ret) return ret;

  AssertRenderers();

  return ret;
}

Int_t GledNS::InitSoSet(const TString& lib_set)
{
  static const Exc_t _eh("GledNS::InitSoSet ");

  { // init
    TString cmd = FabricateInitFoo(lib_set);
    long* p2foo = (long*) FindSymbol(cmd);
    if (!p2foo)
    {
      ISerr(_eh + GForm("can't find %s. Safr!", cmd.Data()));
      return 2;
    }
    void (*foo)() = (void(*)())(*p2foo);
    foo();
  }
  { // user_init
    TString cmd = FabricateUserInitFoo(lib_set);
    long* p2foo = (long*) FindSymbol(cmd);
    if (!p2foo)
    {
      ISmess(_eh + "no user initialization for '" + lib_set + "'.");
    }
    else
    {
      ISmess(_eh + "execing user initialization for '" + lib_set + "'.");
      void (*foo)() = (void(*)())(*p2foo);
      foo();
    }
  }
  LibSetList.push_back(lib_set);
  return 0;
}

Int_t GledNS::LoadSo(const TString& full_lib_name)
{
  G__Set_RTLD_LAZY();
  Int_t ret = gSystem->Load(full_lib_name.Data());
  if (ret)
  {
    ISmess(GForm("GledNS::LoadSo loading %s returned %d",
		 full_lib_name.Data(), ret));
  }
  return ret;
}


void* GledNS::FindSymbol(const TString& sym)
{
  // Used to be G__findsym( sym );
  // Didn't work for explicitly linked libs. Guess those are not registered in cint.

  // dlsym for APPLE takes arg WITHOUT the '_'.
  return dlsym(RTLD_DEFAULT, sym.Data());
}

/**************************************************************************/

void GledNS::BootstrapSoSet(LibSetInfo* lsi)
{
  static const Exc_t _eh("GledNS::BootstrapSoSet ");

  hLid2pLSI_i i = Lid2LSInfo.find(lsi->fLid);
  if (i != Lid2LSInfo.end())
  {
    ISwarn(_eh + GForm("%s(id=%u) already loaded.", i->second->fName.Data(), lsi->fLid));
    return;
  }
  ISmess(_eh + GForm("installing %s(id=%u) ...", lsi->fName.Data(), lsi->fLid));
  Lid2LSInfo[lsi->fLid] = lsi;
  Name2Lid[lsi->fName] = lsi->fLid;
  // Init libsets the new one depends on.
  // The libs are loaded by link-time dependence.
  const char** dep = lsi->fDeps;
  while (*dep)
  {
    if (Name2Lid.find(*dep) == Name2Lid.end())
    {
      Int_t ini = InitSoSet(*dep);
      if (ini) return;
    }
    ++dep;
  }
}

//------------------------------------------------------------------------------

bool GledNS::IsLoaded(const TString& lib_set)
{
  return (Name2Lid.find(lib_set) != Name2Lid.end());
}

bool GledNS::IsLoaded(LID_t lid)
{
  return (Lid2LSInfo.find(lid) != Lid2LSInfo.end());
}

//------------------------------------------------------------------------------

void GledNS::ShutdownLibSet(const TString& lib_set)
{
  static const Exc_t _eh("GledNS::ShutdownLibSet ");

  TString cmd = FabricateUserShutdownFoo(lib_set);
  long* p2foo = (long*) FindSymbol(cmd);
  if (!p2foo)
  {
    ISmess(_eh + "no user shutdown for '" + lib_set + "'.");
  }
  else
  {
    ISmess(_eh + "execing user shutdown for '" + lib_set + "'.");
    void (*foo)() = (void(*)())(*p2foo);
    foo();
  }
}

void GledNS::ShutdownLibSets()
{
  while (!LibSetList.empty())
  {
    ShutdownLibSet(LibSetList.back());
    LibSetList.pop_back();
  }
}

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

void GledNS::BootstrapClass(GledNS::ClassInfo* ci)
{
  // !!!! no check done if class already registered
  // As well ... perhaps should separate them by LID
  // will be thinking of that later ...
  LibSetInfo* lsi = FindLibSetInfo(ci->fFid.fLid);
  lsi->Cid2CInfo[ci->fFid.fCid] = ci;
  Name2Fid.insert(pair<TString,FID_t>(ci->fName, ci->fFid));
}

/**************************************************************************/

TString GledNS::FabricateLibName(const TString& libset)
{
  return TString("lib") + libset + ".so";
}

TString GledNS::FabricateInitFoo(const TString& libset)
{
  // Returns name of void* pointing to init_foo

  return libset + "_GLED_init";
}

TString GledNS::FabricateUserInitFoo(const TString& libset)
{
  // Returns name of void* pointing to user_init_foo

  return libset + "_GLED_user_init";
}

TString GledNS::FabricateUserShutdownFoo(const TString& libset)
{
  // Returns name of void* pointing to user_shutdown_foo

  return libset + "_GLED_user_shutdown";
}

/**************************************************************************/

namespace GledNS
{
  set<TString>	RnrNames;
}

void GledNS::BootstrapRnrSet(const TString& libset, LID_t lid,
			     const TString& rnr, A_Rnr_Creator_foo rfoo)
{
  static const Exc_t _eh("GledNS::BootstrapRnrSet ");

  LibSetInfo* lsi = FindLibSetInfo(lid);
  if(lsi == 0) {
    ISwarn(_eh + GForm("LibSet %s(lid=%u) not loaded.", libset.Data(), lid));
    return;
  }
  hRnr2RCFoo_i j = lsi->Rnr2RCFoo.find(rnr);
  if(j != lsi->Rnr2RCFoo.end()) {
    ISwarn(_eh + GForm("RnrCreator for rnr=%s, LibSet=%s (lid=%u) already present.",
		       rnr.Data(), libset.Data(), lid));
    return;
  }
  lsi->Rnr2RCFoo[rnr] = rfoo;
}

TString GledNS::FabricateRnrLibName(const TString& libset, const TString& rnr)
{
  return TString("lib") + libset + "_Rnr_" + rnr + ".so";
}

TString GledNS::FabricateRnrInitFoo(const TString& libset, const TString& rnr)
{
  TString foo = libset + "_GLED_init_Rnr_" + rnr;
  return foo;
}


/**************************************************************************/

void GledNS::AssertRenderers()
{
  static const Exc_t _eh("GledNS::AssertRenderers ");

  lpLSI_t ls_list;
  ProduceLibSetInfoList(ls_list);
  for (lpLSI_i lsi=ls_list.begin(); lsi!=ls_list.end(); ++lsi) {
    TString libset = (*lsi)->fName;
    for (set<TString>::iterator rnr=RnrNames.begin(); rnr!=RnrNames.end(); ++rnr) {
      if ((*lsi)->Rnr2RCFoo.find(*rnr) == (*lsi)->Rnr2RCFoo.end()) {
	TString cmd = FabricateRnrInitFoo(libset, *rnr);
	long* p2foo = (long*) FindSymbol(cmd);
	if (!p2foo) {
	  TString libname = FabricateRnrLibName(libset, *rnr);
	  int ret = LoadSo(libname);
	  if (ret < 0) {
	    ISerr(_eh + libname + " not existing.");
	    return;
	  }
	  p2foo = (long*) FindSymbol(cmd);
	  if (!p2foo) {
	    ISerr(_eh + cmd + " not existing in " + libname + ".");
	    return;
	  }
	}
	void (*foo)() = (void(*)())(*p2foo);
	foo();
      }
    }
  }
}

void GledNS::AddRenderer(const TString& rnr)
{
  if (RnrNames.find(rnr) == RnrNames.end())
  {
    RnrNames.insert(rnr);
    AssertRenderers();
  }
}

A_Rnr* GledNS::SpawnRnr(const TString& rnr, ZGlass* d, FID_t fid)
{
  static const Exc_t _eh("GledNS::SpawnRnr ");

  LibSetInfo* lsi = FindLibSetInfo(fid.fLid);
  if (lsi == 0)
  {
    ISerr(_eh + GForm("can't demangle lib id=%u.", fid.fLid));
    return 0;
  }
  hRnr2RCFoo_i j = lsi->Rnr2RCFoo.find(rnr);
  if (j == lsi->Rnr2RCFoo.end())
  {
    ISerr(_eh + GForm("can't find Rnr Constructor for %s.", rnr.Data()));
    return 0;
  }
  return (j->second)(d, fid.fCid);
}

/**************************************************************************/
/**************************************************************************/

ZGlass* GledNS::ConstructLens(FID_t fid)
{
  LibSetInfo* lsi = FindLibSetInfo(fid.fLid);
  if(lsi == 0) {
    ISerr(GForm("GledNS::ConstructLens lib set %u not found", fid.fLid));
    return 0;
  }
  ZGlass* g = (lsi->fLC_Foo)(fid.fCid);
  if(g == 0) {
    ISerr(GForm("GledNS::ConstructLens default ctor for FID_t(%u,%u) returned 0", fid.fLid, fid.fCid));
    return 0;
  }
  return g;
}

bool GledNS::IsA(ZGlass* glass, FID_t fid)
{
  if(fid.is_null()) return true;
  LibSetInfo* lsi = FindLibSetInfo(fid.fLid);
  if(lsi == 0) return false;
  return (lsi->fISA_Foo)(glass, fid.fCid);
}

/**************************************************************************/

#if ROOT_VERSION_CODE >= ROOT_VERSION(5,0,0)
  #define ROOT_CINT_MUTEX gGlobalMutex
#else
  #define ROOT_CINT_MUTEX gCINTMutex
#endif

TVirtualMutex* GledNS::GetCINTMutex() { return ROOT_CINT_MUTEX; }

void GledNS::LockCINT()   { ROOT_CINT_MUTEX->Lock();   }
void GledNS::UnlockCINT() { ROOT_CINT_MUTEX->UnLock(); }

/**************************************************************************/

void GledNS::StreamLens(TBuffer& b, ZGlass* lens)
{
  // Writes lens, prefixed by Lid/Cid to the buffer.

  assert(b.IsWriting());
  b << lens->VFID();
  R__LOCKGUARD(ROOT_CINT_MUTEX);
  lens->Streamer(b);
}

ZGlass* GledNS::StreamLens(TBuffer& b)
{
  // Reads lid/cid of the glass, instantiates a lens and streams it out.

  assert(b.IsReading());
  FID_t fid;
  b >> fid;
  ZGlass *lens = ConstructLens(fid);
  if(lens) {
    R__LOCKGUARD(ROOT_CINT_MUTEX);
    lens->Streamer(b);
  }
  return lens;
}

void GledNS::WriteLensID(TBuffer& b, ZGlass* lens)
{
  // Writes lens ID to the buffer.

  assert(b.IsWriting());
  b << (lens ? lens->GetSaturnID() : ID_t(0));
}

ID_t GledNS::ReadLensID(TBuffer& b)
{
  assert(b.IsReading());
  ID_t id;
  b >> id;
  return id;
}

ZGlass* GledNS::ReadLensIDAsPtr(TBuffer& b)
{
  assert(b.IsReading());
  ID_t id;
  b >> id;
  char* p = 0; p += id;
  return (ZGlass*) p;
}

/**************************************************************************/
/**************************************************************************/
// Implementations of Finders and Info-class methods
/**************************************************************************/
/**************************************************************************/

GledNS::LibSetInfo* GledNS::FindLibSetInfo(LID_t lid)
{
  hLid2pLSI_i i = Lid2LSInfo.find(lid);
  if(i == GledNS::Lid2LSInfo.end()) {
    ISerr(GForm("GledNS::FindLibSetInfo can't demangle lib id=%u", lid));
    return 0;
  }
  return i->second;
}

GledNS::LibSetInfo* GledNS::FindLibSetInfo(const TString& lib_set)
{
  hName2Lid_i i = Name2Lid.find(lib_set);
  return (i != Name2Lid.end()) ? FindLibSetInfo(i->second) : 0;
}


void GledNS::ProduceLibSetInfoList(lpLSI_t& li_list)
{
  for(hLid2pLSI_i i=Lid2LSInfo.begin(); i!=Lid2LSInfo.end(); ++i) {
    LID_t lid = i->second->fLid;
    lpLSI_i l = li_list.begin();
    while(l != li_list.end() && lid > (*l)->fLid) ++l;
    li_list.insert(l, i->second);
  }
}

GledNS::ClassInfo* GledNS::FindClassInfo(FID_t fid)
{
  if(fid.is_null()) return 0;
  hLid2pLSI_i i = Lid2LSInfo.find(fid.fLid);
  if(i == GledNS::Lid2LSInfo.end()) {
    ISerr(GForm("GledNS::FindClassInfo can't demangle lib id=%u", fid.fLid));
    return 0;
  }
  return i->second->FindClassInfo(fid.fCid);
}

FID_t GledNS::FindClassID(const TString& name)
{
  hName2Fid_i i = Name2Fid.find(name);
  return (i != Name2Fid.end()) ? i->second : FID_t(0,0);
}

GledNS::ClassInfo* GledNS::FindClassInfo(const TString& name)
{
  return FindClassInfo(FindClassID(name));
}

/**************************************************************************/

GledNS::MethodInfo* GledNS::DeduceMethodInfo(ZGlass* alpha, const TString& name)
{
  // 'name' can be FQ, eg. "SomeGlass::Foo".

  TPMERegexp re("::");
  int  ret = re.Split(name);
  if(ret == 2) {
    ClassInfo* ci = FindClassInfo(re[0]);
    if(ci == 0)  return 0;
    return ci->FindMethodInfo(re[1], false);
  }
  else if(ret == 1 && alpha != 0) {
    ClassInfo* ci = alpha->VGlassInfo();
    return ci->FindMethodInfo(re[0], true);
  }
  return 0;
}

GledNS::DataMemberInfo* GledNS::DeduceDataMemberInfo(ZGlass* alpha, const TString& name)
{
  // 'name' can be FQ, eg. "SomeGlass::Foo".

  TPMERegexp re("::");
  int  ret = re.Split(name);
  if(ret == 2) {
    ClassInfo* ci = FindClassInfo(re[0]);
    if(ci == 0)  return 0;
    return ci->FindDataMemberInfo(re[1], false);
  }
  else if(ret == 1 && alpha != 0) {
    ClassInfo* ci = alpha->VGlassInfo();
    return ci->FindDataMemberInfo(re[0], true);
  }
  return 0;
}

/**************************************************************************/
// GledNS::MethodInfo
/**************************************************************************/

ZMIR* GledNS::MethodInfo::MakeMir(ZGlass* a, ZGlass* b, ZGlass* g)
{
  ZMIR* mir = new ZMIR(a, b, g);
  ImprintMir(*mir);
  return mir;
}

void GledNS::MethodInfo::ImprintMir(ZMIR& mir) const
{
  mir.SetLCM_Ids(fClassInfo->fFid.fLid, fClassInfo->fFid.fCid, fMid);
  if(bLocal)       mir.SetRecipient(0);
  if(bDetachedExe) mir.SetDetachedExe(bMultixDetachedExe);
}

void GledNS::MethodInfo::StreamIds(TBuffer& b) const
{
  assert(b.IsWriting());
  b << fClassInfo->fFid.fLid << fClassInfo->fFid.fCid << fMid;
}

/**************************************************************************/
// GledNS::DataMemberInfo
/**************************************************************************/

TString GledNS::DataMemberInfo::CName()
{ return fPrefix + fName; }

TString GledNS::DataMemberInfo::FullName()
{ return fClassInfo->fName + "::" + fName; }

TString GledNS::DataMemberInfo::FullCName()
{ return fClassInfo->fName + "::" + CName(); }

TRealData* GledNS::DataMemberInfo::GetTRealData()
{
  if(fTRealData == 0)
    fTRealData = fClassInfo->GetTClass()->GetRealData(CName().Data());
  return fTRealData;
}

TDataMember* GledNS::DataMemberInfo::GetTDataMember()
{
  return (GetTRealData()) ? fTRealData->GetDataMember() : 0;
}

/**************************************************************************/
// GledNS::EnumInfo
/**************************************************************************/

GledNS::EnumInfo::EnumInfo(const TString& s, Int_t size) :
  InfoBase(s), fMaxLabelWidth(0)
{
  fEntries.reserve(size);
}

void GledNS::EnumInfo::AddEntry(const TString& n, const TString& l, Int_t v)
{
  fEntries.push_back(EnumEntry(n, l, v));
  fMaxLabelWidth = TMath::Max((Int_t) l.Length(), fMaxLabelWidth);
}

GledNS::EnumEntry* GledNS::EnumInfo::FindEntry(const TString& name)
{
  // Find entry with given name.
  // Throws an exception if it is not found.

  static const Exc_t _eh("GledNS::EnumInfo::FindEntry ");

  vEnumEntry_i i = fEntries.begin();
  while (i != fEntries.end())
  {
    if (i->fName == name)
      return &(*i);
    ++i;
  }
  throw _eh + "entry '" + name + "' not found.";
}

/**************************************************************************/
// GledNS::ClassInfo
/**************************************************************************/

GledNS::lpDataMemberInfo_t*
GledNS::ClassInfo::ProduceFullDataMemberInfoList()
{
  // Recursive up call towards the base (ZGlass)
  lpDataMemberInfo_t* ret;
  ClassInfo* p = GetParentCI();
  if(p) ret = p->ProduceFullDataMemberInfoList();
  else	ret = new lpDataMemberInfo_t;
  copy(fDataMemberList.begin(), fDataMemberList.end(), back_inserter(*ret));
  return ret;
}

GledNS::lpLinkMemberInfo_t*
GledNS::ClassInfo::ProduceFullLinkMemberInfoList()
{
  // Recursive up call towards the base (ZGlass)
  lpLinkMemberInfo_t* ret;
  ClassInfo* p = GetParentCI();
  if(p) ret = p->ProduceFullLinkMemberInfoList();
  else	ret = new lpLinkMemberInfo_t;
  copy(fLinkMemberList.begin(), fLinkMemberList.end(), back_inserter(*ret));
  return ret;
}

/**************************************************************************/

GledNS::ClassInfo* GledNS::ClassInfo::GetRendererCI()
{
  if (!fRendererCI)
  {
    if (fRendererGlass == fName)
    {
      fRendererCI = this;
    }
    else
    {
      ClassInfo *ci;
      if (fRendererGlass.IsNull())
	ci = GetParentCI();
      else
	ci = GledNS::FindClassInfo(fRendererGlass);
      while (ci != ci->GetRendererCI())
      {
	ci = ci->GetRendererCI();
      }

      fRendererGlass = ci->fName;
      fRendererCI    = ci;
    }
  }
  return fRendererCI;
}

A_Rnr* GledNS::ClassInfo::SpawnRnr(const TString& rnr, ZGlass* g)
{
  if (fRendererCI == 0) GetRendererCI();
  // cout <<"GledNS::ClassInfo::SpawnRnr rnr="<< rnr <<", lens="<< g->GetName() <<
  //  "["<< fRendererCI->fName <<"]\n";
  return GledNS::SpawnRnr(rnr, g, fRendererCI->fFid);
}

/**************************************************************************/

namespace
{
  struct infobase_name_eq : public unary_function<GledNS::InfoBase*, bool>
  {
    TString name;
    infobase_name_eq(const TString& s) : name(s) {}
    bool operator()(const GledNS::InfoBase* ib)
    { return ib->fName == name; }
  };
}

GledNS::MethodInfo*
GledNS::ClassInfo::FindMethodInfo(MID_t mid)
{
  hMid2pMethodInfo_i i = fMethodHash.find(mid);
  return ( i!= fMethodHash.end()) ? i->second : 0;
}

GledNS::MethodInfo*
GledNS::ClassInfo::FindMethodInfo(const TString& name, bool recurse, bool throwp)
{
  static const Exc_t _eh("GledNS::ClassInfo::FindMethodInfo ");

  lpMethodInfo_i i = find_if(fMethodList.begin(), fMethodList.end(),
			     infobase_name_eq(name));
  if(i != fMethodList.end()) return *i;
  if(recurse) {
    ClassInfo* p = GetParentCI();
    if(p) return p->FindMethodInfo(name, recurse);
  }
  if(throwp)
    throw(_eh + GForm("'%s' not found in glass %s (recurse=%d).",
		      name.Data(), fName.Data(), recurse));
  return 0;
}

GledNS::DataMemberInfo*
GledNS::ClassInfo::FindDataMemberInfo(const TString& name, bool recurse, bool throwp)
{
  static const Exc_t _eh("GledNS::ClassInfo::FindDataMemberInfo ");

  lpDataMemberInfo_i i = find_if(fDataMemberList.begin(), fDataMemberList.end(),
				infobase_name_eq(name));

  if(i != fDataMemberList.end()) return *i;
  if(recurse) {
    ClassInfo* p = GetParentCI();
    if(p) return p->FindDataMemberInfo(name, recurse);
  }
  if(throwp)
    throw(_eh + GForm("'%s' not found in glass %s (recurse=%d).",
		      name.Data(), fName.Data(), recurse));
  return 0;
}

GledNS::LinkMemberInfo*
GledNS::ClassInfo::FindLinkMemberInfo(const TString& name, bool recurse, bool throwp)
{
  static const Exc_t _eh("GledNS::ClassInfo::FindLinkMemberInfo ");

  lpLinkMemberInfo_i i = find_if(fLinkMemberList.begin(), fLinkMemberList.end(),
				infobase_name_eq(name));

  if(i != fLinkMemberList.end()) return *i;
  if(recurse) {
    ClassInfo* p = GetParentCI();
    if(p) return p->FindLinkMemberInfo(name, recurse);
  }
  if(throwp)
    throw(_eh + GForm("'%s' not found in glass %s (recurse=%d).",
		      name.Data(), fName.Data(), recurse));
  return 0;
}

GledNS::EnumInfo*
GledNS::ClassInfo::FindEnumInfo(const TString& name, bool recurse, bool throwp)
{
  static const Exc_t _eh("GledNS::ClassInfo::FindEnumInfo ");

  lpEnumInfo_i i = find_if(fEnumList.begin(), fEnumList.end(),
			   infobase_name_eq(name));

  if(i != fEnumList.end()) return *i;
  if(recurse) {
    ClassInfo* p = GetParentCI();
    if(p) return p->FindEnumInfo(name, recurse);
  }
  if(throwp)
    throw(_eh + GForm("'%s' not found in glass %s (recurse=%d).",
		      name.Data(), fName.Data(), recurse));
  return 0;
}

/**************************************************************************/

GledNS::LibSetInfo* GledNS::ClassInfo::GetLibSetInfo()
{
  if(!fLibSetInfo) fLibSetInfo = FindLibSetInfo(fFid.fLid);
  return fLibSetInfo;
}

GledNS::ClassInfo* GledNS::ClassInfo::GetParentCI()
{
  if(!fParentCI && !fParentName.IsNull()) {
    FID_t fid = GledNS::FindClassID(fParentName);
    fParentCI = const_cast<ClassInfo*>(FindClassInfo(fid));
  }
  return fParentCI;
}

/**************************************************************************/

TClass* GledNS::ClassInfo::GetTClass()
{
  if(fTClass == 0)
    fTClass = gROOT->GetClass(fName.Data(), true);
  return fTClass;
}

/**************************************************************************/
// LibSetInfo
/**************************************************************************/

GledNS::ClassInfo* GledNS::LibSetInfo::FindClassInfo(CID_t cid)
{
  hCid2pCI_i i = Cid2CInfo.find(cid);
  if(i == Cid2CInfo.end()) {
    ISerr(GForm("GledNS::LibSetInfo::FindClassInfo can't demangle class cid=%u", cid));
    return 0;
  }
  return i->second;
}

GledNS::ClassInfo* GledNS::LibSetInfo::FirstClassInfo()
{
  hCid2pCI_i i = Cid2CInfo.begin();
  if(i == Cid2CInfo.end()) {
    ISerr("GledNS::LibSetInfo::FirstClassInfo no classes found");
    return 0;
  }
  return i->second;
}

/**************************************************************************/
/**************************************************************************/
// Value-type peek and MIR-poke
/**************************************************************************/
/**************************************************************************/

// Type snatched from TDataType.h

Double_t GledNS::peek_value(void* addr, Int_t type)
{
  switch(type) {
  case  2: return *((Short_t*)addr);
  case  3: return *((Int_t*)addr);
  case  4: return *((Long_t*)addr);
  case  5: return *((Float_t*)addr);
  case  6: return *((Int_t*)addr);
  case  8: return *((Double_t*)addr);
  case  9: return *((Double32_t*)addr);
  case 11: return *((UChar_t*)addr);
  case 12: return *((UShort_t*)addr);
  case 13: return *((UInt_t*)addr);
  case 14: return *((ULong_t*)addr);
  case 15: return *((UInt_t*)addr);
  case 16: return *((Long64_t*)addr);
  case 17: return *((ULong64_t*)addr);
  case 18: return *((Bool_t*)addr);
  default: return 0;
  };
}

void GledNS::stream_value(TBuffer& b, Int_t type, Double_t value)
{
  assert(b.IsWriting());
  switch(type) {
  case  2: b << (Short_t)value;    break;
  case  3: b << (Int_t)value;      break;
  case  4: b << (Long_t)value;     break;
  case  5: b << (Float_t)value;    break;
  case  6: b << (Int_t)value;      break;
  case  8: b << (Double_t)value;   break;
  case  9: b << (Double32_t)value; break;
  case 11: b << (UChar_t)value;    break;
  case 12: b << (UShort_t)value;   break;
  case 13: b << (UInt_t)value;     break;
  case 14: b << (ULong_t)value;    break;
  case 15: b << (UInt_t)value;     break;
  case 16: b << (Long64_t)value;   break;
  case 17: b << (ULong64_t)value;  break;
  case 18: b << (Bool_t)value;     break;
  default: b << Int_t(0);          break;
  };
}

/**************************************************************************/
/**************************************************************************/
// Simple TString parser
/**************************************************************************/
/**************************************************************************/

int GledNS::split_string(const TString& s, Ssiz_t start, Ssiz_t end,
			 lStr_t& l, char c)
{
  int cnt=0;
  TString g;
  for(Ssiz_t i=start; i!=end; ++i) {
    if(c==0) {
      if(isspace(s(i)) && g.Length()>0) {
	++cnt; l.push_back(g); g = (char)0; continue;
      }
      if(isspace(s(i))) continue;
    }
    if(s(i)==c) {
      ++cnt; l.push_back(g); g = (char)0; continue;
    }
    g += s(i);
  }
  if(g.Length()>0) { ++cnt; l.push_back(g); }
  return cnt;
}

int GledNS::split_string(const TString& s, lStr_t& l, char c)
{
  // Splits TString on character c. If c==0 splits on whitespace.
  return split_string(s, 0, s.Length(), l, c);
}

int GledNS::split_string(const TString& s, lStr_t& l, const TString& ptr)
{
  // Splits TString on whole contents of ptr.

  int cnt = 0;
  Ssiz_t       i      = 0;
  const Ssiz_t end    = s.Length();
  const Ssiz_t ptrlen = ptr.Length();

  while(i < end) {
    Ssiz_t j = s.Index(ptr, i);
    if(j == kNPOS) j = end;
    if(j > i) {
      ++cnt;
      l.push_back(s(i, j-i));
    }
    i = j + ptrlen;
  }
  return cnt;
}

void GledNS::deparen_string(const TString& in, TString& n, TString& a,
			    const TString& ops, bool no_parens_ok)
  throw (Exc_t)
{
  // expects back parens to be the last char ... could as well grep it
  static const Exc_t _eh("GledNS::deparen_string ");

  Ssiz_t op_pos = in.First(ops);
  if(op_pos == kNPOS) {
    if(no_parens_ok) {
      if(in.IsNull()) throw _eh + "missing name.";
      n = in;
      return;
    } else {
      throw _eh + "no open paren.";
    }
  }
  int cp_pos = in.Length()-1;
  char o = in(op_pos);
  char c = in(cp_pos);
  if((o=='(' && c!=')') || (o=='[' && c!=']') || (o=='{' && c!='}')) {
    throw _eh + "no close paren.";
  }
  n = in;
  n.Remove(op_pos, cp_pos-op_pos+1);
  a = in(op_pos+1, cp_pos-op_pos-1);
  if(n.Length()==0) throw _eh + "missing name";
  if(a.Length()==0) throw _eh + "no args for " + n + ".";
}

/**************************************************************************/

TString GledNS::join_strings(const TString& sep, lStr_t& list)
{
  if(list.empty()) return "";
  lStr_i i = list.begin();
  TString ret = *i;
  while(++i != list.end()) ret += sep + *i;
  return ret;
}

/**************************************************************************/

void GledNS::remove_whitespace(TString& s)
{
  TString g;
  Ssiz_t end = s.Length();
  for(Ssiz_t i=0; i!=end; ++i) {
    if(!isspace(s(i))) g += s(i);
  }
  s = g;
}

Ssiz_t GledNS::find_first_of(const TString& s, const char* accept, Ssiz_t i)
{
  if(i >= s.Length()) return kNPOS;
  const char *f = strpbrk(s.Data()+i, accept);
  return f ? f - s.Data() : kNPOS;
}

/**************************************************************************/

TString GledNS::pathname_make_hidden_file(const TString& path)
{
  // Takes an absolute path and prepends the file component with a '.'.

  TString fn = path;
  Ssiz_t  sp = fn.Last('/');
  if (sp == kNPOS) sp = 0; else ++sp;
  fn.Insert(sp, ".");
  return fn;
}

/**************************************************************************/
// Argument/type-name parsing foos
/**************************************************************************/

void GledNS::split_argument(const TString& arg,
			    TString& type, TString& name, TString& def)
{
  Ssiz_t ei = arg.First('=');
  if(ei != kNPOS) {
    Ssiz_t tei = ei+1; while(isspace(arg(tei))) ++tei;
    def = arg(tei, arg.Length()-tei);
  } else {
    ei = arg.Length();
  }
  --ei;
  while(isspace(arg(ei))) --ei;
  Ssiz_t ti = ei;
  while(isalnum(arg(ti)) || arg(ti) == '_') --ti;
  name = arg(ti+1, ei-ti);
  while(isspace(arg(ti))) --ti;
  type = arg(0, ti+1);
}

void GledNS::unrefptrconst_type(TString& type)
{
  Ssiz_t i;
  while((i = type.First("*&")) != kNPOS) {
    type.Replace(i, 1, " ");
  }
  type.Prepend(" ");
  while((i = type.Index(" const ")) != kNPOS) {
    type.Remove(i+1, 5);
  }
  remove_whitespace(type);
}

/**************************************************************************/
/**************************************************************************/

int GledNS::tokenize_url(const TString& url, list<url_token>& l)
{
  Ssiz_t i = 0;
  const Ssiz_t end = url.Length();
  url_token::type_e type      = url_token::list_sel;
  url_token::type_e next_type = url_token::null;
  TString part;
  int count = 0;

  while(i < end) {
    Ssiz_t j = find_first_of(url, "/-\\", i);
    if(j == kNPOS) j = end;
    if(j > i) {
      part += url(i, j-i);
      i = j;
    }
    bool terminal = false;
    char c = url(i); // Relies on url(end) == 0

    if(c == '\\') {
      if(++i < end) part += url[i];
      if(++i < end) continue;

      terminal = true;
      next_type = url_token::null;
    } else {
      // is a terminal?
      switch (c) {
      case 0:
	terminal = true;
	next_type = url_token::null;
	break;
      case '/':
	terminal = true;
	next_type = url_token::list_sel;
	++i;
	break;
      case '-':
	if(i+1 < end && url[i+1] == '>') {
	  terminal = true;
	  next_type = url_token::link_sel;
	  i += 2;
	} else {
	  part += "-";
	  if(++i == end) terminal = true;
	}
	break;
      } // switch
    }
    if(terminal) {
      if(part.Length() > 0) {
	// cout <<"tokenize_url making token " << part <<","<< (int)type <<endl;
	l.push_back(url_token(part, type));
	++count;
	part = "";
      }
      type = next_type;
    }
  }
  return count;
}


/**************************************************************************/
/**************************************************************************/
// Exception stuffe
/**************************************************************************/
/**************************************************************************/

//______________________________________________________________________________
//
// Exception class thrown by Gled classes and macros.

ClassImp(Exc_t);

Exc_t::Exc_t(const std::string& s) : TString(s.c_str())
{
   // Constructor.
}

Exc_t operator+(const Exc_t &s1, const std::string &s2)
{ Exc_t r(s1); r += s2; return r; }

Exc_t operator+(const Exc_t &s1, const TString &s2)
{ Exc_t r(s1); r += s2; return r; }

Exc_t operator+(const Exc_t &s1,  const char *s2)
{ Exc_t r(s1); r += s2; return r; }

Exc_t operator+(const Exc_t &s1, char c)
{ Exc_t r(s1); r += c; return r; }


/**************************************************************************/
/**************************************************************************/
// Circular formatting buffer with mutex
/**************************************************************************/
/**************************************************************************/

namespace {
  GMutex	form_mutex;
  const int	form_len = 1024 * 16;
  char		form_buffer[form_len];
  char*		form_pos = form_buffer;
  char*		form_end = form_buffer + form_len;
  const int	max_length = 1024;
}

const char* GForm(const char* fmt, ...)
{
  form_mutex.Lock();

  if(form_end - form_pos < max_length) form_pos = form_buffer;

  va_list ap;
  va_start(ap, fmt);
  int n = vsnprintf(form_pos, max_length, fmt, ap);
  va_end(ap);

  if(n >= max_length) {
    n = max_length;
    size_t l = strlen(fmt);
    if(fmt[l-1]==10) form_pos[n-2] = 10;
  } else {
    ++n;
  }
  char* ret = form_pos;
  form_pos += n;

  form_mutex.Unlock();
  return ret;
}

const char* GFormVA(const char* fmt, va_list args)
{
  form_mutex.Lock();

  if(form_end - form_pos < max_length) form_pos = form_buffer;

  int n = vsnprintf(form_pos, max_length, fmt, args);

  if(n >= max_length) {
    n = max_length;
    size_t l = strlen(fmt);
    if(fmt[l-1]==10) form_pos[n-2] = 10;
  } else {
    ++n;
  }
  char* ret = form_pos;
  form_pos += n;

  form_mutex.Unlock();
  return ret;
}


/**************************************************************************/
/**************************************************************************/
// TString .vs. std::TString.
/**************************************************************************/
/**************************************************************************/

TBuffer& operator<<(TBuffer& b, const string& s)
{
  Int_t   nbig;
  UChar_t nwh;
  nbig = s.length();
  if (nbig > 254) {
    nwh = 255;
    b << nwh;
    b << nbig;
  } else {
    nwh = UChar_t(nbig);
    b << nwh;
  }
  b.WriteFastArray(s.data(), nbig);
  return b;
}

TBuffer& operator>>(TBuffer& b, string& s)
{
   Int_t   nbig;
   UChar_t nwh;
   b >> nwh;
   if (nwh == 255)
     b >> nbig;
   else
     nbig = nwh;
   s.resize(nbig);
   b.ReadFastArray(const_cast<char*>(s.data()), nbig);
   return b;
}

// Relies on TString::Data() fast & null-terminated.

bool operator==(const TString& t, const string& s)
{ return (s == t.Data()); }

bool operator==(const string&  s, const TString& t)
{ return (s == t.Data()); }
 GledNS.cxx:1
 GledNS.cxx:2
 GledNS.cxx:3
 GledNS.cxx:4
 GledNS.cxx:5
 GledNS.cxx:6
 GledNS.cxx:7
 GledNS.cxx:8
 GledNS.cxx:9
 GledNS.cxx:10
 GledNS.cxx:11
 GledNS.cxx:12
 GledNS.cxx:13
 GledNS.cxx:14
 GledNS.cxx:15
 GledNS.cxx:16
 GledNS.cxx:17
 GledNS.cxx:18
 GledNS.cxx:19
 GledNS.cxx:20
 GledNS.cxx:21
 GledNS.cxx:22
 GledNS.cxx:23
 GledNS.cxx:24
 GledNS.cxx:25
 GledNS.cxx:26
 GledNS.cxx:27
 GledNS.cxx:28
 GledNS.cxx:29
 GledNS.cxx:30
 GledNS.cxx:31
 GledNS.cxx:32
 GledNS.cxx:33
 GledNS.cxx:34
 GledNS.cxx:35
 GledNS.cxx:36
 GledNS.cxx:37
 GledNS.cxx:38
 GledNS.cxx:39
 GledNS.cxx:40
 GledNS.cxx:41
 GledNS.cxx:42
 GledNS.cxx:43
 GledNS.cxx:44
 GledNS.cxx:45
 GledNS.cxx:46
 GledNS.cxx:47
 GledNS.cxx:48
 GledNS.cxx:49
 GledNS.cxx:50
 GledNS.cxx:51
 GledNS.cxx:52
 GledNS.cxx:53
 GledNS.cxx:54
 GledNS.cxx:55
 GledNS.cxx:56
 GledNS.cxx:57
 GledNS.cxx:58
 GledNS.cxx:59
 GledNS.cxx:60
 GledNS.cxx:61
 GledNS.cxx:62
 GledNS.cxx:63
 GledNS.cxx:64
 GledNS.cxx:65
 GledNS.cxx:66
 GledNS.cxx:67
 GledNS.cxx:68
 GledNS.cxx:69
 GledNS.cxx:70
 GledNS.cxx:71
 GledNS.cxx:72
 GledNS.cxx:73
 GledNS.cxx:74
 GledNS.cxx:75
 GledNS.cxx:76
 GledNS.cxx:77
 GledNS.cxx:78
 GledNS.cxx:79
 GledNS.cxx:80
 GledNS.cxx:81
 GledNS.cxx:82
 GledNS.cxx:83
 GledNS.cxx:84
 GledNS.cxx:85
 GledNS.cxx:86
 GledNS.cxx:87
 GledNS.cxx:88
 GledNS.cxx:89
 GledNS.cxx:90
 GledNS.cxx:91
 GledNS.cxx:92
 GledNS.cxx:93
 GledNS.cxx:94
 GledNS.cxx:95
 GledNS.cxx:96
 GledNS.cxx:97
 GledNS.cxx:98
 GledNS.cxx:99
 GledNS.cxx:100
 GledNS.cxx:101
 GledNS.cxx:102
 GledNS.cxx:103
 GledNS.cxx:104
 GledNS.cxx:105
 GledNS.cxx:106
 GledNS.cxx:107
 GledNS.cxx:108
 GledNS.cxx:109
 GledNS.cxx:110
 GledNS.cxx:111
 GledNS.cxx:112
 GledNS.cxx:113
 GledNS.cxx:114
 GledNS.cxx:115
 GledNS.cxx:116
 GledNS.cxx:117
 GledNS.cxx:118
 GledNS.cxx:119
 GledNS.cxx:120
 GledNS.cxx:121
 GledNS.cxx:122
 GledNS.cxx:123
 GledNS.cxx:124
 GledNS.cxx:125
 GledNS.cxx:126
 GledNS.cxx:127
 GledNS.cxx:128
 GledNS.cxx:129
 GledNS.cxx:130
 GledNS.cxx:131
 GledNS.cxx:132
 GledNS.cxx:133
 GledNS.cxx:134
 GledNS.cxx:135
 GledNS.cxx:136
 GledNS.cxx:137
 GledNS.cxx:138
 GledNS.cxx:139
 GledNS.cxx:140
 GledNS.cxx:141
 GledNS.cxx:142
 GledNS.cxx:143
 GledNS.cxx:144
 GledNS.cxx:145
 GledNS.cxx:146
 GledNS.cxx:147
 GledNS.cxx:148
 GledNS.cxx:149
 GledNS.cxx:150
 GledNS.cxx:151
 GledNS.cxx:152
 GledNS.cxx:153
 GledNS.cxx:154
 GledNS.cxx:155
 GledNS.cxx:156
 GledNS.cxx:157
 GledNS.cxx:158
 GledNS.cxx:159
 GledNS.cxx:160
 GledNS.cxx:161
 GledNS.cxx:162
 GledNS.cxx:163
 GledNS.cxx:164
 GledNS.cxx:165
 GledNS.cxx:166
 GledNS.cxx:167
 GledNS.cxx:168
 GledNS.cxx:169
 GledNS.cxx:170
 GledNS.cxx:171
 GledNS.cxx:172
 GledNS.cxx:173
 GledNS.cxx:174
 GledNS.cxx:175
 GledNS.cxx:176
 GledNS.cxx:177
 GledNS.cxx:178
 GledNS.cxx:179
 GledNS.cxx:180
 GledNS.cxx:181
 GledNS.cxx:182
 GledNS.cxx:183
 GledNS.cxx:184
 GledNS.cxx:185
 GledNS.cxx:186
 GledNS.cxx:187
 GledNS.cxx:188
 GledNS.cxx:189
 GledNS.cxx:190
 GledNS.cxx:191
 GledNS.cxx:192
 GledNS.cxx:193
 GledNS.cxx:194
 GledNS.cxx:195
 GledNS.cxx:196
 GledNS.cxx:197
 GledNS.cxx:198
 GledNS.cxx:199
 GledNS.cxx:200
 GledNS.cxx:201
 GledNS.cxx:202
 GledNS.cxx:203
 GledNS.cxx:204
 GledNS.cxx:205
 GledNS.cxx:206
 GledNS.cxx:207
 GledNS.cxx:208
 GledNS.cxx:209
 GledNS.cxx:210
 GledNS.cxx:211
 GledNS.cxx:212
 GledNS.cxx:213
 GledNS.cxx:214
 GledNS.cxx:215
 GledNS.cxx:216
 GledNS.cxx:217
 GledNS.cxx:218
 GledNS.cxx:219
 GledNS.cxx:220
 GledNS.cxx:221
 GledNS.cxx:222
 GledNS.cxx:223
 GledNS.cxx:224
 GledNS.cxx:225
 GledNS.cxx:226
 GledNS.cxx:227
 GledNS.cxx:228
 GledNS.cxx:229
 GledNS.cxx:230
 GledNS.cxx:231
 GledNS.cxx:232
 GledNS.cxx:233
 GledNS.cxx:234
 GledNS.cxx:235
 GledNS.cxx:236
 GledNS.cxx:237
 GledNS.cxx:238
 GledNS.cxx:239
 GledNS.cxx:240
 GledNS.cxx:241
 GledNS.cxx:242
 GledNS.cxx:243
 GledNS.cxx:244
 GledNS.cxx:245
 GledNS.cxx:246
 GledNS.cxx:247
 GledNS.cxx:248
 GledNS.cxx:249
 GledNS.cxx:250
 GledNS.cxx:251
 GledNS.cxx:252
 GledNS.cxx:253
 GledNS.cxx:254
 GledNS.cxx:255
 GledNS.cxx:256
 GledNS.cxx:257
 GledNS.cxx:258
 GledNS.cxx:259
 GledNS.cxx:260
 GledNS.cxx:261
 GledNS.cxx:262
 GledNS.cxx:263
 GledNS.cxx:264
 GledNS.cxx:265
 GledNS.cxx:266
 GledNS.cxx:267
 GledNS.cxx:268
 GledNS.cxx:269
 GledNS.cxx:270
 GledNS.cxx:271
 GledNS.cxx:272
 GledNS.cxx:273
 GledNS.cxx:274
 GledNS.cxx:275
 GledNS.cxx:276
 GledNS.cxx:277
 GledNS.cxx:278
 GledNS.cxx:279
 GledNS.cxx:280
 GledNS.cxx:281
 GledNS.cxx:282
 GledNS.cxx:283
 GledNS.cxx:284
 GledNS.cxx:285
 GledNS.cxx:286
 GledNS.cxx:287
 GledNS.cxx:288
 GledNS.cxx:289
 GledNS.cxx:290
 GledNS.cxx:291
 GledNS.cxx:292
 GledNS.cxx:293
 GledNS.cxx:294
 GledNS.cxx:295
 GledNS.cxx:296
 GledNS.cxx:297
 GledNS.cxx:298
 GledNS.cxx:299
 GledNS.cxx:300
 GledNS.cxx:301
 GledNS.cxx:302
 GledNS.cxx:303
 GledNS.cxx:304
 GledNS.cxx:305
 GledNS.cxx:306
 GledNS.cxx:307
 GledNS.cxx:308
 GledNS.cxx:309
 GledNS.cxx:310
 GledNS.cxx:311
 GledNS.cxx:312
 GledNS.cxx:313
 GledNS.cxx:314
 GledNS.cxx:315
 GledNS.cxx:316
 GledNS.cxx:317
 GledNS.cxx:318
 GledNS.cxx:319
 GledNS.cxx:320
 GledNS.cxx:321
 GledNS.cxx:322
 GledNS.cxx:323
 GledNS.cxx:324
 GledNS.cxx:325
 GledNS.cxx:326
 GledNS.cxx:327
 GledNS.cxx:328
 GledNS.cxx:329
 GledNS.cxx:330
 GledNS.cxx:331
 GledNS.cxx:332
 GledNS.cxx:333
 GledNS.cxx:334
 GledNS.cxx:335
 GledNS.cxx:336
 GledNS.cxx:337
 GledNS.cxx:338
 GledNS.cxx:339
 GledNS.cxx:340
 GledNS.cxx:341
 GledNS.cxx:342
 GledNS.cxx:343
 GledNS.cxx:344
 GledNS.cxx:345
 GledNS.cxx:346
 GledNS.cxx:347
 GledNS.cxx:348
 GledNS.cxx:349
 GledNS.cxx:350
 GledNS.cxx:351
 GledNS.cxx:352
 GledNS.cxx:353
 GledNS.cxx:354
 GledNS.cxx:355
 GledNS.cxx:356
 GledNS.cxx:357
 GledNS.cxx:358
 GledNS.cxx:359
 GledNS.cxx:360
 GledNS.cxx:361
 GledNS.cxx:362
 GledNS.cxx:363
 GledNS.cxx:364
 GledNS.cxx:365
 GledNS.cxx:366
 GledNS.cxx:367
 GledNS.cxx:368
 GledNS.cxx:369
 GledNS.cxx:370
 GledNS.cxx:371
 GledNS.cxx:372
 GledNS.cxx:373
 GledNS.cxx:374
 GledNS.cxx:375
 GledNS.cxx:376
 GledNS.cxx:377
 GledNS.cxx:378
 GledNS.cxx:379
 GledNS.cxx:380
 GledNS.cxx:381
 GledNS.cxx:382
 GledNS.cxx:383
 GledNS.cxx:384
 GledNS.cxx:385
 GledNS.cxx:386
 GledNS.cxx:387
 GledNS.cxx:388
 GledNS.cxx:389
 GledNS.cxx:390
 GledNS.cxx:391
 GledNS.cxx:392
 GledNS.cxx:393
 GledNS.cxx:394
 GledNS.cxx:395
 GledNS.cxx:396
 GledNS.cxx:397
 GledNS.cxx:398
 GledNS.cxx:399
 GledNS.cxx:400
 GledNS.cxx:401
 GledNS.cxx:402
 GledNS.cxx:403
 GledNS.cxx:404
 GledNS.cxx:405
 GledNS.cxx:406
 GledNS.cxx:407
 GledNS.cxx:408
 GledNS.cxx:409
 GledNS.cxx:410
 GledNS.cxx:411
 GledNS.cxx:412
 GledNS.cxx:413
 GledNS.cxx:414
 GledNS.cxx:415
 GledNS.cxx:416
 GledNS.cxx:417
 GledNS.cxx:418
 GledNS.cxx:419
 GledNS.cxx:420
 GledNS.cxx:421
 GledNS.cxx:422
 GledNS.cxx:423
 GledNS.cxx:424
 GledNS.cxx:425
 GledNS.cxx:426
 GledNS.cxx:427
 GledNS.cxx:428
 GledNS.cxx:429
 GledNS.cxx:430
 GledNS.cxx:431
 GledNS.cxx:432
 GledNS.cxx:433
 GledNS.cxx:434
 GledNS.cxx:435
 GledNS.cxx:436
 GledNS.cxx:437
 GledNS.cxx:438
 GledNS.cxx:439
 GledNS.cxx:440
 GledNS.cxx:441
 GledNS.cxx:442
 GledNS.cxx:443
 GledNS.cxx:444
 GledNS.cxx:445
 GledNS.cxx:446
 GledNS.cxx:447
 GledNS.cxx:448
 GledNS.cxx:449
 GledNS.cxx:450
 GledNS.cxx:451
 GledNS.cxx:452
 GledNS.cxx:453
 GledNS.cxx:454
 GledNS.cxx:455
 GledNS.cxx:456
 GledNS.cxx:457
 GledNS.cxx:458
 GledNS.cxx:459
 GledNS.cxx:460
 GledNS.cxx:461
 GledNS.cxx:462
 GledNS.cxx:463
 GledNS.cxx:464
 GledNS.cxx:465
 GledNS.cxx:466
 GledNS.cxx:467
 GledNS.cxx:468
 GledNS.cxx:469
 GledNS.cxx:470
 GledNS.cxx:471
 GledNS.cxx:472
 GledNS.cxx:473
 GledNS.cxx:474
 GledNS.cxx:475
 GledNS.cxx:476
 GledNS.cxx:477
 GledNS.cxx:478
 GledNS.cxx:479
 GledNS.cxx:480
 GledNS.cxx:481
 GledNS.cxx:482
 GledNS.cxx:483
 GledNS.cxx:484
 GledNS.cxx:485
 GledNS.cxx:486
 GledNS.cxx:487
 GledNS.cxx:488
 GledNS.cxx:489
 GledNS.cxx:490
 GledNS.cxx:491
 GledNS.cxx:492
 GledNS.cxx:493
 GledNS.cxx:494
 GledNS.cxx:495
 GledNS.cxx:496
 GledNS.cxx:497
 GledNS.cxx:498
 GledNS.cxx:499
 GledNS.cxx:500
 GledNS.cxx:501
 GledNS.cxx:502
 GledNS.cxx:503
 GledNS.cxx:504
 GledNS.cxx:505
 GledNS.cxx:506
 GledNS.cxx:507
 GledNS.cxx:508
 GledNS.cxx:509
 GledNS.cxx:510
 GledNS.cxx:511
 GledNS.cxx:512
 GledNS.cxx:513
 GledNS.cxx:514
 GledNS.cxx:515
 GledNS.cxx:516
 GledNS.cxx:517
 GledNS.cxx:518
 GledNS.cxx:519
 GledNS.cxx:520
 GledNS.cxx:521
 GledNS.cxx:522
 GledNS.cxx:523
 GledNS.cxx:524
 GledNS.cxx:525
 GledNS.cxx:526
 GledNS.cxx:527
 GledNS.cxx:528
 GledNS.cxx:529
 GledNS.cxx:530
 GledNS.cxx:531
 GledNS.cxx:532
 GledNS.cxx:533
 GledNS.cxx:534
 GledNS.cxx:535
 GledNS.cxx:536
 GledNS.cxx:537
 GledNS.cxx:538
 GledNS.cxx:539
 GledNS.cxx:540
 GledNS.cxx:541
 GledNS.cxx:542
 GledNS.cxx:543
 GledNS.cxx:544
 GledNS.cxx:545
 GledNS.cxx:546
 GledNS.cxx:547
 GledNS.cxx:548
 GledNS.cxx:549
 GledNS.cxx:550
 GledNS.cxx:551
 GledNS.cxx:552
 GledNS.cxx:553
 GledNS.cxx:554
 GledNS.cxx:555
 GledNS.cxx:556
 GledNS.cxx:557
 GledNS.cxx:558
 GledNS.cxx:559
 GledNS.cxx:560
 GledNS.cxx:561
 GledNS.cxx:562
 GledNS.cxx:563
 GledNS.cxx:564
 GledNS.cxx:565
 GledNS.cxx:566
 GledNS.cxx:567
 GledNS.cxx:568
 GledNS.cxx:569
 GledNS.cxx:570
 GledNS.cxx:571
 GledNS.cxx:572
 GledNS.cxx:573
 GledNS.cxx:574
 GledNS.cxx:575
 GledNS.cxx:576
 GledNS.cxx:577
 GledNS.cxx:578
 GledNS.cxx:579
 GledNS.cxx:580
 GledNS.cxx:581
 GledNS.cxx:582
 GledNS.cxx:583
 GledNS.cxx:584
 GledNS.cxx:585
 GledNS.cxx:586
 GledNS.cxx:587
 GledNS.cxx:588
 GledNS.cxx:589
 GledNS.cxx:590
 GledNS.cxx:591
 GledNS.cxx:592
 GledNS.cxx:593
 GledNS.cxx:594
 GledNS.cxx:595
 GledNS.cxx:596
 GledNS.cxx:597
 GledNS.cxx:598
 GledNS.cxx:599
 GledNS.cxx:600
 GledNS.cxx:601
 GledNS.cxx:602
 GledNS.cxx:603
 GledNS.cxx:604
 GledNS.cxx:605
 GledNS.cxx:606
 GledNS.cxx:607
 GledNS.cxx:608
 GledNS.cxx:609
 GledNS.cxx:610
 GledNS.cxx:611
 GledNS.cxx:612
 GledNS.cxx:613
 GledNS.cxx:614
 GledNS.cxx:615
 GledNS.cxx:616
 GledNS.cxx:617
 GledNS.cxx:618
 GledNS.cxx:619
 GledNS.cxx:620
 GledNS.cxx:621
 GledNS.cxx:622
 GledNS.cxx:623
 GledNS.cxx:624
 GledNS.cxx:625
 GledNS.cxx:626
 GledNS.cxx:627
 GledNS.cxx:628
 GledNS.cxx:629
 GledNS.cxx:630
 GledNS.cxx:631
 GledNS.cxx:632
 GledNS.cxx:633
 GledNS.cxx:634
 GledNS.cxx:635
 GledNS.cxx:636
 GledNS.cxx:637
 GledNS.cxx:638
 GledNS.cxx:639
 GledNS.cxx:640
 GledNS.cxx:641
 GledNS.cxx:642
 GledNS.cxx:643
 GledNS.cxx:644
 GledNS.cxx:645
 GledNS.cxx:646
 GledNS.cxx:647
 GledNS.cxx:648
 GledNS.cxx:649
 GledNS.cxx:650
 GledNS.cxx:651
 GledNS.cxx:652
 GledNS.cxx:653
 GledNS.cxx:654
 GledNS.cxx:655
 GledNS.cxx:656
 GledNS.cxx:657
 GledNS.cxx:658
 GledNS.cxx:659
 GledNS.cxx:660
 GledNS.cxx:661
 GledNS.cxx:662
 GledNS.cxx:663
 GledNS.cxx:664
 GledNS.cxx:665
 GledNS.cxx:666
 GledNS.cxx:667
 GledNS.cxx:668
 GledNS.cxx:669
 GledNS.cxx:670
 GledNS.cxx:671
 GledNS.cxx:672
 GledNS.cxx:673
 GledNS.cxx:674
 GledNS.cxx:675
 GledNS.cxx:676
 GledNS.cxx:677
 GledNS.cxx:678
 GledNS.cxx:679
 GledNS.cxx:680
 GledNS.cxx:681
 GledNS.cxx:682
 GledNS.cxx:683
 GledNS.cxx:684
 GledNS.cxx:685
 GledNS.cxx:686
 GledNS.cxx:687
 GledNS.cxx:688
 GledNS.cxx:689
 GledNS.cxx:690
 GledNS.cxx:691
 GledNS.cxx:692
 GledNS.cxx:693
 GledNS.cxx:694
 GledNS.cxx:695
 GledNS.cxx:696
 GledNS.cxx:697
 GledNS.cxx:698
 GledNS.cxx:699
 GledNS.cxx:700
 GledNS.cxx:701
 GledNS.cxx:702
 GledNS.cxx:703
 GledNS.cxx:704
 GledNS.cxx:705
 GledNS.cxx:706
 GledNS.cxx:707
 GledNS.cxx:708
 GledNS.cxx:709
 GledNS.cxx:710
 GledNS.cxx:711
 GledNS.cxx:712
 GledNS.cxx:713
 GledNS.cxx:714
 GledNS.cxx:715
 GledNS.cxx:716
 GledNS.cxx:717
 GledNS.cxx:718
 GledNS.cxx:719
 GledNS.cxx:720
 GledNS.cxx:721
 GledNS.cxx:722
 GledNS.cxx:723
 GledNS.cxx:724
 GledNS.cxx:725
 GledNS.cxx:726
 GledNS.cxx:727
 GledNS.cxx:728
 GledNS.cxx:729
 GledNS.cxx:730
 GledNS.cxx:731
 GledNS.cxx:732
 GledNS.cxx:733
 GledNS.cxx:734
 GledNS.cxx:735
 GledNS.cxx:736
 GledNS.cxx:737
 GledNS.cxx:738
 GledNS.cxx:739
 GledNS.cxx:740
 GledNS.cxx:741
 GledNS.cxx:742
 GledNS.cxx:743
 GledNS.cxx:744
 GledNS.cxx:745
 GledNS.cxx:746
 GledNS.cxx:747
 GledNS.cxx:748
 GledNS.cxx:749
 GledNS.cxx:750
 GledNS.cxx:751
 GledNS.cxx:752
 GledNS.cxx:753
 GledNS.cxx:754
 GledNS.cxx:755
 GledNS.cxx:756
 GledNS.cxx:757
 GledNS.cxx:758
 GledNS.cxx:759
 GledNS.cxx:760
 GledNS.cxx:761
 GledNS.cxx:762
 GledNS.cxx:763
 GledNS.cxx:764
 GledNS.cxx:765
 GledNS.cxx:766
 GledNS.cxx:767
 GledNS.cxx:768
 GledNS.cxx:769
 GledNS.cxx:770
 GledNS.cxx:771
 GledNS.cxx:772
 GledNS.cxx:773
 GledNS.cxx:774
 GledNS.cxx:775
 GledNS.cxx:776
 GledNS.cxx:777
 GledNS.cxx:778
 GledNS.cxx:779
 GledNS.cxx:780
 GledNS.cxx:781
 GledNS.cxx:782
 GledNS.cxx:783
 GledNS.cxx:784
 GledNS.cxx:785
 GledNS.cxx:786
 GledNS.cxx:787
 GledNS.cxx:788
 GledNS.cxx:789
 GledNS.cxx:790
 GledNS.cxx:791
 GledNS.cxx:792
 GledNS.cxx:793
 GledNS.cxx:794
 GledNS.cxx:795
 GledNS.cxx:796
 GledNS.cxx:797
 GledNS.cxx:798
 GledNS.cxx:799
 GledNS.cxx:800
 GledNS.cxx:801
 GledNS.cxx:802
 GledNS.cxx:803
 GledNS.cxx:804
 GledNS.cxx:805
 GledNS.cxx:806
 GledNS.cxx:807
 GledNS.cxx:808
 GledNS.cxx:809
 GledNS.cxx:810
 GledNS.cxx:811
 GledNS.cxx:812
 GledNS.cxx:813
 GledNS.cxx:814
 GledNS.cxx:815
 GledNS.cxx:816
 GledNS.cxx:817
 GledNS.cxx:818
 GledNS.cxx:819
 GledNS.cxx:820
 GledNS.cxx:821
 GledNS.cxx:822
 GledNS.cxx:823
 GledNS.cxx:824
 GledNS.cxx:825
 GledNS.cxx:826
 GledNS.cxx:827
 GledNS.cxx:828
 GledNS.cxx:829
 GledNS.cxx:830
 GledNS.cxx:831
 GledNS.cxx:832
 GledNS.cxx:833
 GledNS.cxx:834
 GledNS.cxx:835
 GledNS.cxx:836
 GledNS.cxx:837
 GledNS.cxx:838
 GledNS.cxx:839
 GledNS.cxx:840
 GledNS.cxx:841
 GledNS.cxx:842
 GledNS.cxx:843
 GledNS.cxx:844
 GledNS.cxx:845
 GledNS.cxx:846
 GledNS.cxx:847
 GledNS.cxx:848
 GledNS.cxx:849
 GledNS.cxx:850
 GledNS.cxx:851
 GledNS.cxx:852
 GledNS.cxx:853
 GledNS.cxx:854
 GledNS.cxx:855
 GledNS.cxx:856
 GledNS.cxx:857
 GledNS.cxx:858
 GledNS.cxx:859
 GledNS.cxx:860
 GledNS.cxx:861
 GledNS.cxx:862
 GledNS.cxx:863
 GledNS.cxx:864
 GledNS.cxx:865
 GledNS.cxx:866
 GledNS.cxx:867
 GledNS.cxx:868
 GledNS.cxx:869
 GledNS.cxx:870
 GledNS.cxx:871
 GledNS.cxx:872
 GledNS.cxx:873
 GledNS.cxx:874
 GledNS.cxx:875
 GledNS.cxx:876
 GledNS.cxx:877
 GledNS.cxx:878
 GledNS.cxx:879
 GledNS.cxx:880
 GledNS.cxx:881
 GledNS.cxx:882
 GledNS.cxx:883
 GledNS.cxx:884
 GledNS.cxx:885
 GledNS.cxx:886
 GledNS.cxx:887
 GledNS.cxx:888
 GledNS.cxx:889
 GledNS.cxx:890
 GledNS.cxx:891
 GledNS.cxx:892
 GledNS.cxx:893
 GledNS.cxx:894
 GledNS.cxx:895
 GledNS.cxx:896
 GledNS.cxx:897
 GledNS.cxx:898
 GledNS.cxx:899
 GledNS.cxx:900
 GledNS.cxx:901
 GledNS.cxx:902
 GledNS.cxx:903
 GledNS.cxx:904
 GledNS.cxx:905
 GledNS.cxx:906
 GledNS.cxx:907
 GledNS.cxx:908
 GledNS.cxx:909
 GledNS.cxx:910
 GledNS.cxx:911
 GledNS.cxx:912
 GledNS.cxx:913
 GledNS.cxx:914
 GledNS.cxx:915
 GledNS.cxx:916
 GledNS.cxx:917
 GledNS.cxx:918
 GledNS.cxx:919
 GledNS.cxx:920
 GledNS.cxx:921
 GledNS.cxx:922
 GledNS.cxx:923
 GledNS.cxx:924
 GledNS.cxx:925
 GledNS.cxx:926
 GledNS.cxx:927
 GledNS.cxx:928
 GledNS.cxx:929
 GledNS.cxx:930
 GledNS.cxx:931
 GledNS.cxx:932
 GledNS.cxx:933
 GledNS.cxx:934
 GledNS.cxx:935
 GledNS.cxx:936
 GledNS.cxx:937
 GledNS.cxx:938
 GledNS.cxx:939
 GledNS.cxx:940
 GledNS.cxx:941
 GledNS.cxx:942
 GledNS.cxx:943
 GledNS.cxx:944
 GledNS.cxx:945
 GledNS.cxx:946
 GledNS.cxx:947
 GledNS.cxx:948
 GledNS.cxx:949
 GledNS.cxx:950
 GledNS.cxx:951
 GledNS.cxx:952
 GledNS.cxx:953
 GledNS.cxx:954
 GledNS.cxx:955
 GledNS.cxx:956
 GledNS.cxx:957
 GledNS.cxx:958
 GledNS.cxx:959
 GledNS.cxx:960
 GledNS.cxx:961
 GledNS.cxx:962
 GledNS.cxx:963
 GledNS.cxx:964
 GledNS.cxx:965
 GledNS.cxx:966
 GledNS.cxx:967
 GledNS.cxx:968
 GledNS.cxx:969
 GledNS.cxx:970
 GledNS.cxx:971
 GledNS.cxx:972
 GledNS.cxx:973
 GledNS.cxx:974
 GledNS.cxx:975
 GledNS.cxx:976
 GledNS.cxx:977
 GledNS.cxx:978
 GledNS.cxx:979
 GledNS.cxx:980
 GledNS.cxx:981
 GledNS.cxx:982
 GledNS.cxx:983
 GledNS.cxx:984
 GledNS.cxx:985
 GledNS.cxx:986
 GledNS.cxx:987
 GledNS.cxx:988
 GledNS.cxx:989
 GledNS.cxx:990
 GledNS.cxx:991
 GledNS.cxx:992
 GledNS.cxx:993
 GledNS.cxx:994
 GledNS.cxx:995
 GledNS.cxx:996
 GledNS.cxx:997
 GledNS.cxx:998
 GledNS.cxx:999
 GledNS.cxx:1000
 GledNS.cxx:1001
 GledNS.cxx:1002
 GledNS.cxx:1003
 GledNS.cxx:1004
 GledNS.cxx:1005
 GledNS.cxx:1006
 GledNS.cxx:1007
 GledNS.cxx:1008
 GledNS.cxx:1009
 GledNS.cxx:1010
 GledNS.cxx:1011
 GledNS.cxx:1012
 GledNS.cxx:1013
 GledNS.cxx:1014
 GledNS.cxx:1015
 GledNS.cxx:1016
 GledNS.cxx:1017
 GledNS.cxx:1018
 GledNS.cxx:1019
 GledNS.cxx:1020
 GledNS.cxx:1021
 GledNS.cxx:1022
 GledNS.cxx:1023
 GledNS.cxx:1024
 GledNS.cxx:1025
 GledNS.cxx:1026
 GledNS.cxx:1027
 GledNS.cxx:1028
 GledNS.cxx:1029
 GledNS.cxx:1030
 GledNS.cxx:1031
 GledNS.cxx:1032
 GledNS.cxx:1033
 GledNS.cxx:1034
 GledNS.cxx:1035
 GledNS.cxx:1036
 GledNS.cxx:1037
 GledNS.cxx:1038
 GledNS.cxx:1039
 GledNS.cxx:1040
 GledNS.cxx:1041
 GledNS.cxx:1042
 GledNS.cxx:1043
 GledNS.cxx:1044
 GledNS.cxx:1045
 GledNS.cxx:1046
 GledNS.cxx:1047
 GledNS.cxx:1048
 GledNS.cxx:1049
 GledNS.cxx:1050
 GledNS.cxx:1051
 GledNS.cxx:1052
 GledNS.cxx:1053
 GledNS.cxx:1054
 GledNS.cxx:1055
 GledNS.cxx:1056
 GledNS.cxx:1057
 GledNS.cxx:1058
 GledNS.cxx:1059
 GledNS.cxx:1060
 GledNS.cxx:1061
 GledNS.cxx:1062
 GledNS.cxx:1063
 GledNS.cxx:1064
 GledNS.cxx:1065
 GledNS.cxx:1066
 GledNS.cxx:1067
 GledNS.cxx:1068
 GledNS.cxx:1069
 GledNS.cxx:1070
 GledNS.cxx:1071
 GledNS.cxx:1072
 GledNS.cxx:1073
 GledNS.cxx:1074
 GledNS.cxx:1075
 GledNS.cxx:1076
 GledNS.cxx:1077
 GledNS.cxx:1078
 GledNS.cxx:1079
 GledNS.cxx:1080
 GledNS.cxx:1081
 GledNS.cxx:1082
 GledNS.cxx:1083
 GledNS.cxx:1084
 GledNS.cxx:1085
 GledNS.cxx:1086
 GledNS.cxx:1087
 GledNS.cxx:1088
 GledNS.cxx:1089
 GledNS.cxx:1090
 GledNS.cxx:1091
 GledNS.cxx:1092
 GledNS.cxx:1093
 GledNS.cxx:1094
 GledNS.cxx:1095
 GledNS.cxx:1096
 GledNS.cxx:1097
 GledNS.cxx:1098
 GledNS.cxx:1099
 GledNS.cxx:1100
 GledNS.cxx:1101
 GledNS.cxx:1102
 GledNS.cxx:1103
 GledNS.cxx:1104
 GledNS.cxx:1105
 GledNS.cxx:1106
 GledNS.cxx:1107
 GledNS.cxx:1108
 GledNS.cxx:1109
 GledNS.cxx:1110
 GledNS.cxx:1111
 GledNS.cxx:1112
 GledNS.cxx:1113
 GledNS.cxx:1114
 GledNS.cxx:1115
 GledNS.cxx:1116
 GledNS.cxx:1117
 GledNS.cxx:1118
 GledNS.cxx:1119
 GledNS.cxx:1120
 GledNS.cxx:1121
 GledNS.cxx:1122
 GledNS.cxx:1123
 GledNS.cxx:1124
 GledNS.cxx:1125
 GledNS.cxx:1126
 GledNS.cxx:1127
 GledNS.cxx:1128
 GledNS.cxx:1129
 GledNS.cxx:1130
 GledNS.cxx:1131
 GledNS.cxx:1132
 GledNS.cxx:1133
 GledNS.cxx:1134
 GledNS.cxx:1135
 GledNS.cxx:1136
 GledNS.cxx:1137
 GledNS.cxx:1138
 GledNS.cxx:1139
 GledNS.cxx:1140
 GledNS.cxx:1141
 GledNS.cxx:1142
 GledNS.cxx:1143
 GledNS.cxx:1144
 GledNS.cxx:1145
 GledNS.cxx:1146
 GledNS.cxx:1147
 GledNS.cxx:1148
 GledNS.cxx:1149
 GledNS.cxx:1150
 GledNS.cxx:1151
 GledNS.cxx:1152
 GledNS.cxx:1153
 GledNS.cxx:1154
 GledNS.cxx:1155
 GledNS.cxx:1156
 GledNS.cxx:1157
 GledNS.cxx:1158
 GledNS.cxx:1159
 GledNS.cxx:1160
 GledNS.cxx:1161
 GledNS.cxx:1162
 GledNS.cxx:1163
 GledNS.cxx:1164
 GledNS.cxx:1165
 GledNS.cxx:1166
 GledNS.cxx:1167
 GledNS.cxx:1168
 GledNS.cxx:1169
 GledNS.cxx:1170
 GledNS.cxx:1171
 GledNS.cxx:1172
 GledNS.cxx:1173
 GledNS.cxx:1174
 GledNS.cxx:1175
 GledNS.cxx:1176
 GledNS.cxx:1177
 GledNS.cxx:1178
 GledNS.cxx:1179
 GledNS.cxx:1180
 GledNS.cxx:1181
 GledNS.cxx:1182
 GledNS.cxx:1183
 GledNS.cxx:1184
 GledNS.cxx:1185
 GledNS.cxx:1186
 GledNS.cxx:1187
 GledNS.cxx:1188
 GledNS.cxx:1189
 GledNS.cxx:1190
 GledNS.cxx:1191
 GledNS.cxx:1192
 GledNS.cxx:1193
 GledNS.cxx:1194
 GledNS.cxx:1195
 GledNS.cxx:1196
 GledNS.cxx:1197
 GledNS.cxx:1198
 GledNS.cxx:1199
 GledNS.cxx:1200
 GledNS.cxx:1201
 GledNS.cxx:1202
 GledNS.cxx:1203
 GledNS.cxx:1204
 GledNS.cxx:1205
 GledNS.cxx:1206
 GledNS.cxx:1207
 GledNS.cxx:1208
 GledNS.cxx:1209
 GledNS.cxx:1210
 GledNS.cxx:1211
 GledNS.cxx:1212
 GledNS.cxx:1213
 GledNS.cxx:1214
 GledNS.cxx:1215
 GledNS.cxx:1216
 GledNS.cxx:1217
 GledNS.cxx:1218
 GledNS.cxx:1219
 GledNS.cxx:1220
 GledNS.cxx:1221
 GledNS.cxx:1222
 GledNS.cxx:1223
 GledNS.cxx:1224
 GledNS.cxx:1225
 GledNS.cxx:1226
 GledNS.cxx:1227
 GledNS.cxx:1228
 GledNS.cxx:1229
 GledNS.cxx:1230
 GledNS.cxx:1231
 GledNS.cxx:1232
 GledNS.cxx:1233
 GledNS.cxx:1234
 GledNS.cxx:1235
 GledNS.cxx:1236
 GledNS.cxx:1237
 GledNS.cxx:1238
 GledNS.cxx:1239
 GledNS.cxx:1240
 GledNS.cxx:1241
 GledNS.cxx:1242
 GledNS.cxx:1243
 GledNS.cxx:1244
 GledNS.cxx:1245
 GledNS.cxx:1246
 GledNS.cxx:1247
 GledNS.cxx:1248
 GledNS.cxx:1249
 GledNS.cxx:1250
 GledNS.cxx:1251
 GledNS.cxx:1252
 GledNS.cxx:1253
 GledNS.cxx:1254
 GledNS.cxx:1255
 GledNS.cxx:1256
 GledNS.cxx:1257
 GledNS.cxx:1258
 GledNS.cxx:1259
 GledNS.cxx:1260
 GledNS.cxx:1261
 GledNS.cxx:1262
 GledNS.cxx:1263