#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

#include "QFramework/TQListUtils.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQIterator.h"
#include "TObjString.h"
#include "QFramework/TQLibrary.h"

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <functional>
#include <array>

using std::vector;
using std::string;


////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQListUtils:
//
// The TQListUtils namespace provides a set of static utility methods related to lists.
//
////////////////////////////////////////////////////////////////////////////////////////////////

void TQListUtils::print(TList * list, const TString& options) {
	// print a list with a given set of options
  TQTaggable * opts = TQTaggable::parseFlags(options);
  if (!opts) {
    ERRORfunc("Failed to parse options '%s'", options.Data());
    return;
  }
 
  // now print the list
  print(list, *opts);
}


//__________________________________________________________________________________|___________

void TQListUtils::print(TList * list, TQTaggable& options) {
	// print a list with a given set of options
  TString errMsg = "option";
  if (!options.claimTags("[f:s!],[s:b!],!!", errMsg)) {
    ERRORfunc("Failed to parse options '%s'", errMsg.Data());
    return;
  }
 
  bool ownList = false;
  if (list && options.getTagBoolDefault("s", false)) {
    list = getListOfNames(list);
    list->Sort();
    ownList = true;
  }

  TQIterator itr(list, options.getTagStringDefault("f"), ownList);
  while (itr.hasNext()) {
    TString name = itr.readNext()->GetName();
 
    // print element
    std::cout << name.Data() << std::endl;
  }
}


//__________________________________________________________________________________|___________

void TQListUtils::print(const std::vector<TString> & vec) {
	// print a vector of strings
  for (size_t i = 0; i< vec.size() ; ++i) {
    std::cout<< "["<<i<<"]"<<vec.at(i).Data()<<std::endl;
  }
}
//__________________________________________________________________________________|___________

TList * TQListUtils::getListOfNames(TCollection * collection, bool ownCollection) {
  // Returns a list (pointer to instance of TList) of instances of TObjString of
  // names of elements in <collection> or a null pointer in case no element is
  // present (the user is responsible for deleting the returned instance). If
  // <ownCollection> is true object <collection> will be deleted after having been
  // read.
 
  // will be the list to return
  TList * result = NULL;
 
  TQIterator itr(collection, ownCollection);
  while (itr.hasNext()) {
    // create new instance of TList for first element to add
    if (!result) {
      result = new TList();
      result->SetOwner(true);
    }
    result->Add(new TObjString(itr.readNext()->GetName()));
  }
 
  return result;
}


//__________________________________________________________________________________|___________

TList * TQListUtils::getMergedListOfNames(TCollection * c1, TCollection * c2, bool ownCollections) {
  // Returns a sorted list (pointer to instance of TList) of instances of
  // TObjString of names of elements present in at least one of the two collections
  // <c1> and <c2> (the user is responsible for deleting the returned instance). If
  // <ownCollections> is true objects <c1> and <c2> will be deleted after having
  // been read. 
 
  // get list of names of elements in collections
  TList * l1 = getListOfNames(c1, ownCollections);
  TList * l2 = getListOfNames(c2, ownCollections);
 
  // will be the resulting list
  TList * result = NULL;
 
  // the number of entries in each list
  int n1 = 0;
  int n2 = 0;

  // sort the lists by name
  if (l1) {
    n1 = l1->GetEntries();
    l1->Sort();
  }
  if (l2) {
    n2 = l2->GetEntries();
    l2->Sort();
  }
 
  // process the two lists by incrementing list indices in a synchronized way
  int i1 = 0;
  int i2 = 0;
  while (i1 < n1 || i2 < n2) {
 
    // get the two objects at the current list indices
    // (use NULL pointer in case a list has reached its end)
    TObject * obj1 = (i1 < n1) ? l1->At(i1) : NULL;
    TObject * obj2 = (i2 < n2) ? l2->At(i2) : NULL;

    TObject * obj = NULL;
 
    if (obj1 && obj2) {
      // Compare objects based on their Compare(...) method (usually compares names)
      int compare = obj1->Compare(obj2);
      // go to next element in list 1 if list 2 is ahead or both are at same level
      if (compare <= 0) {
        obj = obj1;
        i1++;
      }
      // go to next element in list 2 if list 1 is ahead or both are at same level
      if (compare >= 0) {
        obj = obj2;
        i2++;
      }
    } else if (obj1) {
      // list 2 has reached its end
      obj = obj1;
      i1++;
    } else if (obj2) {
      // list 1 has reached its end
      obj = obj2;
      i2++;
    }

    if (!obj) {
      continue;
    }
    if (!result) {
      result = new TList();
      result->SetOwner(true);
    }
    result->Add(new TObjString(obj->GetName()));
  }

  // clean up
  if (l1) {
    delete l1;
  }
  if (l2) {
    delete l2;
  }
 
  return result;
}


