ROOT logo
/**
 * @defgroup pwglf_forward_trains_helper Analysis helpers
 *
 * @ingroup pwglf_forward_trains
 * 
 * 
 */
/**
 * @file   Helper.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 19:00:17 2012
 * 
 * @brief  Base class for analysis helpers
 * 
 * @ingroup pwglf_forward_trains_helper
 * 
 */
#ifndef TRAIN_HELPER_C
#define TRAIN_HELPER_C
#ifndef __CINT__
# include "Option.C"
# include <TUrl.h>
# include <TString.h>
# include <TMap.h>
# include <TObjString.h>
# include <TSystem.h>
# include <TROOT.h>
# include <TError.h>
# include <TObjArray.h>
# include <TFile.h>
# include <AliAnalysisManager.h>
# include <iostream>
#else 
class TString;
class TUrl;
class TMap;
class Option;
class OptionList;
#endif

/**
 * Helper class to set-up an analysis using a train 
 *
 * @ingroup pwglf_forward_trains_helper
 */
struct Helper 
{
  enum EMode { 
    kLocal, 
    kProof, 
    kGrid
  };
  enum EOperation { 
    kTest,
    kOffline,
    kSubmit,
    kTerminate, 
    kFull
  };
  enum EInput { 
    kESD, 
    kAOD, 
    kUser
  };
  Helper(const Helper& o) 
    : fUrl(o.fUrl), fOptions(o.fOptions), fVerbose(o.fVerbose)
  {}
  Helper& operator=(const Helper&) { return *this; }
  /** 
   * Create a helper object. 
   *
   * @param verbose Verbosity 
   * @param url Url describing the job. 
   *
   * - Local mode: 
   *
   * @code
   * local://<path>[#<treeName>][?[recursive[&]]]
   * @endcode 
   *
   * &lt;path&gt; can be a single ROOT file, a text file with one
   * entry per file to add to the chain, or a directory containing the
   * files. If &lt;path&gt; does not start with a '/' then it is
   * interpreted as a relative path.
   *
   * - Grid mode: 
   *
   * @code 
   * alien:///<path>#<pattern>
   * @endcode
   *
   * - PROOF mode: 
   * 
   * Several options 
   *
   * @code 
   * lite:///<path>[?[recursive[&]][workers=<n>]][#treeName]
   * proof:///<path>[?[recursive[&]][workers=<n>]][#treeName]
   * @endcode 
   *
   * @code 
   * proof://<host>/<dsname>[?[workers=<n>[&]][dsname[=<outname>]]][#treeName]
   * @endcode 
   *
   * Note, if &lt;host&gt; is recognised as an Alice Analysis
   * Facility, then the Grid handler (AliAnalysisAlien) is used unless
   * the option <tt>plain</tt> was given. 
   * 
   * @return Newly allocated helper or null 
   */
  static Helper* Create(const TUrl& url, Int_t verbose=0);
  /** 
   * Load a library 
   * 
   * @param name   Name of library 
   * @param slave  If true also load on slaves
   * 
   * @return true on success, false otherwise 
   */
  virtual Bool_t LoadLibrary(const TString& name, 
			     Bool_t slave=true) = 0;
  /** 
   * Load a source file, and compile it 
   * 
   * @param name Name of the source file 
   * @param copy Copy rather than link 
   * 
   * @return true on success
   */
  virtual Bool_t LoadSource(const TString& name, bool copy=false)
  {
    if (!AuxFile(name, copy)) return false;
    TString base(gSystem->BaseName(name));
    gROOT->ProcessLine("gSystem->RedirectOutput(\"build.log\",\"a\");");
    gROOT->LoadMacro(Form("%s++g", base.Data()));
    gROOT->ProcessLine("gSystem->RedirectOutput(0);");
    return true;
  }
  /** 
   * Load auxillary file - not compiled or sourced.  Just copied to
   * working directory
   * 
   * @param name Extra file name 
   * @param copy Copy rather than link 
   *
   * @return true on success 
   */
  virtual Bool_t LoadAux(const TString& name, Bool_t copy=false)
  {
    if (!AuxFile(name, copy)) return false;
    return true;
  }

