ROOT logo
// $Id: ZNode.cxx 2444 2010-09-13 21:01:56Z 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 "ZNode.h"
#include "ZNode.c7"
#include "ZQueen.h"
#include "ZRnrModList.h"
#include <Stones/ZComet.h>

#include <TMath.h>

#include <ctype.h>

typedef list<ZNode*>           lpZNode_t;
typedef list<ZNode*>::iterator lpZNode_i;

ClassImp(ZNode);

namespace {
  // Limit max search depth for
  int ZNodeTransSearchMaxDepth = 100;
}

void ZNode::_init()
{
  bUseScale = false;
  bUseOM    = false;
  mOM = 0;
  mSx = mSy = mSz = 1;
  mParent = 0; bKeepParent = true;
  mRnrMod = 0;
  bRnrSelf = bRnrElements = bModSelf = bModElements = true;

  // SetElementFID(ZNode::FID()); // Forces ZNode children only
}

/**************************************************************************/
// ZList virtuals
/**************************************************************************/

void ZNode::on_insert(ZList::iterator it)
{
  // Set parent if possible; honour policy bKeepParent policy of the
  // new node.

  ZNode* n = dynamic_cast<ZNode*>(it.lens());
  if(n == 0 || n == this)
    return;
  if((n->mParent == 0 || n->bKeepParent == false) &&
     (n->mQueen->DependsOn(mQueen)))
    {
      n->SetParent(this);
    }
}

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

Int_t ZNode::Level()
{
  Int_t l = 0;
  ZNode *p = this;
  while((p = p->GetParent())) ++l;
  return l;
}

/**************************************************************************/
// ZTrans wrappers
/**************************************************************************/

void ZNode::UnitTrans()
{
  mTrans.UnitTrans();
  mStampReqTrans = Stamp(FID());
}

void ZNode::UnitRot()
{
  mTrans.UnitRot();
  mStampReqTrans = Stamp(FID());
}

void ZNode::SetTrans(const ZTrans& t)
{
  mTrans.SetTrans(t);
  mStampReqTrans = Stamp(FID());
}

void ZNode::MultLeft(const ZTrans& t)
{
  mTrans.MultLeft(t);
  mStampReqTrans = Stamp(FID());
}

void ZNode::MultRight(const ZTrans& t)
{
  mTrans.MultRight(t);
  mStampReqTrans = Stamp(FID());
}

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

void ZNode::MoveLF(Int_t vi, Double_t amount)
{
  if(vi<1 || vi>3) return;
  mTrans.MoveLF(vi, amount);
  mStampReqTrans = Stamp(FID());
}

void ZNode::Move3LF(Double_t x, Double_t y, Double_t z)
{
  mTrans.Move3LF(x,y,z);
  mStampReqTrans = Stamp(FID());
}

void ZNode::RotateLF(Int_t i1, Int_t i2, Double_t amount)
{
  if(i1<1 || i1>3 || i2<1 || i2>3) return;
  mTrans.RotateLF(i1, i2, amount);
  mStampReqTrans = Stamp(FID());
}

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

void ZNode::MovePF(Int_t vi, Double_t amount)
{
  if(vi<1 || vi>3) return;
  mTrans.MovePF(vi, amount);
  mStampReqTrans = Stamp(FID());
}

void ZNode::Move3PF(Double_t x, Double_t y, Double_t z)
{
  mTrans.Move3PF(x,y,z);
  mStampReqTrans = Stamp(FID());
}

void ZNode::RotatePF(Int_t i1, Int_t i2, Double_t amount)
{
  if(i1<1 || i1>3 || i2<1 || i2>3) return;
  mTrans.RotatePF(i1, i2, amount);
  mStampReqTrans = Stamp(FID());
}

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