//__________________________________________________________________________________|___________

int TQListUtils::removeElements(TList * l, const TString& filter) {
  // Removes all elements from input list <l> with names (string returned by
  // GetName()) matching the string filter pattern <filter> and returns the number
  // of elements that have been removed. If the list <l> is the owner of its objects
  // (l->IsOwner() is true) elements will also be deleted.
 
  // get list of names in list
  TList * names = getListOfNames(l, false);
 
  // number of objects removed from list
  int n = 0;
 
  // iterate over object names matching filter
  TQIterator itr(names, filter, true);
  while (itr.hasNext()) {
    TString name = itr.readNext()->GetName();
    TObject * obj = l->FindObject(name.Data());
    if (!obj) {
      // should not happen
      continue;
    }
    l->Remove(obj);
    n++;
    if (l->IsOwner()) {
      delete obj;
    }
  }

  // return the number of elements that have been removed
  return n;
}


//__________________________________________________________________________________|___________

bool TQListUtils::reorder(TList * list, TList * order) {
 
  if (!list || !order || !areIsomorphic(list, order)) {
    // invalid or non-matching input lists
    return false;
  }
 
  // temporarily make the list not being the owner of
  // objects but remeber owner setting to restore it later
  bool isOwner = list->IsOwner();
  list->SetOwner(false);
 
  TQIterator itr(order);
  while (itr.hasNext()) {
    TString name = itr.readNext()->GetName();
    // move object
    TObject * obj = list->FindObject(name.Data());
    if (!obj) {
      // should not happen
      return false;
    }
    list->Remove(obj);
    list->AddLast(obj);
  }
 
  // restore original owner setting
  list->SetOwner(isOwner);
 
  // successfully done!
  return true;
}


//__________________________________________________________________________________|___________

bool TQListUtils::isSubsetOf(TList * l1, TList * l2) {
  // Returns true if for each element in list <l1> there is an element with the same
  // name in list <l2> and false otherwise.
 
  // iterate over objects in list <l1>
  TQIterator itr(l1);
  while (itr.hasNext()) {
    TString name = itr.readNext()->GetName();
    if (!l2 || !l2->FindObject(name.Data())) {
      // no matching element found
      return false;
    }
  }

  // found match for every element
  return true;
} 


//__________________________________________________________________________________|___________

bool TQListUtils::areIsomorphic(TList * l1, TList * l2) {
  // Returns true if the two input lists <l1> and <l2> are isomorphic and false
  // otherwise. Isomorphism in this context means that for element in one list there
  // is exactly one object with the same name in the other list (implying in neither
  // of the two lists there are two or more objects with the same name). Please note:
  // in case both <l1> and <l2> are invalid pointer true is returned.
 
  if (!l1 || !l2) {
    // return true if both input lists are invalid
    return !l1 && !l2;
  }
  if (hasDuplicates(l1) || hasDuplicates(l2)) {
    // don't allow duplicates in any list
    return false;
  }
 
  // list match if <l1> and <l2> are subsets of each other
  return isSubsetOf(l1, l2) && isSubsetOf(l2, l1);
}


//__________________________________________________________________________________|___________

bool TQListUtils::hasDuplicates(TList * list) {
  // Returns true if there are two or more objects in the input list <list> with
  // the same name and false otherwise.
 
  // remember object names already found in the list
  TList found;
  found.SetOwner(true);
 
  // iterate over objects in list
  TQIterator itr(list);
  while (itr.hasNext()) {
    TString name = itr.readNext()->GetName();
    if (found.FindObject(name.Data())) {
      // already had the same name
      return true;
    } else {
      found.Add(new TObjString(name.Data()));
    }
  }

  // no duplicates found
  return false;
}


//__________________________________________________________________________________|___________

bool TQListUtils::sortByStringLength(TList * /*list*/, bool /*ascending*/) {  // TODO: still needs to be implemented
  throw std::runtime_error("TQListUtils::sortByStringLength(TList*, bool) is not implemented, yet!");
  return true;
}


//__________________________________________________________________________________|___________