  /** 
   * Load needed ROOT libaries 
   */
  virtual Bool_t LoadROOT()
  {
    if (gSystem->Load("libTree.so")    < 0) return false;
    if (gSystem->Load("libGeom.so")    < 0) return false;
    if (gSystem->Load("libVMC.so")     < 0) return false;
    if (gSystem->Load("libPhysics.so") < 0) return false;
    if (gSystem->Load("libMinuit.so")  < 0) return false;
    return true;
  }
  /** 
   * Set-up to load the AliROOT libraries 
   * 
   * @return true on success
   */
  virtual Bool_t LoadAliROOT()
  {
    if (!gSystem->Getenv("ALICE_ROOT")) { 
      Error("Helper::LoadAliROOT", "Local AliROOT not available");
      return false;
    }
    if (!LoadLibrary("STEERBase"))     return false;
    if (!LoadLibrary("ESD"))           return false;
    if (!LoadLibrary("AOD"))           return false;
    if (!LoadLibrary("ANALYSIS"))      return false;
    if (!LoadLibrary("OADB"))          return false;
    if (!LoadLibrary("ANALYSISalice")) return false;
    return true;
  }
  /** 
   * Get the execution mode 
   * 
   * @return Execution mode set in set-up URL
   */
  virtual UShort_t Mode() const = 0;
  /**
   * Get the mode string used for AliAnalysisManager::StartAnalysis
   */
  virtual const char* ModeString() const { return "unknown"; }
  /** 
   * Get the operation - this only makes sense for Grid jobs
   * 
   * @return Operation type
   */
  virtual UShort_t Operation() const { return kFull; }
  /** 
   * Get the input data type 
   *
   * @return Input data type 
   */
  virtual Short_t InputType() const
  {
    UShort_t ret = DeduceType(fUrl.GetAnchor());
    if (ret != kUser) return ret;

    if (fOptions.Has("pattern")) ret = DeduceType(fOptions.Get("pattern"));
    if (ret != kUser) return ret;
    
    ret = DeduceType(fUrl.GetFile());
    return ret;
  }
  /** 
   * Check if the MC option was set
   * 
   * @return true if the MC option was given 
   */
  virtual Bool_t IsMC() const { return fOptions.Has("mc"); }
  /** 
   * The file part of tehe output URL - overwritten by derived classes. 
   * 
   * 
   * @return File part of output URL
   */
  virtual TString OutputPath() const { return ""; }
  /** 
   * Get the location of the output data.  Use ful to define second pass 
   * scripts, etc. 
   * 
   * 
   * @return Url string 
   */
  virtual TString OutputLocation() const 
  {
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    if (!mgr || !mgr->GetOutputEventHandler()) return "";

    TString path(OutputPath());
    if (path.IsNull()) {
      path = gSystem->WorkingDirectory(); 
      // mgr->GetName();
    }

    TUrl u(fUrl);
    u.SetFile(path);
    u.SetAnchor("aodTree");
    TString opt(u.GetOptions());
    // if (opt.Contains("AliESDs")) 
    opt.ReplaceAll("AliESDs", "AliAOD");
    // else                         opt.Append("&pattern=AliAOD*.root");
    u.SetOptions(opt);

    return u.GetUrl();
  }
  /** 
   * Set-up done before task setup 
   * 
   * @return true on success
   */
  virtual Bool_t PreSetup() = 0;
  /** 
   * Set-up done after task setup 
   * 
   * @return true on success
   */
  virtual Bool_t PostSetup() = 0;
  /** 
   * Run the analysis
   * 
   * @param nEvents Number of events to analyse 
   * 
   * @return The return value of AliAnalysisManager::StartAnalysis
   */
  virtual Long64_t Run(Long64_t nEvents=-1) = 0;
  /** 
   * Print information to standard output 
   * 
   * @return 
   */
  virtual void Print(Option_t* ="") const
  {
    std::cout << "Url: " << fUrl.GetUrl() << std::endl;
    fOptions.Show(std::cout);
  }
  /** 
   * @return URL help string 
   */
  virtual const Char_t* UrlHelp() const  = 0;
  /** 
   * @return Short description string 
   */
  virtual const char* Desc() const = 0;
  /** 
   * Get the input URL 
   * 
   * @return Input URL 
   */
  const TUrl& Url() const { return fUrl; }
  /** 
   * Get the list of options 
   * 
   * @return Reference to list of options 
   */
  const OptionList& Options() const { return fOptions; }
  /** 
   * Write auxillary ROOT (and possible shell) script for more 
   * (post-)processing e.g., terminate
   * 
   */
  virtual void AuxSave(const TString& /*escaped*/, 
		       Bool_t /*asShellScript*/) {}
  /** 
   * Create an instance of a helper class 
   */
  static Helper* CreateObject(const TString& cl, 
			      const TUrl&    url, 
			      Int_t verbose=0)
  {
    if (verbose < 3) gSystem->RedirectOutput("/dev/null","w");
    if (cl.Contains("proof", TString::kIgnoreCase) || 
	cl.Contains("lite",  TString::kIgnoreCase) || 
	cl.Contains("aaf",   TString::kIgnoreCase)) {
      gSystem->Load("libProof");
      gSystem->Load("libProofPlayer");
    }
    // (Always) recompile and with debug symbols 
    gROOT->LoadMacro(Form("%s.C++g",cl.Data()));
    Long_t ptr = gROOT->ProcessLine(Form("new %s(\"%s\", %d);", 
					 cl.Data(), url.GetUrl(), verbose));
    if (verbose < 3) gSystem->RedirectOutput(0);
    if (!ptr) { 
      Warning("Helper::CreateObject", "Failed to instantize a %s", cl.Data());
      return 0;
    }
    Helper* h = reinterpret_cast<Helper*>(ptr);
    return h;
  }
  /** 
   * Show help on URL using the interpreter 
   * 
   * @param cl Helper class 
   */
  static void ShowUrlHelp(const TString& cl)
  {
    Helper* h = CreateObject(cl, "", true);
    if (!h) return;

    std::cout << "   " << h->UrlHelp() << std::endl;
  }
  /** 
   * Show help on URL and options using the interpreter 
   * 
   * @param cl Helper class 
   */
  static void ShowFullHelp(const TString& cl) 
  {
    Helper* h = CreateObject(cl, "", true);
    if (!h) return;
    
    std::cout << h->Desc() << ":\n" 
	      << "==============\n"
	      << "  " << h->UrlHelp() << "\n\n"
	      << "Options: " << std::endl;
    h->Options().Help(std::cout);
    std::cout << std::endl;
  }
  /**
   * Add a monitor object - only for PROOF 
   */
  virtual Bool_t AddMonitor(const TString&) { return true; }
protected:
  /** 
   * Constructor 
   * 
   * @param url Set-up URL
   * @param verbose Verbosity level 
   */
  Helper(const TUrl& url, Int_t verbose) 
    : fUrl(url), fOptions(), fVerbose(verbose)
  {
    fOptions.Add("mc", "Assume simulation input");
  }