void ZNode::Move(ZNode* ref, Int_t vi, Double_t amount)
{
  static const Exc_t _eh("ZNode::Move ");

  if(ref == 0) throw _eh + "called with zero reference.";
  if(vi<1 || vi>3) return;

  if(ref == this) {
    mTrans.MoveLF(vi, amount);
  } else {
    auto_ptr<ZTrans> a( BtoA(*mParent, ref) );
    throw _eh + "no path from " + Identify() + " to reference node " + ref->Identify() + ".";
    mTrans.Move(*a, vi, amount);
  }
  mStampReqTrans = Stamp(FID());
}

void ZNode::Move3(ZNode* ref, Double_t x, Double_t y, Double_t z)
{
  static const Exc_t _eh("ZNode::Move3 ");

  if(ref == 0) throw _eh + "called with zero reference.";

  if(ref == this) {
    mTrans.Move3LF(x, y, z);
  } else {
    auto_ptr<ZTrans> a( BtoA(*mParent, ref) );
    throw _eh + "no path from " + Identify() + " to reference node " + ref->Identify() + ".";
    mTrans.Move3(*a, x, y, z);
  }
  mStampReqTrans = Stamp(FID());
}

void ZNode::Rotate(ZNode* ref, Int_t ii1, Int_t ii2, Double_t amount)
{
  static const Exc_t _eh("ZNode::Rotate ");

  if(ref == 0) throw _eh + "called with zero reference.";
  if(ii1<1 || ii1>3 || ii2<1 || ii1>3) return;
  if(ref == this) {
    // Get segv from m^-1 * m
    mTrans.RotateLF(ii1, ii2, amount);
  } else {
    auto_ptr<ZTrans> a( BtoA(*mParent, ref) );
    if(a.get() == 0)
      throw _eh + "no path from " + Identify() + " to reference node " + ref->Identify() + ".";
    mTrans.Rotate(*a, ii1, ii2, amount);
  }
  mStampReqTrans = Stamp(FID());
}


/**************************************************************************/
// All possible Set methods.
/**************************************************************************/

void ZNode::SetPos(Double_t x, Double_t y, Double_t z)
{
  mTrans.SetPos(x,y,z); mStampReqTrans = Stamp(FID());
}

void ZNode::SetRotByAngles(Float_t a1, Float_t a2, Float_t a3)
{
  mTrans.SetRotByAngles(a1, a2, a3);
  mStampReqTrans = Stamp(FID());
}

void ZNode::SetRotByDegrees(Float_t a1, Float_t a2, Float_t a3)
{
  const Float_t f = TMath::DegToRad();
  SetRotByAngles(f*a1, f*a2, f*a3);
}

void ZNode::SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat)
{
  mTrans.SetRotByAnyAngles(a1, a2, a3, pat);
  mStampReqTrans = Stamp(FID());
}

void ZNode::SetRotByAnyDegrees(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat)
{
  const Float_t f = TMath::DegToRad();
  SetRotByAnyAngles(f*a1, f*a2, f*a3, pat);
}

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

void ZNode::SetScale(Float_t s)
{
  mSx = mSy = mSz = s;
  mStampReqTrans = Stamp(FID());
}

void ZNode::SetScales(Float_t x, Float_t y, Float_t z)
{
  mSx=x; mSy=y; mSz=z;
  mStampReqTrans = Stamp(FID());
}

void ZNode::MultScale(Float_t s)
{
  mSx*=s; mSy*=s; mSz*=s;
  mStampReqTrans = Stamp(FID());
}

void ZNode::ApplyScale(ZTrans& t)
{
  if(bUseScale) {
    t.Scale(mSx, mSy, mSz);
  }
  if(bUseOM && mParent != 0 && mParent->bUseOM) {
    const Float_t dom =  mOM - mParent->mOM;
    if(dom != 0) {
      const Double_t s = TMath::Power(10, dom);
      t.Scale(s, s, s);
    }
  }
}

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

// Methods for changing properties of daugters.

void ZNode::RnrOnForDaughters()
{
  lpZNode_t dts; CopyListByGlass<ZNode>(dts);
  for(lpZNode_i i=dts.begin(); i!=dts.end(); ++i) {
    GLensReadHolder _rlck(*i);
    (*i)->SetRnrSelf(true);
  }
}