bool TQListUtils::sortByName(TList * list) {
  if(!list || list->GetEntries() < 2) return false;
  bool owner = list->IsOwner();
  list->SetOwner(false);
  std::map<std::string,TObject*> map;
  std::vector<std::string> names;
  TQIterator itr(list);
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    if(!obj) continue;
    std::string s(obj->GetName());
    names.push_back(s);
    map[s] = obj;
    TList* l = dynamic_cast<TList*>(obj);
    if(l) sortByName(l);
  }
  std::sort(names.begin(),names.end());
  for(const auto& name:names){
    list->Remove(map[name]);
    list->AddLast(map[name]);
  }
  list->SetOwner(owner);
  return true;
}

//__________________________________________________________________________________|___________

int TQListUtils::addClones(TCollection* from, TCollection* to){
  // clone all objects contained in one list and append them to the other
  if(!to) return -1;
  TQIterator itr(from);
  size_t n=0;
  while(itr.hasNext()){
    n++;
    TObject* obj = itr.readNext();
    to->Add(obj->Clone());
  }
  return n;
}

//__________________________________________________________________________________|___________

int TQListUtils::moveListContents(TList* origin, TList* target){
  // move all objects contained in one list to the other
  if(!origin || !target) return 0;
  TQIterator itr(origin);
  int nMoved = 0;
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    if(!obj) continue;
    target->Add(obj);
    nMoved++;
  }
  return nMoved;
}

//__________________________________________________________________________________|___________

TObject* TQListUtils::findInList(TList* l, const TString& name){
  // find the first object in a list matching the given name
  // name pattern may contain wildcars
  if(!l) return NULL;
  TQIterator itr(l);
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    if(!obj) continue;
    if(TQStringUtils::matches(obj->GetName(),name))
      return obj;
  }
  return NULL;
}

//__________________________________________________________________________________|___________

TQTaggable* TQListUtils::findInListByTag(TList* l, const TString& key, const TString& value){
  // find the first TQTaggable object 
  // that contains the given key-value-pair 
  // value may contain wildcards.
  if(!l) return NULL;
  TQIterator itr(l);
  while(itr.hasNext()){
    TQTaggable* obj = dynamic_cast<TQTaggable*>(itr.readNext());
    if(!obj) continue;
    if(TQStringUtils::matches(obj->getTagStringDefault(key,""),value))
      return obj;
  }
  return NULL;
}

//__________________________________________________________________________________|___________

int TQListUtils::getMaxNameLength(TCollection* c){
  // retrieve the maximum object name length from some collection
  int max = -1;
  TQIterator itr(c);
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    max = std::max(max,TQStringUtils::getWidth(obj->GetName()));
  }
  return max;
}

//__________________________________________________________________________________|___________

void TQListUtils::printList(TCollection* c){
  // print any type of TCollection nicely formatted
  if(!c){
    ERRORfunc("cannot print NULL list");
    return;
  }
  std::cout << TQStringUtils::makeBoldWhite(c->GetName()) << " has " << c->GetEntries() << " entries:" << std::endl;
  TQIterator itr(c);
  while(itr.hasNext()){
    TObject* obj = dynamic_cast<TObject*>(itr.readNext());
    if(!obj){
      std::cout << TQStringUtils::fixedWidth("TObject",20,false) << " " << TQStringUtils::fixedWidth("NULL",60,false) << std::endl;
      continue;
    }
    std::cout << TQStringUtils::fixedWidth(obj->ClassName(),20,false) << " " << TQStringUtils::fixedWidth(obj->GetName(),60,false) << std::endl;
  }
}

//__________________________________________________________________________________|___________

int TQListUtils::collectContentNames(TCollection* origin, TList* target, const TString& pattern){
  // create a list of all names ob objects contained in some collection
  // that match a given pattern. returns number of matches found.
  if(!origin || !target) return 0;
  TQIterator itr(origin);
  int nMoved = 0;
  while(itr.hasNext()){
    TNamed* named = dynamic_cast<TNamed*>(itr.readNext());
    if(!named) continue;
    if(!TQStringUtils::matches(named->GetName(),pattern))
      continue;
    if(target->Contains(named->GetName()))
      continue;
    target->Add(new TObjString(named->GetName()));
    nMoved++;
  }
  return nMoved;
}

//__________________________________________________________________________________|___________

int TQListUtils::setBranchStatus(TTree* tree, TCollection* list, int status){
  // loop over a list of objects, setting the status of all branches matching the list entry names
  TQIterator itr(list);
  int count = 0;
  while(itr.hasNext()){
    TObject* bName = itr.readNext();
    if(!bName) continue;
    TString name(bName->GetName());
    if (name.First('*') != kNPOS || tree->FindBranch(name)) tree->SetBranchStatus(name, status);
    count++;
  }
  return count;
}

//__________________________________________________________________________________|___________

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