  virtual Bool_t ParseOptions()
  {
    //std::cout << "Url options: \"" << fUrl.GetOptions() << "\"" << std::endl;
    return fOptions.Parse(fUrl.GetOptions(), "&");
  }
  /** 
   * Destructor 
   */
  virtual ~Helper()
  {
  }
  /** 
   * Normalize a library name
   * 
   * @param name 
   * 
   * @return 
   */
  const TString& MakeLibraryName(const TString& name)
  {
    static TString libName;

    libName = name;

    if (!libName.BeginsWith("lib")) { 
      // Check if the library corresponds to a compiled macro 
      if (!gSystem->AccessPathName(Form("%s_C.so", libName.Data()))) 
	libName.Append("_C");
      else if (!gSystem->AccessPathName(Form("../%s_C.so", libName.Data()))) 
	libName = Form("../%s_C", libName.Data());
      else 
	libName = Form("lib%s", libName.Data());
    }
    if (!libName.EndsWith(".so"))   libName.Append(".so");

    return libName;
  }
  /** 
   * Link an auxilary file to working directory 
   * 
   * @param name Name of the file
   * @param copy Copy rather than link
   *
   * @return true on success
   */
  virtual Bool_t AuxFile(const TString& name, bool copy=false)
  {
    TString path(gSystem->ExpandPathName(name.Data()));
    // If not absolute, prepend up-one
    if (!path.BeginsWith("/")) path.Prepend("../");
    if (gSystem->AccessPathName(path.Data())) { 
      // File not accessible
      Warning("Helper::AuxFile", "File %s not accessible", path.Data());
      return false;
    }
    TString base(gSystem->BaseName(path.Data()));
    if (gSystem->AccessPathName(base.Data()) == 0) { 
      // File or link exists - remove it 
      if (gSystem->Unlink(base) != 0) { 
	Error("Helper::AuxFile", "Failed to remove old %s", base.Data());
	return false;
      }
    }
    if (copy) 
      TFile::Cp(path, base);
    else 
      gSystem->Exec(Form("ln -s %s .", path.Data()));
    return true;
  }
  /** 
   * Deduce the top of job from a string 
   * 
   * @param str String 
   * 
   * @return Job type
   */
  static UShort_t DeduceType(const TString& str)
  {
    if (str.IsNull()) return kUser;
    if (str.Contains("aod", TString::kIgnoreCase)) return kAOD;
    if (str.Contains("esd", TString::kIgnoreCase)) return kESD;
    return kUser;
  }
  // --- Data members ------------------------------------------------
  TUrl        fUrl;     // The URI
  OptionList  fOptions; 
  Int_t       fVerbose;
};