void ZNode::RnrOffForDaughters()
{
  lpZNode_t dts; CopyListByGlass<ZNode>(dts);
  for(lpZNode_i i=dts.begin(); i!=dts.end(); ++i) {
    GLensReadHolder _rlck(*i);
    (*i)->SetRnrSelf(false);
  }
}

void ZNode::RnrElmsOnForDaughters()
{
  lpZNode_t dts; CopyListByGlass<ZNode>(dts);
  for(lpZNode_i i=dts.begin(); i!=dts.end(); ++i) {
    GLensReadHolder _rlck(*i);
    (*i)->SetRnrElements(true);
  }
}

void ZNode::RnrElmsOffForDaughters()
{
  lpZNode_t dts; CopyListByGlass<ZNode>(dts);
  for(lpZNode_i i=dts.begin(); i!=dts.end(); ++i) {
    GLensReadHolder _rlck(*i);
    (*i)->SetRnrElements(false);
  }
}

void ZNode::MakeRnrModList(ZGlass* optional_element)
{
  // Makes sure that link mRnrMod is pointing to a ZRnrModList.
  // Previous contents of the link is added to the list if it is
  // created.
  // If non-zero, 'optional_element' is also added to the list.

  ZRnrModList* rml = dynamic_cast<ZRnrModList*>(mRnrMod.get());
  if(rml == 0) {
    rml = new ZRnrModList;
    mQueen->CheckIn(rml);
    if(mRnrMod != 0)
      rml->Add(mRnrMod.get());
    SetRnrMod(rml);
  }
  if(optional_element)
    rml->Add(optional_element);
}

void ZNode::AddRnrMod(ZGlass* el)
{
  // Add el to the rnr-mods if it is a list.
  // Throws an exception if rnr-mod is not a list.

  static const Exc_t _eh("ZNode::AddRnrMod ");

  ZRnrModList* rml = dynamic_cast<ZRnrModList*>(mRnrMod.get());
  if(rml == 0)
    throw _eh + "link RnrMod is not a list.";
  rml->Add(el);
}

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

void ZNode::SetOMofDaughters(Float_t om, Bool_t enforce_to_all)
{
  // If enforce_to_all also changes OM of children w/ parent != this.

  lpZNode_t dts; CopyListByGlass<ZNode>(dts);
  for(lpZNode_i i=dts.begin(); i!=dts.end(); ++i) {
    ZNode* d = *i;
    GLensReadHolder _rlck(d);
    if(enforce_to_all || d->mParent == this) {
      d->SetOM(om);
    }
  }
}

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

ZTrans* ZNode::ToMFR(int depth)
{
  if(depth > ZNodeTransSearchMaxDepth) {
    ISerr("ZNode::ToMFR max search depth exceeded.");
    return 0;
  }

  ZNode *p = mParent.get();
  ZTrans* x;
  if(p == 0) {
    ReadLock();
    x = new ZTrans(mTrans);
    if(bUseScale) { x->Scale(mSx, mSy, mSz); }
    ReadUnlock();
  } else {
    x = p->ToMFR(++depth);
    if(x == 0) return 0;
    ReadLock();
    *x *= mTrans;
    if(bUseScale) { x->Scale(mSx, mSy, mSz); }
    if(bUseOM && p->bUseOM) {
      Float_t dom =  mOM - p->mOM;
      if(dom != 0) {
	const Double_t s = TMath::Power(10, dom);
	x->Scale(s, s, s);
      }
    }
    ReadUnlock();
  }
  return x;
}

ZTrans* ZNode::ToNode(ZNode* top, int depth)
{
  if(depth > ZNodeTransSearchMaxDepth)  {
    ISerr("ZNode::ToNode max search depth exceeded.");
    return 0;
  }

  ZNode *p = *mParent;
  if(p == 0) return 0;

  ZTrans* x;
  if(p == top) {
    GLensReadHolder rd_lck(this);
    x = new ZTrans(mTrans);
  } else {
    x = p->ToNode(top, ++depth);
    if(x) {
      GLensReadHolder rd_lck(this);
      *x *= mTrans;
    } else {
      return 0;
    }
  }

  if(bUseScale) { x->Scale(mSx, mSy, mSz); }
  if(bUseOM && p->bUseOM) {
    Float_t dom =  mOM - p->mOM;
    if(dom != 0) {
      const Double_t s = TMath::Power(10, dom);
      x->Scale(s, s, s);
    }
  }

  return x;
}

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