// ===================================================================
Helper* 
Helper::Create(const TUrl& url, Int_t verbose)
{
  if (!url.IsValid()) { 
    Warning("Helper::Create", "URL is invalid");
    return 0;
  }

  TString prot(url.GetProtocol());
  prot.ToLower();

  TUrl tmp(url);
  TString opts(tmp.GetOptions());
  TString host(url.GetHost());
  TString cl = "";
  if (prot.EqualTo("alien")) { 
    // Create an AliEn helper 
    cl = "GridHelper";
  }
  else if (prot.EqualTo("local")) { 
    // Create Lite helper 
    cl = "LocalHelper";
  }
  else if (prot.EqualTo("proof")) { 
    // Create a Proof helper 
    if (host.IsNull()) 
      cl = "LiteHelper";
    else if (host.BeginsWith("alice-caf")) { 
      // AAF 
      cl = opts.Contains("plugin") ? "AAFPluginHelper" : "AAFHelper";
    }
    else 
      cl = "ProofHelper";
  }
  else if (prot.EqualTo("lite")) { 
    // Create a Proof helper 
    cl = "LiteHelper";
  }
  else if (prot.EqualTo("help")) {
    // Special HELP protocol
    if (host.Contains("options")) {
      std::cout << "Possible URL types and options are:" << std::endl;
      ShowFullHelp("LocalHelper");
      ShowFullHelp("ProofHelper");
      ShowFullHelp("LiteHelper");
      ShowFullHelp("AAFHelper");
      ShowFullHelp("AAFPluginHelper");
      ShowFullHelp("GridHelper");
      return 0;
    }
    std::cout << "Possible URL types are:" << std::endl;
    ShowUrlHelp("LocalHelper");
    ShowUrlHelp("ProofHelper");
    ShowUrlHelp("LiteHelper");
    ShowUrlHelp("AAFHelper");
    ShowUrlHelp("AAFPluginHelper");
    ShowUrlHelp("GridHelper");
    return 0;
  }
  // --- Check if we got a scheme ------------------------------------
  if (cl.IsNull()) {
    Error("Helper::Create", "Unknown scheme: %s", prot.Data());
    return 0;
  }

  // --- Use interpreter to make our object --------------------------
  Helper* helper = CreateObject(cl, url, verbose);
  if (!helper) {
    Error("Helper::Create", "Failed to make object of class %s", cl.Data());
    return 0;
  }

  // --- Parse options -----------------------------------------------
  if (!helper->ParseOptions()) {
    delete helper;
    helper = 0;
  }

  return helper;
}

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