ZTrans* ZNode::BtoA(ZNode* a, ZNode* b, ZNode* top)
{
  if(top == 0) {
    top = FindCommonParent(a, b);
    if(top == 0) return 0;
  }
  auto_ptr<ZTrans> at (a->ToNode(top));
  if(at.get() == 0) return 0;
  at->Invert();
  auto_ptr<ZTrans> bt (b->ToNode(top));
  if(bt.get() == 0) return 0;
  *at *= *bt;
  return at.release();
}

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

void ZNode::FillParentList(list<ZNode*>& plist)
{
  ZNode* p = *mParent;
  if(p != 0) {
    plist.push_back(p);
    p->FillParentList(plist);
  }
}

ZNode* ZNode::FindCommonParent(ZNode* a, ZNode* b)
{
  if(a == 0 || b == 0) return 0;
  if(a == b) return a;

  // !! This far from optimal, methinks.

  lpZNode_t l[2];
  l[0].push_back(a); a->FillParentList(l[0]);
  l[1].push_back(b); b->FillParentList(l[1]);
  int x = 0, y = 1;
  do {
    lpZNode_i i = find(l[y].begin(), l[y].end(), l[x].front());
    if(i != l[y].end()) return l[x].front();
    l[x].pop_front();
    y = x; x = 1 - x;
  } while(!l[0].empty() && !l[1].empty());
  return 0;
}
 ZNode.cxx:1
 ZNode.cxx:2
 ZNode.cxx:3
 ZNode.cxx:4
 ZNode.cxx:5
 ZNode.cxx:6
 ZNode.cxx:7
 ZNode.cxx:8
 ZNode.cxx:9
 ZNode.cxx:10
 ZNode.cxx:11
 ZNode.cxx:12
 ZNode.cxx:13
 ZNode.cxx:14
 ZNode.cxx:15
 ZNode.cxx:16
 ZNode.cxx:17
 ZNode.cxx:18
 ZNode.cxx:19
 ZNode.cxx:20
 ZNode.cxx:21
 ZNode.cxx:22
 ZNode.cxx:23
 ZNode.cxx:24
 ZNode.cxx:25
 ZNode.cxx:26
 ZNode.cxx:27
 ZNode.cxx:28
 ZNode.cxx:29
 ZNode.cxx:30
 ZNode.cxx:31
 ZNode.cxx:32
 ZNode.cxx:33
 ZNode.cxx:34
 ZNode.cxx:35
 ZNode.cxx:36
 ZNode.cxx:37
 ZNode.cxx:38
 ZNode.cxx:39
 ZNode.cxx:40
 ZNode.cxx:41
 ZNode.cxx:42
 ZNode.cxx:43
 ZNode.cxx:44
 ZNode.cxx:45
 ZNode.cxx:46
 ZNode.cxx:47
 ZNode.cxx:48
 ZNode.cxx:49
 ZNode.cxx:50
 ZNode.cxx:51
 ZNode.cxx:52
 ZNode.cxx:53
 ZNode.cxx:54
 ZNode.cxx:55
 ZNode.cxx:56
 ZNode.cxx:57
 ZNode.cxx:58
 ZNode.cxx:59
 ZNode.cxx:60
 ZNode.cxx:61
 ZNode.cxx:62
 ZNode.cxx:63
 ZNode.cxx:64
 ZNode.cxx:65
 ZNode.cxx:66
 ZNode.cxx:67
 ZNode.cxx:68
 ZNode.cxx:69
 ZNode.cxx:70
 ZNode.cxx:71
 ZNode.cxx:72
 ZNode.cxx:73
 ZNode.cxx:74
 ZNode.cxx:75
 ZNode.cxx:76
 ZNode.cxx:77
 ZNode.cxx:78
 ZNode.cxx:79
 ZNode.cxx:80
 ZNode.cxx:81
 ZNode.cxx:82
 ZNode.cxx:83
 ZNode.cxx:84
 ZNode.cxx:85
 ZNode.cxx:86
 ZNode.cxx:87
 ZNode.cxx:88
 ZNode.cxx:89
 ZNode.cxx:90
 ZNode.cxx:91
 ZNode.cxx:92
 ZNode.cxx:93
 ZNode.cxx:94
 ZNode.cxx:95
 ZNode.cxx:96
 ZNode.cxx:97
 ZNode.cxx:98
 ZNode.cxx:99
 ZNode.cxx:100
 ZNode.cxx:101
 ZNode.cxx:102
 ZNode.cxx:103
 ZNode.cxx:104
 ZNode.cxx:105
 ZNode.cxx:106
 ZNode.cxx:107
 ZNode.cxx:108
 ZNode.cxx:109
 ZNode.cxx:110
 ZNode.cxx:111
 ZNode.cxx:112
 ZNode.cxx:113
 ZNode.cxx:114
 ZNode.cxx:115
 ZNode.cxx:116
 ZNode.cxx:117
 ZNode.cxx:118
 ZNode.cxx:119
 ZNode.cxx:120
 ZNode.cxx:121
 ZNode.cxx:122
 ZNode.cxx:123
 ZNode.cxx:124
 ZNode.cxx:125
 ZNode.cxx:126
 ZNode.cxx:127
 ZNode.cxx:128
 ZNode.cxx:129
 ZNode.cxx:130
 ZNode.cxx:131
 ZNode.cxx:132
 ZNode.cxx:133
 ZNode.cxx:134
 ZNode.cxx:135
 ZNode.cxx:136
 ZNode.cxx:137
 ZNode.cxx:138
 ZNode.cxx:139
 ZNode.cxx:140
 ZNode.cxx:141
 ZNode.cxx:142
 ZNode.cxx:143
 ZNode.cxx:144
 ZNode.cxx:145
 ZNode.cxx:146
 ZNode.cxx:147
 ZNode.cxx:148
 ZNode.cxx:149
 ZNode.cxx:150
 ZNode.cxx:151
 ZNode.cxx:152
 ZNode.cxx:153
 ZNode.cxx:154
 ZNode.cxx:155
 ZNode.cxx:156
 ZNode.cxx:157
 ZNode.cxx:158
 ZNode.cxx:159
 ZNode.cxx:160
 ZNode.cxx:161
 ZNode.cxx:162
 ZNode.cxx:163
 ZNode.cxx:164
 ZNode.cxx:165
 ZNode.cxx:166
 ZNode.cxx:167
 ZNode.cxx:168
 ZNode.cxx:169
 ZNode.cxx:170
 ZNode.cxx:171
 ZNode.cxx:172
 ZNode.cxx:173
 ZNode.cxx:174
 ZNode.cxx:175
 ZNode.cxx:176
 ZNode.cxx:177
 ZNode.cxx:178
 ZNode.cxx:179
 ZNode.cxx:180
 ZNode.cxx:181
 ZNode.cxx:182
 ZNode.cxx:183
 ZNode.cxx:184
 ZNode.cxx:185
 ZNode.cxx:186
 ZNode.cxx:187
 ZNode.cxx:188
 ZNode.cxx:189
 ZNode.cxx:190
 ZNode.cxx:191
 ZNode.cxx:192
 ZNode.cxx:193
 ZNode.cxx:194
 ZNode.cxx:195
 ZNode.cxx:196
 ZNode.cxx:197
 ZNode.cxx:198
 ZNode.cxx:199
 ZNode.cxx:200
 ZNode.cxx:201
 ZNode.cxx:202
 ZNode.cxx:203
 ZNode.cxx:204
 ZNode.cxx:205
 ZNode.cxx:206
 ZNode.cxx:207
 ZNode.cxx:208
 ZNode.cxx:209
 ZNode.cxx:210
 ZNode.cxx:211
 ZNode.cxx:212
 ZNode.cxx:213
 ZNode.cxx:214
 ZNode.cxx:215
 ZNode.cxx:216
 ZNode.cxx:217
 ZNode.cxx:218
 ZNode.cxx:219
 ZNode.cxx:220
 ZNode.cxx:221
 ZNode.cxx:222
 ZNode.cxx:223
 ZNode.cxx:224
 ZNode.cxx:225
 ZNode.cxx:226
 ZNode.cxx:227
 ZNode.cxx:228
 ZNode.cxx:229
 ZNode.cxx:230
 ZNode.cxx:231
 ZNode.cxx:232
 ZNode.cxx:233
 ZNode.cxx:234
 ZNode.cxx:235
 ZNode.cxx:236
 ZNode.cxx:237
 ZNode.cxx:238
 ZNode.cxx:239
 ZNode.cxx:240
 ZNode.cxx:241
 ZNode.cxx:242
 ZNode.cxx:243
 ZNode.cxx:244
 ZNode.cxx:245
 ZNode.cxx:246
 ZNode.cxx:247
 ZNode.cxx:248
 ZNode.cxx:249
 ZNode.cxx:250
 ZNode.cxx:251
 ZNode.cxx:252
 ZNode.cxx:253
 ZNode.cxx:254
 ZNode.cxx:255
 ZNode.cxx:256
 ZNode.cxx:257
 ZNode.cxx:258
 ZNode.cxx:259
 ZNode.cxx:260
 ZNode.cxx:261
 ZNode.cxx:262
 ZNode.cxx:263
 ZNode.cxx:264
 ZNode.cxx:265
 ZNode.cxx:266
 ZNode.cxx:267
 ZNode.cxx:268
 ZNode.cxx:269
 ZNode.cxx:270
 ZNode.cxx:271
 ZNode.cxx:272
 ZNode.cxx:273
 ZNode.cxx:274
 ZNode.cxx:275
 ZNode.cxx:276
 ZNode.cxx:277
 ZNode.cxx:278
 ZNode.cxx:279
 ZNode.cxx:280
 ZNode.cxx:281
 ZNode.cxx:282
 ZNode.cxx:283
 ZNode.cxx:284
 ZNode.cxx:285
 ZNode.cxx:286
 ZNode.cxx:287
 ZNode.cxx:288
 ZNode.cxx:289
 ZNode.cxx:290
 ZNode.cxx:291
 ZNode.cxx:292
 ZNode.cxx:293
 ZNode.cxx:294
 ZNode.cxx:295
 ZNode.cxx:296
 ZNode.cxx:297
 ZNode.cxx:298
 ZNode.cxx:299
 ZNode.cxx:300
 ZNode.cxx:301
 ZNode.cxx:302
 ZNode.cxx:303
 ZNode.cxx:304
 ZNode.cxx:305
 ZNode.cxx:306
 ZNode.cxx:307
 ZNode.cxx:308
 ZNode.cxx:309
 ZNode.cxx:310
 ZNode.cxx:311
 ZNode.cxx:312
 ZNode.cxx:313
 ZNode.cxx:314
 ZNode.cxx:315
 ZNode.cxx:316
 ZNode.cxx:317
 ZNode.cxx:318
 ZNode.cxx:319
 ZNode.cxx:320
 ZNode.cxx:321
 ZNode.cxx:322
 ZNode.cxx:323
 ZNode.cxx:324
 ZNode.cxx:325
 ZNode.cxx:326
 ZNode.cxx:327
 ZNode.cxx:328
 ZNode.cxx:329
 ZNode.cxx:330
 ZNode.cxx:331
 ZNode.cxx:332
 ZNode.cxx:333
 ZNode.cxx:334
 ZNode.cxx:335
 ZNode.cxx:336
 ZNode.cxx:337
 ZNode.cxx:338
 ZNode.cxx:339
 ZNode.cxx:340
 ZNode.cxx:341
 ZNode.cxx:342
 ZNode.cxx:343
 ZNode.cxx:344
 ZNode.cxx:345
 ZNode.cxx:346
 ZNode.cxx:347
 ZNode.cxx:348
 ZNode.cxx:349
 ZNode.cxx:350
 ZNode.cxx:351
 ZNode.cxx:352
 ZNode.cxx:353
 ZNode.cxx:354
 ZNode.cxx:355
 ZNode.cxx:356
 ZNode.cxx:357
 ZNode.cxx:358
 ZNode.cxx:359
 ZNode.cxx:360
 ZNode.cxx:361
 ZNode.cxx:362
 ZNode.cxx:363
 ZNode.cxx:364
 ZNode.cxx:365
 ZNode.cxx:366
 ZNode.cxx:367
 ZNode.cxx:368
 ZNode.cxx:369
 ZNode.cxx:370
 ZNode.cxx:371
 ZNode.cxx:372
 ZNode.cxx:373
 ZNode.cxx:374
 ZNode.cxx:375
 ZNode.cxx:376
 ZNode.cxx:377
 ZNode.cxx:378
 ZNode.cxx:379
 ZNode.cxx:380
 ZNode.cxx:381
 ZNode.cxx:382
 ZNode.cxx:383
 ZNode.cxx:384
 ZNode.cxx:385
 ZNode.cxx:386
 ZNode.cxx:387
 ZNode.cxx:388
 ZNode.cxx:389
 ZNode.cxx:390
 ZNode.cxx:391
 ZNode.cxx:392
 ZNode.cxx:393
 ZNode.cxx:394
 ZNode.cxx:395
 ZNode.cxx:396
 ZNode.cxx:397
 ZNode.cxx:398
 ZNode.cxx:399
 ZNode.cxx:400
 ZNode.cxx:401
 ZNode.cxx:402
 ZNode.cxx:403
 ZNode.cxx:404
 ZNode.cxx:405
 ZNode.cxx:406
 ZNode.cxx:407
 ZNode.cxx:408
 ZNode.cxx:409
 ZNode.cxx:410
 ZNode.cxx:411
 ZNode.cxx:412
 ZNode.cxx:413
 ZNode.cxx:414
 ZNode.cxx:415
 ZNode.cxx:416
 ZNode.cxx:417
 ZNode.cxx:418
 ZNode.cxx:419
 ZNode.cxx:420
 ZNode.cxx:421
 ZNode.cxx:422
 ZNode.cxx:423
 ZNode.cxx:424
 ZNode.cxx:425
 ZNode.cxx:426
 ZNode.cxx:427
 ZNode.cxx:428
 ZNode.cxx:429
 ZNode.cxx:430
 ZNode.cxx:431
 ZNode.cxx:432
 ZNode.cxx:433
 ZNode.cxx:434
 ZNode.cxx:435
 ZNode.cxx:436
 ZNode.cxx:437
 ZNode.cxx:438
 ZNode.cxx:439
 ZNode.cxx:440
 ZNode.cxx:441
 ZNode.cxx:442
 ZNode.cxx:443
 ZNode.cxx:444
 ZNode.cxx:445
 ZNode.cxx:446
 ZNode.cxx:447
 ZNode.cxx:448
 ZNode.cxx:449
 ZNode.cxx:450
 ZNode.cxx:451
 ZNode.cxx:452
 ZNode.cxx:453
 ZNode.cxx:454
 ZNode.cxx:455
 ZNode.cxx:456
 ZNode.cxx:457
 ZNode.cxx:458
 ZNode.cxx:459
 ZNode.cxx:460
 ZNode.cxx:461
 ZNode.cxx:462
 ZNode.cxx:463
 ZNode.cxx:464
 ZNode.cxx:465
 ZNode.cxx:466
 ZNode.cxx:467
 ZNode.cxx:468
 ZNode.cxx:469
 ZNode.cxx:470
 ZNode.cxx:471
 ZNode.cxx:472