From df07299ca41ab84944adba37b2c74b9b53e24d08 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Fri, 29 Mar 2024 13:44:40 +0100 Subject: [PATCH 1/8] Fixed compatibility with POSIX --- libhdt/src/util/filemap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libhdt/src/util/filemap.cpp b/libhdt/src/util/filemap.cpp index 7d6ca131..d6f79d6b 100644 --- a/libhdt/src/util/filemap.cpp +++ b/libhdt/src/util/filemap.cpp @@ -117,7 +117,7 @@ FileMap::FileMap(const char *fileName) : fd(0), ptr(NULL) { } // Mark as needed so the OS keeps as much as possible in memory - madvise((void*)ptr, mappedSize, MADV_WILLNEED); + posix_madvise((void*)ptr, mappedSize, POSIX_MADV_WILLNEED); #endif } From 33a63196f0d607af7469dc72cfcdb258e54bf840 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Fri, 29 Mar 2024 13:46:27 +0100 Subject: [PATCH 2/8] ASan and UBSan runtime errors --- libhdt/src/bitsequence/BitSequence375.cpp | 8 +++++-- libhdt/src/hdt/ControlInformation.cpp | 5 +++- libhdt/src/sequence/LogSequence.cpp | 6 ++--- libhdt/src/sequence/LogSequence2.hpp | 9 +++++--- libhdt/src/util/fileUtil.cpp | 28 +++++++++++++++++++---- libhdt/src/util/fileUtil.hpp | 1 + 6 files changed, 43 insertions(+), 14 deletions(-) diff --git a/libhdt/src/bitsequence/BitSequence375.cpp b/libhdt/src/bitsequence/BitSequence375.cpp index 92b25cd3..ec47504e 100644 --- a/libhdt/src/bitsequence/BitSequence375.cpp +++ b/libhdt/src/bitsequence/BitSequence375.cpp @@ -95,6 +95,7 @@ void BitSequence375::buildIndex() //cout << "Blocks: " << numwords << " Super: "<< superblocks.size() << " Size: " << superblocks.size()*8 << endl; // Fill them + uint64_t x{}; while(blockIndex < numwords) { if(!(blockIndex%BLOCKS_PER_SUPER)) @@ -107,7 +108,8 @@ void BitSequence375::buildIndex() } blocks[blockIndex] = blockPop; - blockPop += popcount64(array[blockIndex]); + memcpy(&x, &array[blockIndex], sizeof(size_t)); + blockPop += popcount64(x); blockIndex++; } @@ -405,7 +407,9 @@ size_t BitSequence375::select1(const size_t x) const countdown -= blocks[blockIdx]; // Search bit inside block - size_t bitpos = wordSelect1(array[blockIdx], countdown); + size_t value{}; + memcpy(&value, &array[blockIdx], sizeof(value)); + size_t bitpos = wordSelect1(value, countdown); return blockIdx * WORDSIZE + bitpos - 1; } diff --git a/libhdt/src/hdt/ControlInformation.cpp b/libhdt/src/hdt/ControlInformation.cpp index 3aeb299f..4f13b925 100644 --- a/libhdt/src/hdt/ControlInformation.cpp +++ b/libhdt/src/hdt/ControlInformation.cpp @@ -178,7 +178,10 @@ size_t ControlInformation::load(const unsigned char *ptr, const unsigned char *m CRC16 crc; crc.update(&ptr[0], count); CHECKPTR(ptr,maxPtr, sizeof(crc16_t)); - const crc16_t filecrc = *((crc16_t *)&ptr[count]); + + crc16_t filecrc{}; + memcpy(&filecrc, &ptr[count], sizeof(filecrc)); + if(filecrc!=crc.getValue()) { throw std::runtime_error("CRC of control information does not match."); } diff --git a/libhdt/src/sequence/LogSequence.cpp b/libhdt/src/sequence/LogSequence.cpp index 54a2efa9..3c1bb173 100644 --- a/libhdt/src/sequence/LogSequence.cpp +++ b/libhdt/src/sequence/LogSequence.cpp @@ -29,7 +29,7 @@ * */ -#ifdef HAVE_CSD +#ifdef HAVE_CDS #include #include @@ -61,7 +61,7 @@ size_t LogSequence::get(size_t position) void LogSequence::add(IteratorUInt &elements) { - std::vector vector; + std::vector vector; size_t max = 0; while(elements.hasNext()) { @@ -69,7 +69,7 @@ void LogSequence::add(IteratorUInt &elements) if(element>((size_t)-1)) { throw std::out_of_range("Error, saving a value out of range"); } - vector.push_back(element); + vector.push_back(static_cast(element)); max = element > max ? element : max; } diff --git a/libhdt/src/sequence/LogSequence2.hpp b/libhdt/src/sequence/LogSequence2.hpp index be9d15c8..da2b3ed5 100644 --- a/libhdt/src/sequence/LogSequence2.hpp +++ b/libhdt/src/sequence/LogSequence2.hpp @@ -75,11 +75,14 @@ class LogSequence2 : public IntSequence { size_t i=bitPos/W; size_t j=bitPos%W; size_t result; + size_t value{}; + memcpy(&value, &data[i], sizeof(value)); if (j+bitsField <= W) { - result = (data[i] << (W-j-bitsField)) >> (W-bitsField); + result = (value << (W-j-bitsField)) >> (W-bitsField); } else { - result = data[i] >> j; - result = result | (data[i+1] << ( (W<<1) -j-bitsField)) >> (W-bitsField); + result = value >> j; + memcpy(&value, &data[i+1], sizeof(value)); + result = result | (value << ( (W<<1) -j-bitsField)) >> (W-bitsField); } return result; } diff --git a/libhdt/src/util/fileUtil.cpp b/libhdt/src/util/fileUtil.cpp index d3decef3..3f0d0c3f 100644 --- a/libhdt/src/util/fileUtil.cpp +++ b/libhdt/src/util/fileUtil.cpp @@ -187,6 +187,7 @@ DecompressStream::DecompressStream(const char *fileName) : in(NULL), filePipe(NU #ifdef HAVE_LIBZ in = gzStream = new igzstream(fileName); #else + close(); throw std::runtime_error("Support for GZIP was not compiled in this version. Please Decompress the file before importing it."); #endif } @@ -206,6 +207,7 @@ DecompressStream::DecompressStream(const char *fileName) : in(NULL), filePipe(NU if(pipeCommand.length()>0) { pipeCommand.append(fileName); if ((filePipe=popen(pipeCommand.c_str(),"r")) == NULL) { + close(); cerr << "Error creating pipe for command " << pipeCommand << endl; throw std::runtime_error("popen() failed to create pipe"); } @@ -217,20 +219,36 @@ DecompressStream::DecompressStream(const char *fileName) : in(NULL), filePipe(NU if (!in->good()) { + close(); cerr << "Error opening file " << fileName << " for parsing " << endl; throw std::runtime_error("Error opening file for parsing"); } #endif } +DecompressStream::~DecompressStream() { + close(); +} + void DecompressStream::close() { - if(fileStream) fileStream->close(); + if(fileStream) { + fileStream->close(); + fileStream = nullptr; + } #ifndef WIN32 - if(filePipe) pclose(filePipe); + if(filePipe) { + pclose(filePipe); + filePipe = nullptr; + } #endif #ifdef HAVE_LIBZ - if(gzStream) gzStream->close(); + if(gzStream) { + gzStream->close(); + gzStream = nullptr; + } #endif - delete in; - in=NULL; + if (in) { + delete in; + in=NULL; + } } diff --git a/libhdt/src/util/fileUtil.hpp b/libhdt/src/util/fileUtil.hpp index c3e7a5cd..63d7b46f 100644 --- a/libhdt/src/util/fileUtil.hpp +++ b/libhdt/src/util/fileUtil.hpp @@ -61,6 +61,7 @@ class DecompressStream { public: DecompressStream(const char *fileName); + ~DecompressStream(); std::istream *getStream() { return in; } From 5b1b910de26f5e52aaa7524e01c73915eae36372 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Fri, 29 Mar 2024 14:06:48 +0100 Subject: [PATCH 3/8] Changed HDTManager to use unique_ptr's --- configure.ac | 2 +- libhdt/include/HDTManager.hpp | 13 +++++++------ libhdt/src/hdt/HDTManager.cpp | 24 ++++++++++++------------ libhdt/tools/hdt2rdf.cpp | 3 +-- libhdt/tools/hdtSearch.cpp | 8 +++----- libhdt/tools/modifyHeader.cpp | 4 +--- libhdt/tools/rdf2hdt.cpp | 5 ++--- libhdt/tools/replaceHeader.cpp | 3 +-- 8 files changed, 28 insertions(+), 34 deletions(-) diff --git a/configure.ac b/configure.ac index 0b71ab1e..9f024b00 100644 --- a/configure.ac +++ b/configure.ac @@ -28,7 +28,7 @@ AC_MSG_CHECKING(whether to enable optimizations) AC_ARG_ENABLE([optimization], AS_HELP_STRING([--enable-optimization],[Build library with optimization parameters [default=yes]]), [AC_MSG_RESULT(${enableval})], - [CXXFLAGS="${CXXFLAGS} -g -O2 -std=c++11"] + [CXXFLAGS="${CXXFLAGS} -g -O2 -std=c++14"] [AC_MSG_RESULT(yes)]) AC_MSG_CHECKING(whether to build libcds) diff --git a/libhdt/include/HDTManager.hpp b/libhdt/include/HDTManager.hpp index 57911a75..90ae61dd 100644 --- a/libhdt/include/HDTManager.hpp +++ b/libhdt/include/HDTManager.hpp @@ -37,6 +37,7 @@ #include "HDTListener.hpp" #include +#include namespace hdt { @@ -49,7 +50,7 @@ class HDTManager { /** * Reads an HDT file into main memory. */ - static HDT *loadHDT(const char *file, ProgressListener *listener=NULL); + static std::unique_ptr loadHDT(const char *file, ProgressListener *listener=NULL); /** * Load an HDT File, and load/create additional indexes to support all kind of queries efficiently. @@ -58,17 +59,17 @@ class HDTManager { * @return * @throws IOException */ - static HDT *loadIndexedHDT(const char *hdtFileName, ProgressListener *listener=NULL); + static std::unique_ptr loadIndexedHDT(const char *hdtFileName, ProgressListener *listener=NULL); /** * Maps an HDT file. Faster to load, uses less memory, but may result in delays at access time. */ - static HDT *mapHDT(const char *file, ProgressListener *listener=NULL); + static std::unique_ptr mapHDT(const char *file, ProgressListener *listener=NULL); /** * Maps an HDT file and load/generate additional indexes to solve efficiently all queries. */ - static HDT *mapIndexedHDT(const char *file, ProgressListener *listener=NULL); + static std::unique_ptr mapIndexedHDT(const char *file, ProgressListener *listener=NULL); /** * Return an indexed HDT that is efficient for all kind of queries, given a (possibly) not indexed HDT. @@ -76,7 +77,7 @@ class HDTManager { * @param listener Listener to get notified of loading progress. Can be null if no notifications needed. * @return */ - static HDT *indexedHDT(HDT *hdt, ProgressListener *listener=NULL); + static void indexedHDT(HDT *hdt, ProgressListener *listener=NULL); /** * Create an HDT file from an RDF file. @@ -89,7 +90,7 @@ class HDTManager { * @throws IOException * @throws ParserException */ - static HDT *generateHDT(const char *rdfFileName, const char *baseURI, RDFNotation rdfNotation, HDTSpecification &hdtFormat, ProgressListener *listener=NULL); + static std::unique_ptr generateHDT(const char *rdfFileName, const char *baseURI, RDFNotation rdfNotation, HDTSpecification &hdtFormat, ProgressListener *listener=NULL); }; } diff --git a/libhdt/src/hdt/HDTManager.cpp b/libhdt/src/hdt/HDTManager.cpp index df942ae0..cec58dd9 100644 --- a/libhdt/src/hdt/HDTManager.cpp +++ b/libhdt/src/hdt/HDTManager.cpp @@ -29,26 +29,27 @@ #include #include #include "BasicHDT.hpp" +#include using namespace hdt; namespace hdt { -HDT *HDTManager::loadHDT(const char *file, ProgressListener *listener){ - BasicHDT *h = new BasicHDT(); +std::unique_ptr HDTManager::loadHDT(const char *file, ProgressListener *listener){ + auto h{std::make_unique()}; h->loadFromHDT(file, listener); return h; } -HDT *HDTManager::mapHDT(const char *file, ProgressListener *listener){ - BasicHDT *h = new BasicHDT(); +std::unique_ptr HDTManager::mapHDT(const char *file, ProgressListener *listener){ + auto h{std::make_unique()}; h->mapHDT(file, listener); return h; } -HDT *HDTManager::mapIndexedHDT(const char *file, ProgressListener *listener){ - BasicHDT *h = new BasicHDT(); +std::unique_ptr HDTManager::mapIndexedHDT(const char *file, ProgressListener *listener){ + auto h{std::make_unique()}; IntermediateListener iListener(listener); iListener.setRange(0,10); h->mapHDT(file, &iListener); @@ -58,8 +59,8 @@ HDT *HDTManager::mapIndexedHDT(const char *file, ProgressListener *listener){ return h; } -HDT *HDTManager::loadIndexedHDT(const char *file, ProgressListener *listener){ - BasicHDT *h = new BasicHDT(); +std::unique_ptr HDTManager::loadIndexedHDT(const char *file, ProgressListener *listener){ + auto h{std::make_unique()}; IntermediateListener iListener(listener); iListener.setRange(0,50); h->loadFromHDT(file, listener); @@ -69,14 +70,13 @@ HDT *HDTManager::loadIndexedHDT(const char *file, ProgressListener *listener){ return h; } -HDT *HDTManager::indexedHDT(HDT *hdt, ProgressListener *listener){ +void HDTManager::indexedHDT(HDT* hdt, ProgressListener *listener){ BasicHDT *bhdt = dynamic_cast(hdt); bhdt->loadOrCreateIndex(listener); - return bhdt; } -HDT *HDTManager::generateHDT(const char *rdfFileName, const char *baseURI, RDFNotation rdfNotation, HDTSpecification &hdtFormat, ProgressListener *listener){ - BasicHDT *hdt = new BasicHDT(hdtFormat); +std::unique_ptr HDTManager::generateHDT(const char *rdfFileName, const char *baseURI, RDFNotation rdfNotation, HDTSpecification &hdtFormat, ProgressListener *listener){ + auto hdt{std::make_unique(hdtFormat)}; hdt->loadFromRDF(rdfFileName, baseURI, rdfNotation, listener); return hdt; } diff --git a/libhdt/tools/hdt2rdf.cpp b/libhdt/tools/hdt2rdf.cpp index c394ad66..ab8fa5d8 100644 --- a/libhdt/tools/hdt2rdf.cpp +++ b/libhdt/tools/hdt2rdf.cpp @@ -118,7 +118,7 @@ int main(int argc, char **argv) { try { ProgressListener* progress = showProgress ? new StdoutProgressListener() : NULL; - HDT *hdt = HDTManager::mapHDT(inputFile.c_str(), progress); + auto hdt = HDTManager::mapHDT(inputFile.c_str(), progress); if(outputFile!="-") { RDFSerializer *serializer = RDFSerializer::getSerializer(outputFile.c_str(), notation); @@ -129,7 +129,6 @@ int main(int argc, char **argv) { hdt->saveToRDF(*serializer); delete serializer; } - delete hdt; delete progress; } catch (std::exception& e) { cerr << "ERROR: " << e.what() << endl; diff --git a/libhdt/tools/hdtSearch.cpp b/libhdt/tools/hdtSearch.cpp index 0c4a283e..8b361b8e 100644 --- a/libhdt/tools/hdtSearch.cpp +++ b/libhdt/tools/hdtSearch.cpp @@ -174,7 +174,7 @@ int main(int argc, char **argv) { try { StdoutProgressListener prog; - HDT *hdt = HDTManager::mapIndexedHDT(inputFile.c_str(), &prog); + auto hdt = HDTManager::mapIndexedHDT(inputFile.c_str(), &prog); ostream *out; ofstream outF; @@ -188,7 +188,7 @@ int main(int argc, char **argv) { if(query!="") { // Supplied query, search and exit. - iterate(hdt, (char*)query.c_str(), *out, measure, offset); + iterate(hdt.get(), (char*)query.c_str(), *out, measure, offset); } else { // No supplied query, show terminal. char line[1024*10]; @@ -207,7 +207,7 @@ int main(int argc, char **argv) { continue; } - iterate(hdt, line, *out, measure, offset); + iterate(hdt.get(), line, *out, measure, offset); cerr << ">> "; } @@ -216,8 +216,6 @@ int main(int argc, char **argv) { if(outputFile!="") { outF.close(); } - - delete hdt; } catch (std::exception& e) { cerr << "ERROR: " << e.what() << endl; return 1; diff --git a/libhdt/tools/modifyHeader.cpp b/libhdt/tools/modifyHeader.cpp index c3b88a1a..b4751b78 100644 --- a/libhdt/tools/modifyHeader.cpp +++ b/libhdt/tools/modifyHeader.cpp @@ -94,7 +94,7 @@ int main(int argc, char **argv) { try { // LOAD - HDT *hdt = HDTManager::mapHDT(inputFile); + auto hdt = HDTManager::mapHDT(inputFile); // Replace header Header *head = hdt->getHeader(); @@ -127,8 +127,6 @@ int main(int argc, char **argv) { } // SAVE hdt->saveToHDT(outputFile); - - delete hdt; } catch (std::exception& e) { cerr << "ERROR: " << e.what() << endl; return 1; diff --git a/libhdt/tools/rdf2hdt.cpp b/libhdt/tools/rdf2hdt.cpp index 2f60776c..b0359ce5 100644 --- a/libhdt/tools/rdf2hdt.cpp +++ b/libhdt/tools/rdf2hdt.cpp @@ -214,7 +214,7 @@ int main(int argc, char **argv) { StopWatch globalTimer; ProgressListener* progress = showProgress ? new StdoutProgressListener() : NULL; - HDT *hdt = HDTManager::generateHDT(inputFile.c_str(), baseUri.c_str(), notation, spec, progress); + auto hdt = HDTManager::generateHDT(inputFile.c_str(), baseUri.c_str(), notation, spec, progress); ofstream out; @@ -229,10 +229,9 @@ int main(int argc, char **argv) { vout << ") System(" << globalTimer.getSystemStr() << ")" << endl; if(generateIndex) { - hdt = HDTManager::indexedHDT(hdt, progress); + HDTManager::indexedHDT(hdt.get(), progress); } - delete hdt; delete progress; } catch (std::exception& e) { cerr << "ERROR: " << e.what() << endl; diff --git a/libhdt/tools/replaceHeader.cpp b/libhdt/tools/replaceHeader.cpp index 868762fe..f043b3f5 100644 --- a/libhdt/tools/replaceHeader.cpp +++ b/libhdt/tools/replaceHeader.cpp @@ -42,7 +42,7 @@ int main(int argc, char **argv) { try { // LOAD - HDT *hdt = HDTManager::mapHDT(inputFile); + auto hdt = HDTManager::mapHDT(inputFile); // Replace header Header *head= hdt->getHeader(); @@ -59,7 +59,6 @@ int main(int argc, char **argv) { // SAVE hdt->saveToHDT(outputFile); - delete hdt; } catch (std::exception& e) { cerr << "ERROR: " << e.what() << endl; return 1; From 2232909ea3c33a32be7f8463e45f873b6c3b2397 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Fri, 29 Mar 2024 14:08:30 +0100 Subject: [PATCH 4/8] Added bnode.prefix option for Serd parser --- libhdt/include/RDFParser.hpp | 2 +- libhdt/src/hdt/BasicHDT.cpp | 4 ++-- libhdt/src/rdf/RDFParser.cpp | 4 ++-- libhdt/src/rdf/RDFParserSerd.cpp | 4 +++- libhdt/src/rdf/RDFParserSerd.hpp | 3 ++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libhdt/include/RDFParser.hpp b/libhdt/include/RDFParser.hpp index fe220680..b4d79d50 100644 --- a/libhdt/include/RDFParser.hpp +++ b/libhdt/include/RDFParser.hpp @@ -55,7 +55,7 @@ class RDFParserCallback { virtual void doParse(const char *fileName, const char *baseUri, RDFNotation notation, bool ignoreErrors, RDFCallback *callback)=0; - static RDFParserCallback *getParserCallback(RDFNotation notation); + static RDFParserCallback *getParserCallback(RDFNotation notation, const std::string& bnode_prefix); }; class RDFParserPull: public IteratorTripleString { diff --git a/libhdt/src/hdt/BasicHDT.cpp b/libhdt/src/hdt/BasicHDT.cpp index c1225918..e4bddd76 100644 --- a/libhdt/src/hdt/BasicHDT.cpp +++ b/libhdt/src/hdt/BasicHDT.cpp @@ -217,7 +217,7 @@ void BasicHDT::loadDictionary(const char* fileName, const char* baseUri, RDFNota // Load data DictionaryLoader dictLoader(dict, &iListener); - RDFParserCallback *parser = RDFParserCallback::getParserCallback(notation); + RDFParserCallback *parser = RDFParserCallback::getParserCallback(notation, spec.getOrEmpty("bnode.prefix")); parser->doParse(fileName, baseUri, notation, true, &dictLoader); delete parser; @@ -285,7 +285,7 @@ void BasicHDT::loadTriples(const char* fileName, const char* baseUri, RDFNotatio TriplesLoader tripLoader(dictionary, triplesList, &iListener); RDFParserCallback *pars = RDFParserCallback::getParserCallback( - notation); + notation, spec.getOrEmpty("bnode.prefix")); pars->doParse(fileName, baseUri, notation, true, &tripLoader); delete pars; header->insert("_:statistics", HDTVocabulary::ORIGINAL_SIZE, tripLoader.getSize()); diff --git a/libhdt/src/rdf/RDFParser.cpp b/libhdt/src/rdf/RDFParser.cpp index fadd9004..370f74b7 100644 --- a/libhdt/src/rdf/RDFParser.cpp +++ b/libhdt/src/rdf/RDFParser.cpp @@ -12,14 +12,14 @@ namespace hdt { -RDFParserCallback *RDFParserCallback::getParserCallback(RDFNotation notation) { +RDFParserCallback *RDFParserCallback::getParserCallback(RDFNotation notation, const std::string& bnode_prefix) { #ifdef HAVE_SERD if(notation==NQUAD || // Deprecated: use `NQUADS' instead. notation==NQUADS || notation==NTRIPLES || notation==TRIG || notation==TURTLE) { - return new RDFParserSerd(); + return new RDFParserSerd(bnode_prefix); } #else throw ParseException("No Parser available for input RDF Format"); diff --git a/libhdt/src/rdf/RDFParserSerd.cpp b/libhdt/src/rdf/RDFParserSerd.cpp index a2463cc8..fe8636f4 100644 --- a/libhdt/src/rdf/RDFParserSerd.cpp +++ b/libhdt/src/rdf/RDFParserSerd.cpp @@ -143,7 +143,8 @@ struct LibzSerdStream { #endif -RDFParserSerd::RDFParserSerd() : numByte(0) +RDFParserSerd::RDFParserSerd(const std::string& bnode_prefix) + : numByte(0), bnode_prefix(bnode_prefix) { } @@ -184,6 +185,7 @@ void RDFParserSerd::doParse(const char *fileName, const char *baseUri, RDFNotati NULL); serd_reader_set_error_sink(reader, hdtserd_on_error, NULL); + serd_reader_add_blank_prefix(reader, (const uint8_t*)bnode_prefix.c_str()); const uint8_t* input=serd_uri_to_path((const uint8_t *)fileName); diff --git a/libhdt/src/rdf/RDFParserSerd.hpp b/libhdt/src/rdf/RDFParserSerd.hpp index d5d8613d..be857b79 100644 --- a/libhdt/src/rdf/RDFParserSerd.hpp +++ b/libhdt/src/rdf/RDFParserSerd.hpp @@ -20,13 +20,14 @@ class RDFParserSerd : public RDFParserCallback { RDFCallback *callback; string error; uint64_t numByte; + std::string bnode_prefix; string getString(const SerdNode *term); string getStringObject(const SerdNode *term, const SerdNode *dataType, const SerdNode *lang); SerdSyntax getParserType(RDFNotation notation); public: - RDFParserSerd(); + RDFParserSerd(const std::string& bnode_prefix); virtual ~RDFParserSerd(); void doParse(const char *fileName, const char *baseUri, RDFNotation notation, bool ignoreErrors, RDFCallback *callback); From ec6ba67d16819c5da808476e1d10f4ebd87e0cdb Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Fri, 29 Mar 2024 14:14:45 +0100 Subject: [PATCH 5/8] Safety check for HDTSpecification::get --- libhdt/src/hdt/HDTSpecification.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libhdt/src/hdt/HDTSpecification.cpp b/libhdt/src/hdt/HDTSpecification.cpp index dbf6d2b1..3852fbea 100644 --- a/libhdt/src/hdt/HDTSpecification.cpp +++ b/libhdt/src/hdt/HDTSpecification.cpp @@ -59,11 +59,17 @@ void HDTSpecification::setOptions(const std::string& options) { } } +const std::string emptyString = ""; + const std::string& HDTSpecification::get(const std::string& key) { - return map.at(key); -} + auto it = map.find(key); -const std::string emptyString = ""; + if (it == map.end()) { + return emptyString; + } + + return it->second; +} const std::string& HDTSpecification::getOrEmpty(const std::string& key) { From aff3dc8490cf7059301c73dcd3cca67514b1a8e0 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Tue, 2 Apr 2024 11:33:48 +0200 Subject: [PATCH 6/8] Implemented loading of HDTs via in-memory stream --- libhdt/include/HDTManager.hpp | 29 ++++ libhdt/src/hdt/BasicHDT.cpp | 276 ++++++++++++++++++++++++++++++++++ libhdt/src/hdt/BasicHDT.hpp | 9 ++ libhdt/src/hdt/HDTManager.cpp | 21 +++ libhdt/src/util/fileUtil.cpp | 16 ++ libhdt/src/util/fileUtil.hpp | 2 + libhdt/third/memstream.hpp | 53 +++++++ 7 files changed, 406 insertions(+) create mode 100644 libhdt/third/memstream.hpp diff --git a/libhdt/include/HDTManager.hpp b/libhdt/include/HDTManager.hpp index 90ae61dd..cb08900c 100644 --- a/libhdt/include/HDTManager.hpp +++ b/libhdt/include/HDTManager.hpp @@ -61,6 +61,35 @@ class HDTManager { */ static std::unique_ptr loadIndexedHDT(const char *hdtFileName, ProgressListener *listener=NULL); + /** + * Load an HDT File from memory, and load/create additional indexes to support all kind of queries efficiently. + * @param hdtBuffer + * @param hdtBufferLen + * @param hdtIndexBuffer + * @param hdtIndexBufferLen + * @param listener Listener to get notified of loading progress. Can be null if no notifications needed. + * @return + * @throws IOException + */ + static std::unique_ptr loadIndexedHDTFromMemory( + const char *hdtBuffer, + size_t hdtBufferLen, + const char* hdtIndexBuffer, + size_t hdtIndexBufferLen, + ProgressListener *listener=NULL); + + /** + * Load multiple HDT Files stored in memory buffers, and load/create additional indexes to support all kind of queries efficiently. + * @param buffer_list List of pairs + * @param baseUri + * @param listener + * @return + * @throws IOException + */ + static std::unique_ptr loadFromSeveralHDTInMemory( + const std::vector>& buffer_list, + string baseUri, ProgressListener * listener=NULL); + /** * Maps an HDT file. Faster to load, uses less memory, but may result in delays at access time. */ diff --git a/libhdt/src/hdt/BasicHDT.cpp b/libhdt/src/hdt/BasicHDT.cpp index e4bddd76..dbbbeff7 100644 --- a/libhdt/src/hdt/BasicHDT.cpp +++ b/libhdt/src/hdt/BasicHDT.cpp @@ -449,6 +449,38 @@ void BasicHDT::addDictionaryFromHDT(const char *fileName, ModifiableDictionary * } } +void BasicHDT::addDictionaryFromHDT(const char * buffer, size_t bufferLen, ModifiableDictionary * dict, ProgressListener * listener) +{ + BasicHDT hdt; + hdt.mapHDT(buffer, bufferLen, listener); + + Dictionary *otherDict = hdt.getDictionary(); + + char str[100]; + + for(long long int i=0;igetNsubjects();i++) { + dict->insert(otherDict->idToString(i+1, SUBJECT), SUBJECT); + + if ((listener != NULL) && (i % 100000) == 0) { + sprintf(str, "%lld subjects added.", i); + listener->notifyProgress((i*100)/otherDict->getNsubjects(), str); + } + } + + for(long long int i=0;igetNpredicates();i++) { + dict->insert(otherDict->idToString(i+1, PREDICATE), PREDICATE); + } + + for(long long int i=0;igetNobjects();i++) { + dict->insert(otherDict->idToString(i+1, OBJECT), OBJECT); + + if ((listener != NULL) && (i % 100000) == 0) { + sprintf(str, "%lld objects added.", i); + listener->notifyProgress((i*100)/otherDict->getNobjects(), str); + } + } +} + void BasicHDT::loadDictionaryFromHDTs(const char** fileName, size_t numFiles, const char* baseUri, ProgressListener* listener) { @@ -486,6 +518,42 @@ void BasicHDT::loadDictionaryFromHDTs(const char** fileName, size_t numFiles, co } } +void BasicHDT::loadDictionaryFromHDTs(const std::vector>& hdt_list, const char * baseUri, ProgressListener * listener) +{ + StopWatch st; + IntermediateListener iListener(listener); + + // Create temporary dictionary + ModifiableDictionary *dict = getLoadDictionary(); + dict->startProcessing(); + try { + NOTIFY(listener, "Loading Dictionary", 0, 100); + iListener.setRange(0, 80); + + for (auto& hdt_file : hdt_list) { + addDictionaryFromHDT(hdt_file.first, hdt_file.second, dict, &iListener); + } + + iListener.setRange(80, 90); + dict->stopProcessing(&iListener); + + // Convert to final format + dictionary->import(dict); + + delete dict; + } catch (std::exception& e) { + cerr << "Catch exception dictionary: " << e.what() << endl; + delete dict; + throw; +#ifndef WIN32 + } catch (char *e) { + cout << "Catch exception dictionary: " << e << endl; + delete dict; + throw e; +#endif + } +} + void BasicHDT::loadTriplesFromHDTs(const char** fileNames, size_t numFiles, const char* baseUri, ProgressListener* listener) { // Generate Triples ModifiableTriples* triplesList = new TriplesList(spec); @@ -616,6 +684,135 @@ void BasicHDT::loadTriplesFromHDTs(const char** fileNames, size_t numFiles, cons } +void BasicHDT::loadTriplesFromHDTs(const std::vector>& hdt_list, const char * baseUri, ProgressListener * listener) +{ + // Generate Triples + ModifiableTriples* triplesList = new TriplesList(spec); + //ModifiableTriples *triplesList = new TriplesKyoto(spec); + //ModifiableTriples *triplesList = new TripleListDisk(); + StopWatch st; + IntermediateListener iListener(listener); + try { + NOTIFY(listener, "Loading Triples", 0, 100); + iListener.setRange(0, 60); + + triplesList->startProcessing(&iListener); + + TriplesLoader tripLoader(dictionary, triplesList, &iListener); + + // FIXME: Import from files + + uint64_t totalOriginalSize=0; + BasicHDT hdt; + + for (auto& hdt_file : hdt_list) { + hdt.mapHDT(hdt_file.first, hdt_file.second); + Dictionary *dict = hdt.getDictionary(); + + // Create mapping arrays + size_t nsubjects = dict->getNsubjects(); + LogSequence2 subjectMap(bits(dictionary->getNsubjects()), nsubjects); + subjectMap.resize(nsubjects); + for(size_t i=0;iidToString(i+1, SUBJECT); + size_t newid = dictionary->stringToId(str, SUBJECT); + subjectMap.set(i, newid); + } + + size_t npredicates = dict->getNpredicates(); + LogSequence2 predicateMap(bits(dictionary->getNpredicates()), npredicates); + predicateMap.resize(npredicates); + for(size_t i=0;iidToString(i+1, PREDICATE); + size_t newid = dictionary->stringToId(str, PREDICATE); + predicateMap.set(i, newid); + } + + size_t nobjects = dict->getNobjects(); + LogSequence2 objectMap(bits(dictionary->getNobjects()), nobjects); + objectMap.resize(nobjects); + for(size_t i=0;iidToString(i+1, OBJECT); + size_t newid = dictionary->stringToId(str, OBJECT); + objectMap.set(i, newid); + } + + totalOriginalSize += hdt.getHeader()->getPropertyLong("_:statistics", HDTVocabulary::ORIGINAL_SIZE.c_str()); + + size_t numtriples = hdt.getTriples()->getNumberOfElements(); + IteratorTripleID *it = hdt.getTriples()->searchAll(); + + TripleID newTid; + char str[100]; + long long int j = 0; + while(it->hasNext()) { + TripleID *tid = it->next(); + + newTid.setAll( + subjectMap.get(tid->getSubject()-1), + predicateMap.get(tid->getPredicate()-1), + objectMap.get(tid->getObject()-1) + ); + + triplesList->insert(newTid); + + if ((listener != NULL) && (j % 100000) == 0) { + sprintf(str, "%lld triples added.", j); + listener->notifyProgress((j*100)/numtriples, str); + } + j++; + } + delete it; + } + + triplesList->stopProcessing(&iListener); + + // SORT & Duplicates + string ord = spec.getOrEmpty("triplesOrder"); + + TripleComponentOrder order = parseOrder(ord.c_str()); + if (order == Unknown) { + order = SPO; + } + + iListener.setRange(80, 85); + triplesList->sort(order, &iListener); + + iListener.setRange(85, 90); + triplesList->removeDuplicates(&iListener); + + header->insert("_:statistics", HDTVocabulary::ORIGINAL_SIZE, totalOriginalSize); + +#ifndef WIN32 + } catch (char *e) { + cout << "Catch exception triples" << e << endl; + delete triplesList; + throw; +#else + } catch (std::exception& e) { + // cerr << "Catch exception triples" << e << endl; + delete triplesList; + throw; +#endif + } + if (triples->getType() == triplesList->getType()) { + delete triples; + triples = triplesList; + } else { + iListener.setRange(90, 100); + try { + triples->load(*triplesList, &iListener); + } catch (std::exception& e) { + delete triplesList; + throw; + } + delete triplesList; + } + + //cerr << triples->getNumberOfElements() << " triples added in " << st << endl << endl; + +} + void BasicHDT::loadFromSeveralHDT(const char **fileNames, size_t numFiles, string baseUri, ProgressListener *listener) { try { @@ -650,6 +847,41 @@ void BasicHDT::loadFromSeveralHDT(const char **fileNames, size_t numFiles, strin } } +void BasicHDT::loadFromSeveralHDT( + const std::vector>& buffer_list, + string baseUri, ProgressListener * listener) +{ + try { + // Make sure that URI starts and ends with <> + if(baseUri.at(0)!='<') + baseUri = '<'+baseUri; + if(baseUri.at(baseUri.length()-1)!='>') + baseUri.append(">"); + + IntermediateListener iListener(listener); + + iListener.setRange(0,50); + loadDictionaryFromHDTs(buffer_list, baseUri.c_str(), &iListener); + + iListener.setRange(50,99); + loadTriplesFromHDTs(buffer_list, baseUri.c_str(), &iListener); + + fillHeader(baseUri); + + }catch (std::exception& e) { + // cerr << "Catch exception load: " << e << endl; + deleteComponents(); + createComponents(); + throw; +#ifndef WIN32 + } catch (char *e) { + cout << "Catch exception load: " << e << endl; + deleteComponents(); + createComponents(); + throw e; +#endif + } +} void BasicHDT::saveToRDF(RDFSerializer &serializer, ProgressListener *listener) @@ -671,6 +903,19 @@ void BasicHDT::loadFromHDT(const char *fileName, ProgressListener *listener) { stream.close(); } +void BasicHDT::loadFromHDT(const char *buffer, size_t bufferLen, ProgressListener *listener) +{ + this->fileName = "memory_stream.tmp"; + + DecompressStream stream(buffer, bufferLen); + istream *in = stream.getStream(); + if(!in->good()){ + throw std::runtime_error("Error opening buffer to load HDT."); + } + this->loadFromHDT(*in, listener); + stream.close(); +} + void BasicHDT::loadHeader(const char *fileName, ProgressListener *listener) { this->fileName = fileName; @@ -800,6 +1045,22 @@ void BasicHDT::mapHDT(const char *fileNameChar, ProgressListener *listener) { this->loadMMap(ptr, ptr+mappedSize, &iListener); } +void BasicHDT::mapHDT(const char * buffer, size_t bufferLen, ProgressListener * listener) +{ + IntermediateListener iListener(listener); + + // Clean previous + if(mappedHDT!=NULL) { + delete mappedHDT; + mappedHDT = nullptr; + } + + unsigned char* ptr = reinterpret_cast(const_cast(buffer)); + + // Load + this->loadMMap(ptr, ptr+bufferLen, &iListener); +} + size_t BasicHDT::loadMMap(unsigned char *ptr, unsigned char *ptrMax, ProgressListener *listener) { size_t count=0; ControlInformation controlInformation; @@ -930,6 +1191,21 @@ void BasicHDT::loadOrCreateIndex(ProgressListener *listener) { } } +void BasicHDT::loadOrCreateIndex(const char* indexBuffer, size_t indexBufferLen, ProgressListener *listener) +{ + memstream in(indexBuffer, indexBufferLen); + + if (in.good()) { + ControlInformation ci; + ci.load(in); + triples->loadIndex(in, ci, listener); + } else { + IntermediateListener iListener(listener); + iListener.setRange(0,100); + triples->generateIndex(&iListener); + } +} + void BasicHDT::saveIndex(ProgressListener *listener) { if(this->fileName.size()==0) { cerr << "Cannot save Index if the HDT is not saved" << endl; diff --git a/libhdt/src/hdt/BasicHDT.hpp b/libhdt/src/hdt/BasicHDT.hpp index 23145ade..034d60c9 100644 --- a/libhdt/src/hdt/BasicHDT.hpp +++ b/libhdt/src/hdt/BasicHDT.hpp @@ -56,8 +56,11 @@ class BasicHDT : public HDT { void loadTriples(const char *fileName, const char *baseUri, RDFNotation notation, ProgressListener *listener); void addDictionaryFromHDT(const char *fileName, ModifiableDictionary *dict, ProgressListener *listener=NULL); + void addDictionaryFromHDT(const char* buffer, size_t bufferLen, ModifiableDictionary *dict, ProgressListener *listener=NULL); void loadDictionaryFromHDTs(const char** fileName, size_t numFiles, const char* baseUri, ProgressListener* listener=NULL); + void loadDictionaryFromHDTs(const std::vector>& hdt_list, const char* baseUri, ProgressListener* listener=NULL); void loadTriplesFromHDTs(const char** fileNames, size_t numFiles, const char* baseUri, ProgressListener* listener=NULL); + void loadTriplesFromHDTs(const std::vector>& hdt_list, const char* baseUri, ProgressListener* listener=NULL); void fillHeader(const string &baseUri); @@ -97,16 +100,21 @@ class BasicHDT : public HDT { * @param input */ void loadFromHDT(const char *fileName, ProgressListener *listener = NULL); + void loadFromHDT(const char *buffer, size_t bufferLen, ProgressListener *listener = NULL); void loadHeader(const char *fileName, ProgressListener *listener); void loadFromSeveralHDT(const char **fileNames, size_t numFiles, string baseUri, ProgressListener *listener=NULL); + void loadFromSeveralHDT( + const std::vector>& buffer_list, + string baseUri, ProgressListener *listener=NULL); /** * Load an HDT from a file, using memory mapping * @param input */ void mapHDT(const char *fileName, ProgressListener *listener = NULL); + void mapHDT(const char *buffer, size_t bufferLen, ProgressListener *listener = NULL); /** * @param output @@ -125,6 +133,7 @@ class BasicHDT : public HDT { void saveToHDT(const char *fileName, ProgressListener *listener = NULL); void loadOrCreateIndex(ProgressListener *listener = NULL); + void loadOrCreateIndex(const char* indexBuffer, size_t indexBufferLen, ProgressListener *listener = NULL); void saveIndex(ProgressListener *listener = NULL); diff --git a/libhdt/src/hdt/HDTManager.cpp b/libhdt/src/hdt/HDTManager.cpp index cec58dd9..2e97acf1 100644 --- a/libhdt/src/hdt/HDTManager.cpp +++ b/libhdt/src/hdt/HDTManager.cpp @@ -42,6 +42,15 @@ std::unique_ptr HDTManager::loadHDT(const char *file, ProgressListener *lis return h; } +std::unique_ptr HDTManager::loadFromSeveralHDTInMemory( + const std::vector>& buffer_list, + string baseUri, ProgressListener * listener) +{ + auto h{std::make_unique()}; + h->loadFromSeveralHDT(buffer_list, baseUri, listener); + return h; +} + std::unique_ptr HDTManager::mapHDT(const char *file, ProgressListener *listener){ auto h{std::make_unique()}; h->mapHDT(file, listener); @@ -70,6 +79,18 @@ std::unique_ptr HDTManager::loadIndexedHDT(const char *file, ProgressListen return h; } +std::unique_ptr HDTManager::loadIndexedHDTFromMemory(const char *hdtBuffer, size_t hdtBufferLen, const char* hdtIndexBuffer, size_t hdtIndexBufferLen, ProgressListener *listener) +{ + auto h{std::make_unique()}; + IntermediateListener iListener(listener); + iListener.setRange(0,50); + h->loadFromHDT(hdtBuffer, hdtBufferLen, listener); + + iListener.setRange(50,100); + h->loadOrCreateIndex(hdtIndexBuffer, hdtIndexBufferLen, listener); + return h; +} + void HDTManager::indexedHDT(HDT* hdt, ProgressListener *listener){ BasicHDT *bhdt = dynamic_cast(hdt); bhdt->loadOrCreateIndex(listener); diff --git a/libhdt/src/util/fileUtil.cpp b/libhdt/src/util/fileUtil.cpp index 3f0d0c3f..5a43c4f3 100644 --- a/libhdt/src/util/fileUtil.cpp +++ b/libhdt/src/util/fileUtil.cpp @@ -226,6 +226,22 @@ DecompressStream::DecompressStream(const char *fileName) : in(NULL), filePipe(NU #endif } +DecompressStream::DecompressStream(const char *buffer, size_t len) : in(NULL), filePipe(NULL), fileStream(NULL) +{ +#ifdef HAVE_LIBZ + gzStream = NULL; +#endif + + in = new memstream(buffer, len); + + if (!in->good()) + { + close(); + cerr << "Error creating memory stream for parsing " << endl; + throw std::runtime_error("Error creating memory stream for parsing"); + } +} + DecompressStream::~DecompressStream() { close(); } diff --git a/libhdt/src/util/fileUtil.hpp b/libhdt/src/util/fileUtil.hpp index 63d7b46f..1817ae14 100644 --- a/libhdt/src/util/fileUtil.hpp +++ b/libhdt/src/util/fileUtil.hpp @@ -36,6 +36,7 @@ #include "../third/gzstream.h" #include "../third/fdstream.hpp" +#include "../third/memstream.hpp" #include @@ -61,6 +62,7 @@ class DecompressStream { public: DecompressStream(const char *fileName); + DecompressStream(const char *buffer, size_t len); ~DecompressStream(); std::istream *getStream() { return in; diff --git a/libhdt/third/memstream.hpp b/libhdt/third/memstream.hpp new file mode 100644 index 00000000..bdb59509 --- /dev/null +++ b/libhdt/third/memstream.hpp @@ -0,0 +1,53 @@ +#ifndef LIBHDT_THIRD_MEMSTREAM_H +#define LIBHDT_THIRD_MEMSTREAM_H + +#include +#include +#include +// for EOF: +#include +// for memmove(): +#include + + +// low-level read and write functions +#ifdef _MSC_VER +# include +#else +# include +#endif + +class memstream : public std::istream { +public: + memstream(const char* buffer, size_t size) + : std::istream(&_buffer), _buffer(buffer, size) { + rdbuf(&_buffer); + } + +private: + class Buffer : public std::streambuf { + public: + Buffer(const char* buffer, size_t size) { + setg(const_cast(buffer), const_cast(buffer), const_cast(buffer + size)); + } + + std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override { + if (way == std::ios_base::cur) { + gbump(static_cast(off)); + } else if (way == std::ios_base::end) { + setg(eback(), egptr() + off, egptr()); + } else if (way == std::ios_base::beg) { + setg(eback(), eback() + off, egptr()); + } + return gptr() - eback(); + } + + std::streampos seekpos(std::streampos sp, std::ios_base::openmode which) override { + return seekoff(sp, std::ios_base::beg, which); + } + }; + + Buffer _buffer; +}; + +#endif // LIBHDT_THIRD_MEMSTREAM_H From b985f30c331a50b51aff79cb8746b5f8360e9f94 Mon Sep 17 00:00:00 2001 From: Giuseppe Picciuca Date: Mon, 6 May 2024 14:14:32 +0200 Subject: [PATCH 7/8] Stripped LibCDS and updated Copyright headers in modified files --- .gitignore | 2 - .travis.yml | 4 - Dockerfile | 1 - Makefile.am | 2 +- configure.ac | 11 - hdt-it/.cproject | 42 - hdt-it/.gitignore | 8 - hdt-it/.project | 27 - hdt-it/Camera.cpp | 249 ---- hdt-it/Camera.h | 77 -- hdt-it/Color.cpp | 157 --- hdt-it/Color.h | 49 - hdt-it/Info.plist | 58 - hdt-it/LICENSE | 280 ----- hdt-it/README.md | 73 -- hdt-it/StopWatch.cpp | 170 --- hdt-it/StopWatch.hpp | 61 - hdt-it/abouthdt.cpp | 14 - hdt-it/abouthdt.hpp | 22 - hdt-it/abouthdt.ui | 173 --- hdt-it/colors.hpp | 29 - hdt-it/constants.h | 39 - hdt-it/createdmg.sh | 72 -- hdt-it/dictionarysuggestions.cpp | 186 --- hdt-it/dictionarysuggestions.hpp | 39 - hdt-it/doc/hdtit.png | Bin 184528 -> 0 bytes hdt-it/doc/manual.html | 88 -- hdt-it/doc/matrix.png | Bin 98639 -> 0 bytes hdt-it/editreset.png | Bin 1230 -> 0 bytes hdt-it/hdt-it.pro | 135 -- hdt-it/hdt-it_es.qm | Bin 23805 -> 0 bytes hdt-it/hdt-it_es.ts | 906 -------------- hdt-it/hdtcachedinfo.cpp | 155 --- hdt-it/hdtcachedinfo.hpp | 38 - hdt-it/hdtcontroller.cpp | 369 ------ hdt-it/hdtcontroller.hpp | 103 -- hdt-it/hdtico.icns | Bin 168938 -> 0 bytes hdt-it/hdtico.rc | 1 - hdt-it/hdtit.cpp | 400 ------ hdt-it/hdtit.hpp | 78 -- hdt-it/hdtit.ui | 875 ------------- hdt-it/hdtoperation.cpp | 284 ----- hdt-it/hdtoperation.hpp | 71 -- hdt-it/hdtresources.qrc | 7 - hdt-it/hdtspecform.cpp | 180 --- hdt-it/hdtspecform.hpp | 38 - hdt-it/hdtspecform.ui | 361 ------ hdt-it/hdtsummarygenerator.cpp | 109 -- hdt-it/hdtsummarygenerator.hpp | 15 - hdt-it/hdtwinico.ico | Bin 36098 -> 0 bytes hdt-it/hdtwinico2.ico | Bin 38462 -> 0 bytes hdt-it/headermodel.cpp | 174 --- hdt-it/headermodel.hpp | 38 - hdt-it/loading.gif | Bin 2465 -> 0 bytes hdt-it/logo-hdt.png | Bin 43732 -> 0 bytes hdt-it/logo-hdt2.png | Bin 46972 -> 0 bytes hdt-it/main.cpp | 39 - hdt-it/matrixviewwidget.cpp | 501 -------- hdt-it/matrixviewwidget.hpp | 81 -- hdt-it/myapplication.cpp | 45 - hdt-it/myapplication.hpp | 24 - hdt-it/predicatestatus.cpp | 97 -- hdt-it/predicatestatus.hpp | 39 - hdt-it/qclearlineedit.cpp | 48 - hdt-it/qclearlineedit.hpp | 30 - hdt-it/regexmodel.cpp | 132 -- hdt-it/regexmodel.hpp | 37 - hdt-it/resultcounter.cpp | 47 - hdt-it/resultcounter.hpp | 30 - hdt-it/searchresultsmodel.cpp | 179 --- hdt-it/searchresultsmodel.hpp | 39 - hdt-it/sparqlform.cpp | 27 - hdt-it/sparqlform.hpp | 28 - hdt-it/sparqlform.ui | 112 -- hdt-it/sparqlmodel.cpp | 155 --- hdt-it/sparqlmodel.hpp | 32 - hdt-it/stringutils.cpp | 48 - hdt-it/stringutils.hpp | 18 - hdt-it/triplecomponentmodel.cpp | 146 --- hdt-it/triplecomponentmodel.hpp | 33 - lib/.gitignore | 2 - lib/Makefile.in | 803 ------------ libcds/COPYRIGHT | 504 -------- libcds/Changelog | 38 - libcds/Doxyfile | 307 ----- libcds/Makefile.am | 172 --- libcds/README | 12 - libcds/cds.pc.in | 11 - libcds/docs/delete_me | 0 libcds/include/Array.h | 184 --- libcds/include/BitSequence.h | 130 -- libcds/include/BitSequenceBuilder.h | 59 - libcds/include/BitSequenceBuilderDArray.h | 47 - libcds/include/BitSequenceBuilderRG.h | 46 - libcds/include/BitSequenceBuilderRRR.h | 48 - libcds/include/BitSequenceBuilderSDArray.h | 47 - libcds/include/BitSequenceDArray.h | 74 -- libcds/include/BitSequenceRG.h | 101 -- libcds/include/BitSequenceRRR.h | 126 -- libcds/include/BitSequenceSDArray.h | 60 - libcds/include/BitString.h | 114 -- libcds/include/BitmapsSequence.h | 73 -- libcds/include/Coder.h | 44 - libcds/include/HuffmanCoder.h | 77 -- libcds/include/LCP.h | 82 -- libcds/include/LCP_DAC.h | 53 - libcds/include/LCP_DAC_VAR.h | 62 - libcds/include/LCP_FMN.h | 70 -- libcds/include/LCP_PT.h | 62 - libcds/include/LCP_PhiSpare.h | 52 - libcds/include/LCP_Sad.h | 65 - libcds/include/LCP_naive.h | 57 - libcds/include/Mapper.h | 70 -- libcds/include/MapperCont.h | 64 - libcds/include/MapperNone.h | 51 - libcds/include/MapperRev.h | 61 - libcds/include/NPR.h | 63 - libcds/include/NPR_CN.h | 80 -- libcds/include/NPR_FMN.h | 69 - libcds/include/NSV.h | 68 - libcds/include/PSV.h | 67 - libcds/include/Permutation.h | 75 -- libcds/include/PermutationBuilder.h | 46 - libcds/include/PermutationBuilderMRRR.h | 42 - libcds/include/PermutationBuilderWT.h | 39 - libcds/include/PermutationMRRR.h | 58 - libcds/include/PermutationWT.h | 66 - libcds/include/RMQ_succinct.h | 111 -- libcds/include/RMQ_succinct_lcp.h | 113 -- libcds/include/Sequence.h | 111 -- libcds/include/SequenceAlphPart.h | 83 -- libcds/include/SequenceBuilder.h | 53 - libcds/include/SequenceBuilderAlphPart.h | 45 - libcds/include/SequenceBuilderGMR.h | 45 - libcds/include/SequenceBuilderGMRChunk.h | 45 - libcds/include/SequenceBuilderStr.h | 46 - libcds/include/SequenceBuilderWaveletMatrix.h | 45 - libcds/include/SequenceBuilderWaveletTree.h | 46 - .../SequenceBuilderWaveletTreeNoptrs.h | 45 - .../SequenceBuilderWaveletTreeNoptrsS.h | 45 - libcds/include/SequenceGMR.h | 72 -- libcds/include/SequenceGMRChunk.h | 80 -- libcds/include/SuffixTree.h | 102 -- libcds/include/SuffixTreeY.h | 119 -- libcds/include/TableOffsetRRR.h | 109 -- libcds/include/TextIndex.h | 107 -- libcds/include/TextIndexCSA.h | 109 -- libcds/include/WaveletMatrix.h | 95 -- libcds/include/WaveletTree.h | 114 -- libcds/include/WaveletTreeNoptrs.h | 115 -- libcds/include/WaveletTreeNoptrsS.h | 95 -- libcds/include/comparray4.h | 88 -- libcds/include/cppUtils.h | 94 -- libcds/include/factorization.h | 59 - libcds/include/factorization_var.h | 68 - libcds/include/huff.h | 94 -- libcds/include/interface.h | 116 -- libcds/include/libcdsBasics.h | 253 ---- libcds/include/libcdsSDArray.h | 187 --- libcds/include/libcdsTrees.h | 120 -- libcds/include/mmap.h | 62 - libcds/include/perm.h | 95 -- libcds/include/sdarraySadakane.h | 80 -- libcds/include/timing.h | 46 - libcds/include/wt_coder.h | 75 -- libcds/include/wt_coder_binary.h | 61 - libcds/include/wt_coder_huff.h | 61 - libcds/include/wt_node.h | 60 - libcds/include/wt_node_internal.h | 61 - libcds/include/wt_node_leaf.h | 58 - libcds/src/static/bitsequence/BitSequence.cpp | 157 --- .../bitsequence/BitSequenceBuilderDArray.cpp | 43 - .../bitsequence/BitSequenceBuilderRG.cpp | 41 - .../bitsequence/BitSequenceBuilderRRR.cpp | 41 - .../bitsequence/BitSequenceBuilderSDArray.cpp | 43 - .../static/bitsequence/BitSequenceDArray.cpp | 337 ----- .../src/static/bitsequence/BitSequenceRG.cpp | 377 ------ .../src/static/bitsequence/BitSequenceRRR.cpp | 430 ------- .../static/bitsequence/BitSequenceSDArray.cpp | 119 -- .../src/static/bitsequence/TableOffsetRRR.cpp | 124 -- .../static/bitsequence/sdarraySadakane.cpp | 589 --------- libcds/src/static/coders/HuffmanCoder.cpp | 108 -- libcds/src/static/coders/huff.cpp | 248 ---- libcds/src/static/mapper/Makefile | 3 - libcds/src/static/mapper/Mapper.cpp | 53 - libcds/src/static/mapper/MapperCont.cpp | 88 -- libcds/src/static/mapper/MapperNone.cpp | 46 - libcds/src/static/mapper/MapperRev.cpp | 81 -- libcds/src/static/permutation/Permutation.cpp | 79 -- .../permutation/PermutationBuilderMRRR.cpp | 41 - .../permutation/PermutationBuilderWT.cpp | 27 - .../static/permutation/PermutationMRRR.cpp | 68 - .../src/static/permutation/PermutationWT.cpp | 89 -- libcds/src/static/permutation/perm.cpp | 241 ---- .../src/static/sequence/BitmapsSequence.cpp | 175 --- libcds/src/static/sequence/Sequence.cpp | 97 -- .../src/static/sequence/SequenceAlphPart.cpp | 407 ------ .../sequence/SequenceBuilderAlphPart.cpp | 46 - .../static/sequence/SequenceBuilderGMR.cpp | 62 - .../sequence/SequenceBuilderGMRChunk.cpp | 46 - .../static/sequence/SequenceBuilderStr.cpp | 320 ----- .../sequence/SequenceBuilderWaveletMatrix.cpp | 45 - .../sequence/SequenceBuilderWaveletTree.cpp | 70 -- .../SequenceBuilderWaveletTreeNoptrs.cpp | 45 - .../SequenceBuilderWaveletTreeNoptrsS.cpp | 46 - libcds/src/static/sequence/SequenceGMR.cpp | 232 ---- .../src/static/sequence/SequenceGMRChunk.cpp | 192 --- libcds/src/static/sequence/WaveletMatrix.cpp | 363 ------ libcds/src/static/sequence/WaveletTree.cpp | 181 --- .../src/static/sequence/WaveletTreeNoptrs.cpp | 572 --------- .../static/sequence/WaveletTreeNoptrsS.cpp | 393 ------ libcds/src/static/sequence/wt_coder.cpp | 50 - .../src/static/sequence/wt_coder_binary.cpp | 96 -- libcds/src/static/sequence/wt_coder_huff.cpp | 117 -- libcds/src/static/sequence/wt_node.cpp | 38 - .../src/static/sequence/wt_node_internal.cpp | 281 ----- libcds/src/static/sequence/wt_node_leaf.cpp | 89 -- libcds/src/static/suffixtree/LCP.cpp | 117 -- libcds/src/static/suffixtree/LCP_DAC.cpp | 93 -- libcds/src/static/suffixtree/LCP_DAC_VAR.cpp | 201 --- libcds/src/static/suffixtree/LCP_FMN.cpp | 185 --- libcds/src/static/suffixtree/LCP_PT.cpp | 238 ---- libcds/src/static/suffixtree/LCP_PhiSpare.cpp | 174 --- libcds/src/static/suffixtree/LCP_Sad.cpp | 156 --- libcds/src/static/suffixtree/LCP_naive.cpp | 97 -- libcds/src/static/suffixtree/NPR.cpp | 35 - libcds/src/static/suffixtree/NPR_CN.cpp | 471 ------- libcds/src/static/suffixtree/NPR_FMN.cpp | 118 -- libcds/src/static/suffixtree/NSV.cpp | 332 ----- libcds/src/static/suffixtree/PSV.cpp | 379 ------ libcds/src/static/suffixtree/RMQ_succinct.cpp | 458 ------- .../static/suffixtree/RMQ_succinct_lcp.cpp | 434 ------- libcds/src/static/suffixtree/SuffixTree.cpp | 35 - libcds/src/static/suffixtree/SuffixTreeY.cpp | 484 -------- .../src/static/suffixtree/factorization.cpp | 241 ---- .../static/suffixtree/factorization_var.cpp | 307 ----- libcds/src/static/textindex/TextIndex.cpp | 36 - libcds/src/static/textindex/TextIndexCSA.cpp | 111 -- libcds/src/static/textindex/comparray4.cpp | 1106 ----------------- libcds/src/static/textindex/mmap.cpp | 111 -- libcds/src/static/textindex/qsufsort.cpp | 312 ----- libcds/src/static/textindex/suftest3.test.cpp | 412 ------ libcds/src/utils/Array.cpp | 158 --- libcds/src/utils/BitString.cpp | 72 -- libcds/src/utils/cppUtils.cpp | 29 - libcds/src/utils/timing.cpp | 55 - libcds/tests/Makefile.am | 19 - libcds/tests/testArray.cpp | 126 -- libcds/tests/testBitSequence.cpp | 120 -- libcds/tests/testHuffman.cpp | 47 - libcds/tests/testLCP.cpp | 147 --- libcds/tests/testNPR.cpp | 152 --- libcds/tests/testQuantile.cpp | 124 -- libcds/tests/testSequence.cpp | 96 -- libcds/tests/testSuffixTree.cpp | 70 -- libcds/tests/testTextIndex.cpp | 63 - libcds/tests/timeSequence.cpp | 140 --- libcds/tests/toArray.cpp | 63 - libcds/tests/toArray2.cpp | 64 - libcds/tutorial/src/ArrayExample.cpp | 47 - libcds/tutorial/src/ArrayExample2.cpp | 49 - libcds/tutorial/src/BitSequenceRGExample.cpp | 48 - libcds/tutorial/src/BitSequenceRRRExample.cpp | 48 - .../src/BitSequenceSDArrayExample.cpp | 49 - libcds/tutorial/src/Makefile | 54 - .../tutorial/src/SequenceAlphPartExample.cpp | 60 - libcds/tutorial/src/SequenceGMRExample.cpp | 53 - .../src/SequenceWaveletTreeExample.cpp | 51 - libcds/tutorial/ssa/Makefile | 43 - libcds/tutorial/ssa/build_index.cpp | 66 - libcds/tutorial/ssa/dump_bwt.cpp | 40 - libcds/tutorial/ssa/ssa.cpp | 430 ------- libcds/tutorial/ssa/ssa.h | 92 -- libcds/tutorial/ssa/test_count.cpp | 106 -- libcds/tutorial/tutorial.pdf | Bin 2202095 -> 0 bytes libhdt/Makefile.am | 5 - libhdt/include/HDTManager.hpp | 5 +- libhdt/include/RDFParser.hpp | 1 + libhdt/src/bitsequence/BitSequence375.cpp | 1 + libhdt/src/hdt/BasicHDT.cpp | 4 + libhdt/src/hdt/BasicHDT.hpp | 4 + libhdt/src/hdt/ControlInformation.cpp | 4 + libhdt/src/hdt/HDTManager.cpp | 8 +- libhdt/src/hdt/HDTSpecification.cpp | 4 + libhdt/src/rdf/RDFParser.cpp | 30 +- libhdt/src/rdf/RDFParserSerd.cpp | 31 + libhdt/src/rdf/RDFParserSerd.hpp | 30 + libhdt/src/sequence/LogSequence.cpp | 5 +- libhdt/src/sequence/LogSequence2.hpp | 5 +- libhdt/src/util/fileUtil.cpp | 5 +- libhdt/src/util/fileUtil.hpp | 4 +- libhdt/src/util/filemap.cpp | 5 +- libhdt/tests/Makefile.am | 5 - libhdt/third/memstream.hpp | 25 + libhdt/tools/Makefile.am | 5 - libhdt/tools/hdt2rdf.cpp | 7 +- libhdt/tools/hdtSearch.cpp | 6 +- libhdt/tools/modifyHeader.cpp | 30 + libhdt/tools/rdf2hdt.cpp | 4 +- libhdt/tools/replaceHeader.cpp | 32 +- m4/ax_cxx_compile_stdcxx.m4 | 42 +- m4/gnulib-cache.m4 | 47 - m4/gnulib-comp.m4 | 205 --- m4/onceonly.m4 | 104 -- rdf2hdt/.gitignore | 73 -- rdf2hdt/rdf2hdt.cpp | 197 --- rdf2hdt/rdf2hdt.pro | 15 - 307 files changed, 226 insertions(+), 34008 deletions(-) delete mode 100644 hdt-it/.cproject delete mode 100644 hdt-it/.gitignore delete mode 100644 hdt-it/.project delete mode 100644 hdt-it/Camera.cpp delete mode 100644 hdt-it/Camera.h delete mode 100644 hdt-it/Color.cpp delete mode 100644 hdt-it/Color.h delete mode 100644 hdt-it/Info.plist delete mode 100644 hdt-it/LICENSE delete mode 100644 hdt-it/README.md delete mode 100644 hdt-it/StopWatch.cpp delete mode 100644 hdt-it/StopWatch.hpp delete mode 100644 hdt-it/abouthdt.cpp delete mode 100644 hdt-it/abouthdt.hpp delete mode 100644 hdt-it/abouthdt.ui delete mode 100644 hdt-it/colors.hpp delete mode 100644 hdt-it/constants.h delete mode 100755 hdt-it/createdmg.sh delete mode 100644 hdt-it/dictionarysuggestions.cpp delete mode 100644 hdt-it/dictionarysuggestions.hpp delete mode 100644 hdt-it/doc/hdtit.png delete mode 100644 hdt-it/doc/manual.html delete mode 100644 hdt-it/doc/matrix.png delete mode 100644 hdt-it/editreset.png delete mode 100644 hdt-it/hdt-it.pro delete mode 100644 hdt-it/hdt-it_es.qm delete mode 100644 hdt-it/hdt-it_es.ts delete mode 100644 hdt-it/hdtcachedinfo.cpp delete mode 100644 hdt-it/hdtcachedinfo.hpp delete mode 100644 hdt-it/hdtcontroller.cpp delete mode 100644 hdt-it/hdtcontroller.hpp delete mode 100644 hdt-it/hdtico.icns delete mode 100644 hdt-it/hdtico.rc delete mode 100644 hdt-it/hdtit.cpp delete mode 100644 hdt-it/hdtit.hpp delete mode 100644 hdt-it/hdtit.ui delete mode 100644 hdt-it/hdtoperation.cpp delete mode 100644 hdt-it/hdtoperation.hpp delete mode 100644 hdt-it/hdtresources.qrc delete mode 100644 hdt-it/hdtspecform.cpp delete mode 100644 hdt-it/hdtspecform.hpp delete mode 100644 hdt-it/hdtspecform.ui delete mode 100644 hdt-it/hdtsummarygenerator.cpp delete mode 100644 hdt-it/hdtsummarygenerator.hpp delete mode 100644 hdt-it/hdtwinico.ico delete mode 100644 hdt-it/hdtwinico2.ico delete mode 100644 hdt-it/headermodel.cpp delete mode 100644 hdt-it/headermodel.hpp delete mode 100644 hdt-it/loading.gif delete mode 100644 hdt-it/logo-hdt.png delete mode 100644 hdt-it/logo-hdt2.png delete mode 100644 hdt-it/main.cpp delete mode 100644 hdt-it/matrixviewwidget.cpp delete mode 100644 hdt-it/matrixviewwidget.hpp delete mode 100644 hdt-it/myapplication.cpp delete mode 100644 hdt-it/myapplication.hpp delete mode 100644 hdt-it/predicatestatus.cpp delete mode 100644 hdt-it/predicatestatus.hpp delete mode 100644 hdt-it/qclearlineedit.cpp delete mode 100644 hdt-it/qclearlineedit.hpp delete mode 100644 hdt-it/regexmodel.cpp delete mode 100644 hdt-it/regexmodel.hpp delete mode 100644 hdt-it/resultcounter.cpp delete mode 100644 hdt-it/resultcounter.hpp delete mode 100644 hdt-it/searchresultsmodel.cpp delete mode 100644 hdt-it/searchresultsmodel.hpp delete mode 100644 hdt-it/sparqlform.cpp delete mode 100644 hdt-it/sparqlform.hpp delete mode 100644 hdt-it/sparqlform.ui delete mode 100644 hdt-it/sparqlmodel.cpp delete mode 100644 hdt-it/sparqlmodel.hpp delete mode 100644 hdt-it/stringutils.cpp delete mode 100644 hdt-it/stringutils.hpp delete mode 100644 hdt-it/triplecomponentmodel.cpp delete mode 100644 hdt-it/triplecomponentmodel.hpp delete mode 100644 lib/.gitignore delete mode 100644 lib/Makefile.in delete mode 100644 libcds/COPYRIGHT delete mode 100644 libcds/Changelog delete mode 100755 libcds/Doxyfile delete mode 100644 libcds/Makefile.am delete mode 100644 libcds/README delete mode 100644 libcds/cds.pc.in delete mode 100644 libcds/docs/delete_me delete mode 100644 libcds/include/Array.h delete mode 100644 libcds/include/BitSequence.h delete mode 100644 libcds/include/BitSequenceBuilder.h delete mode 100644 libcds/include/BitSequenceBuilderDArray.h delete mode 100644 libcds/include/BitSequenceBuilderRG.h delete mode 100644 libcds/include/BitSequenceBuilderRRR.h delete mode 100644 libcds/include/BitSequenceBuilderSDArray.h delete mode 100644 libcds/include/BitSequenceDArray.h delete mode 100644 libcds/include/BitSequenceRG.h delete mode 100644 libcds/include/BitSequenceRRR.h delete mode 100644 libcds/include/BitSequenceSDArray.h delete mode 100644 libcds/include/BitString.h delete mode 100644 libcds/include/BitmapsSequence.h delete mode 100644 libcds/include/Coder.h delete mode 100644 libcds/include/HuffmanCoder.h delete mode 100644 libcds/include/LCP.h delete mode 100644 libcds/include/LCP_DAC.h delete mode 100644 libcds/include/LCP_DAC_VAR.h delete mode 100644 libcds/include/LCP_FMN.h delete mode 100644 libcds/include/LCP_PT.h delete mode 100644 libcds/include/LCP_PhiSpare.h delete mode 100644 libcds/include/LCP_Sad.h delete mode 100644 libcds/include/LCP_naive.h delete mode 100644 libcds/include/Mapper.h delete mode 100644 libcds/include/MapperCont.h delete mode 100644 libcds/include/MapperNone.h delete mode 100644 libcds/include/MapperRev.h delete mode 100644 libcds/include/NPR.h delete mode 100644 libcds/include/NPR_CN.h delete mode 100644 libcds/include/NPR_FMN.h delete mode 100644 libcds/include/NSV.h delete mode 100644 libcds/include/PSV.h delete mode 100644 libcds/include/Permutation.h delete mode 100644 libcds/include/PermutationBuilder.h delete mode 100644 libcds/include/PermutationBuilderMRRR.h delete mode 100644 libcds/include/PermutationBuilderWT.h delete mode 100644 libcds/include/PermutationMRRR.h delete mode 100644 libcds/include/PermutationWT.h delete mode 100644 libcds/include/RMQ_succinct.h delete mode 100644 libcds/include/RMQ_succinct_lcp.h delete mode 100644 libcds/include/Sequence.h delete mode 100644 libcds/include/SequenceAlphPart.h delete mode 100644 libcds/include/SequenceBuilder.h delete mode 100644 libcds/include/SequenceBuilderAlphPart.h delete mode 100644 libcds/include/SequenceBuilderGMR.h delete mode 100644 libcds/include/SequenceBuilderGMRChunk.h delete mode 100644 libcds/include/SequenceBuilderStr.h delete mode 100644 libcds/include/SequenceBuilderWaveletMatrix.h delete mode 100644 libcds/include/SequenceBuilderWaveletTree.h delete mode 100644 libcds/include/SequenceBuilderWaveletTreeNoptrs.h delete mode 100644 libcds/include/SequenceBuilderWaveletTreeNoptrsS.h delete mode 100644 libcds/include/SequenceGMR.h delete mode 100644 libcds/include/SequenceGMRChunk.h delete mode 100644 libcds/include/SuffixTree.h delete mode 100644 libcds/include/SuffixTreeY.h delete mode 100644 libcds/include/TableOffsetRRR.h delete mode 100644 libcds/include/TextIndex.h delete mode 100644 libcds/include/TextIndexCSA.h delete mode 100644 libcds/include/WaveletMatrix.h delete mode 100644 libcds/include/WaveletTree.h delete mode 100644 libcds/include/WaveletTreeNoptrs.h delete mode 100644 libcds/include/WaveletTreeNoptrsS.h delete mode 100644 libcds/include/comparray4.h delete mode 100644 libcds/include/cppUtils.h delete mode 100644 libcds/include/factorization.h delete mode 100644 libcds/include/factorization_var.h delete mode 100644 libcds/include/huff.h delete mode 100644 libcds/include/interface.h delete mode 100644 libcds/include/libcdsBasics.h delete mode 100644 libcds/include/libcdsSDArray.h delete mode 100644 libcds/include/libcdsTrees.h delete mode 100644 libcds/include/mmap.h delete mode 100644 libcds/include/perm.h delete mode 100644 libcds/include/sdarraySadakane.h delete mode 100644 libcds/include/timing.h delete mode 100644 libcds/include/wt_coder.h delete mode 100644 libcds/include/wt_coder_binary.h delete mode 100644 libcds/include/wt_coder_huff.h delete mode 100644 libcds/include/wt_node.h delete mode 100644 libcds/include/wt_node_internal.h delete mode 100644 libcds/include/wt_node_leaf.h delete mode 100644 libcds/src/static/bitsequence/BitSequence.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceBuilderDArray.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceBuilderRG.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceBuilderRRR.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceBuilderSDArray.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceDArray.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceRG.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceRRR.cpp delete mode 100644 libcds/src/static/bitsequence/BitSequenceSDArray.cpp delete mode 100644 libcds/src/static/bitsequence/TableOffsetRRR.cpp delete mode 100644 libcds/src/static/bitsequence/sdarraySadakane.cpp delete mode 100644 libcds/src/static/coders/HuffmanCoder.cpp delete mode 100644 libcds/src/static/coders/huff.cpp delete mode 100644 libcds/src/static/mapper/Makefile delete mode 100644 libcds/src/static/mapper/Mapper.cpp delete mode 100644 libcds/src/static/mapper/MapperCont.cpp delete mode 100644 libcds/src/static/mapper/MapperNone.cpp delete mode 100644 libcds/src/static/mapper/MapperRev.cpp delete mode 100644 libcds/src/static/permutation/Permutation.cpp delete mode 100644 libcds/src/static/permutation/PermutationBuilderMRRR.cpp delete mode 100644 libcds/src/static/permutation/PermutationBuilderWT.cpp delete mode 100644 libcds/src/static/permutation/PermutationMRRR.cpp delete mode 100644 libcds/src/static/permutation/PermutationWT.cpp delete mode 100644 libcds/src/static/permutation/perm.cpp delete mode 100644 libcds/src/static/sequence/BitmapsSequence.cpp delete mode 100644 libcds/src/static/sequence/Sequence.cpp delete mode 100644 libcds/src/static/sequence/SequenceAlphPart.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderAlphPart.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderGMR.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderGMRChunk.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderStr.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderWaveletMatrix.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderWaveletTree.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrs.cpp delete mode 100644 libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrsS.cpp delete mode 100644 libcds/src/static/sequence/SequenceGMR.cpp delete mode 100644 libcds/src/static/sequence/SequenceGMRChunk.cpp delete mode 100644 libcds/src/static/sequence/WaveletMatrix.cpp delete mode 100644 libcds/src/static/sequence/WaveletTree.cpp delete mode 100644 libcds/src/static/sequence/WaveletTreeNoptrs.cpp delete mode 100644 libcds/src/static/sequence/WaveletTreeNoptrsS.cpp delete mode 100644 libcds/src/static/sequence/wt_coder.cpp delete mode 100644 libcds/src/static/sequence/wt_coder_binary.cpp delete mode 100644 libcds/src/static/sequence/wt_coder_huff.cpp delete mode 100644 libcds/src/static/sequence/wt_node.cpp delete mode 100644 libcds/src/static/sequence/wt_node_internal.cpp delete mode 100644 libcds/src/static/sequence/wt_node_leaf.cpp delete mode 100644 libcds/src/static/suffixtree/LCP.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_DAC.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_DAC_VAR.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_FMN.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_PT.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_PhiSpare.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_Sad.cpp delete mode 100644 libcds/src/static/suffixtree/LCP_naive.cpp delete mode 100644 libcds/src/static/suffixtree/NPR.cpp delete mode 100644 libcds/src/static/suffixtree/NPR_CN.cpp delete mode 100644 libcds/src/static/suffixtree/NPR_FMN.cpp delete mode 100644 libcds/src/static/suffixtree/NSV.cpp delete mode 100644 libcds/src/static/suffixtree/PSV.cpp delete mode 100644 libcds/src/static/suffixtree/RMQ_succinct.cpp delete mode 100644 libcds/src/static/suffixtree/RMQ_succinct_lcp.cpp delete mode 100644 libcds/src/static/suffixtree/SuffixTree.cpp delete mode 100644 libcds/src/static/suffixtree/SuffixTreeY.cpp delete mode 100644 libcds/src/static/suffixtree/factorization.cpp delete mode 100644 libcds/src/static/suffixtree/factorization_var.cpp delete mode 100644 libcds/src/static/textindex/TextIndex.cpp delete mode 100644 libcds/src/static/textindex/TextIndexCSA.cpp delete mode 100644 libcds/src/static/textindex/comparray4.cpp delete mode 100644 libcds/src/static/textindex/mmap.cpp delete mode 100644 libcds/src/static/textindex/qsufsort.cpp delete mode 100644 libcds/src/static/textindex/suftest3.test.cpp delete mode 100644 libcds/src/utils/Array.cpp delete mode 100644 libcds/src/utils/BitString.cpp delete mode 100644 libcds/src/utils/cppUtils.cpp delete mode 100644 libcds/src/utils/timing.cpp delete mode 100644 libcds/tests/Makefile.am delete mode 100644 libcds/tests/testArray.cpp delete mode 100644 libcds/tests/testBitSequence.cpp delete mode 100644 libcds/tests/testHuffman.cpp delete mode 100644 libcds/tests/testLCP.cpp delete mode 100644 libcds/tests/testNPR.cpp delete mode 100644 libcds/tests/testQuantile.cpp delete mode 100644 libcds/tests/testSequence.cpp delete mode 100644 libcds/tests/testSuffixTree.cpp delete mode 100644 libcds/tests/testTextIndex.cpp delete mode 100644 libcds/tests/timeSequence.cpp delete mode 100644 libcds/tests/toArray.cpp delete mode 100644 libcds/tests/toArray2.cpp delete mode 100755 libcds/tutorial/src/ArrayExample.cpp delete mode 100755 libcds/tutorial/src/ArrayExample2.cpp delete mode 100755 libcds/tutorial/src/BitSequenceRGExample.cpp delete mode 100755 libcds/tutorial/src/BitSequenceRRRExample.cpp delete mode 100755 libcds/tutorial/src/BitSequenceSDArrayExample.cpp delete mode 100755 libcds/tutorial/src/Makefile delete mode 100755 libcds/tutorial/src/SequenceAlphPartExample.cpp delete mode 100755 libcds/tutorial/src/SequenceGMRExample.cpp delete mode 100755 libcds/tutorial/src/SequenceWaveletTreeExample.cpp delete mode 100755 libcds/tutorial/ssa/Makefile delete mode 100755 libcds/tutorial/ssa/build_index.cpp delete mode 100755 libcds/tutorial/ssa/dump_bwt.cpp delete mode 100755 libcds/tutorial/ssa/ssa.cpp delete mode 100755 libcds/tutorial/ssa/ssa.h delete mode 100755 libcds/tutorial/ssa/test_count.cpp delete mode 100755 libcds/tutorial/tutorial.pdf delete mode 100644 m4/gnulib-cache.m4 delete mode 100644 m4/gnulib-comp.m4 delete mode 100644 m4/onceonly.m4 delete mode 100755 rdf2hdt/.gitignore delete mode 100755 rdf2hdt/rdf2hdt.cpp delete mode 100755 rdf2hdt/rdf2hdt.pro diff --git a/.gitignore b/.gitignore index e5a731db..6d927335 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ rdf2hdt replaceHeader libhdt/examples/* libhdt/.libs -libcds/.libs #Ā Autotools m4/ @@ -66,7 +65,6 @@ stamp-h1 *.a **/examples/* **/tests/* -libcds-v1.0.12/includes !**/examples/*.cpp !**/tests/*.cpp *.o diff --git a/.travis.yml b/.travis.yml index f92c6126..5f63c62a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,6 @@ script: - ./configure --prefix=$LOCAL CXX=$HDT_CPP - make -j2 # Make and run selected tests. Most tests in HDT are failing - - make check -j2 -C libcds || ( cat libcds/tests/test-suite.log && exit -1) - make check -j2 -C libhdt || ( cat libhdt/tests/test-suite.log && exit -1) # Install - make install @@ -61,10 +60,7 @@ script: - test -f $LOCAL/bin/replaceHeader - test -f $LOCAL/bin/searchHeader - test -f $LOCAL/lib/libhdt.la - - test -f $LOCAL/lib/libcds.la - "if [ \"$TRAVIS_OS_NAME\" = \"linux\" ]; then test -L $LOCAL/lib/libhdt.so; fi" - - "if [ \"$TRAVIS_OS_NAME\" = \"linux\" ]; then test -L $LOCAL/lib/libcds.so; fi" - "if [ \"$TRAVIS_OS_NAME\" = \"osx\" ]; then test -L $LOCAL/lib/libhdt.dylib; fi" - - "if [ \"$TRAVIS_OS_NAME\" = \"osx\" ]; then test -L $LOCAL/lib/libcds.dylib; fi" - test -f $LOCAL/lib/pkgconfig/hdt.pc - test -f $LOCAL/lib/pkgconfig/cds.pc diff --git a/Dockerfile b/Dockerfile index 1078c138..51c1d282 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,6 @@ RUN apt update; \ # Copy in libraries and binaries from build stage. COPY --from=build \ - /usr/local/lib/libcds* \ /usr/local/lib/libhdt* \ /usr/local/lib/ COPY --from=build \ diff --git a/Makefile.am b/Makefile.am index 11d2e1f1..c6d6a18c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ AUTOMAKE_OPTIONS = subdir-objects -SUBDIRS = libcds libhdt +SUBDIRS = libhdt ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = m4/gnulib-cache.m4 diff --git a/configure.ac b/configure.ac index 9f024b00..13d8f8b3 100644 --- a/configure.ac +++ b/configure.ac @@ -31,14 +31,6 @@ AC_ARG_ENABLE([optimization], [CXXFLAGS="${CXXFLAGS} -g -O2 -std=c++14"] [AC_MSG_RESULT(yes)]) -AC_MSG_CHECKING(whether to build libcds) -AC_ARG_ENABLE([libcds], - AS_HELP_STRING([--enable-libcds],[Build libcds [default=yes]]), - [AC_MSG_RESULT(${enableval})], - [enable_cds=yes] - [AC_MSG_RESULT(yes)]) -AM_CONDITIONAL([WANTS_LIBCDS], [test x$enable_cds != xno]) - # Dependencies AC_ARG_WITH([zlib], AS_HELP_STRING([--with-zlib], [Use z library [default=yes] ]), @@ -94,8 +86,5 @@ AC_CONFIG_FILES([ libhdt/Makefile libhdt/tools/Makefile libhdt/tests/Makefile - libcds/cds.pc - libcds/Makefile - libcds/tests/Makefile ]) AC_OUTPUT diff --git a/hdt-it/.cproject b/hdt-it/.cproject deleted file mode 100644 index a58e5c8c..00000000 --- a/hdt-it/.cproject +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hdt-it/.gitignore b/hdt-it/.gitignore deleted file mode 100644 index 3f4ae9cf..00000000 --- a/hdt-it/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -Makefile -Makefile.Debug -Makefile.Release -unix/ -win32/ -macx/ -hdt-it.pro.user* -object_script.* diff --git a/hdt-it/.project b/hdt-it/.project deleted file mode 100644 index 46c9a264..00000000 --- a/hdt-it/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - hdt-it - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/hdt-it/Camera.cpp b/hdt-it/Camera.cpp deleted file mode 100644 index 61c3b23c..00000000 --- a/hdt-it/Camera.cpp +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Camera.cpp - * - * Created on: 04/03/2011 - * Author: mck - */ - -#include - -#include "Camera.h" - -Camera::Camera() : - rotationAnimation(this, "camRotation") -{ - widgetWidth = 800; - widgetHeight = 600; - toDefaultValues(); - - connect(this, SIGNAL(rotationChanged()), this, SIGNAL(cameraChanged())); - connect(this, SIGNAL(zoomChanged()), this, SIGNAL(cameraChanged())); - connect(this, SIGNAL(offsetChanged()), this, SIGNAL(cameraChanged())); -} - -Camera::~Camera() -{ -} - -qreal Camera::getZoom() -{ - return zoom; -} - -void Camera::setZoom(double newz) -{ - zoom = newz; - zoom = zoom < 0.5 ? 0.5 : zoom; - emit zoomChanged(); -} - -void Camera::increaseZoom(int dif) -{ - zoom += 0.001*dif*zoom; - zoom = zoom < 0.5 ? 0.5 : zoom; - emit zoomChanged(); -} - -void Camera::decreaseZoom(int dif){ - zoom -= 0.001*dif*zoom; - zoom = zoom < 0.5 ? 0.5 : zoom; - emit zoomChanged(); -} - -void Camera::multiplyZoom(int mult) -{ - zoom *= mult; - zoom = zoom < 0.5 ? 0.5 : zoom; - emit zoomChanged(); -} - - -void Camera::setOffset(double x,double y){ - offx = x; - offy = y; - if(offx<-1.0) offx=-1.0; - if(offx>0.0) offx=0.0; - if(offy<-1.0) offy=-1.0; - if(offy>0.0) offy=0.0; - emit offsetChanged(); -} - -void Camera::setOffset(QPointF &rect){ - this->setOffset(rect.x(), rect.y()); -} - -QPointF Camera::getOffset() { - return QPointF(offx, offy); -} - -void Camera::moveOffset(double x,double y){ - setOffset(offx + x / (zoom*widgetWidth), offy - y / (zoom*widgetHeight)); -} - -void Camera::setRotation(double x,double y){ - rotx = x; - roty = y; - emit rotationChanged(); -} - -void Camera::setRotation(QPointF &rect){ - this->setRotation(rect.x(), rect.y()); -} - -void Camera::animateRotation(double x, double y) { - rotationAnimation.stop(); - rotationAnimation.setDuration(500); - rotationAnimation.setEasingCurve(QEasingCurve::InOutQuad); - rotationAnimation.setStartValue(QPointF(rotx, roty)); - rotationAnimation.setEndValue(QPointF(x,y)); - rotationAnimation.start(); -} - -QPointF Camera::getRotation() { - return QPointF(rotx, roty); -} - -void Camera::rotateCamera(double x,double y){ - rotationAnimation.stop(); - rotx += 0.5 * x; - roty += 0.5 * y; - emit rotationChanged(); -} - -void Camera::toDefaultValues(){ - rotx = roty = 0; - zoom = 1; - offx = -0.5; - offy = -0.5; - emit rotationChanged(); - emit zoomChanged(); - emit offsetChanged(); -} - -void Camera::setScreenSize(int w, int h){ - widgetWidth = w; - widgetHeight = h; - - glViewport(0, 0, (GLsizei) w, (GLsizei) h); - - GLdouble aspect, left, right, bottom, top; - - aspect = (GLdouble) widgetWidth / (GLdouble) widgetHeight; - - if ( aspect < 1.0 ) { - left = -0.75; - right = 0.75; - bottom = -1.0 * ( 1.0 / aspect ); - top = 1.0 * ( 1.0 / aspect ); - } else { - left = -0.75 * aspect; - right = 0.75 * aspect; - bottom = -1.0; - top = 1.0; - } - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glOrtho( left*widgetWidth, right*widgetWidth, bottom*widgetHeight, top*widgetHeight, -10, 10 ); - glMatrixMode( GL_MODELVIEW ); -} - -void Camera::applyTransform(){ - glScaled(1.1*zoom, 1.1*zoom, 1.0); - - glScalef(widgetWidth, widgetHeight, 1.0); - - glTranslatef(offx, offy, 1); - - glTranslatef(0.5, 0.5, 0.5); - glRotatef(roty, 1, 0, 0); - glRotatef(rotx, 0, 1, 0); - glTranslatef(-0.5, -0.5, -0.5); -} - -void Camera::setFrontView() -{ - animateRotation(0, 0); -} - -void Camera::setLeftView() -{ - animateRotation(90,0); -} - -void Camera::setTopView() -{ - animateRotation(0,90); -} - -void Camera::set3DView() -{ - animateRotation(-45,45); -} - -bool Camera::isFrontView() -{ - return rotx==0 && roty==0; -} - -bool Camera::isLeftView() -{ - return rotx==90 && roty==0; -} - -bool Camera::isTopView() -{ - return rotx==0 && roty==90; -} - -bool Camera::is3DView() -{ - return rotx==-45 && roty==45; -} - -void Camera::toDefaultValuesAnimated() -{ - QPropertyAnimation *rotAnim = new QPropertyAnimation(this, "camRotation"); - rotAnim->setEasingCurve(QEasingCurve::InOutQuad); - rotAnim->setDuration(400); - rotAnim->setStartValue(QPointF(rotx, roty)); - rotAnim->setEndValue(QPointF(0,0)); - - QPropertyAnimation *zoomAnim = new QPropertyAnimation(this, "camZoom"); - zoomAnim->setEasingCurve(QEasingCurve::InOutQuad); - zoomAnim->setDuration(400); - zoomAnim->setStartValue(zoom); - zoomAnim->setEndValue(1); - - QPropertyAnimation *offAnim = new QPropertyAnimation(this, "camOffset"); - offAnim->setEasingCurve(QEasingCurve::InOutQuad); - offAnim->setDuration(400); - offAnim->setStartValue(QPointF(offx, offy)); - offAnim->setEndValue(QPointF(-0.5, -0.5)); - - QSequentialAnimationGroup *animationGroup = new QSequentialAnimationGroup(); - - if(offAnim->startValue()!=offAnim->endValue()) - animationGroup->addAnimation(offAnim); - else - delete offAnim; - - if(zoomAnim->startValue()!=zoomAnim->endValue()) - animationGroup->addAnimation(zoomAnim); - else - delete zoomAnim; - - if(rotAnim->startValue()!=rotAnim->endValue()) - animationGroup->addAnimation(rotAnim); - else - delete rotAnim; - - animationGroup->start(QAbstractAnimation::DeleteWhenStopped); -} - -void Camera::stopAnimations() -{ - rotationAnimation.stop(); -} - - diff --git a/hdt-it/Camera.h b/hdt-it/Camera.h deleted file mode 100644 index aa8bd217..00000000 --- a/hdt-it/Camera.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Camera.h - * - * Created on: 04/03/2011 - * Author: mck - */ - -#ifndef CAMERA_H_ -#define CAMERA_H_ - -#include -#include - -#include - -class Camera : public QObject { - Q_OBJECT - Q_PROPERTY(QPointF camRotation READ getRotation WRITE setRotation NOTIFY rotationChanged) - Q_PROPERTY(QPointF camOffset READ getOffset WRITE setOffset NOTIFY offsetChanged) - Q_PROPERTY(qreal camZoom READ getZoom WRITE setZoom NOTIFY zoomChanged) - -private: - double zoom; - double rotx, roty; - double offx, offy; - int widgetWidth, widgetHeight; - QPropertyAnimation rotationAnimation; - - void stopAnimations(); -public: - explicit Camera(); - ~Camera(); - -public: - qreal getZoom(); - void setZoom(double newz); - void increaseZoom(int dif); - void decreaseZoom(int dif); - void multiplyZoom(int mult); - - void setOffset(double x,double y); - void setOffset(QPointF &rect); - QPointF getOffset(); - - void moveOffset(double x,double y); - - QPointF getRotation(); - void setRotation(QPointF &rect); - void setRotation(double x,double y); - void animateRotation(double x,double y); - void rotateCamera(double x,double y); - - void toDefaultValues(); - void toDefaultValuesAnimated(); - - void setScreenSize(int width, int height); - void applyTransform(); - - bool isFrontView(); - bool isLeftView(); - bool isTopView(); - bool is3DView(); - -public slots: - void setFrontView(); - void setLeftView(); - void setTopView(); - void set3DView(); - -signals: - void rotationChanged(); - void zoomChanged(); - void offsetChanged(); - void cameraChanged(); -}; - -#endif /* CAMERA_H_ */ diff --git a/hdt-it/Color.cpp b/hdt-it/Color.cpp deleted file mode 100644 index 8e477d53..00000000 --- a/hdt-it/Color.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Color.cpp - * - * Created on: 04/03/2011 - * Author: mck - */ - -#include -#include - -#include "Color.h" -#include "constants.h" - - Color::Color() { - setRGBA(1,1,1,1); - } - - Color::~Color() { - } - - -void Color::use() { - -} - -/** Invert Color - * @param c Description of the param. - * @return void - */ -void Color::invert() { - r = 1 - r; - g = 1 - g; - b = 1 - b; -} - -void Color::setRGB(double r, double g, double b) { - this->r = r; - this->g = g; - this->b = b; -} - -void Color::setRGBA(double r, double g, double b, double a) { - this->r = r; - this->g = g; - this->b = b; - this->a = a; -} - -/** HSV to RGB - * @param h Description of the param. - * @param s Description of the param. - * @param v Description of the param. - * @param c Description of the param. - * @return void - */ -void Color::setHSV(double h, double s, double v) { - // H is given on [0, 6]. S and V are given on [0, 1]. - // RGB are each returned on [0, 1]. - float m, n, f; - int i; - - if (h == -1) { - setRGB(v, v, v); - return; - } - - i = floor(h); - f = h - i; - if (!(i & 1)) - f = 1 - f; // if i is even - m = v * (1 - s); - n = v * (1 - s * f); - switch (i) { - case 6: - case 0: - setRGB(v, n, m); - break; - case 1: - setRGB(n, v, m); - break; - case 2: - setRGB(m, v, n); - break; - case 3: - setRGB(m, n, v); - break; - case 4: - setRGB(n, m, v); - break; - case 5: - setRGB(v, m, n); - break; - } -} - -QColor Color::asQColor() -{ - QColor c(255*r, 255*g, 255*b, 255*a); - return c; -} - -/**Get Color 2 - * @param val Description of the param. - * @param vmin Description of the param. - * @param vmax Description of the param. - * @param c Description of the param. - * @return void - */ -void ColorRamp2::apply(Color *c, double val, double vmin, double vmax) { - double total = vmax - vmin; - double prop = (vmin + val / total); - - if(vmax==0.0) { - c->setRGB(1.0, 0.0, 0.0); - return; - } - - //std::cout << "h: " << fmod(prop*100,6) << std::endl; - //std::cout << "\tmin: " << vmin << " val: "<< val << " max: " << vmax << " Prop: " << prop << " dv: " << total << std::endl; -#ifdef SCREEN - c->setHSV(fmod(prop*100,6), 1.0 , 0.5 + 0.5 * prop); - c->invert(); -#else - c->setHSV(fmod(prop*100,6), 1.0, 0.3+0.7*prop); - //c->invert(); -#endif - // printf("(%.1f, %.1f, %.1f) %.1f\n", val, vmin, vmax, prop); -} - -/** Get Color - * @param v Description of the param. - * @param vmin Description of the param. - * @param vmax Description of the param. - * @param c Description of the param. - * @return void - */ -void ColorRamp1::apply(Color *c, double v, double vmin, double vmax) { - if (v < vmin) - v = vmin; - if (v > vmax) - v = vmax; - - double dv = vmax - vmin; - - if (v < (vmin + 0.25 * dv)) { - c->setRGB(0, 4 * (v - vmin) / dv, 1); - } else if (v < (vmin + 0.5 * dv)) { - c->setRGB(0, 1 + 4 * (vmin + 0.25 * dv - v) / dv, 1); - } else if (v < (vmin + 0.75 * dv)) { - c->setRGB(4 * (v - vmin - 0.5 * dv) / dv, 1, 0); - } else { - c->setRGB(1, 1 + 4 * (vmin + 0.75 * dv - v) / dv, 0); - } -} - - - diff --git a/hdt-it/Color.h b/hdt-it/Color.h deleted file mode 100644 index 0ede20a1..00000000 --- a/hdt-it/Color.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Color.h - * - * Created on: 04/03/2011 - * Author: mck - */ - -#ifndef COLOR_H_ -#define COLOR_H_ - -#include - -class Color { -public: - double r,g,b,a; - -public: - Color(); - Color(double r, double g, double b); - Color(double r, double g, double b, double a); - virtual ~Color(); - - void use(); - void invert(); - - void setRGB(double r, double g, double b); - void setRGBA(double r, double g, double b, double a); - void setHSV(double h, double s, double v); - QColor asQColor(); -}; - -class ColorRamp { -public: - virtual void apply(Color *co, double v, double vmin, double vmax)=0; -}; - - -class ColorRamp1 : public ColorRamp { -public: - void apply(Color *co, double v, double vmin, double vmax); -}; - - -class ColorRamp2 : public ColorRamp { -public: - void apply(Color *co, double v, double vmin, double vmax); -}; - -#endif /* COLOR_H_ */ diff --git a/hdt-it/Info.plist b/hdt-it/Info.plist deleted file mode 100644 index 7244838c..00000000 --- a/hdt-it/Info.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - CFBundleIconFile - hdtico.icns - CFBundlePackageType - APPL - CFBundleGetInfoString - Created by Qt/QMake - CFBundleSignature - ???? - CFBundleExecutable - HDT-it - CFBundleIdentifier - org.rdfhdt.HDT-it - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - hdt - - CFBundleTypeIconFile - hdtico.icns - CFBundleTypeMIMETypes - - binary/rdf-hdt - - CFBundleTypeName - HDT RDF File - CFBundleTypeRole - Editor - LSIsAppleDefaultForType - - - - CFBundleTypeExtensions - - hdt.gz - - CFBundleTypeIconFile - hdtico.icns - CFBundleTypeMIMETypes - - binary/rdf-hdt - - CFBundleTypeName - HDT RDF File - CFBundleTypeRole - Editor - LSIsAppleDefaultForType - - - - - - diff --git a/hdt-it/LICENSE b/hdt-it/LICENSE deleted file mode 100644 index 56fd5d6a..00000000 --- a/hdt-it/LICENSE +++ /dev/null @@ -1,280 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS diff --git a/hdt-it/README.md b/hdt-it/README.md deleted file mode 100644 index af9450a9..00000000 --- a/hdt-it/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# HDT-it! GUI tool for the HDT triple format - -Overview -================= - -HDT-it is a tool that can generate -and consume RDF files in HDT format. It demonstrates the capabilities -of HDT by allowing to search basic triple patterns against HDT files, and -also visualizes the 3D adjacency matrix of the underlying RDF graph to -provide an overview of the dataset distribution. - -Download executable -================= - -An executable version of the tool is available for multiple platforms in http://www.rdfhdt.org/downloads/ - -Compiling -================= - -Dependencies: - -- HDT-Lib -- QT4 (http://doc.qt.io/qt-4.8/) - -Compilation: - -1.Compile the main hdt-lib library. To compile the library run `make` under the directory `hdt-lib`, this will generate the library and tools. -2. Execute Qmake in libcds-v1.0.12: - - $ cd libcds-v1.0.12/qmake - $ qmake - $ make - -3.Execute Qmake in hdt-lib - - $ cd hdt-lib/qmake - $ qmake - $ make - -4.Execute Qmake in hdt-it - - $ cd hdt-it - $ qmake - $ make - -The application should be available in a new hdt-it subfolder (e.g. hdt-it/unix or hdt-it/win32) - -Licensing -================= -Copyright (C) 2012, Mario Arias, Javier D. Fernandez, Miguel A. Martinez-Prieto -All rights reserved. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Visit our Web Page: www.rdfhdt.org - -Contacting the authors: - - Mario Arias: mario.arias@deri.org - - Javier D. Fernandez: jfergar@infor.uva.es - - Miguel A. Martinez-Prieto: migumar2@infor.uva.es - diff --git a/hdt-it/StopWatch.cpp b/hdt-it/StopWatch.cpp deleted file mode 100644 index 7a2e8d8a..00000000 --- a/hdt-it/StopWatch.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * StopWatch.cpp - * - * Created on: 03/03/2011 - * Author: mck - */ - -#include -#include - -#include // For memcpy() - -#include "StopWatch.hpp" - -StopWatch::StopWatch() { -#ifdef WIN32 - QueryPerformanceFrequency(&frequency); - startCount.QuadPart = 0; - endCount.QuadPart = 0; -#endif - reset(); -} - -#ifdef WIN32 -void StopWatch::reset() { - QueryPerformanceCounter(&startCount); - endCount = startCount; -} - -void StopWatch::stop() { - QueryPerformanceCounter(&endCount); -} - -unsigned long long StopWatch::getUser() { - unsigned long long start = startCount.QuadPart * (1000000.0 / frequency.QuadPart); - unsigned long long end = endCount.QuadPart * (1000000.0 / frequency.QuadPart); - return end - start; -} - -unsigned long long StopWatch::getSystem() { - return getUser(); -} - -unsigned long long StopWatch::getReal() { - return getUser(); -} - -#else -void StopWatch::reset() { - struct rusage ru; - - getrusage(RUSAGE_SELF, &ru); - gettimeofday(&real1, NULL); - - memcpy(&user1, &ru.ru_utime, sizeof(struct timeval)); - memcpy(&system1, &ru.ru_stime, sizeof(struct timeval)); - - memcpy(&user2, &user1, sizeof(struct timeval)); - memcpy(&system2, &system1, sizeof(struct timeval) ); -} - -void StopWatch::stop() { - struct rusage ru; - getrusage(RUSAGE_SELF, &ru); - gettimeofday(&real2, NULL); - - memcpy(&user2, &ru.ru_utime, sizeof(struct timeval)); - memcpy(&system2, &ru.ru_stime, sizeof(struct timeval)); -} - -unsigned long long difference(time_t s1, time_t s2, suseconds_t us1, suseconds_t us2) { - unsigned long long tmp1, tmp2; - - tmp1 = s1 * 1000000 + us1; - tmp2 = s2 * 1000000 + us2; - - return tmp1-tmp2; -} - -unsigned long long StopWatch::getUser() { - return difference(user2.tv_sec,user1.tv_sec, user2.tv_usec,user1.tv_usec); -} - -unsigned long long StopWatch::getSystem() { - return difference(system2.tv_sec,system1.tv_sec, system2.tv_usec,system1.tv_usec); -} - -unsigned long long StopWatch::getReal() { - return difference(real2.tv_sec,real1.tv_sec, real2.tv_usec,real1.tv_usec); -} -#endif - - - - - -std::string StopWatch::getUserStr() { - return toHuman(getUser()); -} -std::string StopWatch::getSystemStr() { - return toHuman(getSystem()); -} -std::string StopWatch::getRealStr() { - return toHuman(getReal()); -} - - -unsigned long long StopWatch::stopUser() { - stop(); - return getUser(); -} - -unsigned long long StopWatch::stopSystem() { - stop(); - return getSystem(); -} - -unsigned long long StopWatch::stopReal() { - stop(); - return getReal(); -} - - -std::string StopWatch::stopUserStr() { - stop(); - return getUserStr(); -} - -std::string StopWatch::stopSystemStr() { - stop(); - return getSystemStr(); -} - -std::string StopWatch::stopRealStr() { - stop(); - return getRealStr(); -} - -std::ostream &operator<<(std::ostream &stream, StopWatch &sw) { - stream << sw.stopRealStr(); - return stream; -} - -std::string StopWatch::toHuman(unsigned long long time) { - unsigned int tot_secs = time/1000000; - - unsigned int hours = tot_secs/3600; - unsigned int mins = (tot_secs/60) % 60; - unsigned int secs = (tot_secs % 60); - unsigned int ms = (time%1000000)/1000; - unsigned int us = time%1000; - - std::ostringstream out; - if(hours>0) { - out << hours << " hour "; - } - if(mins>0) { - out << mins << " min "; - } - if(secs>0) { - out << secs << " sec "; - } - if(ms>0) { - out << ms << " ms "; - } - if(us>0){ - out << us << " us"; - } - return out.str(); -} diff --git a/hdt-it/StopWatch.hpp b/hdt-it/StopWatch.hpp deleted file mode 100644 index c10b0814..00000000 --- a/hdt-it/StopWatch.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * StopWatch.hpp - * - * Created on: 03/03/2011 - * Author: mck - */ - -#ifndef STOPWATCH_HPP_ -#define STOPWATCH_HPP_ - -#ifdef WIN32 -#include -#else -# include -# include -#endif - -#include -#include - -class StopWatch { -private: - -#ifdef WIN32 - LARGE_INTEGER frequency; - LARGE_INTEGER startCount; - LARGE_INTEGER endCount; -#else - struct timeval user1, user2; - struct timeval system1, system2; - struct timeval real1, real2; -#endif - -public: - StopWatch(); - - void reset(); - void stop(); - - unsigned long long getUser(); - unsigned long long getSystem(); - unsigned long long getReal(); - - std::string getUserStr(); - std::string getSystemStr(); - std::string getRealStr(); - - unsigned long long stopUser(); - unsigned long long stopSystem(); - unsigned long long stopReal(); - - std::string stopUserStr(); - std::string stopSystemStr(); - std::string stopRealStr(); - - static std::string toHuman(unsigned long long time); - - friend std::ostream &operator<<(std::ostream &stream, StopWatch &sw); -}; - -#endif /* STOPWATCH_HPP_ */ diff --git a/hdt-it/abouthdt.cpp b/hdt-it/abouthdt.cpp deleted file mode 100644 index cde89f16..00000000 --- a/hdt-it/abouthdt.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "abouthdt.hpp" -#include "ui_abouthdt.h" - -Abouthdt::Abouthdt(QWidget *parent) : - QDialog(parent), - ui(new Ui::Abouthdt) -{ - ui->setupUi(this); -} - -Abouthdt::~Abouthdt() -{ - delete ui; -} diff --git a/hdt-it/abouthdt.hpp b/hdt-it/abouthdt.hpp deleted file mode 100644 index 7a7981c6..00000000 --- a/hdt-it/abouthdt.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef ABOUTHDT_HPP -#define ABOUTHDT_HPP - -#include - -namespace Ui { - class Abouthdt; -} - -class Abouthdt : public QDialog -{ - Q_OBJECT - -public: - explicit Abouthdt(QWidget *parent = 0); - ~Abouthdt(); - -private: - Ui::Abouthdt *ui; -}; - -#endif // ABOUTHDT_HPP diff --git a/hdt-it/abouthdt.ui b/hdt-it/abouthdt.ui deleted file mode 100644 index fb4767dc..00000000 --- a/hdt-it/abouthdt.ui +++ /dev/null @@ -1,173 +0,0 @@ - - - Abouthdt - - - - 0 - 0 - 557 - 377 - - - - - 0 - 0 - - - - - 557 - 377 - - - - - 557 - 377 - - - - About HDT-it! - - - - - 200 - 340 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Close - - - false - - - - - - 10 - 10 - 91 - 81 - - - - - 0 - 0 - - - - - 91 - 81 - - - - - 91 - 81 - - - - border-image: url(:/images/logo-hdt.png); - - - - - - - 110 - 10 - 431 - 321 - - - - - 12 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:12pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:16pt; font-weight:600;">HDT-it! version 1.1</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:16pt; font-weight:600;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">HDT (Header, Dictionary, Triples) is a binary representation for RDF that compresses big datasets in order to store and share big RDF files.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">HDT-it is a tool that allows generating and consuming HDT files. As an example, the tool allows to search for basic graph patterns, and shows a global 3D Matrix of the RDF distribution.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">For more information about the tool and our research, please visit:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">HDT Web page: </span><a href="http://www.rdfhdt.org"><span style=" font-family:'Lucida Grande'; font-size:13pt; text-decoration: underline; color:#0000ff;">http://www.rdfhdt.org</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Research group: </span><a href="http://dataweb.infor.uva.es"><span style=" font-family:'Lucida Grande'; font-size:13pt; text-decoration: underline; color:#0000ff;">http://dataweb.infor.uva.es</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:14pt; font-weight:600;">HDT was possible thanks to:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Mario Arias Gallego &lt;</span><a href="mailto:mario.arias@insight-centre.org"><span style=" text-decoration: underline; color:#0000ff;">mario.arias@insight-centre.org</span></a><span style=" font-family:'Lucida Grande';">&gt;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Javier D. FernĆ”ndez GarcĆ­a &lt;</span><a href="mailto:jfergar@infor.uva.es"><span style=" text-decoration: underline; color:#0000ff;">jfergar@infor.uva.es</span></a><span style=" font-family:'Lucida Grande';">&gt;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Miguel A. MartĆ­nez-Prieto &lt;</span><a href="mailto:migumar2@infor.uva.es"><span style=" text-decoration: underline; color:#0000ff;">migumar2@infor.uva.es</span></a><span style=" font-family:'Lucida Grande';">&gt;</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Claudio Gutierrez &lt;</span><a href="mailto:cgutierr@dcc.uchile.cl"><span style=" text-decoration: underline; color:#0000ff;">cgutierr@dcc.uchile.cl</span></a><span style=" font-family:'Lucida Grande';">&gt;</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:14pt; font-weight:600;">And the following organizations:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande';"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">University of Valladolid. </span><a href="http://www.uva.es"><span style=" text-decoration: underline; color:#0000ff;">http://www.uva.es</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">University of Chile. </span><a href="http://dcc.uchile.cl"><span style=" text-decoration: underline; color:#0000ff;">http://dcc.uchile.cl</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">Insight Centre for Data Analytics </span><a href="http://www.insight-centre.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.insight-centre.org</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">(Formerly known as Digital Enterprise Research Insitute. </span><a href="http://www.deri.ie"><span style=" text-decoration: underline; color:#0000ff;">http://www.deri.ie</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">National University of Ireland Galway. </span><a href="http://www.nuigalway.ie"><span style=" text-decoration: underline; color:#0000ff;">http://www.nuigalway.ie</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; text-decoration: underline; color:#0000ff;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:14pt; font-weight:600;">Acknowledgemens:</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; text-decoration: underline; color:#0000ff;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande';">RDF/HDT is a project funded by the Spanish Ministry of Economy and Competitiveness (TIN2009-14009-C02-02); Science Foundation Ireland: Grant No. SFI/08/CE/I1380, Lion-II; Chilean Fondecyt's 1110287 and 1-110066</span></p></body></html> - - - true - - - - - - - buttonBox - accepted() - Abouthdt - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Abouthdt - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/hdt-it/colors.hpp b/hdt-it/colors.hpp deleted file mode 100644 index f1bbc166..00000000 --- a/hdt-it/colors.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef COLORS_HPP -#define COLORS_HPP - -#define SCREEN - -#ifndef SCREEN -#define TEXT_COLOR 0.0, 0.0, 0.0, 1.0 -#define CROSS_COLOR 1.0, 0.0, 0.0, 1.0 -#define TEXT_BACKGROUND_COLOR 1.0, 1.0, 1.0, 0.9 -#define BACKGROUND_COLOR 1, 1, 1, 1 -#define SHARED_AREA_COLOR 0.9, 0.9, 0.9, 1.0 -#define SHARED_AREA_BORDER_COLOR 0.1, 0.1, 0.1, 1.0 -#define AXIS_COLOR 0.1, 0.1, 0.1, 1.0 -#define GRID_COLOR 0.3, 0.3, 0.3, 1.0 -#define RDF_POINT_SIZE 1.5 -#else -#define TEXT_COLOR 1.0, 1.0, 1.0, 1.0 -#define CROSS_COLOR 1.0, 1.0, 1.0, 1.0 -#define TEXT_BACKGROUND_COLOR 0.0, 0.0, 0.0, 0.7 -#define BACKGROUND_COLOR 0, 0, 0, 1 -#define SHARED_AREA_COLOR 0.2, 0.2, 0.2, 1.0 -#define SHARED_AREA_BORDER_COLOR 0.3, 0.3, 0.3, 1.0 -#define AXIS_COLOR 0.8, 0.8, 0.8, 1.0 -#define GRID_COLOR 0.2, 0.2, 0.2, 1.0 -#define RDF_POINT_SIZE 1 -#endif - - -#endif // COLORS_HPP diff --git a/hdt-it/constants.h b/hdt-it/constants.h deleted file mode 100644 index dc955d74..00000000 --- a/hdt-it/constants.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * constants.h - * - * Created on: 04/03/2011 - * Author: mck - */ - -#ifndef CONSTANTS_H_ -#define CONSTANTS_H_ - -#define TIMER_DELAY 50 -#define RENDER_NUM_POINTS 100000 - -#define SCREEN - -#ifndef SCREEN -#define TEXT_COLOR 0.0, 0.0, 0.0, 1.0 -#define CROSS_COLOR 1.0, 0.0, 0.0, 1.0 -#define TEXT_BACKGROUND_COLOR 1.0, 1.0, 1.0, 0.9 -#define BACKGROUND_COLOR 1, 1, 1, 1 -#define SHARED_AREA_COLOR 0.9, 0.9, 0.9, 1.0 -#define SHARED_AREA_BORDER_COLOR 0.1, 0.1, 0.1, 1.0 -#define AXIS_COLOR 0.1, 0.1, 0.1, 1.0 -#define GRID_COLOR 0.3, 0.3, 0.3, 1.0 -#define RDF_POINT_SIZE 1.5 -#else -#define TEXT_COLOR 1.0, 1.0, 1.0, 1.0 -#define CROSS_COLOR 0.0, 0.0, 0.0, 1.0 -#define TEXT_BACKGROUND_COLOR 0.0, 0.0, 0.0, 0.7 -#define BACKGROUND_COLOR 0, 0, 0, 1 -#define SHARED_AREA_COLOR 0.1, 0.1, 0.1, 1.0 -#define SHARED_AREA_BORDER_COLOR 0.2, 0.2, 0.2, 1.0 -#define AXIS_COLOR 0.8, 0.8, 0.8, 1.0 -#define GRID_COLOR 0.2, 0.2, 0.2, 1.0 -#define RDF_POINT_SIZE 1 -#endif - - -#endif /* CONSTANTS_H_ */ diff --git a/hdt-it/createdmg.sh b/hdt-it/createdmg.sh deleted file mode 100755 index 10fcc7c7..00000000 --- a/hdt-it/createdmg.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -SRCAPP="macx/HDT-it.app" -FOLDER="macdmg" -VOL="HDT-it" -NAME="HDT-it!" -VERS="1.1" -DMG="$VOL-$VERS.dmg" - -FRAMEWORK_BASE="$SRCAPP/Contents/Frameworks/" -REMOVE="QtSql.framework QtXmlPatterns.framework QtDeclarative.framework QtNetwork.framework QtScript.framework QtSvg.framework QtGui.framework/Versions/4/QtGui.strip" - -DATASETBASE="$HOME/rdf/dataset/" -DATASETS="test.nt" -DATASETHDTBASE="$HOME/hdt/" -DATASETSHDT="3kbo.hdt aaronland.hdt 3dnews.hdt aisricom.hdt" -#DATASETSHDT="aifb.hdt apex.hdt 2blog.hdt 3kbo.hdt aaronland.hdt 3dnews.hdt aisricom.hdt" - -mkdir -p $FOLDER -rm -Rf $FOLDER/* - -# ADD LIBRARIES -echo macdeployqt $SRCAPP -macdeployqt $SRCAPP - -# ADD Translation files -cp -Rf *.qm $SRCAPP/Contents/Resources - -# ADD License and documentation -cp -Rf LICENSE $FOLDER - -mkdir -p $FOLDER/doc -cp -Rf doc/* $FOLDER/doc - -# REMOVE UNNEDED FILES -for i in $REMOVE -do - echo rm -Rf $FRAMEWORK_BASE$i; - rm -Rf $FRAMEWORK_BASE$i; -done - -echo rm -Rf "$SRCAPP/Contents/PlugIns/*" -rm -Rf "$SRCAPP/Contents/PlugIns/*" - -# CREATE TMP FOLDER -echo mkdir -p $FOLDER/datasets -mkdir -p $FOLDER/datasets - -echo "Fill moredatasets.txt" -echo "You can download more datasets from http://www.rdfhdt.org/datasets or import your own ones using the 'Import RDF' option!" > $FOLDER/datasets/moredatasets.txt - -# COPY APP to folder -echo cp -R $SRCAPP $FOLDER -cp -R $SRCAPP $FOLDER - -# COPY DATASETS -for i in $DATASETS -do - echo cp $DATASETBASE$i $FOLDER/datasets - cp $DATASETBASE$i $FOLDER/datasets -done - -for i in $DATASETSHDT -do - echo cp $DATASETHDTBASE$i $FOLDER/datasets - cp $DATASETHDTBASE$i $FOLDER/datasets -done - -# CREATE DMG -rm -Rf "$DMG" -echo hdiutil create -srcfolder "$FOLDER" -volname "$VOL" -format UDZO -imagekey zlib-level=9 "$DMG" -hdiutil create -srcfolder "$FOLDER" -volname "$NAME" -format UDZO -imagekey zlib-level=9 "$DMG" diff --git a/hdt-it/dictionarysuggestions.cpp b/hdt-it/dictionarysuggestions.cpp deleted file mode 100644 index c50c80d3..00000000 --- a/hdt-it/dictionarysuggestions.cpp +++ /dev/null @@ -1,186 +0,0 @@ - -#include -#include -#include - -#include "dictionarysuggestions.hpp" - -#include "stringutils.hpp" - -#include - -#define NUM_SUGGESTIONS 10 - -DictionarySuggestions::DictionarySuggestions(QLineEdit *parent) : - QObject(parent), - editor(parent), - controller(NULL) -{ - popup = new QTreeWidget; - popup->setWindowFlags(Qt::Popup); - popup->setFocusPolicy(Qt::NoFocus); - popup->setFocusProxy(parent); - popup->setMouseTracking(true); - - popup->setColumnCount(1); - popup->setUniformRowHeights(true); - popup->setRootIsDecorated(false); - popup->setEditTriggers(QTreeWidget::NoEditTriggers); - popup->setSelectionBehavior(QTreeWidget::SelectRows); - popup->setFrameStyle(QFrame::Box | QFrame::Plain); - popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - popup->header()->hide(); - - popup->installEventFilter(this); - - connect(popup, SIGNAL(itemClicked(QTreeWidgetItem*,int)), - SLOT(doneCompletion())); - - timer = new QTimer(this); - timer->setSingleShot(true); - timer->setInterval(100); - connect(timer, SIGNAL(timeout()), SLOT(autoSuggest())); - connect(editor, SIGNAL(textEdited(QString)), timer, SLOT(start())); -} - -DictionarySuggestions::~DictionarySuggestions(){ - delete popup; -} - -bool DictionarySuggestions::eventFilter(QObject *obj, QEvent *ev) -{ - if (obj != popup) - return false; - - if (ev->type() == QEvent::MouseButtonPress) { - popup->hide(); - editor->setFocus(); - return true; - } - - if (ev->type() == QEvent::KeyPress) { - bool consumed = false; - int key = static_cast(ev)->key(); - switch (key) { - case Qt::Key_Enter: - case Qt::Key_Return: - doneCompletion(); - consumed = true; - - case Qt::Key_Escape: - editor->setFocus(); - popup->hide(); - consumed = true; - - case Qt::Key_Up: - case Qt::Key_Down: - case Qt::Key_Home: - case Qt::Key_End: - case Qt::Key_PageUp: - case Qt::Key_PageDown: - case Qt::Key_Shift: - break; - - default: - editor->setFocus(); - editor->event(ev); - popup->hide(); - break; - } - - return consumed; - } - - return false; -} - -void DictionarySuggestions::showCompletion(const vector &choices) -{ - if (choices.size()==0) - return; - - popup->setUpdatesEnabled(false); - popup->clear(); - int maxWidth=0; - QFontMetrics metrics(popup->font()); - - for (int i = 0; i < choices.size(); ++i) { - QTreeWidgetItem * item; - item = new QTreeWidgetItem(popup); - item->setText(0, stringutils::toQString(choices[i].c_str())); - maxWidth = qMax(maxWidth, metrics.boundingRect(item->text(0)).width()); - } - popup->setCurrentItem(popup->topLevelItem(0)); - popup->resizeColumnToContents(0); - popup->adjustSize(); - popup->setUpdatesEnabled(true); - - int h = popup->sizeHintForRow(0) * qMin(NUM_SUGGESTIONS, (int)choices.size()) + 3; - popup->resize( qMax(popup->width(), qMin(maxWidth+20, 600)), h); - - popup->move(editor->mapToGlobal(QPoint(0, editor->height()))); - popup->setFocus(); - popup->show(); -} - -void DictionarySuggestions::doneCompletion() -{ - timer->stop(); - popup->hide(); - editor->setFocus(); - QTreeWidgetItem *item = popup->currentItem(); - if (item) { - editor->setText(item->text(0)); - QMetaObject::invokeMethod(editor, "returnPressed"); - } -} - -void DictionarySuggestions::autoSuggest() -{ - if(!controller ||!controller->hasHDT() ) { - return; - } - - try { - QString str = editor->text(); - if(str.length()<1) { - return; - } - - // If not URI, Literal, Blank - if( str.at(0)!='"' && str.at(0)!='_' && str.left(4)!="http") { - // Assume literal otherwise - str.prepend("\""); - } - vector choices; - - // FETCH RESULTS FROM DICTIONARY - controller->getHDT()->getDictionary()->getSuggestions(str.toUtf8(), role, choices, NUM_SUGGESTIONS); - - if(choices.size()==1 && choices[0]==string(str.toUtf8())) { - return; - } - - // show - showCompletion(choices); - } catch (const char *ex) { -#ifndef WIN32 - } catch (char *ex) { -#endif - } -} - -void DictionarySuggestions::preventSuggest() -{ - timer->stop(); -} - -void DictionarySuggestions::setRole(hdt::TripleComponentRole role) -{ - this->role = role; -} - -void DictionarySuggestions::setController(HDTController *controller) -{ - this->controller = controller; -} diff --git a/hdt-it/dictionarysuggestions.hpp b/hdt-it/dictionarysuggestions.hpp deleted file mode 100644 index fedf5fbc..00000000 --- a/hdt-it/dictionarysuggestions.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef DICTIONARYSUGGESTIONS_HPP -#define DICTIONARYSUGGESTIONS_HPP - -#include -#include - -#include - -QT_BEGIN_NAMESPACE -class QLineEdit; -class QTimer; -class QTreeWidget; -QT_END_NAMESPACE - -class DictionarySuggestions : public QObject -{ - Q_OBJECT -public: - explicit DictionarySuggestions(QLineEdit *parent = 0); - ~DictionarySuggestions(); - bool eventFilter(QObject *obj, QEvent *ev); - void showCompletion(const vector &choices); - void setController(HDTController *controller); - void setRole(hdt::TripleComponentRole role); - -public slots: - void doneCompletion(); - void preventSuggest(); - void autoSuggest(); - -private: - QLineEdit *editor; - QTreeWidget *popup; - QTimer *timer; - HDTController *controller; - hdt::TripleComponentRole role; -}; - -#endif // DICTIONARYSUGGESTIONS_HPP diff --git a/hdt-it/doc/hdtit.png b/hdt-it/doc/hdtit.png deleted file mode 100644 index cb3e28850d11c4069609d7c76e0de3f355b837f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184528 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�lOx7fbuP3JCQLp6hd(%WUm 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

UIY62V?E_H{!IQ-r>-|-ih|0rZ$lDV~Z*T;V*M! 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 @R;_jU!V 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 TrUBVqtUrAn<7>rN?mqs1O9qRm diff --git a/hdt-it/doc/manual.html b/hdt-it/doc/manual.html deleted file mode 100644 index 1d442cf8..00000000 --- a/hdt-it/doc/manual.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -HDT-it! 0.9Beta User Manual - - - -

HDT-it! 0.9Beta User Manual

- -

Purpose

- -

HDT (Header, Dictionary, Triples) is a binary representation for RDF that compresses big datasets to save space while maintaining search and browse operations. This makes it an ideal format for storing and sharing RDF datasets.

-

HDT-it! is a tool that allows generating and consuming HDT files. As an example, the tool allows to search basic graph patterns, and shows a global 3D Matrix of the RDF distribution to understand the organization of the information.

-

This document teaches how to use the tool to create and browse HDT files. There is also a screencast demonstrating visually all the features of HDT-it available at the RDF HDT Web page.

- -

Installation.

-

Windows

-

To install HDT-it! on Microsoft Windows, download the binary package for Windows from the RDF-HDT Download page. Uncompress the zip file using any appropriate software (Such as IZarc) to any folder of your choice. To launch the application, just double click on HDT-it.exe. You might find usefull to have a shortcut on your desktop. To do so, drag the hdt-it.exe file to your desktop using the right button of the mouse, and select "Create shortcut".

- -

Should you want to uninstall HDT-it!, just delete the folder on your hard drive.

- -

MacOSX

-

To install HDT-it! on MacOSX, download the binary package for MacOSX from RDF-HDT Download page. Launch the dmg file and drag the HDT-it! app to your Applications folder. Then you can launch HDT-it! the same way as any MacOSX application. You can create a shortcut to it by droping the app from the Applications folder to your dock.

- -

Note that HDT-it! is a Universal binary, and can run on 32 and 64 bit Intel platforms, but cannot run on PowerPC.

- -

Should you want to uninstall HDT-it!, just drag the App from the Applications folder to the Trash.

- -

Linux

-

To install HDT-it! on Linux, download the binary package for Linux from RDF-HDT Download page. Untar the package on your home (tar jxfv HDT-it-0.9beta-linux.tbz2) and launch it using the HDT-it.sh script (./HDT-it.sh). The package contains all the needed libraries: namely Qt 4.7.

- -

HDT-it Usage

- -

After opening HDT-it, you can see the following view:

- - - -

Managing datasets:

-

The first step when using HDT-it is loading a dataset. It uses the HDT format to keep all the information in a compact but at the same time accessible manner. -

Load HDT

-

If you have any dataset in HDT, you can load it using the "Open HDT" option from the toolbar. The instalation distribution package contains several example datasets that you can play with. You can also download bigger datasets from the Dataweb page. -

Import RDF

-

You also probably want to load your own dataset. HDT-it! is able to load RDF data in several well-known RDF formats (NTriples, N3, Turtle and RDF-XML) and convert it to HDT. To import data, select Import RDF and follow the instructions. You need to specify some information, namely:

-
    -
  • The file source of RDF
  • -
  • The base URI used for loading the RDF.
  • -
  • The specific format of the different sections of HDT. Depending on this options we can obtain a compromise between compression ratio and search capabilities. The default options will provide a fair balance between the two. -
- -

The process of importing the RDF file will take a while. We recommend using "NTriples" as input format since it can be processed statement by statement therefore using fewer RAM memory. For really big datasets, you may need a powerfull computer with a high amount of RAM memory, since the conversion process needs to construct intermediate data structures. In these cases, we recommend using the commandline tools available in HDT-lib on a server machine. Then the resulting HDT file can be loaded using a more modest computer since it is already compressed and ready to be used.

- -

Save HDT

-

This option allows saving the HDT file. It is specially useful when you just imported a RDF file and want to keep an HDT version for faster loading and consumption.

-

Export RDF

-

You can export any HDT search back to RDF to consume it using traditional tools or loading it to any RDF database. Just select export and by default the tool will serialize it to NTriples. If you want to export the whole dataset, just left empty all the fields in the triple search pattern.

- -

Browsing

-

Triple Search Pattern

-

On the top left, you can insert a triple search pattern to filter the results. It allows searching for a specific subject, predicate or object. Any field left blank means "any", so the default empty option will show all triples. In order to simplify the typing task, options are proposed as the user types thanks to the dictionary. -

Dataset Information

-

On the bottom left part of the window, all the information available about the dataset is shown. Namely the size of the original dataset and the compressed HDT version (to highlight the savings of using HDT). It also shows the details about the dictionary (the number of entries in the dictionary and the number of triples). It is also interesting to see the relative size of the dictionary against the triples.

-

List of Components.

-

Also on the bottom left you can select any of the components (Subjects, predicates, or objects). It will show a list of all the different elements available. The user can double click on any item to add it to the search box.

-

Metadata

-

The Metadata tab on the top right allows browsing all the information about the HDT's header in plain RDF format.

-

Search Results

-

The Search Results Tab shows the list of all triples that match the specified query in the triple search pattern block. You can double-click on any element to add it to the search pattern box. Also, you can right-click on it and select "Search as Subject/Predicate/Object".

-

Visualization.

-

The visualization widget allows the developer to have an overall view of the dataset. It allows understanding the structure of the RDF data.

- -

The matrix view is based on an Adjacency Matrix. The dictionary part of the HDT assigns numerical ID to each of the different subject, predicate and object. Then, each RDF triple can be referred as a triple of numerical IDs, such as 234,5,3425. This ID can be interpreted as a point in a 3-Dimensional space, therefore it can be plotted as a point in a 3D graph axis. The matrix view is just a scatter-plot of all the triples of the dataset.

- - - -

To better see the details, you can rotate the view by holding the mouse's left button, or pan using the right one. To increase/decrease the zoom the mouse wheel shall be used. There are three predefined views: Top, Left, and 3D, that can be selected on the top bar. You can also select reset to go back to the initial view.

-

In order to understand the information underlying each area of the visualization, the application reveals information about the nearest triple under the cursor when the user hovers the mouse over each area. Note that this feature is only available for the Front view.

- -

Acknowledgements

-

HDT was possible thanks to: -

- - diff --git a/hdt-it/doc/matrix.png b/hdt-it/doc/matrix.png deleted file mode 100644 index 6f40af1f4701c42acbfe3e051e0ccfe680f33b7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98639 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 z 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 diff --git a/hdt-it/editreset.png b/hdt-it/editreset.png deleted file mode 100644 index d9bd666174d211cd2c185b0c249d14816515f4eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1230 zcmV;<1Tp)GP)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ-FiAu~RCwB4(Z5ak1gTM7yu!NwQxA!zI^4V7V|y;0f11QSAoA(SQrLxN$3otdA-4uABt z_nv#tHz(+AuHSogcQq3vH)@q%{%pN_AI%l7Uk)G0MKq=^l}eS<)xF$@s6RhESLt=W zR&AM_k^nN2 z#)VU#jKSDfiH<44nM<`5BQTOou5mM{)Rv7fwu3dxbX*xhjy3GqHR)E!uU;g%(i^&1 z6B7YgW}3jhEB diff --git a/hdt-it/hdt-it.pro b/hdt-it/hdt-it.pro deleted file mode 100644 index 9cd1b43c..00000000 --- a/hdt-it/hdt-it.pro +++ /dev/null @@ -1,135 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2011-06-07T18:38:15 -# -#------------------------------------------------- - -QT += core gui opengl - -QMAKE_CXXFLAGS_RELEASE -= -O2 -QMAKE_CXXFLAGS_RELEASE += -O3 - -#macx:QMAKE_CXXFLAGS += -msse4.2 - -win32-g++:contains(QMAKE_HOST.arch, x86_64):{ - CONFIG += exceptions rtti -} - -CONFIG += debug_and_release -macx:CONFIG += x86_64 - -TARGET = HDT-it -TEMPLATE = app - -win32:OutputDir = 'win32' -unix:OutputDir = 'unix' -macx:OutputDir = 'macx' - -DESTDIR = $${OutputDir} -OBJECTS_DIR = $${OutputDir} -MOC_DIR = $${OutputDir} -RCC_DIR = $${OutputDir} -UI_DIR = $${OutputDir} - -SOURCES += main.cpp\ - hdtit.cpp \ - matrixviewwidget.cpp \ - hdtspecform.cpp \ - Color.cpp \ - Camera.cpp \ - StopWatch.cpp \ - qclearlineedit.cpp \ - searchresultsmodel.cpp \ - triplecomponentmodel.cpp \ - hdtoperation.cpp \ - abouthdt.cpp \ - hdtcachedinfo.cpp \ - stringutils.cpp \ - predicatestatus.cpp \ - hdtsummarygenerator.cpp \ - resultcounter.cpp \ - headermodel.cpp \ - dictionarysuggestions.cpp \ - myapplication.cpp \ - sparqlmodel.cpp \ - sparqlform.cpp \ - regexmodel.cpp \ - hdtcontroller.cpp - -HEADERS += hdtit.hpp \ - matrixviewwidget.hpp \ - hdtspecform.hpp \ - Color.h \ - Camera.h \ - constants.h \ - colors.hpp \ - StopWatch.hpp \ - qclearlineedit.hpp \ - searchresultsmodel.hpp \ - triplecomponentmodel.hpp \ - hdtoperation.hpp \ - abouthdt.hpp \ - hdtcachedinfo.hpp \ - stringutils.hpp \ - predicatestatus.hpp \ - hdtsummarygenerator.hpp \ - resultcounter.hpp \ - headermodel.hpp \ - dictionarysuggestions.hpp \ - myapplication.hpp \ - sparqlmodel.hpp \ - sparqlform.hpp \ - regexmodel.hpp \ - hdtcontroller.hpp - -FORMS += hdtit.ui \ - hdtspecform.ui \ - abouthdt.ui \ - sparqlform.ui - -TRANSLATIONS += hdt-it_es.ts - -LIBCDS = ../libcds-v1.0.12 - -# Using Hard-coded Makefile -INCLUDEPATH += $${LIBCDS}/includes ../hdt-lib/include/ . -#LIBS += $${LIBCDS}/lib/libcds.a ../hdt-lib/libhdt.a - -# Using autotools -#LIBS += $${LIBCDS}/src/.libs/libcds.a ../hdt-lib/.libs/libhdt.a - -# Using Qt Projects -#win32:LIBS += ../hdt-lib/qmake/win32/libhdt.a $${LIBCDS}/qmake/win32/libcds.a - -win32:LIBS += ../hdt-lib/qmake/win32/hdt.lib $${LIBCDS}/qmake/win32/cds.lib "F:\git\zlib\bin\zlib.lib" "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\um\x64\opengl32.lib" "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\um\x64\glu32.lib" "F:\serd-0.26.0\bin\serd.lib" - -unix:!macx:LIBS += ../hdt-lib/qmake/unix/libhdt.a $${LIBCDS}/qmake/unix/libcds.a -lGLU -macx:LIBS += $${LIBCDS}/qmake/macx/libcds.a ../hdt-lib/qmake/macx/libhdt.a -#PRE_TARGETDEPS += $$LIBS - -# Installed in the system -#LIBS += -lcds -lhdt - - -#External libs - -#Windows -win32-g++:contains(QMAKE_HOST.arch, x86_64):{ - #win32:LIBS += -L"C:/msys/local/lib/" -lxml2 -lws2_32 -} else { - # win32:LIBS += -L"C:/MinGW/msys/1.0/local/lib/" -lxml2 -lws2_32 -} - -win32:LIBS += -L"C:/msys/local/lib/" -L"/usr/local/lib" -L"C:/MinGW/msys/1.0/local/lib/" - -#Unix (Linux & Mac) -unix:LIBS += -L"/usr/local/lib" -lz -lserd-0 - -RESOURCES += \ - hdtresources.qrc - -win32:RC_FILE = hdtico.rc - -QMAKE_INFO_PLIST = Info.plist - -ICON = hdtico.icns diff --git a/hdt-it/hdt-it_es.qm b/hdt-it/hdt-it_es.qm deleted file mode 100644 index 29fb43d83ff720562b36e2d01f0538c73bc38868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23805 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 - - - - Abouthdt - - - About HDT-it! - Acerca de HDT-it! - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:12pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">HDT-it! version 0.9beta</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT (Header, Dictionary, Triples) is a binary representation for RDF that compresses big datasets in order to store and share big RDF files.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT-it is a tool that allows generating and consuming HDT files. As an example, the tool allows to search for basic graph patterns, and shows a global 3D Matrix of the RDF distribution.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information about the tool and our research, please visit:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT Web page: <a href="http://www.rdfhdt.org"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://www.rdfhdt.org</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Research group: <a href="http://dataweb.infor.uva.es"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://dataweb.infor.uva.es</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT was possible thanks to:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Javier D. FernĆ”ndez GarcĆ­a &lt;<a href="mailto:jfergar@infor.uva.es"><span style=" text-decoration: underline; color:#0000ff;">jfergar@infor.uva.es</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Miguel A. MartĆ­nez-Prieto &lt;<a href="mailto:migumar2@infor.uva.es"><span style=" text-decoration: underline; color:#0000ff;">migumar2@infor.uva.es</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mario Arias Gallego &lt;<a href="mario.arias@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">mario.arias@gmail.com</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Claudio Gutierrez &lt;<a href="mailto:cgutierr@dcc.uchile.cl"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">cgutierr@dcc.uchile.cl</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Alejandro Andres &lt;<a href="mailto:fuzzy.alej@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">fuzzy.alej@gmail.com</span></a>&gt;</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:12pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">HDT-it! version 0.9beta</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT (Header, Dictionary, Triples) is a binary representation for RDF that compresses big datasets in order to store and share big RDF files.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT-it is a tool that allows generating and consuming HDT files. As an example, the tool allows to search for basic graph patterns, and shows a global 3D Matrix of the RDF distribution.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For more information about the tool and our research, please visit:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT Web page: <a href="http://www.rdfhdt.org"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://www.rdfhdt.org</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Research group: <a href="http://dataweb.infor.uva.es"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://dataweb.infor.uva.es</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT was possible thanks to:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Javier D. FernĆ”ndez GarcĆ­a &lt;<a href="mailto:jfergar83@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">jfergar83@gmail.com</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Miguel Ɓngel MartĆ­nez-Prieto &lt;<a href="mailto:migumar2@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">migumar2@gmail.com</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mario Arias Gallego &lt;<a href="mario.arias@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">mario.arias@gmail.com</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Claudio Gutierrez &lt;<a href="mailto:cgutierr@dcc.uchile.cl"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">cgutierr@dcc.uchile.cl</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Alejandro Andres &lt;<a href="mailto:fuzzy.alej@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">fuzzy.alej@gmail.com</span></a>&gt;</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:12pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">HDT-it! versiĆ³n 0.9beta</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT (Header, Dictionary, Triples) es una representaciĆ³n binaria de RDF que comprime grandes volumenes de datos en ficheros reducidos para su almacenamiento o intercambio.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT-it es una herramienta que permite generar y consumir ficheros en formato HDT. Como ejemplo, la herramienta permite realizar consultas de patrones bĆ”sicos de triples, y tambiĆ©n muestra una matriz 3D con la distribuciĆ³n de los datos RDF dentro del dataset.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Para mĆ”s informaciĆ³n acerca de HDT:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PĆ”gina Web de HDT: <a href="http://www.rdfhdt.org"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://www.rdfhdt.org</span></a></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Grupo de investigaciĆ³n: <a href="http://dataweb.infor.uva.es"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">http://dataweb.infor.uva.es</span></a></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">HDT ha sido posible gracias a:</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Javier D. FernĆ”ndez GarcĆ­a &lt;<a href="mailto:jfergar@infor.uva.es"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">jfergar@infor.uva.es</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Miguel A. MartĆ­nez-Prieto &lt;<a href="mailto:migumar2@infor.uva.es"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">migumar2@infor.uva.es</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mario Arias Gallego &lt;<a href="mario.arias@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">mario.arias@gmail.com</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Claudio Gutierrez &lt;<a href="mailto:cgutierr@dcc.uchile.cl"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">cgutierr@dcc.uchile.cl</span></a>&gt;</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Alejandro Andres &lt;<a href="mailto:fuzzy.alej@gmail.com"><span style=" font-size:13pt; text-decoration: underline; color:#0000ff;">fuzzy.alej@gmail.com</span></a>&gt;</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> - - - - HDTManager - - File Error - Error en el fichero - - - No open file. - NingĆŗn fichero abierto. - - - <h3>Dataset:</h3> - <h3>Conjunto de datos:</h3> - - - <b>Original Size</b>: - <b>TamaƱo original</b>: - - - <b>HDT Size</b>: - <b>TamaƱo HDT</b>: - - - <b>Compression ratio</b>: - <b>Ratio de compresiĆ³n</b>: - - - <b>Number of triples</b>: %1<br/> - <b>NĆŗmero de triples</b>: %1<br/> - - - <h3>Dictionary:</h3> - <h3>Diccionario:</h3> - - - <b>Number of entries</b>: %1<br/> - <b>NĆŗmero de entradas</b>: %1<br/> - - - <b>Different subjects</b>: %1<br/> - <b>Sujetos diferentes</b>: %1<br/> - - - <b>Different predicates</b>: %1<br/> - <b>Predicados diferentes</b>: %1<br/> - - - <b>Different objects</b>: %1<br/> - <b>Objetos diferentes</b>: %1<br/> - - - <b>Shared area</b>: %1<br/> - <b>Zona compartida</b>: %1<br/> - - - <b>Type</b>: <small> - <b>Tipo</b>: <small> - - - <b>Dictionary Size</b>: - <b>TamaƱo diccionario</b>: - - - <h3>Triples:</h3> - <h3>Triples:</h3> - - - <b>Triples Size</b>: - <b>TamaƱo Triples</b>: - - - - HDTOperation - - - Loading HDT File - Cargando fichero HDT - - - - Importing RDF File to HDT - Importando fichero RDF a HDT - - - - Saving HDT File - Guardando fichero HDT - - - - Exporting HDT File to RDF - Exportando fichero HDT a RDF - - - - Exporting results to RDF - Exportar resultados a RDF - - - - Cancel - Cancelar - - - - HDTSpecForm - - - Import RDF File to HDT - Importar fichero RDF a HDT - - - - InputRDF file name or URI - RDF Input File - URL o nombre del fichero RDF de entrada - - - - ... - - - - - NTRIPLES - - - - - N3 - - - - - TURTLE - - - - - RDF-XML - - - - - Base URI for the dataset - URI base para el conjunto de datos - - - - Header - Cabecera - - - - - Plain - - - - - - - Type: - - - - - Dictionary - Diccionario - - - - Plain Front Coding - - - - - Triples - Triples - - - - BitmapTriples - - - - - TriplesList - - - - - PlainTriples - - - - - SPO - - - - - SOP - - - - - PSO - - - - - POS - - - - - OSP - - - - - OPS - - - - - Order - Orden - - - - - - LogStream - - - - - - - IntegerStream - - - - - - - HuffmanStream - - - - - StreamX: - - - - - StreamY: - - - - - StreamZ: - - - - - Select Input RDF File - Seleccione fichero RDF de entrada - - - - RDF Files(*) - Ficheros RDF(*) - - - - Select a file name. - Seleccione un nombre de fichero. - - - - Please insert a file name or URI. - Seleccione un nombre de fichero o URI. - - - - HDTSummaryGenerator - - - No open file. - NingĆŗn fichero abierto. - - - - <h3>Dataset:</h3> - <h3>Conjunto de datos:</h3> - - - - <b>File name</b>: <small> - <b>Nombre del fichero</b>: <small> - - - - <b>Dataset base URI</b>: <small> - <b>URI base</b>: <small> - - - - <b>Original Size</b>: - <b>TamaƱo original</b>: - - - - <b>HDT Size</b>: - <b>TamaƱo HDT</b>: - - - - <b>Compression ratio</b>: - <b>Ratio de compresiĆ³n</b>: - - - - <b>Issued</b>: %1<br/> - <b>Creado</b>: %1 <br/> - - - - <h3>Header:</h3> - <h3>Cabecera</h3> - - - - - <b>Number of triples</b>: %1<br/> - <b>NĆŗmero de triples</b>: %1<br/> - - - - <h3>Dictionary:</h3> - <h3>Diccionario:</h3> - - - - <b>Number of entries</b>: %1<br/> - <b>NĆŗmero de entradas</b>: %1<br/> - - - - <b>Different subjects</b>: %1<br/> - <b>Sujetos diferentes</b>: %1<br/> - - - - <b>Different predicates</b>: %1<br/> - <b>Predicados diferentes</b>: %1<br/> - - - - <b>Different objects</b>: %1<br/> - <b>Objetos diferentes</b>: %1<br/> - - - - <b>Shared area</b>: %1<br/> - <b>Zona compartida</b>: %1<br/> - - - - - <b>Type</b>: <small> - <b>Tipo</b>: <small> - - - - <b>Dictionary Size</b>: - <b>TamaƱo diccionario</b>: - - - - - <br/> - - - - - <h3>Triples:</h3> - <h3>Triples:</h3> - - - - <b>Triples Size</b>: - <b>TamaƱo Triples</b>: - - - - <b>Triples Order</b>: - <b>Orden de triples</b>: - - - - HDTit - - - HDT-it ! - - - - - Triple Search Pattern - PatrĆ³n de BĆŗsqueda de Triples - - - - Insert a Subject Search Pattern - Inserte un patrĆ³n de bĆŗsqueda de sujeto - - - - Insert a Predicate Search Pattern - Inserte un patrĆ³n de bĆŗsqueda de predicado - - - - S - - - - - P - - - - - Insert an Object Search Pattern - Inserte un patrĆ³n de bĆŗsqueda de objeto - - - - O - - - - - No results. - No hay resultados. - - - - Info - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">No dataset.</p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NingĆŗn conjunto de datos abierto.</p></body></html> - - - - Subjects - Sujetos - - - - Predicates - Predicados - - - - Show only triples from most used predicates. - Mostrar solo los triples de los predicados mĆ”s usados. - - - - Minimum predicate usage count: - Uso mĆ­nimo de predicado: - - - - 0 - - - - - All - Todos - - - - None - Ninguno - - - - Objects - Objetos - - - - Metadata - Metadatos - - - - Search Results - Resultados de BĆŗsqueda - - - - Matrix View - Vista de Matriz - - - - File - Archivo - - - - Views - Vistas - - - - Open HDT - Abrir HDT - - - - Ctrl+O - - - - - Import RDF - Importar RDF - - - - Ctrl+I - - - - - Save HDT - Guardar HDT - - - - Ctrl+S - - - - - Export RDF - Exportar RDF - - - - Ctrl+E - - - - - Views: - Vistas: - - - - Front - Frontal - - - - Front View - Vista Frontal - - - - Ctrl+1 - - - - - Left - Izquierda - - - - Left View - Vista izquierda - - - - Ctrl+2 - - - - - Top - Superior - - - - Top View - Vista Superior - - - - Ctrl+3 - - - - - 3D - - - - - 3D View - Vista 3D - - - - Ctrl+4 - - - - - Full Screen - Pantalla completa - - - - Switch Full Screen - Cambiar a pantalla completa - - - - Ctrl+F - - - - - Reset - Inicial - - - - Reset to Initial view - Reiniciar a la vista inicial - - - - Ctrl+R - - - - - Close - - - - - Ctrl+W - - - - - About - Acerca - - - - About HDT-it! - Acerca de HDT-it! - - - - Ctrl+A - - - - - Quit - Salir - - - - Quit HDT-it! - Salir de HDT-it! - - - - Ctrl+Q - - - - - %1 results found in %2. - %1 resultados en %2. - - - - Select HDT File - Seleccione el fichero HDT - - - - - HDT Files(*.hdt *.HDT) - Ficheros HDT (*.hdt *.HDT) - - - - Select Output HDT File - Seleccione fichero HDT de salida - - - - Export Search Results - Exportar resultados de bĆŗsqueda - - - - Warning: Only those triples matching the selected search pattern will be exported. - Advertencia: Solo se exportarĆ”n los triples relativos a la bĆŗsqueda actual. - - - - Select Output RDF File - Seleccione fichero RDF de salida - - - - RDF Files(*.rdf *.RDF *.n3 *.N3) - Ficheros RDF(*.rdf *.RDF *.n3 *.N3) - - - - Copy - Copiar - - - - Search as Subject - Buscar como sujeto - - - - Search as Predicate - Buscar como Predicado - - - - Search as Object - Buscar como objeto - - - HDT Files(*.rdf *.RDF *.n3 *.N3) - Ficheros RDF(*.rdf *.RDF *.n3 *.N3) - - - - HeaderModel - - - Subject - Sujeto - - - - Predicate - Predicado - - - - Object - Objeto - - - - SearchResultsModel - - - Subject - Sujeto - - - - Predicate - Predicado - - - - Object - Objeto - - - - TripleComponentModel - - - Subject - Sujeto - - - - Predicate - Predicado - - - - Object - Objeto - - - diff --git a/hdt-it/hdtcachedinfo.cpp b/hdt-it/hdtcachedinfo.cpp deleted file mode 100644 index 48b49d97..00000000 --- a/hdt-it/hdtcachedinfo.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "hdtcachedinfo.hpp" -#include "constants.h" - -#include "../../hdt-lib/src/triples/BitmapTriples.hpp" - -#include - -HDTCachedInfo::HDTCachedInfo(hdt::HDT *hdt) : hdt(hdt) -{ - -} - -void HDTCachedInfo::generateGeneralInfo(hdt::ProgressListener *listener) -{ - // Count predicates - unsigned int nPred = hdt->getDictionary()->getNpredicates(); - - maxPredicateCount = 0; - predicateCount.clear(); - predicateCount.resize(nPred+1); - - NOTIFYCOND(listener, "Loading predicates", 0, 100); - - // TODO: Use predicateCount directly - if(hdt->isIndexed()) { - hdt::Triples *t = hdt->getTriples(); - hdt::TripleID triplePredicate; - for(int p=1;p<=nPred;p++) { -#if 1 - predicateCount[p] = t->getNumAppearances(p); -#else - triplePredicate.setAll(0, p, 0); - hdt::IteratorTripleID *predIt = t->search(triplePredicate); - - predicateCount[p] = predIt->estimatedNumResults(); - - maxPredicateCount = max(maxPredicateCount, predicateCount[p]); - - delete predIt; -#endif - } - } - - // Calculate Predicate Colors - predicateColors.clear(); - predicateColors.resize(nPred); - ColorRamp2 cr; - for(unsigned int i=0;isearch(pat); - for(int i=0;i<50 && it2->hasNext(); i++) { - it2->next(); - } - delete it2; - - // Iterate over elements of the array to make sure their dictionary entries are loaded. -#if 0 - hdt::TripleString out; - for(size_t i=0;igetDictionary()->tripleIDtoTripleString(triples[i], out); - } -#endif -} - -void HDTCachedInfo::generateMatrix(hdt::ProgressListener *listener) -{ - // Generate matrix - hdt::Triples *t = hdt->getTriples(); - size_t increment = t->getNumberOfElements()/RENDER_NUM_POINTS; - increment = increment < 1 ? 1 : increment; - - -// Using InterleavedIterator to jump directly to the triple and get the related information. - hdt::BTInterleavedIterator it(dynamic_cast(t), increment); - - size_t count=0; - while(it.hasNext()) { - hdt::TripleID *tid = it.next(); - triples.push_back(*tid); - //cout << *tid << endl; - - NOTIFYCOND(listener, "Generating Matrix", count, RENDER_NUM_POINTS); - count++; - //if((count%100)==0) - //cout << "Iteration: " << count << endl; - } - -// Using normal iterator that goes through all entries. -// hdt::IteratorTripleID *it = t->searchAll(); -// size_t count=0; -// for(size_t i=0;igetNumberOfElements();i+=increment) { -// it->goTo(i); -// hdt::TripleID *tid = it->next(); -// triples.push_back(*tid); -// NOTIFYCOND(listener, "Generating Matrix", i, t->getNumberOfElements()); -// count++; -// if((count%100)==0) -// cout << "Iteration: " << count << endl; -// } -// delete it; - -} - -Color * HDTCachedInfo::getPredicateColor(size_t npred) -{ - return &predicateColors[npred]; -} - -size_t HDTCachedInfo::getPredicateUsages(size_t predicate) -{ - return predicateCount[predicate]; -} - -size_t HDTCachedInfo::getMaxPredicateCount() -{ - return maxPredicateCount; -} - -vector &HDTCachedInfo::getTriples() -{ - return triples; -} - -void HDTCachedInfo::save(QString &fileName, hdt::ProgressListener *listener) -{ - // Only save info of files bigger than 2M triples. Otherwise is fast to create from scratch. - if(hdt->getTriples()->getNumberOfElements()>2000000) { - std::ofstream out(fileName.toLatin1(), ios::binary); - uint64_t numTriples = triples.size(); - out.write((char *)&numTriples, sizeof(uint64_t)); - out.write((char *)&triples[0], sizeof(hdt::TripleID)*numTriples); - out.close(); - } -} - -void HDTCachedInfo::load(QString &fileName, hdt::ProgressListener *listener) -{ - generateGeneralInfo(listener); - - std::ifstream in(fileName.toLatin1(), ios::binary); - if(in.good()) { - uint64_t numTriples; - in.read((char *)&numTriples, sizeof(uint64_t)); - triples.resize(numTriples); - in.read((char *)&triples[0], sizeof(hdt::TripleID)*numTriples); - in.close(); - } else { - generateMatrix(listener); - save(fileName, listener); - } -} diff --git a/hdt-it/hdtcachedinfo.hpp b/hdt-it/hdtcachedinfo.hpp deleted file mode 100644 index 39242c51..00000000 --- a/hdt-it/hdtcachedinfo.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef HDTCACHEDINFO_HPP -#define HDTCACHEDINFO_HPP - -#include -#include -#include -#include "StopWatch.hpp" - -#include "Color.h" - - -class HDTCachedInfo -{ -private: - - hdt::HDT *hdt; - vector triples; - - vector predicateColors; - size_t maxPredicateCount; - vector predicateCount; - -public: - HDTCachedInfo(hdt::HDT *hdt); - - Color *getPredicateColor(size_t npred); - size_t getPredicateUsages(size_t predicate); - size_t getMaxPredicateCount(); - vector &getTriples(); - - void generateGeneralInfo(hdt::ProgressListener *listener=NULL); - void generateMatrix(hdt::ProgressListener *listener=NULL); - - void save(QString &fileName, hdt::ProgressListener *listener=NULL); - void load(QString &fileName, hdt::ProgressListener *listener=NULL); -}; - -#endif // HDTCACHEDINFO_HPP diff --git a/hdt-it/hdtcontroller.cpp b/hdt-it/hdtcontroller.cpp deleted file mode 100644 index 449e19aa..00000000 --- a/hdt-it/hdtcontroller.cpp +++ /dev/null @@ -1,369 +0,0 @@ -#include -#include - -#include - -#include -#include -#include - -#include - -#include "hdtcontroller.hpp" -#include "hdtoperation.hpp" -#include "hdtcachedinfo.hpp" -#include "stringutils.hpp" -#include "resultcounter.hpp" - -#define SHOW_DIALOGS - -HDTController::HDTController(QObject *parent) : - QObject(parent), - hdt(NULL), - searchPatternID(0,0,0), - selectedTriple(0,0,0), - numResults(0), - iteratorResults(NULL) -{ - subjectModel = new TripleComponentModel(this, hdt::SUBJECT); - predicateModel = new TripleComponentModel(this, hdt::PREDICATE); - objectModel = new TripleComponentModel(this, hdt::OBJECT); - searchResultsModel = new SearchResultsModel(this); - headerModel = new HeaderModel(this); - predicateStatus = new PredicateStatus(this); - regexModel = new RegexModel(this); -} - -HDTController::~HDTController() { - closeHDT(); - delete subjectModel; - delete predicateModel; - delete objectModel; - delete searchResultsModel; - delete headerModel; - delete predicateStatus; - delete regexModel; -} - -void HDTController::updateOnHDTChanged() -{ - this->numResults = hdt->getTriples()->getNumberOfElements(); - - subjectModel->notifyLayoutChanged(); - predicateModel->notifyLayoutChanged(); - predicateStatus->refreshAll(); - objectModel->notifyLayoutChanged(); - searchResultsModel->updateResultListChanged(); - headerModel->updateDatasetChanged(); - regexModel->updateDatasetChanged(); - - emit datasetChanged(); -} - -void HDTController::importRDFFile(QString file, const string &baseUri, hdt::RDFNotation notation, hdt::HDTSpecification &spec) -{ - closeHDT(); - - HDTOperation *hdtop = new HDTOperation(); - hdtop->loadFromRDF(spec, file, notation, baseUri); - int result = hdtop->exec(); - if(result==0) { - this->hdt = hdtop->getHDT(); - this->hdtCachedInfo = hdtop->getHDTInfo(); - this->fileName = file; - - updateOnHDTChanged(); - } - delete hdtop; -} - -void HDTController::openHDTFile(QString file) -{ - closeHDT(); - - HDTOperation *hdtop = new HDTOperation(file); - hdtop->loadFromHDT(file); - int result = hdtop->exec(); - - if(result==0) { - this->hdt = hdtop->getHDT(); - this->hdtCachedInfo = hdtop->getHDTInfo(); - this->fileName = file; - - updateOnHDTChanged(); - } - - delete hdtop; -} - -void HDTController::saveHDTFile(QString file) -{ - if(hdt!=NULL) { -#ifdef SHOW_DIALOGS - HDTOperation *hdtop = new HDTOperation(hdt); - hdtop->saveToHDT(file); - hdtop->exec(); - delete hdtop; -#else - hdt->saveToHDT(file.toAscii()); -#endif - } -} - -void HDTController::exportRDFFile(QString file, hdt::RDFNotation notation) -{ - if(hdt!=NULL) { -#ifdef SHOW_DIALOGS - HDTOperation *hdtop = new HDTOperation(hdt); - hdtop->saveToRDF(file, notation); - hdtop->exec(); - delete hdtop; -#else - hdt::RDFSerializer *serializer = hdt::RDFSerializer::getSerializer(file.toAscii(), notation); - hdt->saveToRDF(*serializer); -#endif - } -} - -void HDTController::exportResultsRDFFile(QString file, hdt::RDFNotation notation) -{ - if(hdt!=NULL) { -#ifdef SHOW_DIALOGS - HDTOperation *hdtop = new HDTOperation(hdt); - hdt::IteratorTripleString *it = hdt->search(searchPatternString); - hdtop->exportResults(file, it, getNumResults(), notation); - hdtop->exec(); - delete hdtop; -#else - hdt::RDFSerializer *serializer = hdt::RDFSerializer::getSerializer(file.toAscii(), notation); - hdt::IteratorTripleString *it = hdt->search(searchPatternString); - serializer->serialize(iterator, getNumResults()); - delete serializer; - delete iterator; - break; -#endif - } -} - - -void HDTController::closeHDT() -{ - if(hdt!=NULL) { - delete hdt; - hdt = NULL; - - numResults=0; - subjectModel->notifyLayoutChanged(); - predicateModel->notifyLayoutChanged(); - predicateStatus->refreshAll(); - objectModel->notifyLayoutChanged(); - searchResultsModel->updateResultListChanged(); - headerModel->updateDatasetChanged(); - regexModel->updateDatasetChanged(); - - emit datasetChanged(); - } -} - - -TripleComponentModel * HDTController::getSubjectModel() -{ - return subjectModel; -} - -TripleComponentModel * HDTController::getPredicateModel() -{ - return predicateModel; -} -TripleComponentModel * HDTController::getObjectModel() -{ - return objectModel; -} - -SearchResultsModel * HDTController::getSearchResultsModel() -{ - return searchResultsModel; -} - -HeaderModel * HDTController::getHeaderModel() -{ - return headerModel; -} - -RegexModel *HDTController::getRegexModel() -{ - return regexModel; -} - -PredicateStatus *HDTController::getPredicateStatus() -{ - return predicateStatus; -} - -HDTCachedInfo *HDTController::getHDTCachedInfo() -{ - return hdtCachedInfo; -} - -hdt::HDT *HDTController::getHDT() -{ - return hdt; -} - -bool HDTController::hasHDT() -{ - return hdt!=NULL; -} - -void HDTController::setSearchPattern(hdt::TripleString &pattern) -{ - if(hdt==NULL) { - return; - } - - if(searchPatternString != pattern) { - try { - this->searchPatternString = pattern; - - hdt->getDictionary()->tripleStringtoTripleID(pattern, searchPatternID); - - // Reset iterator - if(iteratorResults!=NULL) { - delete iteratorResults; - iteratorResults=NULL; - } - numResults=0; - - // Check not found - if( (searchPatternID.getSubject()==0 && !pattern.getSubject().empty()) || - (searchPatternID.getPredicate()==0 && !pattern.getPredicate().empty()) || - (searchPatternID.getObject()==0 && !pattern.getObject().empty()) ) { - - } else { - iteratorResults = hdt->getTriples()->search(searchPatternID); - } - updateNumResults(); - - predicateStatus->selectPredicate(searchPatternID.getPredicate()); - } catch (char *exception){ - numResults = 0; - iteratorResults = NULL; - } catch (const char *exception){ - numResults = 0; - iteratorResults = NULL; - } - searchResultsModel->updateResultListChanged(); - - emit searchPatternChanged(); - } -} - -hdt::TripleID & HDTController::getSearchPatternID() -{ - return searchPatternID; -} - -hdt::TripleString & HDTController::getSearchPatternString() -{ - return searchPatternString; -} - -hdt::TripleID HDTController::getSelectedTriple() -{ - return selectedTriple; -} - -void HDTController::setSelectedTriple(hdt::TripleID &selected) -{ - selectedTriple = selected; -} - -void HDTController::clearSelectedTriple() -{ - selectedTriple.clear(); -} - -quint64 inline DIST(quint64 x1, quint64 x2, quint64 y1, quint64 y2) { - return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); -} - -void HDTController::selectNearestTriple(int subject, int predicate, int object) -{ - vector &triples = getTriples(); - if(triples.size()==0) { - this->clearSelectedTriple(); - return; - } - - hdt::TripleID *best = &triples[0]; - unsigned int bestpos = 0; - quint64 bestdist = DIST(triples[0].getSubject(), subject, triples[0].getObject(), object); - - for (unsigned int i = 0; i < triples.size(); i ++) { - if (triples[i].match(searchPatternID) && predicateStatus->isPredicateActive(triples[i].getPredicate()-1)) { - quint64 dist = DIST(triples[i].getSubject(), subject, triples[i].getObject(), object); - - if (dist < bestdist) { - best = &triples[i]; - bestdist = dist; - bestpos = i; - //printf("1New %u, %u, %u, Dist: %u Pos: %u\n", best->getSubject(), best->getPredicate(), best->getObject(), bestdist, bestpos); - } - } - } - //printf("Found: %u, %u, %u, Dist: %llu\n", best->getSubject(), best->getPredicate(), best->getObject(), bestdist); - - this->setSelectedTriple( *best ); -} - -vector & HDTController::getTriples() -{ - return hdtCachedInfo->getTriples(); -} - -size_t HDTController::getNumResults() -{ - return numResults; -} - -void HDTController::numResultsValueChanged(int numResults) -{ - this->numResults = numResults; - searchResultsModel->updateNumResultsChanged(); - emit numResultsChanged(numResults); -} - -void HDTController:: numResultCountFinished() -{ - -} - -void HDTController::updateNumResults() -{ - if(iteratorResults==NULL) { - return; - } - - if(iteratorResults->numResultEstimation()==hdt::EXACT) { - // Provided, use. - numResults = iteratorResults->estimatedNumResults(); - } else { - // Not provided, count. - while(iteratorResults->hasNext()) { - iteratorResults->next(); - numResults++; - } - } - - searchResultsModel->updateNumResultsChanged(); - emit numResultsChanged(numResults); -} - -QString HDTController::getFileName() -{ - return fileName; -} - - - - diff --git a/hdt-it/hdtcontroller.hpp b/hdt-it/hdtcontroller.hpp deleted file mode 100644 index af67a966..00000000 --- a/hdt-it/hdtcontroller.hpp +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef HDTMANAGER_HPP -#define HDTMANAGER_HPP - -#include -#include - -#include "hdtcachedinfo.hpp" -#include "triplecomponentmodel.hpp" -#include "searchresultsmodel.hpp" -#include "headermodel.hpp" -#include "predicatestatus.hpp" -#include "regexmodel.hpp" - -class TripleComponentModel; -class SearchResultsModel; -class PredicateStatus; -class HeaderModel; -class RegexModel; - -class HDTController : public QObject -{ - Q_OBJECT - -public: - explicit HDTController(QObject *parent = 0); - ~HDTController(); - -private: - // HDT - hdt::HDT *hdt; - QString fileName; - - // Models / Info - TripleComponentModel *subjectModel; - TripleComponentModel *predicateModel; - TripleComponentModel *objectModel; - SearchResultsModel *searchResultsModel; - HeaderModel *headerModel; - PredicateStatus *predicateStatus; - HDTCachedInfo *hdtCachedInfo; - RegexModel *regexModel; - - // Search pattern / results - hdt::TripleID selectedTriple; - hdt::TripleID searchPatternID; - hdt::TripleString searchPatternString; - hdt::IteratorTripleID *iteratorResults; - size_t numResults; - -public: - hdt::HDT *getHDT(); - bool hasHDT(); - void openHDTFile(QString file); - void saveHDTFile(QString file); - void importRDFFile(QString file, const string &baseUri, hdt::RDFNotation notation, hdt::HDTSpecification &spec); - void exportRDFFile(QString file, hdt::RDFNotation notation); - void exportResultsRDFFile(QString file, hdt::RDFNotation notation); - void closeHDT(); - - TripleComponentModel *getSubjectModel(); - TripleComponentModel *getPredicateModel(); - TripleComponentModel *getObjectModel(); - RegexModel *getRegexModel(); - SearchResultsModel *getSearchResultsModel(); - HeaderModel *getHeaderModel(); - PredicateStatus *getPredicateStatus(); - HDTCachedInfo *getHDTCachedInfo(); - - void selectNearestTriple(int subject, int predicate, int object); - void setSelectedTriple(hdt::TripleID &selected); - hdt::TripleID getSelectedTriple(); - void clearSelectedTriple(); - - hdt::TripleID &getSearchPatternID(); - hdt::TripleString &getSearchPatternString(); - void setSearchPattern(hdt::TripleString &pattern); - - vector &getTriples(); - - size_t getNumResults(); - - QString getFileName(); - -signals: - void datasetChanged(); - void searchPatternChanged(); - void numResultsChanged(int numResults); - -private slots: - void updateOnHDTChanged(); - void updateNumResults(); - void numResultsValueChanged(int numResults); - void numResultCountFinished(); - -public slots: - -}; - - -#endif // HDTMANAGER_HPP - - - diff --git a/hdt-it/hdtico.icns b/hdt-it/hdtico.icns deleted file mode 100644 index e7f7aae71aefb72afbd1a76c91f47e7191bec782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168938 zcmeFabzD_h+dsVaX}SbO5J40X>BjCZ><+r^9`#USJ4%-*f;z_NSfk@OW6U5Xwqonp zoiyzCd+h^=bE^~g^L~E++F&TA}Kpj@Dw z7Zp1XzakebXBsk@T&`(psNcjuCXbY9pc~Vv&zQO?6GbyMj*~UgRx{CIq8KLS&{D77 z5+;_&8MlZ@IL0_`G2=v{T((@coGo9loL|oC5QxZ`3s=lk;uF9`F|nGJg-HxElgZTN z^+&l{kFb}^q+*GJF&T5{&RAn_W?tV^TgkLUoWZc>#{C_QEewpU^ps4_G25;ky-Y2X zjMHfu$uvYv(~z~4iNsRY6t^7H)ML$bnTTU8qF5^%PcNqiR(diuvnGs*nN?>K12<3o zCMJ!|Wkgs{9RTd5sb-+fG2kNWZz5922iB8HC31NrlS-}CM2(E2S>yuwH|ulPZjDs} zeWt7>Dr(x|glUlr7DR$D5M|iL%~nN}qS36*F4J1eL=sM<#+ZV&AIq3cC~NKH-UvjA zxrWnRngnR|2E$5J4w^{5d&Jv)Oavmu~D!gNj95Dke`jrCA6O^#!F4Owq6(#B5@Hz?`V7->eZhDpQwDX~xuK zGfkypkwO8wjCz^sdAX|S+Ou!RkvJtNAiAb{hKFJe6`Y81n1=qZzNGl9(Ev}GM8uep zIn!fp!hAi*U;H(2fjr7euS6i}Ay+h@m%?XlXZz?#zfDWiG8?g3t-1Z?Op|?Y;4rcWDEOhT z_(wY?WxFgfzeLI=j+Ktd9^GqcG}BVkkYX)5%h=Gd1H!bx+Ul$J1MY*vNI#^nGfOl1 z*ad13-vx8$%$XOdT)H5W#mdy>G95cdJ9}pfnS6;X7E&j*Yo;Yr7&)6V?pr1nF*Exp zCee0NaNJ6!#W4p1D2GVQS{gIaDyHF}O<={GRU;-syNKB|0$U-n&ieEKdZh2B8_C2? z?8RI>Q!{gHRNvUjL6dO_Om1jp)!af&_=q{=poL3>)`=iGoG1m8VjiCH>FZ`6Lv&h~|0W`#7C6HRk>T}$R zmSPEGYNAQQIjOv%wViDMw-yK!^=>pa;$^mTa`?3&Ld94uY625A!kTeFTvN;q z?TLE`3n#*QNu;6noHUZjBy4PFa5|C~!oNAjnkCTY2T`?{PxQ{WF4%c8KJOeCuJW0JeE z#mM86nFJyz5{pG~?;u_7DEuF+<`t!PomIb+kBa(l5ujdh7)tK ztiFgl=p~UcELzeGkxa*}|H$FJZPjVr8`6YZrZ8PtNtV}xIgOn%e((_ADI=iC5OtE% z?&sS<78mW4*-akXTuUU;a|{VKUC4AfHshD+V|^13IvGqE1_6UYh>e5Bs>L!L*v}zJ znHkZ|S&xYNSY4$UHppg%J;YIjrE6pef9mJW#Ne+;B=`3wafIr~q*9%UZ8!-;M$86} zTg22k(oLpa`*6rObd`$9H_7}4)=UsEU?J0nB-U?kDQB$vqy{RG5@t8k4)Q2w=D|x> zu2lAs=}jD|i^)ww#;OVO=$N{EM2|kpeLMd1nb183D@xXCe||^>ozMcI6c0U!-iAFIfjM6D?F3gQ!TR zl*y$E)@Z8>lPsl&V&=51Zxoa2En6fbsV4E1jM_e_b#uEu32UrmY9yZW787SonlgI? zhCn_el~Y&$d@_IA{8`a;grI^Wp3o)ydNLBMw{O6Vul&%dk#+d1 z7~C>WA}6@i;rjNpH4V(0u=q>Dh>qn=#gG)Vh~xrBSFXmCEH!M#9*km!QgvN+eg@OW z($q6RcPu*lV*yJ(ZDh%wc9o*Pu4LbG5ofnx$ML+45vB}JZcUOd|J|qsJG+n>$Tb!0 z#ZVSe$QK?s_=rE+8>{kW0n5In-<%Em&uD6wG+57)C`h_ae> zXr;;6CcZU7X1QFU!6xy+YA+K_u6}1=E@B>QZ@+w=H&@HLczp-rQyiNQL^+5izUkfc=*V%8MbOe}o;U3IEx7nK?EC}e}(k;yYB7ghPkr({W z-M}2NRedIQl;u28V`^#&H8z^}Vz$$_{&qM!$O!8rXS=?WGi#HgWr)w9N@}8)DE zx-d_|`no;87s8r5@MA?XQbINE;!dVdax9j^JTjT>#gqL-)|TZ{MOwsFb@nI=Kcup1 z`O;!r(ivx~mVb_^X=o_4nIrEF`zc(s2%4h(o0!;IqbrZ#50}~5v+8iTbP4xrY~I^c z!zPW`Vm^DAYllgf?z=*ORc+Kk#2U<9q-AO#5{DMPd-&|_Hc!aZe_V(N;hp^E&Fl?~ z|I{jy!bO1L!tzmQ{H03_q9|ecM*Kx?b=++sc%pNJLm7?lpPSMHF*A z2ii)ApH2gFrKQ-Sp`KicCy&8y7*TyIC-)c+xw~_V1`s*!0XWV$LpyhOS7+xaCpBkh z7k3XQ6R_Y9m~5tQoNnJHppS2rgY7iTvQHz#{Ldq+19 zcNb?DCsz-+soTs<#2R`yJG(l&x!ag%!61qx8ugpIx;wkNIC(bZxSNO&Sba|?R~KiG z7CLY%8ci|W&C#<7OC7q-GIf zDiM>}xjDN!x$7|QD%=!nLcm-Q2rYwAXHq-dxY~+@CM|Syc1L8pf;uXkU0j_#8Zgmi z0&MB-?CfsAMBg$6q9%8=*`WbOPwuRA;T&a%eqj&XT%6tY7W+u}o|a#O=7ta1}t)ttCQabO4SnuCNy8=|%?ZJwSg#&7|%~8if{hViRaa z3ldx~%EPd_MGJ^{)UR&Qq#Mv7j1gLlKG!15*0Anu^{U4R7+6+g&;Vo+GcQ)7Z2J*q z7odFMvjmDR5%NZLIbuK@0a+Jom?(CVGj0_Pw;?t{o-pW7jK>UEE$#}fkEScFmVvNZ zBBq80Cl3%Nv^9a4IM*(+gcjM&781lsNj6XusFn>m$%eBVOh_R_2|R>!xws*0fOsK( z&=!PC&lxM@=!uNzI%V-jo=zkfHoEZU>Ke_!c2`GFNXAW)ZsHCm^k`|S14|^5Y8qR+ zsiYgE-X{IfbE(!3cV`D%d#76cK)`aBR7+t^swH)Cb#oO|%f-VU`2InxVD;+gqpQ1z zqluV7Qw9CiYwGAG=&!XAl$3j{(shYeeKVznxUsP=B1{GgP-6?;u!SNfq+gVR{lEP0 zm(SU+|FCFVU@4d2A8Z)39(GKslqjWS&lvX%%PAEv0`p`D(!dZsu!@YUmR-+rp~0cP z{oLx2-Gf2+J!osyiEke)k4=pkYKbCZ%Y60@=w3}~S%gQsrNb$aId#PrnojbRe;bxIqhtlOs5 z>1jzh^Bf?74AcTGi?DTR$!osd6vQNjR63F{$DH_#l$15yl}HaIV1phffjMRN@tKKP zt2TOL8fXbd>a9*qOHEC)Mt-)4X(P!sSe%uZnUHNq?(8yCm#{#$~xl9{w-k>oOyOXAifW<`s*)x;Gk^9RUuQzkx7imIQKo{$qrGkjYO z1I*8MBpAzxN;pU*lwc3j5Hquk)WqBY)FkwkFo$)?NjdH5!6Jy4h+8WB+)fioSc|nO ziMd_s^lp}g2R-S*LQ*j$B4>?yCKi!RB^IWJniAryXq#%R^=HQlY>a_#f!NCHTRFHX zJtEze9uhal=Ee#V_-(aV_OAoieqBmZPCI%K1)gK9u9b@iTy~t3x-$%fYjb@FJ-3Cp zVUU!bm;?E#0p%9ntQk*I&h72VXo2m7wJNd1a_?j%0S#km9&PgPfE>bQnPx?GLteFOQW!o9INl@ z?&R#MbP-{Y(n;(L$Vw*>=2N;TTrrJXL(H;4wSJvQMn(|EE0~d>ZR;T;{zMZo*ph6o z(!~J7V1Yf{VL;v7J%F76K#oAh(+XWTl04Q+f;=X`U9MvKVr~IRBa|3Y!K5wWJCrW< zF^j8*tF1+S9ZiLrrcQnHmbevWk|CO~M+OMmBrKRv@PoA1NPXuVNc}=AIr0Ok9UMxe ziwrZ_n`%Ikq-qWAFbf{JI=MMv4p1g$&DJDkBxJX$R<1@wS)=3>2ybVil}YT}$Sskx zw>N~ULmaDPJH$UC13Mxc&2U4&B8QY-!u)d*(v#DhGK6?g>L~i5WM&ekxp)n%MzpE` zZY{Vw40JO^@G630>mgoZqK0mGMl-s#6sdTx{cRe|ND7RG7+$Xt%t-yXHAyfv*07i& z)|jF)>hB0oib5iyGNx`P1X^&)mQ0kxTnQ`t?D+K5)U3X+wo+7*07^o?ToN;rV6^&x zTKLCmq}*EKE}m(N5T@761oxh!5``|C;?vR+bCr$~IAM#4>r;|5zun}|q~MOk0m~;t zXwU-LR3esvV^)|T(uH%DZ({aR)+;wTDKlZs`lvy6`U)n~vFbH*O*Yx!O@UOILQPa4 z2XPssB^mHIkqyEG&`0q~F0-Tsa!p&CkSZAZ~6(GnG{S|VyZ|NB#syfU4`e9 zx<#y78{?h(9tg#10)iN_ZNxEP+n9;g(XFvC#vT0no-KsD0?8I`WLYRS zUq{Xfkv`=pw%kz!diJhSE+XjSdLWDNkaLnACLYLunb_IYUbKP9TMGSM)eh5KY6vYc z*oH=csSqxjTC27V%&@9%Yf8fG?5`k_%+*T%BQm6-PmvtqN777wd=$IU1Kv$9C-keqmMN^455|vZf7pjB{&}c5`K;}ms5Fl;_PsHLSSU3qP zreY$P+=rud4FpPzfS&Fg#G7G>V1+fM4Q#x+_UYB9du#hfYD%h+N701H&Z;$9rDSBn z5V?CG0ougWY56U?jtz;32v>$_ghxb#O`tL?phY28v;$dE^aY`*q-82XiOZW1;Uhct z7#k5D=+9!BzXHM{d^;kqgjj{Sc%4Fp-8!>AV5b6^Ui2lGl zED$sVgn}Z>2t)$IU1DTBG5N5AZWs*?kdDgF&DW2Cs%iCJy9g6jYOOm30I(N<&LKU zvyrmF9P5jjb%allf1qD*ush0zA_?|TxMpJ7JLIf=!h8e$gC|6^t(_NM7{<=Y-NW8Y zM;gl%675E|?#N_o=LCv62zP`10{sJhLr2!5y8a?;BVm!$`-Ee#7%*`n?1^MJ7>3Cx>DIttaRYnQjevZdiw2S7?%`kz zSB0UFF+*ZfuOUM0mmRe_30Y!8|)j_i;f5o@lvUN;}#As(e6@L#}&UkyxP}sVmY}6Gs9^(N^lDkCpKc90$*vN^Y!QsBf@OxD~?& zg0M%4qyjSjJ)s2oLsJ(fPNO?Jx{GMf#LF-h1iU@w1{;F> zf*>9zu-P_-8iuW*=U7rahY7|2@hEyeTs1(|fC0x<+<_#FMeHd+=}S7}r_DIDiCEt- zKj4FcRR+A*aFXG1a0h6D1b`yna4Z@qLg~dHIv6rops0omt*d!r6<*Du6G9bmcfinyKU92Q2~SlAePY07GSf46R-;;gt1CSW_^|Uq!(0q{06((ed2^* zbPNvbV}ei&;h10)we&j%g$i~lbR-h8%NWgdp9t$8=;s?2I>g;n9i8Yd5ZYd4mLkB$lOQ;VkciL;!w2;0H*8#RL>Syg5Jpez1D0K57D#aX!~A^VfBfJI zgG0kYLjv(BFc^J8LfxR!HwZng?qQ*RcB^F_)B~m8B zb{BE_G2A{3pIiuq<-h|)Dx56fs9vSt#%KP@4B?Pf(%9&9lM|rK1 z)1<8x!`CTxKQtl$Ij+m?Lj+k@V=Ce%2<>9lLdL##}mBssw8qn;qm-y zG3bQ70N5%uHuT!DQ|ERoP_aTq==iCVXO1A#5Gqy@mUHoBeqk5PqpDcR+34%}`PZk@ zbV9{S#(L0n*a@z!X{{>EKY7lcu*a?e3fBA2=bzt$dYD|g`@*q{-%~vWMc+xIQH(l!D(^-p;URRFvG!L^ z9J@Z49*~!jh)}x1PoZ=rWA2wv9J?{9wzrfyT|9a0#sqq>5V8+1D3Ld?_UNSSA??}O z(}s#qI1eP$uB2ZZjM^1!6VtKpJuXBU5gD$GP=t=}=ZwugPP|2hs5K!PQU`QfLUbTK zh=Kq>@-6xVAl!sn`$YO`A#U~y42=lv*GvooP{RUe^3UX5!?t=YXT}j{+S7wbS~F%j zI2_i;H(+s~Mu4A>e`v&TYt#==08_Dihg4O7B6|h%r1kGZf`daU2;?|U+8s6(CJ?^M$1fNbEHp4M zGz=yU!8=7vL4JM{`yvPv%2=lPr%#>ELzcdhc|jIL-$6*PcEn5w2sMUAV`F{&24?mhhv3#1j}d?SgpGo4MpO-x!j`Gz7jp~hpkO1eLmhU?VEz%jjtuod z1OV$F6fxS<2q#?hI0Kgv5y9{j{%~0#KFDTrRNCi!KL2c9Vc%-)YbR)5^W)II8zVtA z6m4V(JSs5oix^`gg@i~XI5R`pANehb)yN2H#H2wJ5M<@3G(QfSf4snvG+#+(S}17A znC_3z{0rNWg~11Shar?l91$4m1!juHC}@!@6uZLpsIWx1Dy)LRp);pWpFG({Wo*n~ zY|M6_&p(%U(G84{u=eD4DIgh-?KKLxbt!pS=+0>6`VSGF%ZfN zV-Fb?NvVk2CI9@f3x{v}gI)=z_Ld_#w7FfmG6*njXwTp)OH1Q|KRemNU;=eILw zj@{VYQM!N#tnA%vlJKz&K2_BPXBgiF$Xq_S(^xqK}Iu5jYH;%!j=RPB4Q-p@UBdp z%bL+7UC&&CXUM;BeD|H}!Skf9SkW22-0Lte&s>VG6-Dgn${rX%1DI zh6>|?^bZT!48}nl2341?`cPEs7i#jc%{QzM6QQhyLx4g69M-5#8=)t(2{|GT<$Y`u z(oUfbNen2d9;Zw8&o5*srz(~8CzAX^8XP85pynf_z2o8A*Td)2xM{Vh;vX%q5&BPun|*2K#c5B-P#_DfzBP67%;`m zoYXZSaDq@(QCo1)W9#Ow35Gfq@^2om7p&1}1(8tJn>| z1CZ~EsT76`L!b}INwsuPcG1Z))to2up-xI8O&Lyj_AYkls9b*raz0+pzmkh(|-5Dh>@ z8&*QXni1;YAFWvq={yS2x`USGvbKVmuo9FS>tn$ruv8Le z0>cH|eIp#mU?RvvAk;NJHzOfFC1XuyMr3-U%r%**3Gt~p>7%sBwm{*LsS#NJpvFv+ zNRt>t6;x)FgRjzsrC|-{ZAgnx&d5wlj88~brq)YI04kZ8DGABBD{wAbFgQNS00qqx zVuL_r73w=!+F)on7Msd1kb7J5pR^^AlAe(qpOU>HJ1rqGA$48u`n34OjP%rm^qhVG z2ApUWBLn1q;T>_ViIO!zBy{09#I3^NB#?RfM6@7AyGmJS>{O(urN(D$NS@lqwt`Z!%JwhpKlbev9l9rU2IgqNPGAiaalSo0asBQeZ#PsCM)f+~m z8yMgTa5?{L%9?52cjZK)a#%KnVFQ9l9sS;5$gI9>|VDP zL8o-5(#}>!d~Qe8bS~imz5=p-h}ObaB>Gq^4kf) zp~xE)F&<@gsyz}q6TqU>loTA*uMU)PXfAe5QhL%F?3CkF3#OGhj*18i@IjzT;jR{{ zslGn`VG(0p5d9&vgl9KSO{Fc!9^|)I)4UR9la+)`w`@0>7ivzj*R-ckctmKRf3&ZL ze;~@`etnu#vsbtEguft)7950$BmP`h1Ukbmrk{KeojYm5+4hf3zq)Tr6n)sZt^n?za zL?ik5LDe!`XlYF?s39Rk#13oH+BsAn!`-Cp#Ej(hMof%KmuyK!N^1HtSUaHzHa{yl zEo~JFZ$imx*1Dwh)I^k}P*sx%hb&@g3xXI7{$wO&pg^Bb{#d>&Jrz>GxHJ{_0&~!s z*_eqjP`WrH75liDQDC&tlz}FpAh#eZIW>I+tiAwmD)cWU8C5)?>NbtEF%{7o+Bi|n z8uVNVuXapDqE8OkvEH?sL^`$srOsNwxcoZI$rZNXtJ&q1gC)%gAdvvlSSH9Bkd_kC z0zqrybGy=fC*T+2GLvwM#D#9LrZ`7OyYR_$l;F5({?W7?+0$vZ1fopF2I5H~G5HkL zh^*EmrKOVuVul1kN|Q)RbA_`QC#lCw!P+dQGB7qaguG@V4!9(zuS6 zg6WyCTaDx_PWi!ajKBV#PUvZUp>OaI9h& zlR(8`N@6h~8A+tdkN{wo?M$?sCb&}88tRaYUF%?MN{64TP*y|UocV`fH7i(0t`d)x7;8EMIh8>eV+B2@J79#_ixq{Ot$^rU#4 zc379aZcQ3KrQ<#!Yux~-=MC0a!s>;t%T9{NCU+)|L}8OVEd!g~m^o)bGZzHNH5vXlJtsT54Njk{idBdenB|zoSsQZJWn`qLXRKYnA^Y242k0d@ zdyg5zbTg@Cci-7@OA?kXnity74lW2QK#gQ$#8OoEBr;tE4)Vjgz@IVhzRK?7Wd|v^ zE5R`YRiO3rXKH=Zgd_JI{>hPh_P^_Y9QYpx{>Op;cN{M=& zDt~5V-BEw*GY%8{Wj_RxQYQ1>{*te%K1N-1I7pA7#QE1_|6+3FU)X}Gd!Z1(!uwFA zx8^AV7!fzB5Wp)-KD>MP?tO6uK0lwUL5W07r+@bwN1@E?K%z-Fyh@!Ih#xgmQzg~% z2wz!IT2fj~e_3&9c_n|V6IyC|{VVtq*8M@zP#tLjHUkqvmqmsV8} z)o*TIy7nAcRF+qjmGkq^_TOBbsE{w_FHm|~dlCGEfLi*6<=~6U`7)kAKFtH?9yo0~ z-#w*#d1cjmJ{=tR_ZRl7AMoY;O<|524iNnKTKGi0KmWd}vXnoJcmJ_GB(EH^T3=OO z&cEf8&|Wk0A0q-#k3rWR1n9z8!Ki%#pYnx{U{OU`Ng&D~>N4UKCsjjPs{J2)3IC3t z`d=V`%JUPzzf1Is1f3UX`;>nD+k9nJIlK0-Q8h)StWm#4hj6LOMqX>->!EUT2NKRSMaH{U-fbQ@ow8oJbhsF zxfLetexeoV_HXTAHT-*r_!sX!6qUoe@|!T1R<-_-?oHs!%Xnp7Yg|hy!SBsOF;o7n z3JCBkdA|HTIhLw&9tu5y;cT%={|P`2l&l=}>CZ6$0x7?S_Dj`bS&JEcAQ`Q>K53|P zBfziVD~tKOg>w_`LKVvSv-qx$TKgwr7x^OoG-`LByNEyO5WvzVf5z|62mz7LPXPU^ zJVJpfvA*|Q&x8xF)wxV?%i9`BFE5C za3+JN{4);(_+|V9w8NfM3wuUg_^y8i-{lkd1RYk)Byh*0y6>Ak-8<17Tp3d+bQu%0Jj$%+u6)wwE5ieTL?Vy{p3 zNz7UUA4M~P{!yRMj~PYmJm436MgKCvpAvKGfSKjYVlQ7+R$LRM)?U zY4!D4_-ktT4{1@bY=~E-a6+SIP~G30;yT(d(3IeoocX=yOG{zN0JyBEsHD8Ivb?0I zsEmvoo|N)s(^MYr@53KQEQzj_?@xe(>-|XmC$e&TN1ghcR{gV7q{NYeq4hz|z5U4vPV9J=~Gn#N5uoQ{4 zP60fzzLdW{iueKZE0sv3Fu)K_iT4Gf1L&3TH*i{@hJ&#GrF%9AGK`=L z^gn>dxm82|ND{U*R!?RBRpfHo*B}8EFI!`WKs8GEiTKm_EO0L=b4MVihA%aEPvA@W zn<(`|%L&(-iw4M~toa2H4+K6SYfuI49MgDI^_su)5&qjZe69TzCc)%w;GZkY$|vF= zjGB!6h)AlA_`BO^1X(aKCH!xCbS|!jQ3M&6VE5&m+Ft5a34V^j5Sm`b z)*gaA4|HWt96S?-$s0rEV?KJ2Pwd0~d7RP$D zYT^&!AtBK7H4+UW|1A3B=AAb%Z(gE-kpW6SAJ@Bcf#1feotUU(mM%;i{&E=ojFR`3n825p{ne zMSFwE%K7U;mQ}au3!f$IBr&Y2%1Y<}1EQeXu1u=Q;{GZ9B+pIZb}`}ae-`J@gC`rf ziv*yYcc&f*;z$i}Kwikd5bXRD`e`}sz)fhtUcnfC9%!AXB!KG)ekrn6x}=<9)aG+{ z?;M|R&XyAW{}TS5zaxGs1;`?WDdoG;9ll@V8rfqoq@>M!9+v%|!f&af|EIrC|93=x z8Q)F--@Bp`Zmsy;+gJSSLSp1UgAemp3hc|iSfr@Kd-_O0`_E*sDtISSI`daZAmG_C zM==6OVD?Yo(|kJ5Fsy=qh{F(ng7x`Z5qAaXB2;V)lg`o*4kC~`o3r*96?FeGe2{P+ z(*XrrD8S#q0B50u^q9X-v4X)<@`jIl5~{6kfsB7hKdI9;VrL1`fWPqm1cUnbB=s-l zkKl{e@EPf4nH!VK;N9%unf@_+H8z{XxtP!Sd+;e*g7_8js~EmRZ3byv4m>{mi6+}k z@&7+se-fwmD*ivx|2yo554}S6zl0ycTfs63;!v1=%&4xizh9!i4oqPsRkB7iQVjw;I8G z7XIh_KcI8+I&nH?m)CB9is8_pfff8soljEa|3m@iR(6I~zk)cN5g=z^COkJH%HY0Y(YugOC6s3o8OH6(};^Y6B($gZlTuRJif7vJt8}MO`Kc zpHZ;r{a#36t14dMt!d&vu;>Nm-d>~vL|EBYvx;`@lHREjmr9g?@TCcaKopM^ zqVglw=UQBQT@|AE&bHRd3!p$KKvsR=6F&hD?l6(tjEwC+tef9KraGNpO+W2_*g|2* zw4Q4Ya_Z(69O%;BCP@7U7%*W8B8W{yBZ{3+&-_i_#ze2&@cT2|lv3pjbd>P(KLrmu zKGxO5q?C2?f3bwNcmZSw-s^$9l0bo~>R(bBcurEMl4s1@^R%DV9mDP=ihqkQ)A@=Ui}K&`BJ)sjE=}5>%*~3k2~0E(kK20mJRk ziE7A|rPzDG?gQjOxXPg{2OFakkx=)lb59>@;o~hgswsap+Xj2Um6{ST~pSd?xi*l{cO@!o&PM4~#YWOgtrmrC0 z#e5(z`Mgu1^u?Wm_Y!2^LJbq&s=%bZx4Z&8n6(mIRPBK2*f|I%gdwG$0}tCv-?jQF zd`SCbkY9@Z{m)ZR-N`;Bp;s}#QMIs?&4Ls9{Z|})2)yX3e3BPG1aH2H@CH~7jA~G- zDexV8rR8sX)G+xY{YO9-#lv;YMV*ntN7Qr3s`Afp8eKIVjICgP)h#`HczgG3)eNt5 zW1&>_B4Ny@KZJrn5uXoj7cK#QAk$$M5Ti=|4n-PYyvTy@1d_$rA*hyYqEV!%TY#6S z;X6=1&w4z@JIJpP6P+deX>2uo12zAOo1wQqcT%(Fql35b;kSk|5f6Ea7{6RsSjWZupL}Utt^aU%;AIDf7h< zRw2mvI-oDK*7Bc1Y=9BukIrAoSQ}7}=`$e=pL3y9&j?0479ir^O5YdP9|XzS8k(IB zAZY-vPgy{?YOtQD9s|j9h@b!Mg+oTKF-4(5Dv{$L=tue?nZ}Q>xB>z~8d-~iz$knh zYA=Mh+WLday1gUsSXuSG8<8lIRsTJVCf|Mlc&cU`r`LA> z^+h>M8y*=d${%GHw$Si-i$1$Y;mU=?By0(G?ikMA< z#f+|@pY9QsxbFqf@()Eg?nQ}hF*s4hpYi7CK;i$vg-OIR8GX$KT|!CbSN?eN;96ep^tK51P}2Or z;Jpe9*tJigend`yLTAWuaSE-P4^%Gt@{qd2|NGAZAe5Op;ap3<62ZDVaJsH~)3*ed|1I*2})Z-|NuNN?F_N0(W&gO(v_3!@p9fVsWeDB;8 zmDz{w#b4|cEU=F6#IPwUTTBsB6JLA@3!)0T=!6`#&_DXyVN`I$h3S0x{`d=K_?us~ z)6qxasu@syE5Wy}*8YzJYLx8YYX$MOXdE`34a^4&A3nb3|KS4$4CnpuC)l{&6GA8W zO}CrjX76n8#D7a0gN$uX!I=1h!@BxshqT`|qWytlePg%leL7E?pLt;LhfA+lE!(A~ z-|Awe|B>C%UTtl?C+0d99(Qx{T5>l}`=?!Qaf25dUASx3Ymx2nG1J_SKD9MJR@|yv zy5Z#&c(^gr>)uF_V)9#>He=>ua8s=f3ohI{7v0^)Z3|h>wO0EZ>(CnU13*l)aqr`1^oy4^E!HXPt<(&{coeX>~7=5 zj^;mB&yF^!8u@7B(6(=y?Hih)(NBHhs@_LmIIlcZ)Hrg7+3e%Km0kErEZZY`Rqm`-L3{Md$iOnwC#qLr&4*@6R+hC8*TF@ z93JK$ovRGjG`YF?n_G_`*e49;o88dSsWj{pfBkx=Bk~LJ1qr|AH~Y5a!BJU{%O+8k z&(gchz2$WO_F(5!U-8kVr(Z79DxP~ZPkV5j>Dmz$Q;+{zl%6&3*-u-iUQOtD%Ef#4 z{IoxgzOajaY8U;&#rs6w-g?7^M17bT)cl=B(_@N)vYx2{G5I@|KY0@4`(C;0)f$Dq z+nPuE-ydi=!R}$IRomg^uAT>f%P)36w0y~d+2Wa7E@VEk4LjDy;<3|Jr?9qBL#~*w zbn=eSG7BrzoYD7T^40xGuM1b_ubcVwE`18Gj2L|`}aj#>3lVx+8 zvOZHkB(B~(rY%2Kqv7oP^|H>+Yjo(=`)k3nqIL-n+qha!^?qd>eA036c!wudZNKSr zB(>+|1(N+9zaDpr?yz%jN@VVEYx9mP)E5V@DL8F3KiHtCciT1xZJthfGtY2+SGSnS#KgoJs8U^(cffnqlLDs&&1uM@;mMCzGu?QinymkS`VJC ze%(2s;LOS1EjnCls-FXT;ixft^n({?xDW(+%iH6pRMb?}0s@0#~8 z-l2GBbKXB<#IGkBv~#~1+2@J>(Bv^rW~Dxxx;^>B+Nj`K`qDM`Ejs&bP(K(mYxfTq zZq8|<6>hpDv2lfSq2Jb@Z5llppmSyFY^{OaOw>1T{%K^>K(RsJZ9g@deD*?lXqz)} zZ`$69dlkK>%dxwiy5Aji^!2(!Z4aJpxbDiDs_;oH!icjHF^F)mlqDFXU*Ldn%{EKeFM#|L)4G{@WE!EeVm2n+Rj&OZ>>zrZsKNr zc>1gfH-Bk#+-do!RYkY9q#yHYUAe3Oku9R811$!K!}-|n&l-deZ~5{E|4l91ek)dF zj@1dcz0X8*=9_^lET4JK51R3;NvETYPG;|FxgdYTw!YTCEq=OwHy>VZ$eXU%^L-bS z!~KqV4tf(k{>KNy$J%Z!|GiV0kD`9sNad7utw-MvcxR&>c+Rq|XmG&+ts7GY)k_(F zGfuzfoo*&Sh0a#K7yY{b?x?|T(+bQt$R-bRPCc`~bnmJJC*wH#8%wO7s(C)vaM)y0 z(AqhR^)K8x@bTK04oAAP-c#K5`uVnb(rmr+1N`NHyy7^6>s>OhzqXiZb;REwSofXI zr1Hme{6-ery~!|Y)_Hx$wyhhT++=k-<2)zZO-gIt za%|9}f#tcE-K^)Ihzxw5`nuiW;G7u?ZO?W2gAKazee;$0?$G8NUtQlPo3S~g^4#kC zvvl41-=BEdpl!yA?F-*0KRo(ka`e+lksn$!teux-tMrJ1bz z?f$Jzo+x!$M~|=(tIJ+WrKKaxy3StEE>89?`kH@|Ozlj|dlK#EH;dXi{wj)1m~z|j zhTqhL@0;;+8uW>7|GoZW{eCNZH(p`f)?2%Cw%cWCy!;LOj; zP1#FLmTlb;5$5<{^^w$f+m6+{VRmlq_VfdK$IDBP)o&(UpZe`E_kD^a(+y*%EW9{% z+P+=U9-hzC+a58AGcDG~a7i-6t2RXKz+3H*;e!#ch z9c^qkVzVd)8KI7H2NHg}w=mIq$e8 z?T19^ZE3#-k6kn$#kPCh9N&SY*!{NC%E{4DQCEwtb5h5RyDaWCE4IpbLuc)YyF=!# z=&W4oy!`>+|F`#TzFD%pZ0G0(t?Z+mpU1WKTsw1EudWV8-@j=aJK?)sebp>?{C;-4 z58vZPVCxaig)<8xg7>*fdS$kXder~79YL>i<__@c9&xbW>pQl2lf6Dj7H$1`c38@p zlBxOaFGtN>^5|SblShs1mileHdT;is-e$A1o(-I}b9&l|6%!v`2%CIo#Ey8M)>f<2 zigOjaE|0gqC3eg2{W|jY4)NOJowDVJ6S{oAR$AD8npwRL0|w;B-Va@F>+;yE`{^jJ zW9ja5&n-N<=k2o9N1I0{IGj7vNc-(6WrjYtzt_{Ndw)1rZ&%0G51x(Mbs!}mR#)@8 zi$ks5mX$YsAKzs|-jc%0PJP8DMctn7nLKaGABm}wbH!cyYBbE!4`^9%=0;ZLmd2Ss zwcXd@c;VKbx6=k))t@xB`AFAAH-2}ifB$)rh5AVMr441j{t)TDzQdFBZ`@}-Tz5`m zguA{*S8nhAu{)~Ly^Cg<=6*Y7aO$?lIWr4KPvB=c$r@~Xx?n_H{^hk|QD)#Qp z1^JpJFFks}^LkjTvywHh=Sh zSK3B@*w6Kgys@>a^c#!fh6|oK?#fuQPs1;6Zs9M>d=@QV^tQB%$AHtitINixJPgyy ziTF9R^TJ+s%lm3PEv~5ir6S@do2wUl&UAZc(R{z==1KKl|DwLCxU+iCoD1VvT-p}* z+dt3VdC|P3-J*G4=% zv8&_ajfvgIUfikkJY#jZN!*zOYj^8B{mpnu{Vj)_7K;~@7rH&MOg}PnmwJqR^`^-U zGX~v1_TXAm!~WAdTj(41-(j$QX6WgdGxdLR;`{A$9IXRZ2^Z)~Bt%D~#S)aC>o6`JM1Z-CD{5?DMX>oUzy4xz_gJ@?+);pXznA==#&z zs=EPee|GOSxnZAWn|GXSctXQsrE!$aqb3_iZ$4|$HO_c&MODh)1-Ym854*T_nwHH{ z&%7I!>g(rq?)kIqVY$l`ttp$A-wpjEw&)r6a$V(stesB}jP>{GF;)Bial=88CebDD zhG`Z2*0ZR76N|9eB~j}i)$=<#XZ~%|6*`8OoR7Y^P*UM;-+1AAme}R`&5Ig^O*&4v zs_^TuA$DLt?_g=xi`=HK-|<#PKMZtEnKI9Mm3f!-=O4)bNUypcJm>ij?@ed4UNXWa z?ew@?dXF4}pG4aa=>Kf#kmf&Ec`tG)7d^9HJY@FxnQ=*j_r*MKFfZ_JwD#LuJ1tY@ zYTxX++$quUn&fJO5pl9EZ+!Y5$rx<1t5d9b$ekf8NBnH=VwUh=zuJi|`n>1v4vB%9 z`uw*x>Br zDfVM7Evz4^w_x}0$A=9a(y!q#@5xJA=QkN|e6?al((P~i+=+g7!_w!j*W3QX*EUF* zGpP04pq09X6EA75m{Ct}%lsr@ z_^zX6K~tYum;5~V;M%!)#n+emC2tGroqO;7hD^oAjSsiK*llgz-S2G(cSq-f?0K)1 zjeh94p?H+T{7DDLdHr;9dscD6ox7ULj+c%s>eYeG+w;&&-R#AvIk87)A8dQz$3l-; z=T9Aq?0;s(X3fXeVVmAxeKD;#%sb^y56&j>>Bh*uhf61S?K|tI;?&rMrvmTao1`5v z?yXVw!ws45l3MSRJi>3tvOG??JP z>Dx)&zB9VmepSk-vsV{aEHf+}-gbBr_qxyR(%$>ezrK8nyYKB*prv#F+Mt4&<$-D^ z9B=>eYl8Z)qscD|x^-RdY1-w-Sv$gfwoc9I^lg@I%&;Gu-+gG1x^P~*mpPmEHuXL+ zf0X0olnI`{1Ug84En{Z>zQy;N-`3fKo}0-s94;BoylOdM>Zl)s>NmIZyYARcRQOEG z=gtH9zM}W%Tq>81J^Uf)RO6wG4wda*mK>1xi_@h;G2d@84wo6WuW%0NHTvC4!^*iA z)i%gqoBk3#JY~R7ch1!}>bt|OylnZ2;Xa###}68B_LIc)RgVqvle1I9Lz@i9Z)$US z*73-ODb|l(EH<-WvQ@FB|4Emq>%%WyUVbLzpk<+Z^Mw=7Mg6kkM&nbrhV1R_bnyM? ztV0W>#?>E$C;JEMX4y-SVySmdUuFKfR^>!`XdB=Qp#rA_go&4?9Oc($7 z^J%jdPVZz@`RLo;p(*z|rq4g@@9|BZ=Jck|8$Nk*ci5PvE&)9fTBigYowLb1Yq0*r zg5?9cbYA6lcU6&Ht9@55#KoVszkYg|{h~JedOm$==RU6Yy+y?y5fu~Mj8n&D&pMla zah#dQrm-$>VkPs7JMPSz_oHXo_qQ5OxEcGQpTs9&gP-XBwkbW5e@wsD;9lH5{j(O8 zRu6yi|0TI);gSB0vqy~T*V;HO;z;g^1815Sc=tbSz~#4{{>)@ZzaPeZ2<_Bqq@Mk? z1s3Itd`G^wq)r zlt{)035UP@38M7=qbEfld9Pk>9Ae;rcr@(Ol~HFHL0IV&E<@NS+3 zvVlnC1eiop5^*}BtWXCGZ0B;OQLPwwb;En%FwA)DDn2=HqmaBPQnI1$rXe3l|Q0wj|i?`#4Kkzm$zyhj` zW1tuX-K$Ie$nyuZ;fw868Se*a`c5uQqJfG^=SJ%h(pL@?7>{IS7%f<=g3By{E*qOP z!&^GCZ;W%()uD^iA5;B+Jra18Wy06Z1TR)Z z$I<@F$4N-APEPh{4#Bx7O$b$v#ecGy>EGyP7fv$>Yillq1&9v*=Fg?(CiZc>$!WezduxK2;ei+DoVJ-=|UAo{Tk{2h1lDo)y92K@(&y~_Qp z?K{6z1jXAllriy>!ACLVFD`1*aCTsTSSk=dFD^thsErbxrx`R-(kIHA^M;#GRoVE` zogBT+v>J^sLRL`_J42Fd|PWgk80bSU~l0t^}tL>kN~Z`X9(?WvgWLgr($Yl za2&h&FK{SS9#&`DuWnX1xgmxjh`NfQvN89miZ35CZt&`%pcMmC#Oip0x$Hj#P;Hus z(^%0fg|`s55)z<(pZ0iY~hAS8Kr{)9_IS5$VIPc9{0%82R3CCqvHs z3e(k8C4y_`Ns;zvr;8_|5)GWXzniiF+c)toBu`=Gn(xaH=QJ@B)ly@IVU$) zZZ?Ph68e!nBiv(iC*?J^aK{P>g{74Gj&Akk)>vcr3yXos?GP|!BOg2tweK{X8PES# z0Psi+c=>+V=aial#=iL+os)zm9#bEv=8HtmcIj3I(^~v^gOx`c7vHZ&%3 z4E^93>|i?Ss`@+pUpnWv2rKQ|n7g2v9RD;Uhg$J$OVsrvnmtPGWI3iP7yKH#bElCs>5{@Q*tOXS{pULxxXGK!cT#@HoFyd{2gYY@zyxRvN5}KoB$)(q2 zjXr0HIqqDTJaqX%{X9XiJHGK{&euyl&o-*etpF~NRwFbPJU#Q*ZlcF&y=<8wKV|EF z{t4vlGhWYVo`Z#F?q$wX^?ZFzi_D}Elj~kVpRyGF`RV^{cLhD=tjBn8R&KsOl8(_s z@DIt2m|gq>8$1&(Edk{5mX$;n7&kPYZdzL{<_b3^bb&I6SW4*;0M;+`&Zr2y=cj z);;^57{C!czv|)o3t)QYj!2PB8~yra_!roSJTW$b7#b^s;iq6O1d~ zM7VEca-Tw8%ym_O=B!7y$o z*`pg~`$(6izFgQ2(krz~qL?jAUS-mK}LppYEA9M4JSJ9_28 z+M`|z_-V2hKnZNcRQL~}^+f8#P{Qw4GW9aOxcPfsHuVY7xvX^y3B;CcmLZ1taED9J zf*G%pb!L7;yDgzihVmh7xc4W15D)xJ_xRezjWkYG5iT@i#L&-@OeSW137nMB7wV2 zV>fzl(%{2YxsEV@L_BIP_%UbHI@q_FDJ>AOTp6~G3rOcPfZ@YCNhPX4RHRTiEf=g<5=!#kvRBcYjJthfE{sCgMGC_Nl&D+qYpsII$A_5N zmBV;m!=V2C;!nJ1TyW?-!FzdFJNE|I>?%C89{*`E_F7HMmuEqp#;p+DbCMf0Lo%xn zx*S5zJwNF_0w~sPR`C;?X?q0<5pdjJWwLr-akOg#zwwJImz&$-P=UXox`bgvm&56u zt6bxt8KNo;Zqlg9uHp0ZtCWZK!{T|{TZ&*x6g3?8Qm7qa9Eaf6$a5kJ1Qi4M!?H-h zDyu+FXN_OGEY?Sjkzv&{oq0*6BXW}LF!#kA=T94iol=@HT{AB#%aj$;EhL~d&G<@0 zKA_zs9xMjiS&s9Si*PSE2Y(A4eN$}GJu??rwj~Bmf|3x|Ilj<1+7`A;@IAhIPTLI^ zQ5d~aktY>0Y`4$0TD{_eiH_DyAC}PDLi#LyO6yFu11kQ#aMFHWnrqe&irOV$7a#k^U_6STG&NOzIbXt$vLi7Bz`0I3`SksEIl z4}sM4mUB5hdPcIHA|@}+rUUxEer#O?$(N8_>K0KKTl&FGwo#weTyykjEfy~!Q`?gk zr7@ZAv7F(<$i%@5?`|DM7auZiqFK4eJIbK#XFHJI8FLN1nnPp(`C`S~h@UCoHvd3V zD7~R_zfGkL!7)lWtJL`f#_fEJ0~WB1=aAC%Xs_Z9*X#G_xmS2vJ{vNlj)PwB=4i#)P^w9dXHIKr+#RLKTZhb8xdIsGY9dHq**hgtil_D(XIGCELUHF3IRcbHkR7Vf2cZd~ zR$}bnY!cs#NgfjPOB#fj9=MfVZ>mPE9;rSB?HWs1q=TEkc1*3(LbXvd3@TuV>`wQX z8mwyi`Hvyo_^mXG7kVYwJnweE!$x+^#i9WQkwvkV5mjR2%k+ zzZf7#zZqAz9)90jxbQ_OZri*!qIk6Anu7hO>23VQtvgRN{Bum;|oBDkI6H{gxC8Up0 z!tsb74JjU{A@1sM&L_DMGiI2gM0S z+t@_Ws>e4=-LeEh`-j{iqbDV_d%ZTP#%%1Nee+IIy83sWSCub9T8h4wcr+vuIxvP#CWV1y}M&c zoZ~-f`WNmGI3$u&2Ps3Z`@gUOopll)$QSU(lO=fnQ4usg=TOY1?wJ~`T+xIFk#XU% zK}Xt@-p(>}h1ImP&Lo4P+7gV15Tw<&?_@gB@mnmI2X>R1*=Iwnd`!4FVazoxBqZ6j z>n;pvHIpQy+o=^O)b}F9c&PH$CBbhKI5|?&3!SK-|3An3w8yg$iOH;3&X$|1DXBc* z+(#;@4z!;sAVnq82x zoDk}V%iabAu4w33uX%&63kEzQbr@bKb-yVv~u*4s}Za=nsXG8T&7C z(Czp^C$U7qQwTX?I;ERQL~cjTEl`WESVC+qEJd#A*9~rS@}HRhH*WhK+U@yuj#anK ztw3XX;HRzZqpq&`OXkP&#^Ix8$=DiFnYK`3wou7B+LUSrH9VNt8%52Z)R&vBtYtFw z{wjb3UZBNDc!5^2TPu3Z&L+I-|1O{|B4&BHKzNGDq2qiffrlc%_P_K2$ua_IHQ%u8 zIH5wPv5{Lmi!$NIe;GOPyCRmgsr5#Zu!zOk20Y8(&VSow75hf&O%saMspyg%cdhkU zATL-@U#)`7f~H_WLLb-f2Mf-R(-_$zb+^M$J5Zn{D)$i2^QF}5(nRt}94ljXBcMGo zK->wSfDmOc*JN9o^(cY-z03tQ?*CQjs{7);LF?=8N%0X|2GP#W=Pvt_W-JCdj6x$Hb1wa;|`nM0IH~#q} z8UE?_)MbE7U(vZ|QPLClyb|{?SdF%+EZZgAKzgp9NtZKQB$oDH(@|SuoYk!XjO}AU zhK}Gf2cUlO(Y_v0SC`mPb1~^D(2>11jV03}lkB(Ah9>)6k6v)^#;8r9JsN(Y|R zp?2ilH#T^&W~YX58f_DIAJt<_6~`K%f_-h(U;XZG3qI3XhW_6NHaB{kL+(3{3U%DY zOS~VwHK|5A^|=R>)^EHI9=C>CA`efBCh$p`f+OyNIAq|-y7wRo7&gxipDOCN{^PD0 ztCBLBG*5Bto#7k}AtuQgl@|Xz$F`<8l?ZmxR@ZyVg%O(|?`0)1Q1&nPZQNc2GRhPm z|0+mg%zP76*b}Zs9Vof-7AN4g?aUL9)8|0(14z+OFXjV~6DZQn5+p;zJ3@w=yZ;M} zitI@nO;?oI>%6t&7X00^X~FsE9$$&A{~`+~+pC2>_r6Gjx-)vWlzFo2Ji9iPl1VJd2Y_{_3sMZJ1tc;;J!XVfQZb&~YtL%m{nQo#jKC&$)9;jPf#iN78>BojhkQ1&I(Dt?ThE zo#a?~q$WCXH|w^SnCfiCTqP?P&k99tYpA+0fs7dSB!w7dXSj#+0ze<+xquQYZHA`$ zVc$HXnqrm)oC+83pWw61ONX@|s=q~U32PM?FJPkB1Z;vz!y8%%qv-OSk;8~SuNrn; zGO(af3pdrEepVci^Z00uPn40=o!-@ zf67w*q)=&xOK~1WnNb_f6N;co5{u* zL=k2Ir`ND}U+R!zB2PH5NkbS*shJ&L^FasOYHX<$Z_a*mGK4)lz{br*w6_vE6BkAVB#4Cx3gF@iBw zxtI?ao7==&Q0bcA!xuL>aW4PGnbPt#)IL9)mdPfS3 z0U6z(SAT1)y}b5#D| zQ`Rke>t+Bys}^y*l;kzhAD43VVe@cT)!!>-3x1~*vpkhAq$ z!<_h|z))BINg}_Zzh>QgLA=z0-*1uK7Djl5#VeQ3bBAH?q^ZwnH+rFWe&+F6DEi!% zU+qdl$bB&ySHx>@;cb~PTJ3|}s|2p3*2P}A(ACbE3R3xik}l*)6&E;(ZOp`q7Qh4= zb_1LeJ{B5a|dvDQD~OWz4W+4=L2J zDYEeBQ-f2-g+JyEzop<_mSre+m)c38M`U||S#1cDKXGH-z?Mm@I7n}w@q`Rl6wNO3 zEkSrSmnW%?FpGiAs=qv~&7ZBs%*^};wD$~IUtnDl&oJ0vB{_)raXOZYoto0{+d1iG z>H{VzJ}V+c_mbz%H!_ir!BPHI56vsxXy66TB>{9|)dNjo?}F|ekSckzyypc@>AFbM z)={Ubiz5C|ATK&FrI`y4YZz?6(iRJwM>~_b)(LDa&=q?PuR5>vq0vm2DRF`##C}kJ z#_cNt8boRPdCNoT0DJQSQeP&K+_bp`*C= z3KCl{I!D@wQi%e;dEzaKNe6Pm-ad9n4>&6o45S2nS3e7xRI^ zrna5S*N($Yt_OU`U|B*>fbeKO`ZoNOsk@su!~3f0(z$BOl|ddXGO}9D{Qm(qxF}|A zZ1AA?OI<=X=v5HXAK$6bsTss*Gp^(M9=ZYe_4$Q);kK6^XVB2Q;LpVSJk%LFOuP5Zx0jEbH$&n0 z0XKk*ae!j&ghBeN@{JP_XP0ye?wkWlHMV|7SzB` z41c;cRGt$EwfEI*?2_<@ci6tQ&tg6p4&j9QSn#Ob)A%{?tG9Fv&_5@o;FcDmE-jNG z3H-e!(}}J^J3n^3QX1~YzbbEe+wNnjDAtXvHDAZFUF5Q|0l`QWSVt#`P|WRgY4KItsG?9c8$Uc&jkxEk`~)dp&ThoCrBW_HG@z&@{dM8P*$f81MXdMQ`mytD__F$PUi!vR+7!V-CAC~C z(Q+NN$P{3ouA@w!#QzfSa@_l+K!{c+v9e!O{_(HA)U%#65IMy6juEoE8vhpgkJybUrv_QHxil}<3 z4rKk=-6+6Hvjf3}U%~J*V5e;qNs(|2^BNA%g zXrn`y4_W;WrcaRWk1`$d*ikX+D+oXX)0fdmVZPe!!`8PaJUg;-$?vl%*=zQqy`Fei z*T_S9Ce|?5teEAw(NaXEs|J!Nr^ga|`oN&+P}{T)hYe^G24s?coTWWDaX&tKE49(g zF_CCKL5>Z5IWlSCO!4&`YwgX;Lb5j7JolxrodEP)}jiONH> z*{mk}f$8LgV^^UTPN2df7gm)^h640^8ut35vpjrwUZx6Kr}O8G;h2rTIfB3nKR`Nm zsZE8RI1f!iD2@YL%t-vTFJnG|SuFCFqXj#QFxg#v3g-SyCA>^sQqeyTLQ3e34B7hi z$TheZDmCI-_=(=-1#k`0_R2-dw|!?IdsPL-d&>z?>sLSDlYf)&AM5MOXFCkp@y}U) z(S@#EK4Qb|>$V?nU9kIl{`4e`B$|+~6_zoUG6mxI`CF;t8`9oAgz?}wA+D??H;lk| z)J2b>m*Y;?PbVK3weuC{CY@+8JNq>Do`Doe+_+P+kD`g5K02}H2_)#A!`7p~LS2q5 zB??Whs}X2|A|$2ZU;tMt#i&?BF8&epCSbc56)R|WryuB}NQ~ObpPljq4hFucaA@Yz z!*)Zoh8|j*pH6bVtVRdGl+?Gb;}z3ya@_wpL7xM<&*@nBJ!J11zzD-TvhlF(&4m#s zHqSa>(+bI>wn0Ak!6UO^Tu{+ho+!6cd}04wT#3{eqtXNKb2%cB_e3Hk&`~ebiisD> z_1*BB2!y(YX#Kw~ORtHi0b8kl<12)B?L@_+#gv%z)8|Rqt^JcbI}H{rJ9kTpO>d1J zG`4n6)tNn;dh-A_72lYDp1(5bVF^5K0Vi#dUJM$%>u?=;7d-VLdkb0e!eDtE!omiO zM;^S$X%8;9mF@?&b7Ak@?JJBMqi>7BFy_2x-`hOz-vLjhnTuvE>1)VKo@``bcx=>2^I;>=iCB=8ObQB0 zj|NjGR(MLP9YQ+W&{J;dBGcB=Nu$0MqxjAVx8NGIFEMwFU{+2-T?gfz89{n5$;vQ$hsv=1c@0!%z2{ zpzkE_5nGt<0vlJQU(^*yN|IUUfQ`pp5oNz5B-k-P^-K`4R9@+$w`Kv>f9*tC+LV;w zfnXzSAPX&OWOK6_a*BX!4gmW3JAl4S_(}umOrtuNs}G`i>V9DYHETNtAfz+i-~@Nd zST1unL;^gEO&?eOfa-^Y&KEyT5Gn9mTiG}WNQxwAVBaK7Fut0LZJU1jEX?gDKGU5X zzQ@&Z^%o?gozhXA|20;obhee0@~~yv*1K+phQ zV;=isjycw{$#wK{0p#Z?a3qFH>O)Ax^RB;LlhdCV=uRz_;H}(`p{MC4WIhGib#h`s z&=6A3!;b7c0TLt|z+U{%@ze(5O=rfIKiQ?Y9t<|{RzC;-9Js<*Q}Ef%$WaH;Km1sg8pivxzSGa4QQ*RjQ34XILpEKDN|Z*4EKKT z5D0bZAdLh(g;DiJPv@=9!cb>>P4~YtpikS|PeNTQJ8B1s`YxT=KJ;d^Pb=vZxZYrt z%-S1GjT~MRVJ0o^0UtxdwySkK@P6kT1PIaEK*XG@&-2-_4#foeD9b<;yOOH%*pZ z457D?9B8pe@Q>$7^xyE{lbqNmRR%t1hqQ?Qbs7-MFEhz(ldr@m(pXuirq3E5RJE3} zpoKmsFRL64>2>b|g8|l+IuyA?@w3OayxMEqrX2*|AgvS4W3fo0jC5D_P z|4u`dpGJa9H{9`$Ty)#az9 z&9cGA<4H7K&gy3FL&NzTK-4f?AiWeG!N_(L5zO`*b&gMo2b|RWo!wV%3oS(ihq@oqC{@ zW|K+gKxiDVAS`0c>#%`=l89o9REpBvNotOZqH|$@7VN^I;9`}e&Qqq@b4PRDAKJyEo^m8>4p0a09 zv|Sr%n}^U=aFvPvKh2DahqyeN?{@_gJqD*F?^;}87DtxhZEUi}+&_|7oNStg+9d8b z`mN+ChnKk4ZTLOxy<(NDvF)&Fd&KFD08w&Wx8p9tL8n}7a?lBAdGiH6_yn>G+%%sq z^-;jWw+7GR^&Ryti@aQDVD2_Hl~T*eBX?bqq!clO3!*G_ZuWW80)##u`2P-eoZdg3 zE^icLaU2y*3Sgxb|1~BZ>!6UQH{TOl`HcTzEMS&oD}#+WWq=sHqwEXyt|3iROiiNgwVF%_Z!8J9W&u@6cmm8_Z5wn>37av1C?F^V+Ix%=_N~P*Z3;eInHH3mlU8s}bOYJjqkJ8z zH1O&S8>FmVg<=vZZ$5vpy(p8GS<8h+x48Ij5WsQAxiKeo8qQ%2iFVI-70bWC&%IImmi0y ze10CH0L#o2q(aA~LE5eJwB71g&%dj^BODYKP#0E&SRhLA`biYe2v3fbGkU);2zjvO9FE zIKz;Nsm<^-otJ99dMcQDsGmu|0&Y%{6sGU=MPc(aBLg+E3DePo+`-N zmEoJ?;YEA`;;}II4OTyjaItG3MTc>Dq2%9s^($2WJfCOYKkQ?>6s07A5?ShUn27lU z!(|UP2lHzM9mo+UXo$>+s84I4>b9r3Y}qRsZ3zQbPA?Z{n_RL9b5Cxy1gF9(BqZfF z31MpATmTvdgWCbV4foph!LacD*)4P609E!@*XB=xhC8M;BF%=#2lO@7rCv}s+A#G1 zfa$FSPL}N%L64ulHF`KFS7Ss&`r}qsaRNy}7h{D(S^VS&l$yYxs!HtE{o)-TVk)vc z-&f_R_Iehe71~J7|qGEmL4tR~W$ z2CdRrls1%Kt%)6ezB<#Hg2G$;BQFAS6O>t8^O2Y$;T8E_g?@h#%M*^2v&ZTCZ9uMi zP1?dlG52r{r!PxM{wA|=Ri-yAr|PL~`JS*zfWV4kSk6vh%>u%;2yWnMCbZndIW1du z53*Yb`rg@}fUKeUm(iGv{}Es}M>nnA2!gn}tpJuW<@{qWL}&SL$owU+q8FIL-#>i| z1DrY|xBH%MwWUHn&|C}-WM$=awsdCMTS6AS*f`sV1e2__${rvUI^HcV3v8lfn9VBS zoX~GS%g$XY8$OBN`1bA4X(8cRDK+HM#B2OUC z+6=US+Ni4Dc|M}MWEX^>4k{N&Zy=&p}hgypMnNQbdk z!z^3n7;yP;LDtLg6~A<(%-A^_1S}H9IV}ZJx`q{TCy(3F=hbZj=(ddFD{wRsq0D+t zU?^euY}XXKCdp=^PFM|jCf4hJor|DZl|cGJs&?D@Un!@TijtpD zanQBUZ~7vN{h__1?pcri78O03yr-vqKIL|+_Xf-$Y)%suZYcE=%1XkUZxM+@tw4ZR zoMN_xjYsf7$X{$eq48VeFDh{&zCR|`Jz0C;@U)%7YHba;Ug&ZoY$cB7qW)dTY z$pCw+e!&k{s)L%!x+Yk;MPF19l%h_H8u$#IZ!g5hIRAh5!1cPsIu=bOFhj^V+@rHw zLs!Y1?yd;Y6!DBrr^Djm@8mKpj1^^M+_=4smU~s7iKmgL*mM}<^~Hba{ZcNekBwKA z)>Dquls#4N;ZVJrPk|=QxdLPobqhNR^C@lXpH?cCCD9VV)|Cmelz#EP$KNh85`aP{ zYH+{bZwwO+;nn);SRFlW4KSz=JvbJ3@CKI~qPkKmQz4_3a(khLzD^4zvI&JnP`4#6 zXe)o?)NZm`Tse;}$#|ovu^$0+(1^Ftq>RK;4u5|ObhzxE|ou*oh zv+J6B}3V2N03UdmC;3e8)aAZDzm*CYIVFTq$AbJV2%#A)rh_ zKg0yJr6=p*832Zm+R3)-}+ovHv>&$`;xOjw8V@90N0-N)4kS}DY~68{5^dwFcWtM zQ-A)ZPzr;xQA>oRw!wtdupvlkTRpmIf+w>ZC&hD9C93?aYtPiB{M zAT9GOtQVun@)6aW2FRO=so{~|$d>&u*S-6qs|ukw!KFYXk;Dp8NEmHhYDR@X>Y zJ_=q9XZUcdRrT?OjZNHBdgfzTHe^X#)HF0y0=$S?a+59a(K2(x_@;)M)1vw^?om9s zYCiG_-9J!9IPk$pLtm)_eX{ZyeZgC4v&ThIJJZOJ7+7E9?9}c4!cQ2b_ID_Q)!#m zlCzl!T;8+Co&ClLwmB72T$EL)gVCG!z6FUk# zTj2D6jP(W>o(-J1jc`#FR)dF`;>sdW<>V2ez>yg~c(*Qu5Rg}q+VnULVW7x;4GVim z^}BAoqqm=){|=LcV!y`+G`Qs0QvQzrSx+M*%}==i5kNFwWGtR5Pqfy(a=hI92a8mi zfO&@uLL9!6&q4rjeS%#bIoxR^Y^xx;tP0OItb(&Z#@q)C9(fD@Tc=opt8(W09ENwv zjL8}p3m9#c9Ey;3ikWRi7rM#49``+E2bQzJNCPsjk3mlz8)#HqWDXk5;$kK`)y*FW z&!0id;SQh3NB>thJnsUe7;dF5nU7} zL;>WL%6hw zO0Xl8Lc2WHoa<8N0}Ivg1dH;PfwIXi8>_2oYJ?on=i|cF)A#f0I9cy?fA&AZZqTRp zpi)=F9eUdQhzcbJaa!E2Vm~hW{)oya%+h-5Z`=ShmO1la zhOYg9s)V2_Fq@nUmw305uhirh&>AGqfw-lyP1hG5MfA1;<&4lNRo}mV68x#LIzeL=xc_5O=>L8EFQ8_)i~21MX;V>e^QO7lh|a&hD?HIrEv?5y zaI06sB^+V7Oc?T?JQd%$p3FrU%~Im^kndFNQ66*^2z|OIO>S^-&@XJJCs%1zpsDqY^YeICJ#sFKlE zbv1~^50a{42Wu-^10xrxBXo~$?iPLURpVDtSu(5#U4xS!>;+h;j8O<@)#w>)pO@-fW_!lYn;u|OTpyzwOBFoGFA|I?(5gCw&i4t;Ec+o_(4oij`D4`BGgfGY$T0(>2CXIq>~zHjrCZkz=sk zR{JaYTFVZe7@7kKJ4P6U-?#p&^lHN%&c4WyT!8U?cc=wT8}TJY9Ro#k^}zP9pAE}s zT7~024Yi?8B^KnjV0LzWF)2WhPW`;X+pSc1hXVzCw;`DBMfRwAK-vN{a>RxC3k)2k@?5khAx+hdjW`1m4UiLZbNoL303|%8qeWq+(0l`8^OFA zM-xhmFE-4!ETG7*N3^mL2nsd{rjMB8_Uq5>=tlas9{RT{7uC7<)xJNse1C64m_Js= zey!sDTOInhWa=Y(_va-gq++cRsEw1RPb)&KQVpML@H$=B3*VXqtupr?eL;us-gRm@ zH?7%wpp;-SL*$LzTeqVs+g#b)7w47Su_4_R)*az|z~8+dps=-?MwfMApIQSh*VAg1 zJTx2PDtKc1Hqe^HH=>g7#-6eAe0iCs2eo!7YbgkFdk^;_&YB`Vx<`cQ#}_Q zl4Fii$M$UK3lr_vg5@pZWo~)k@>x;#~8 zpm89sy!cp+VT#c1qsIEZf`3cQ{q!)J!MD=dYjq;^Zo%B?&P8x#pXBrKY5TYOLiJ#! z#!-E&*3%RM)vUsspH(H~S*|3Q>N!&SU}ooo6@(cgd1SXSVCWZ%PH2><<7pvbXaoha z*nAhg1m|o-%rGXo@2yLesScIHz?SR^q+&64j)yk03CS{@TbwDG3aN|rA?&?sRG;Vr z*kECKj1jNqp&^a+Qg5XN0r+pJ!_N^&0wDpI-kZ{HM9j%OAf8hM48s6ZGg^Tgy;iC0 z>8&+Q>LFJX>&n%?@Kub*A<~|vZ4l0FSSY;;DKsLPzAVWldv!{%xOi;95J7lskr9BD z5|Qip#{Ct2C^MWNR&1B%rGo^AO4L=+oH8ogwoT&$1Ut?y6_%*hU>-4F=`5&8U;=)r zGo9Jk)Ut(7MdnWeB<~yiP-8jaef+x762UzTs(Zt~MRx^nSN-JgP7MUnP-JUe>*-Jj ziou5<+bGgd`FsMn-Em5|y5*)krGT6Ru2j`zYWkULm8*>k=PtmFjmvz!P%u9DgGE(R z)WBOMN;_o!4z1eb8RD$^a{$jWrVK3h&`DOy-@*0bonS=ADSdr<+{Tq%q(QK%`l&Db zvm6RXV9SU3OG_rupay5|Xh>N7PJk4yl>p;!d47T&6z>wu5OEJO3Ty(rt#85$5aD6L z8t|x%pi<$O+4W=Xf#k+=Y^EM~@U}|$xlf!TTn9Kx`?*euM01WXPBKYMz=r!SZ?e|x zZa#qMa2t&l(?tt*S#&EO2WNEz&K26ep>-J-u)Z2Px))h7n}*<1-zR{pj;qq11*jn4 zp<`T8q?H3~f($NQ^#0){4uK>^a@9Dd#o4zub)+rjqiV4Q3}u5%2;E4yll9K`g-z>n znL@i|qRNS&`TTf11=&P>?Hr4B2c9vZ^m`&@B{fy}qPP{fD*1Pb26U6Qi39K#Wa^Docjp zKJoC6>1~NK@hdAOkq{sC%64#AH%%07wk@2X&mRe`kaH1I8QIYYu4niYL$aH=7F&UU z?hj@(m621vmMmdN3`|Q!86K0dtz&HE;`z{BDK#hry)NSQ>_Vv5d}A9C*;PP&zVm2a z^Me8*AYGRZm9}KNqgFi-R%PHl-N@uZQME5BD2!Ob>1s8Fn?e~N7uM2?O!KpW{T50Af+_S^fiD*Vq1 z{q~fnAWf}Jw0m-TI2qhuyp?e#yW!s{BJ4!LXEgJk1gvye5vsnYG4Q3QPNIJ1Es;nbj0V!M5EPAQAwn11^ATEJc4ls?Xqr5#q|;U(NIg7qq+ww50m zKWBCqzLtfKsi9_*z47F?@vJ{Erl*@-+pPraM;1Zlrq&Lj&=Kp!1Ix+gHY1m=_R4so zw#6bH8k!RVY|X;2GGeFAeZ_j=epvOo*8n1Zxasshi;f$2>H2sknC(~JJgc zxUtYRDjh_WQVtU}O30&^#c|1w6pWPnfRzt$wwT`uTkmn3er#O75 zxP#}|BudzD*Zj*Ea@O@4{_kDcjT#RmLC_CRX(Zb~Z{2W>FxE~vkmpk^d{Fykcm50k zBLNH5EruTv`ll0@@&PNGBHNBrR}?>L8u&^d%HPV=Qu4?IbVdJPQpo)8(eSTiBAKmk zpHUl6HA=A$d(J0=hNr7~^fq%xUK|pw?3AI)24cHdC~5Z-xf_o_P5XATfJ5iw<98(T zh%_R)ojHy3ZKhzW2|GBOkR1$D|9JM#_hAjnb|ni%i|@rtC>cYDeWevEP&@uK4=p5x zC7Dv(NG99e6MhWD4d5{qu5=Z*D-A6RR^o7zt59mL%FNXca-v;_!(?kR-3OTP#-1O` zodJPingrTCjJ`dgibpXQgtm^Ryfj`*r=9Y-`8d+?nhE|h`k+?H(>DtTZ)sBCSV8qj zL)L1WA4E&)dYXgb9rs;os)LO4G!=k8VJ16Zbij%Rqri>y-9o;^=|uECvYogaCX}{% z2tT?$)Fhl9l8VS3z#vd8vl$>ONHYh@KGSKM_kBZVI{2;u@wh8K{(Uvw(wgJT)DLlnPaS3r@S3~zYtX4bSEsz*qEcPn?&!N!NYuT zp6w=F!}a}e4($Dxz~9nedUyoMWhQz9Re5jHU>uDZTGM{~^K}HB3PiZ*MNx+FuvH@q z3I0@~X)^VzF=+4V{hJ|EavxJHLusz?r?=WAt2K=u?=SlAFUq7CFOt*FPOA; z7p=C2VGh6MymqI?K2|v{WXfHpa63GcEHJb-Z%&C?UDo})2G5)3LSCrnmC4!~K#r>o z+cbU|VXisMj?x1s|4gz*ULD?5xI^8U#1S%Td3OjJSrJVHnW1)6Fu%p1P(MPX-_XF3GXUIhSSK%Bo2?dJ!7 zSN0Zj`pe(1ESpxDggoH^GdUswH{4NJ8M?z9k|Oi)ci$k_ER64$O0Kn?gDDD#Fu5!* zOEr`Nqn_uh!+G!22# zT@k4U)g#)wpnvDcdA(=xMzR>?E%xa`xhwoYad^5vPR4xiF^H=O_*lgveB8h) zQdf!NB7!^L{xh|Qr8a)I5f_9>a}3tWKi{FS=lp{UC|(w}eWzb;4U$@R%TpJZY3~o0 zT6^HXI1HxVHZqsYNy7bUE%h=~y@N9JQSBI>#_mj(zpyjsCr6SEc6su&qBsm{I zTKWHE9l#e!b`;4sy zPj+)64WYbnnKDWWV0$d_FTOeh5`Km=u**Z?)z4cA(og00FhCXHL?yYsrYsb75MaEX z6k2yOx0itT3?$rk;!*B}g0oaax;W({#~;lPKlE)XmXZ;~$zN2cmkk!)*TmrK+Z%)o zLtH!}P&dTa-Gc<+D=t~+j7uvy>k2Tz49nrMu?yH_lrbhI#ve%dr!Kgj?>@B#&Lgso ztUnda%wSlDGM6n^J>m)OfwH60p}g6(6Orf6WIK9WM6bu6_g)m7w(k*31N7f=`tuRe z6U^{Ap56?!8FjQoiu#^>pUT>|sjwve3j-=zYU-AR38CO#6I8f#=xJua;svdhV&A!w zd}hj59yM}z@!tAy9Un_y1gDfl{$@0;Li%h574KO=&&Eg$B5w%Hq{R$%v`}@8i#1u zgKCuLzT$X*$SNJp;3&u0R-RS)2(-I%pq`6T@Z5I76IYjd0kX_?dM^?_W_CI?wK9`z zGc2qX=U?eJYaQV%OlE*O)!Hs%5!G6hXaJRKqa~g(6!PyV)ih5Eig0s?NozHMW6mEP zUa^o%2^-TLeamd5KqiS>;(EOLZSBj89__DOK3q!zKLFem7a#d%Zs=BZ=5v$2+|EM# z;yz_qE`YACZl0)w&i-tO);t5HPa-V&DF^UY2GSxh`89{8Hxtq&{eVydcs)vwoRB4q zb0igJHKx4LUe=mx0wX7ikMT5p5hUh}-)6L+eMuuldwmO>$rApSCWf9r@N)r{jxUzp zSn@Ez1KYj&2K?HxoTK3S0TDhhGh~4h0=nz)8-_+KzcKkrr&>9#OkeVXCjDj&AY`5v zAcEtsk$tgl(CK(DjK>c_lr0y^BkSM!!M0^Sty`!Mmn>z!9iSJTvP7hEw*~IiBTiIv z5$-xgy040@(l^^NeX`FeV~WshLLQHQ(z#@Dks*#Bh_=(xr9jjgW%C~$Q(MM0w<*a> zPeLmYD93l*M&Gn?wKu0~04+?Qe|XI`sTtxjSaFC30sv#PT}jxy5o&5GcYPhz*r%ba z3cH?Y!3^J#KVw$-Or+TlZ;4UYvC;0Ao*Rjk;A{9v8d#LD&Y8|0`489XAzP6?^N(nX zts^3&2+o}U7X1V@N7+cb>%qnFb%--C^2BCrrYXQ;b_g+ab2LSV%mwRZkL!hOdP_q| z&VvAyVk!vv&v6^K(YK20qg6hrp)3nDw;?Vx!wuVb?nB{*NckK1=%l_$NF}3cC9u33 z99pCr?T__-mpB?3h&#XKMk;fu?I$`4@X#LOQStOiiwUIFnUc>6Y9Fd>q$pw=P35OV z3T$ObYIEOqON`--RD`<&TM>ObC{r@*raL8db=bU>?u{MYL=7^siK4Y#B;+19M+X(dgMp#m92aKmQz5Lec#AI5&C| z8Thk*b<3zW`ex18cKafsCFQ`O*f> z(-8k=1Uz}jklX}gia$P4lupwcL4EtyMSmO%!}4G z{H`*P1E%c*Ev>MTp(AJF$za#b&1)tXp6Zq3)H!^>&0y6NtivXR(a6lLW04TP)&iks z@YxwtMKDG3IL0cql2=h_h}sF`>c*j})1IHg8P2|SaXOjf@`ao3K1?L;3+)xm6T1&V zFnb2+#w)Xd7B>0Ng7)fgzMQA^3OVW0H-aqM^ne;HxJ~XK-As0~@bsV=bZAar4oNrN zv(a2LAtS&XOIqAQ`m`Qp+0ra6v4J}WdOh$8rxzt2PLFfgC+#a(ZJ@y}<6*(=HPLs!S zR9fdjCubwPhZc%*Flc+N%?Rs>rl=UJ+IOe@@u>E*gIm{Jc$#RLM+`XM?@jnzh22WT z0$$Pqa}zt-1}%;<%d~US;#S2E)y8Etoqg$yD?bnjsid%AF-+$Kp041kna9|ZcoWfB zBrW$0P4GLQaDRu(k(Yi(8h46GAx+8|HzwM%8Rk^zi76gG?tzOhr$NXC=F<8YD=PG{ z`d!dJQ0(BDDKc;OPzn4Wv+V9NqSRXuGqOknqLy&hRYX14XxThvKQ9smdE7q@zL(zo zTWcH#R`D;bfprbw3^g~2Ta?%5s_KZoe?vai!| zjMh1$XFe;7UE;H?>MK?PIClRQ(S8gDI|Gox!wq0qlEOC%KwX!ZWV*3{<0R~-AeB0M z0&O;WuLp`;WTfKko<@WwXy|dU&!X!K+yu7zsj-4WOt$jOi_gR8FimK1!OH&WK?XZ}IFg3O=y%oQ$1HkTU zW3X~sHy@W^)S{ksInKQpL92bBy(*Uy9XTm7?IdzoSSk;YI=6^Rois(XMB4%$Po@dr z$JD$Ri3N&l{zi+3fyX8FGvIt`Fr_PJp1raGPlD`T4=ECKPF6V{RaG}i*!3v?D&$;S zSC3MH=- z8qf@RYD>c>wD7b>&ES$Il#vHxX^Yr}EHTt3AftZ?nRU55%H)Fe>OM0eO1$JK1j`de zZS6`~9z|*W*OHxYl&>JE^ZH)%5I6pI%ajpdixni`dfv$ZWQFpHy~~}UoxSH3J2f$j zv+cfiCG2+SLs>BwH2z$X>@$s_jMt>To7Th+3sK>;Z*7y^jcOKmH=V5`9|_%L;Onc4 zT!=VYY}2F5snYPRjPhoivP)O>xx09#>W9cTgTGLeq`-|F?*B<&?4P2o_%%twh#!_Q z4M`;9@4i#3_R{hc>wG$^Q?*eJdS4OqRmq)5v(@`N1Hk}o3*Y5=rDw705=!GU)+(eI z?fkX>)Cpputx(Wb6YL0gRq4Hw!(0_d#SBcF{xlX4V`aBj zZO;@pUY!7~QA37#3+|+A8RiY^r+AFgfYj8)PwMp!Xksno25~r>oR-AYZVm^m_YnR9T^^&IFwEfj3iSj@E;j-AzLVO)pe1=3td34X^V%xPK>% zIs4(mGw|w*fSP9wx#G9n6h=XhjfwM+A;F28*^qy2ZAVefWS&`qD7Y+WkCtIey=`b$ zj~05TBzi&|b#au*91SCiODF#&Lyv^cpvD};buW}Dw9E&G>BP9T&&Dhh^Nv1m*+Dz6 z05`R^A)eBJQ=(0?b03}phrUs%X-*mJy~M16rlxSF5$>Mcq6-po+Phgjnu|~jIlC(x z0(}UEex{KaC`*l{B@8_3`be|*SY zO4ln=Mh_%cRWK%EmDW8mLSZ7M*~TlYuLzi-q^Bs9CnB*>P;QzjG1R54OY1ItNSFloahTKV#!A~6Tq--Mqj1uGdlFm={mVz)m(3g`fdm8~wRm79D@=qVjY(*)Kki+qA04Cb`j z^6CfOa}T)sQ5I_+46Xb%S1O#?d;!?_;ok(>-On(9VhgwzV`fX7o&a?jSA@Yt?kg6^ zRUXPsmHQLgG#55Rn~VquC7WL90V>(jA_r1|a^4RMByE-c!LxYTEg*Q* zPzNRO>)ecSum)?8wzZ)PZaVF_##p3t(=n%WLNxy))}~mDw{Rq)Lqf@Ohh!p|0b{tl z%CO z@IVz3?xsmIetkd{{|Q)~{NxCv$3w5l4!?*;PRmf|kZ3e;kxEkg zRAtCnyRX1j9)PN=%DL8xw1hPO zKs>ZgU!C7`=Bw3a3Sm#bY<~?++A4HRJJ=rce8L=wCoHMLDsGMlhEg{-@ zzMfnFdGW}snP@lZogjgN0IlC1EE9ve_8bt$^C?SLO~20e<~=?lL?b%iL$3VqlaPk0 zl{QLJx82W&t&atSgvXz|sS@l9HVs>vj#cK5!!XRe21rjfDd$Hax}QW_M%xKRdoxcK+qsC=pO38DxC0>0708|SLF;!z{ z;x|xWOcF;wsZ&BJFtgskQ+-ZWgbM#@EwNCx*p|U4?~M)7S@)JjIwZXeUBu{*~a6I?MGjWtb%Jx~J4s zje=Pz*80N6c)dmhyLqf&1}a(hL}$V;r`%nMeLW$j!vzS(?pLE#6B1e!#K@0)g&wFK zSG7qB+}JtW=gSfWHIG!ysj#Z6@^^9i9%(HFPw5KT^RzpV zT$om(tdqlN!=RwiF|Ol7VZ99Pzu?O|s>f%e?bpYzMj7Ky>>#5JwI*!s z7Nl?kDQ#(ALeeh`E#`bSQoc_`pzTJckdfybl+<(u>S0c}!9SIFA{)p)PO;Kob}Hgy z$-FhD==X_?KM~;bSq$uZ0BsQ107w`fF-HoAuV}K3+}Gf{ZRU&?eE&@~m1;C%SFFQc zzT##~UAe!ffc5V1A1|hH0o8%e5*$>(O~=-`HroTeR@6B4G^pvSc&sr8CA^a_ZTXVc zR|u!5$PAuyStw7zUjFtscO+~rWV2j=&G@k?ov`f*3S7p@`_53kZILAzAv(@^vkIG5 z!|(HWr9Pj6>33R#r^u>?LTC9c1PBbxCx&<-Z1ZoZb$&Z}UQ`d>laMveJDf=iNhcO%6wzv&d;nknwwezWW%T-{V|-{*kIGtO|#UV80XK-4ajN;Bhv z_kaFo+Nq{U=UGZvT9Z-Vq+|ds6yG|SO;M6_ocqZ&LJ05-#Zlj0ITK)5L^4B*Y7}@r z?Z|Kfv=#aOGG@kjXv3FjXXE1L-u6W--6{teOh;p;&hfW35;wcblkv_d-POEm%C=8n zT}^jq_)o2G17}t-nh{gCj8l-SMP4zRRBGxIK)3>g6q(T0;e zs479|`}OO1AURD?L2dm-G2?vqEyh1&i;Xf-qpT-8%S2)|llJlwc zGib)D7pkr-HC|h!5{2X6StT;XZ}-Aw=DI8;t_z9C)gmZ zfOohn56?rT$<2#P6eH0=Ml-S#=A2mP;?L+)^E*~_NT778!Kev;-@D}0U_L0j#HWx8 zUM{dTjR-co7a2l;^M)J8IbBQDBFsXYa1lwu+MBR40ASXfU83i*BfRLDm#h6f4AI-r zoRGJ@tKbJxyQDIiu$puO8lyEv8Mr^RpfUoZs4?H1Fig9;mYyp4KwrWJ=7c|gy~O%r z+(Yho{s;t|i3uU4;#p%!x1Z3cCRQ25U4%|{FV03*Bs*QGNOhR~XsrX}? z{PBwlZnT7T@J3~-DEbF~ml$$z? zay;qLWXA4^W}NjQIE`R-?kCSSxp{Ac=m*Gfi(9w-yu7g>sze0V6S_q!6~B5zl8!lN zO(;lRvT=^U+3VVQ`SFlkWvzBRm=b`7d1B*p5A~Fnu{zehe|G(IC`}0k0>Ar3XO>gh z@$tC51%+T(lJ22V$f_v<5mG6jgn9>G!5~EBGID*DB-anteO_SxD9XhftIRsvZX=h^ z5OilEP6+ypZ{_gCb;GBpa4IL?bYTttoO$ukX7T*HRU5N*QGYsQIy5%T4Kv}?@$SJme9APohnR*Db|1_5w6H&j0 zf6kK}4+5trb3!$uci5e*-*M`?Y$(4xz!gn{a6 zF}^I}!=Z;CG&h$1D5uPojAomUAr7dSFk07RA&IN+>z`55@7b1ha!*g34iUbqH=GSO zcECLyIocI(7+VAd$l_C#U8DMaBYNu#_FP~%|06}RHA}2T3kC2156qc&^$&1F1By+M zJT8kpa`&wf_!RtpVRpmAyzEO03C8`;nI^MEC%eRgp^8urnCGx0bK2l@Q0nr{ixhjO zEOVhga)oWbe9uQ+Sh9z3o6;l05~UkP6;R*7iU{ga)*npRk`)jlZYbE-fj>vpqOxfFkL_HVS5}Q%fd0>0zq}k9MiN%M>F$}Hb5(KGFcd*3I%1f zKRx8>aZJ3yvqix&5rg6KGz~~*^@-Hyd9M3fXo_Mw&gwx?_&|Arrxx2K;uX%plk;|o=We}zsy7+#rru|!``nP-aZw3$5u|KPKe^%Lkt>oqx=Y#0+vai(^^t3pg z300fbWTeJpKZiN~?tZ)`K$Cg?n1k{H=RnNas=F)X-S+F)UEa_rz=FUN>-asQp3$0C zqlu0$U0v|FXnx>7i8kWt=8M0V(M`UepTUZBhE!IRp_()8=BL(Fb9%GN(ZOv!)FV9h9Ln z6HDJ%aOks`m{1;iFZV?nL$~F;gsTDDBXz|8BufUtnS1a0t%w&UF93*EUF?n%0aueO zdfvyasb)cGs%J^PfRe~K;}^3T_&$wVNUWY$L}+GXh+}I?k-!xI)wdYiyl6mgO>n=4OhnnHJZBN{mcR^PA?iKT@V*fb!M`;juPy^oLdbS`f+N4^DW_SYv+o?S(Tb) z#g(U)KshOvVY|=^mlT)A%`-&6;!x$sEGo%@8jI1Rgk~Z%w&{;}GL%*Om9p+r2ah1S zO3`YduVfJiufLuiaKwLw4GBV;%i;0s&HxR8rJk%HU5Rs6pQV$>_SYfLG@FrAgu$kx ziTpRSW@eOH;Fp$NZtO4jOzX^R0a@M%~G zWt5H;G1)*%{H0zyR+8+SC0&LM4+z*96cV800;Z#!mgPe@5q*Bt9irjvLNxQ=5_xYh z>BGZ!y(Wwcr0@$6{oy4DKzXt{rsbq*)$W{ts@$ITaEKduv8AdBmR_Y%XJh(Q>o|nY zBdN$xkqE!amWkmzl@wzkS=2+HgT^0LEG0%ceci!Fu>ch{nX1N@LFF_p6(4mFl7~#$ zQ<^jt*}$Y0G1F}N*)rrKyn#IJAO(0O;cqnp=zmn`cKpPpT}PQ6!}>>Yh_DJO=5UcW zk)f@9JI(HD#2)vNxGfBt0o3 znI}OM-NcwKvd&?G9ZW!-RqB_RO#5UpL=UCaA|stL$gnGxIdEd16GcU$;6_sR*9W#o zAtEn2t}${sy8F8M=RW}k{}pp4;2FyYpFXOp|NTB*&;dl8R*jkY)Nfgccia4$FH z)Qpcmc6J&YcQat+(INA-XmpBeeRxv@bGjT2(Tzm19!2r-OF`T51+gpf&+e$5F3HKG zfE;w_$CXM_e^gGpRpq)o&I#?;_d4-D9_J>>9Yz^Nq0}gB(g7ae5JB}JsQgGP{xFU6 zB(+mphqDdbdA*(FGq!Im@1*0O%gCuP?n^Gnj+-d`KcpaTEZA%K&1~yaw(r-CGsxbT z&|mts8OXnH5}Wk}w#JafQwzXxb3=6z>T54Dih`!qCh*?RQ4^NsZ(@Ki{|2xBd6ATF zyvdDaD0X^g2tNn+B0Ggjmh8${vbMI0A?BiA8_h;r?1zG-3q7Hm=uz@P#>JgF+A*}6 zfBnm1xgt?#g>tQo(j{vQ%=I6jbM*4$@ZcAp7S43EW1$;5{`;;@9L2%4NqDMJz!Ulv zf@G>A|6n6ANn1V@s}GuVnF*GfAk$Q#>2UT1+0waG&e(^ud~J z=dxnDIRk4zkgdWIQ66r*%1h|O{qF^QCExq)6K=EJscbiCF*yn0(VMK+8=f^QH{lw? zx~FEvkmvnE&Y!<~?LU92k?7ux`U{J1(lQS^uSd|ObO%l4ex&e`b#{K#-Q8ZAxlwCC zumCyKEJ{5vC%egg$6?|@g;`=CaQS(qtD4e&bo`MtQMPK;mLv)y9F6@RGlO_^LB(w) z1?Ewgi0||e;+V6fxw$UbLF;S%YwrO!mi6>Wm|9{xqdH}YM1zL3B0`ATCLDikwUA&N zvDHxnzhjotfV+73lF|KMmr8!~;1=T!V3_+;d4~6Y(+4TNvzp&2uk=M+S(8lE>%y;9J-ONNOYA~-sONJt_L z;2cd!XPd`hT7mwqBCsunY*23NCq)FL{}3h><38bxgISP6F}6Jvv2BtE0SQ%b?ow5m2rho=R@( ztb&dftY}saC9ts3<){|qNXP;mJMf5UGcNLY5q7$aQL7f%V_E)tMgpIQ_t^81r8<_L zz5hV~Z*Oc2OCxy*N{Y*KMnw{WTh-PO1e#yV{^XbkBXx6ye=ur0%GkcRO1W?1=Bc3zEFos+Un``O54-=5v)U8t)Hh_Ge^-!;#h% zG-Vtc2M$(MR4uLy5gca`6R>mtB>qN23FG%;@&vQrof7*hv)&Q$uh$E#b~Bd}h!m}^ z-&qb@%VGR^A6^2VGLNm=RNqYH$hGIb;&$V+_QkJaAA=6n%k{^+z0E#x98M&1yg=H$ z3Wrz{ozS;}VCQffw{laOkEySZ6n#=*Pu_l!l>uMDbLbV>@_*lpX~W}D#tUK~$Dqb(nwzK++W=N?zxa+5pVH^~Ze zo%1}iXA1B}XxuDRsLo%dWz(};Xv&EjgG#!p&?XZe{*#8Y!{~Y(idGFm2?cwy@$e!o zR*WHKK%sOc%&i9qIdr?e`zrgPs+mw7Z>MgIQ|IVctDfa)Wx`lcIzx%RT#_AjhI>uD zQaRa)B+wC=3=cPqaWnoU8~)~N@wn$<&b}#YQO9)Y{}CsQH7HLADLHS3W=MC50(Zh8 z%<+v1^9pafYMjm9w|h-D%2O-69hFJ6WeG`F$j?Y&0q7sULs{aa{|@V{ugv=V8_E6F zPNGzEZQ#p8G^;8#GE9@JQkvdOys1j3Pcovcy|lHJ|des zri`={jHN;}bO{AoX%cFC+kS5zMobOms9}2nM|ML(RuAnEyzmrWaUrokQ_bJS3bB#E63j-N9nxUq~=d#yK!p(Wz`5;oP=)_GhieFWXrB8E>1F;1DKIgt#o` zgH2|JSdjVv8w9>(q;`vIrHZ00;2Pm@KC0 z_ab!a(({vB#IpC2<_Lwc?3_+6C?M3t=v4TNqdWE2SMw21;!zd?A1Z<3|osmK=^&JnJAy zRby15|1SHF&!|dgb=|$xq7UbE{Ki7Uc{$5}>46O!%>+Tf_JbZ5vIh>uuR)O?k~2qw z?bVMc4=?iyO%gD?25t@%q)t1EG?h%rXU3&4q??vm)ao^(!G_;NJ(2;aQL$%WaD1r+ zL>MF_Il`;3x^}Ji)3|WpaTO2I4)xQyy?(RAwzs}eHnMabC-)y=kS%o_1ICxSN5*RGaqaGEu0H&R*vp}VuseNpLj6R2 zd7?mw2jgWEtzhOntSlw4fT}9kSnA*ZOvu($Z)_Lv*WotYfp5FQ$Y}?&<1=^&f4u)?)&sJ6%f?OOKnTcu`<>E1^|_>I(~p%bU2P(_M< z!Aw(&hOL;qzC`9FNJ8!16S|tng>KpCbftz}bOOLHyg%P9>Mwvc@__`@T=v0#-m^7K z(+uON36()@F6Ud;&^bm(&PoS0L*qE_-Y&di4@R_3c%KZlG3m>E2UqDxM(O;9&(GD^ z47UNF`;G}i@Ki*}40G)F402&R*A$L;YBz+K0zSrzZ(kQ4kc)TOSu~lJf=3PT$Vu>b;UH@p|bJw6Ao(>pu zbWEbK@!y2Ia+i#~ScXp#;k?N$=4b%x{*$PcZ4P#3JAbW2t>MrHmgw%b-v*zlem5(@ zih%_?v?`+f56Z)zP#h4rAJHg$)Dhmp$X&ZktEf4A(sng8VHy3Mb)H$kg4BQoe{4oE zO%eK{;(VSp+=n6cDB~0qhSaDKz6wI7J$f&8-r5kpQBC9mO?uLbv=EihBNg{GGEhiP zVXHk#$zQ&qW_Sq5NT#A&FHw`Q$cVzHYSxuK*nj(dNOaIQ{_$#zlfJUiPiqU||25>= zI)(r~oi7WHsFdigEs7t^0!`i#-|*4*z71HX1vvpChj-^uQIJNcqTP4%i>)K7z_0&x(k9$# zCOh$A*G?So0SJ!m_znlTdy8^UpsD+Aqcb_pw(tY24pwH6oK7NDnbfu*h$9df=B`Zx zSQyp?JgD@ziO!9(2g8kI(KZOtrrIBE1cetyV%+4`B@2?&SV9>M5F9le{EtdU8+7F` z+uKYvHUARoP1t*$2VzlK3!wgeV?^w2zec>#XTz*sEoH2Q&`twxp!xt)PWUCJ28<`!PW5&+PCO zI#%j3)~%Kz{T>v?R2nXADH_dSLyU#mkGdZf<``@1+ATK|P89zxp|*Z+7oZ+NqUB4( z9zZc65=w~^RQx1KoKN!C)WC=q`7TaC#C?uvpXJNn=kW9jzTUNehoTks^*@i>*w5|i zclP%!`+BRx_VvH}dZhimr+(h3fZ-ddvlN&tAj^6xp1EWX-?j$374 zE+pen1&lP=q-P+fa~CToU@=L(BWaPPq~%C1D^N&N&U?n^gwwBr<540NYg<>*jrWnx zFtY%knO;)#=g5YVO>6NaT1&@?7{M`g+@5feaB1y0ZC3d|G~V+ri-X!dlIQ7aU!qS# zJNVH04mO?_oj{!j(RId<$Y2YqwZQN^pY6j@4j`uvfH~elHJqTYC?+=it`oX}$rkYP zi>aLq?!(n>XvLqvii718$xbrxCzzRqj_#+cK`4lTG~_LE5-=#+qa>7-dyFY zO>{0RR{cIgJr#bns}i5}_FSSfhK~I}T88qAwG14w@)QwUMrCpGPly-U7e@-D3c)Y9yAKcF>~XFcvE(6=&(~wSO_|j zIACKID!SiuZT!j~&r$T)Tju;Of{ejXKMKme;mC$++8Ed^jlHih(VnSq4IJom+gjGU zC*}EQL~41xB9yys{*oXG(2G>Yrhcc8R)oC$44PfB&d zaf?EVZ`zve=b1STaUwm6!GhfYZc9>`oAX$GZWuic3n;i!wXSlzA$ZrAYLmK%7wi_4KD49ffu?Xb!nw2WmtweyOREeoxyQtbi1*{?2&+cffdka~W@lkl3YVg+ z`AK`&##R>r@5-2+>LzHxcDlNDY+u9b57hd97EN&^d=39+(mqL7O)Z$-PiZ*k#uZ|pSOY6FyLKc|z=LqOWRi}A+Gk~#l@Xk7hHjscf1+?s=SngkkL-xawB$hbW9cR`Qf9sw z^ji7qW;kB4!rN6m(pmhyYg*h?V^AsQ4w{vu&nbeF+94x@=fqX^oP~K$x?2l&&>cBX zN{mC>vHO3RGaB`?w6`GR;-`iUMxKHdb;N!nSJ0|w#wyT@7*LI81X`SDa8^k@O=}_T zXWM$ru-A^Xin@~YHfv6F;ZzGTlk_{p{R zTC|_kz+Ig8a}Y?rB-|7yDdgThQVh2T2@khC49yn&49g}Rl!B_lc9$h_sVa?bnC?V_ zKZh51AE-t{A8cJD0$h;=i^JV(c5_r3_2)exC%g3nlV(LbL!w3RBoYYr*%-U)kgY#* z1+f7r%`NC_=At7~1hU{okVvm0Ee|8#J?Tm}oJ4c9d)TWR@?lBeB_+grLV?v5gwfR{ z>ti%puE`eO2$}4YC0hL#n|bl z`Btz}rxiCt5R7DAv4U3497y~*SJ4K7_vFas7)}v>$xiKxAf+tC;Oyj8*QODZtW$A(&f7wVze+yUl$&f!-SKQLT~*H5cv6(s0cCW% zHlp{?ah}aF>Qmh(z2P}?+G*e9P?u2M=!R9iFsmP!j*=l%uy4}xrOwrPetQRLa3jsT zDRSz!POppyCHB;}RQe-k4pFL?t^e|q9MkvtBf#x@UtN-%=%D=^eau>NGsLd zzfi6pS&Y#GHQyE!5_&twpTqo5Rgb(3*VQWB1Y4 zx*T(V)9#!p-teTz>;B?O_ee9hpoUK|$IA$hShY-YG&lb(hWFz(fOJFu0=IulYMYcz zJlWb7J&b!YY1zg&pwkfU>mrU+oPSnsY*f>f)Yh|f&c*yj%}qPQr%De@O3IDj;}i#w zYGO2Q|04qI@)Znng#Izl^Qka@ly3(~fd|;~UoIw$$dB1zuY8#o1>LW{#njE!1GSvq zJV638w5sc`6H=fgezB>hNP1SG))!`-n8~N={27}4>dZBas>b?-t^hlrkzXCAA-f+X zV1z&}?Gv|`vFXs7n<%N`R^9p8sF5DS?a&9a-W-Zt8OfJr#n?0q{fP$xy(MVA87P zg!*dMy?p;$Zc_1RXfta)vq;}_>ZpovDdjlwDTt$QdECQax>n2oP<*Un&sgmPU2W^L zV^&?F17g`)?zuoHw7U{jNM>lW;+m+m4tI`m>pvLA?bLd@eWmjJ*aliiDk!X0r>ExV zF_!KMei-n@2+~yUN#U}`%)pb{#ZlxrN^{PoO|c#X#HEla)j3mwhzOlO8{BI<2IxP_ydWw>>BY5;_VTAOx6Ena=_jHhl%+o-rvNIhFRFmaXQ+np ziWIY%v2q;tUWa|*j;pgelSveWFc|-9gAluEs`qGTN-+)NLw&95dnPo0ojKMjuD(d17~KY#WtfR^WB7TsMzZl`a15mo_MDJIG4)io4SRw%zSF4xJ83Te=o4lS1f+A6h!MB^9$t!>rl~& zK?!WVp!w_V(${!_bJBrU0m3mkIN!A2IFkK=ZcfJn?oS=YqvPf^+IHeJvzdz!orrehv0KvWH7%O6#uf+jkamQmQ`;A*v97aGa&D$+_`7?3M3 zZnJ$H2gyUHuLd=^sg>84k^dny>`eQi&L$8H5uO3->E`C~UTMQuWr2rHOu^AzO?(O- zvWt;Yufi%W#(u@<5OmuB4#-fuqpTV-5A?t6wC`A z93=8QwznbrX7yr$^FjxJ-pfY8iXbth1+y4(xNpumOJo*DyJD~j9P~aWDY8mzVw9v2 z%hX?b)B~(TWK8>ATt<&+6ei<8yV@fU;rlC=OcP;p+$XGPs{5NdWQ&+(UgH<^s$hp* znk=WuOOeyz7*#9>?vGY{AqB79I6*T%r7$|)i=6Z}8uRowdu42ALs(^n56p3?+hkwi zlw50?V8*s=Pzxsf%YWdlo?tyiMrV9KUbZ|M@~yw3@wY3@(UK$mKAz2CK`qInNDGz2 zns^|&rG+zSU{G(zR5fQ?)X17b!aQ_c1G`_K0{48O({4Ms3EVsh6ic!;zR`6L!NUoN zOOPU$KP3GzmdG!Fb-ZoWKI)o7NE{p33MHB|#S|EB^IAG~P!gjtjWl&Q09 z@LE#(5;qHrd&wVrP@<7~m^hJ;FI^N-oWB|EW7EH-%c@pwQY1EfZ97gwLl3j6St_p^ zd&SJ5S}Hl6+`O0x2NjaZoRp~MOzo1Oj9>)ymA)+GV>2NlXZtGfCqR)%-%YS7L(nxP zeMWhR_2kdtc~fF?X#~v`$9mo1(lD8M+1YC?;Pgf#vxmY= zd->TP`{voa^v#(!oF0vvOM{sDQ9Kfi5k1f{BD057Xi=wF3aBTf801w*FAW35k|%yTUK;%#?#tr>Ai|Tm=BN z)qh}9Os|D@w32mnbP(q>*z|;g8)we z;k1=*^bOs0u62M}QIhTkWk?Lv0KWKb{IgMX=JMBq{#>6@i51NGK_h=9HXMKxX%FfT z`haI*YL*ygHj_?I-?C^*k0Ys(Fw3O92mqNb1W{kBbzk3Lj*;j#(%D?wA-GL4Qe2=+ zhaJPeMc~sT7U7ccz&n*;KG}qq#Wd~%9|xq9?K)|U-~*+Si-`6$&!BF*Yn)~q*gDGI zU2?Mh@|$Ru_o7iR_H-?7rI=s?^#DYmwYPsPyYa`rqFeHknW&5rH85&glQ}2(2F!^8 zmX5I|6U)>XyMF~nNqNHEMR%|>`puK4oA>CSde0V7gzmrk_CZ+%*_6u0pOqY5g#W2% z%#R{*9hJx`J;t-gh6X3p#vpWfpJuFkH2l6CDB~etu2fO6{usJY?s;WzAj}uPl+Hf6 zg5N+0nSL&_l6#y+(A;U*lcU+uJAlJ3@6l>+9l z)2Qqu7R*?v*7FX{JABgAMZw+)Y8rb7XTxhlAU}JY<1!Q1f?+9Fv|e)!prZDZvyj~) zIP3UyY|J+}=$5efUwtMLH(N>meflt9)*rH@;IoL0>ai}w0EOW59882mhWUn25^Ip# zyD?ApPDltXg}<9607fxuKwPX3*BaNa^LKV%O40RABkHrM0N4jngb@3!KI!6{{oLVkE~WIN=y94qF9QXqNH{${@Ir z59kk%q^j3-?4UuNl-o}3(j;zyG)ofS*O{piWlcBh1CV5&nXS2(&V8Jo+|x7eeTawx zyCFxtUjHMqZ!n3-T-uhi>8_Mv_Geh)*2S_v6NRSR=-Sv>SZ@%aJ}YQmzK z^sCXVetufhXGgqfP+uy*(~{^@>;U58rhxJT@V{_TxZ-fmLEHJtmRRLI_4F|){mR0^ z9c)ZX9VSKBO#&=h(rjBaSIko=y=Ruej>Oq7KZk2R&V%Mi)hx$f4o8qM$k;WDhE>d6vB^nDm+HW4s;@|9~3A8mqHi@Q+ z;E&A$#=!W+c?-m91w4972-}OfKVT#GUoo<3>9t7~{$cOLMW31{J(YD#rd_9`3~E&- zTck_DOAS0m`D8hSJGdF zPa46(HLq|~>nlH;96^=aT#?#qKg1z<^-gWdExYz@rJQ|KNE(47KhhQ%IvIT+NqDG5 zCYfhw8aGOhQ~EEK)Vw+lfE*`_i(Wr|;I2^L?qHjUAUS_<)?aHgwv4?p+H==j$;El> z5_T9h+)HVNFDnI2atiFy|MsN>q}MQ&Y~Pw2iw*6Z!(lsd#C|bWBX-&G9jba}&T_a6 zJuLFN&GO*~TBetWkp?a(t@plbWKfLH=l^>&sbX?Vtp#K}JkAx%K5C1-zq`3h#wI>T z4V)4HO0^yn!^<5Mr(Y?bZQA!3yGdER^tEk_8&R3o3BfT3FY`L~p`|tgo0q7rJ|1tQ z?H&q&su2R$ensLaB(j>Too*7X&&IY$X`IV^$_}=-cJ--Pdt~Usmbl`=RCi#WL^E1b zsQ1L^pZlc7eEf@G%VB1bth_v57+9M$FJvKq8P#a9gr=h&>QYtkD6F$U@Lj(^#1;yYnOi0;wsa#{jR;u}I$3CkRN5iIFmf4x4Bs#n@%^YGU`B zUH{H2U)eZ&k0Z=H6us!3T)xD@`eHJZoqH8(2wIwmm`gNW)Yl?V;ospxcnq?GE{=a* zb?NCLS)Qa)PbDZ7{;*D;p5OP)!ls43DawU#)`OvqnrlV_8bKxsf*O(K`H~L@!7~$8 zgaE_mY^2;PI1c>_Ji&?uJP-GKk?kjFCgYjh3h)XVb}wxudyfi@!gI<%oI&HA1!up%>D{+&XVjxA495aNKD1V;J8IfgwiAuQTB!uwY zOPFInN&Qj*nJ&CVgXex4TMEclWfJ zhR%SLY$!b9y3~l?jFb2grZm{BI1xJWlCDD2KUUtQ<)PHv=I?3X;peW538SN3 zkt1!#^+TuR$evN4H-e-gt{+;Jb@8urX^TWnd#?(hyV~}Gv8mssND2svhbc~YCf_zV zp9L(Zm_&BHFr3nj>O>I)Y4EY^`lY~Ug0yn{o1R(xJ`D0wL@CMPlvTb_gkN|bW`Eb! zIw@j#1($AE#YyKX?XziTCOjuJ~4S%&AjstiI_<=VYH`25P)1}xxuvF zubzP`+i_}I%Ce4f{Mtm9dc87H{tz_pTgo=6IKf$GIE}e3GaHP7*eu`;?M=QPNJuP92j*Qk-2krqbog;h)o_T z&$UT7{1ZWNNi}cIniC2m^mx*OtDr6cf#+8KJ2jn}f^a9Im!!-IUY`JYDI~U9lArw^ zd<(1nmnS83R?yHa%M+M^Rz|a3Ct(QqbR6=Dckyu~`M;_QtN~CAeLkKqf~Oe1{_tEa zksi!YtH>^G8zKb!?}0Eq%mSU)dDb9}9P|@qkKpbg z8H-}Gtbo2~dsOAHM(4ugY{~LLUL-ti2YCXdo@*wiSskXTIuT30lYOWOZz3><0wKGQ zQr)<|v;FIDCORP>g8NF~UXf|Ty$BQ~^K|<&UAfFWRG%LhR@Yvx!L;uC(7!;WI7<~p zsN#t&_y*NBx|nw&5?WEpdg`1=a7@=fuEQJ~%L`=^hj> zA&~$$F(RO}tz?#z$F&pa6qsH%i{u%tkY$AL5p>K)4W+%Ib9Ut9ReSL@7ZF3sGimS8 zZN^D2l4V#z!-{ZpFt;vPxR{j%nGdTMvuQMaX=6}*ff!Mp**#)0hAt| zkz+AVIrx~w_nt1#>vOw8Yw~&iV1A0omS-v(JUrpUdk7>y8ZYP(E}u3-0dk%6Dt^O6 zzKNk`yjNSiYZRB$ffy@Lbd22=k3Dry)9F=)F8dpEiwpK2SS{ntsMo>*Yghu4hL`2{ z^@BcaI`>{H;*8<0e$P=tT7IS}FMmPVOctFE!zI_Zd9(cq=h6FdtI|$~vRKvC&SOrB zJy=Dt)g%`dz=!oy>H6Y1fpXvLzXCUW7<7O_fIhQF{(wFE3mgct#?e(Y0%J)kRGsE#oDw4en(ADA1MZf0Zf|X{Shj0ECSQzu8{-5^kLSJ!MnDS z>5Kh$IO@}Akr>^Hq&F4Edw=7XJh9;3kf`pd2x-fZN;A|Cu5ihN6VebWXA#m*IF1w>@(Ic0M@d zkq$(f?PKH@$QE*HHt-&&n*k>=MWiO=0ECXgHW}_&qMOk(=$w66;q(G}vO5K2gywj; z+)Sm*E-zS(9afn28fvPpv)rAuUo^wy;E7E*giy%Nf{TRZ#L?YFg7aUwfq7|hwU6#*0us{&NB)ASB}s=_&4%1U28*D zidAK~5y67U#NWC1H^T!iu$=CEkOoGD`w>*7fH)2mv(Lfhh(;a9c8raxY&T0*K8pCP zwX1!eiV`($({4PZgc`Dy%TCyYK!ybAjJ@vm1BOLL9+=sSdnHp@1X z2MXKFsz}1@w3YTp6+Cxm+Bq1w$vgp))niwn3wrF1+)}vWFJPT?;D5Q8S_COh%ZwWYkVL(;yq+kKOMpa1&(gek7LuzxHZA9`?U}BWH1m; zv|Y^CT_B+?{|6TL<6MU{gsOL0v|YfG(}SZTzcZT-tOf^U0bIRE(@py%HG92Y^UnTw zi^QE%NEj8wnDb?^-q8@Qzjv6$e~~btet=~RRRqcpJ)m@)UhQn;^^67QUd)o{!X(Cr z>-v>X0{5j%GPEqP=!RElvIp+Te8R&3F|lIqMml~ued??PU4HDUZkc5w%7(g3Z1 zwx5R}peOXwCV#vbfJWa=yx8i=xm+B!o;AMd^5hW=X{p4?ezzquVw?{Fu~!ouHT(qD zyfz94FH{76rRQKTqB)^Cg=L?G&rrxw=;jk0he3P$8ns>-0-JbuwdoO zR=4N^qLTXyOSOvps`qg`r@l0osu2!|L=OF$dEHj(L==q)J8M?0y>aVG!6I!KBk5cC zVC{66$N?F>d%W&`i#Y;)(;37mBXI!!D;)-K^$XtUE_qIF&_4uow9-e?T*?kx$|}~u z=X(`)ZUVji`W3$?)xV_r=dgtyr~r~lsQ+~0SePacPetoWkEc>9dJxTLRnKGZhhb=s zStK9EXp|a>sx=zW>loOjS-{z&4+#SrefP+2A1WYy0~C{eWwxb}ITo~8@ZPqjmkSj! z8jF-db;)dxR+A3qM0CcZ&MAhVj)3*dFOBfNYs?S0xM^s{ z=MmvaNhpQSmZq~)ohG@jtKSy$Vg7M(=dJM+0FnRZi|+eRJvn$2PQcu>uWM8qgEAR- zKyrPT{^6KlkKl%^AXfj8gRZ(UH{16I?MR9Z&zU{5o;9osLP@UmCAf=NR9JTP-%mb4 z$jzl8(V$Or0Zv}JFEgx%HfH(_Ui-vfXWN)Vhr=O&ipk%Lp13yz++}1>T%l7oO-KXa z9uu5*#Tz67DHz;%&4C~o%I!(~?$ASX)k=w&_%m6u4S+|q9CVDF(lH>Ll`L=-vbJ_n|C?gTWQ$I zwH#rrSOvzEDZ4fZ0?$C{vTJsF+F@ytF~|iFzj>Gg*Uvj^4=9u-4y;Q?E}~T_xZX%E zpTDxQZXN9onU(9*YGAy`X7Q~~+MRQNP_gbps6=QFIu7ZV-K*{krQxfe*`tjRV3Nb@ zTX-hG*eK*2zvDcFJ&nSU2Me;8GF&?Km%E6Lu17FQCR{?*V-@7q zI}9aUsFL`D0eO@tHYDpIVaXa}za8qBo)OW$RwX_PS?;qEua-K~2`nEQBMz9vuQREp z97OECwdWWWwGz#Fw@9-iIF0751bZnL;8Bs0{$Mv?u{qIgo)KXlQ;OyKSqM#bCk-PU zYCZU01&*~e`L%cqNhswB>A{)EZml+oR!Ue~sW51~F5KD1F;7F}$s|WMd|s5QY2)*O z=hxI4sv;#(Sy}u1*bAy|1a-~jAjP0l2y-?d$2^+(sU<#79>9cj~x+HQZZQrdXaR2ZSU2=PcXw8{JMDy0|jPn z3z~5|@2AzIVlmgzLlX$G=jLWYtD%6fWAe!f!C41g_F$fA1S>tS%)`J0lQHgJ^rcbl zLlMiH^_w?aD^h%sg*3M1iP(WtG2F&-^#NZz*3=A^$ZY6f$(%pEW~FXl7y3)Q5U(xM zZ>20Yv?bTFmOJEjx57oT-g*@u6T`KqAs7 zQ~EYjzXs6vj84z{FcRM<4%|vwl5w(!B(Pzr3#ARc>ktL)V8Mnk{x3c5) zq5iAJ*PJ%8k$prpwSSj$Rent4q-1pnFF(q=eINF_4R3FYYims+E5za2^rFh53kdLN zsP{ZHYMh5ip>+cZS``u`gyQ3E4(lhGLF)@c%yiGIjn!w4V?IwH$6VB5 zUavP~UNj~wkF6AAJHh@gLL%l?46_<@xTTY)DFUD-DOJ2WJ^3N#6b}4qaOWQ_e%t_l zS|}ZkTP0XoY3`OBP|}?icLYwtpLI)P22KD#`%wS@02nI;0s>g5aHwA!#mvRi!ODS& z;MWHD-&X#&wfJ?>EGj!V01$p%B4ZO%GXRkP?f?J+ z0RPti+W$uUHxBr>{x_}hkNl4!0Mmco|4#Rx`9IhH=YxO)0{*}9qXYo++X)a56a)kS z@J9y#nLt59!{GlG4Fv^_9}@sX06=L&YeN%PS~pfYCOXES1c3h@4bX1=cTDo!;2FxV zCYc)jlRr^R)w7d?(Hy?UrRd{~AOfEKz;!iM;R~Er8)ja^UCZl)wtK+4*NI!RqDcEm zy&nlcAD0j{MZb}JXmiohyzWX1LXe8E41%!nz~{l500=8FjX6ljb4en<`Z_K<&D$5K z_H8-EIF%gW{romZP`tk71y9u+>jua{1(=B1!+c?Fk`O{9TPzRDlmp0f5^pOI8*;^a z2I-dl-u>8{<8(R#Df8bnvVUpRWG3-&SY~M($XFypo*Jp6==HUTkTDqhRIvRnw${*v zW+yh>hlI;`@*U!j4>6Aw4%{(@i?rN1 zM?C57D*rN=2p=j|204_P*O~VyxbL!do-1UVH^uc#wwESVzbBv@Xg^pW$*W?=HpK(z zHdyMMLBS-WCKx~o^cq=i2r3NpK*CPtTiZ^1Dp^!M$n7Lwpq|>z8@8?HeAO*DBG?gx zuA533fyELP!cB9D9pJBw&~1jyCkRhCyu3pJV0o!!c)A=3Fe?q1%Z#0#svbYXiw}`QV#LT;AB>iTl!Iz znb^63E{!*`jIc}0$r2zMa@Ar_4OBcu#3n?M`MPX{#LTz`J@DKbc5+v=_A~9~t;L0^ ztzhAVWcq>N4@M|ZKjO#cp_f6~(etH}<}PMPR>t;$MxeXCJTpKY(aMX0o|a&$t%LO! ze*P(TILmo1W~}(-p5G!mujGv?2QYKXCA9?H7`*8!N;KCp4K+hJ`_7fWJ5_#3cI&j(6SSLDX)%{|s-*Y9`KTp4JHsYE9*hK&1H~9fzPu@POR*{A zWiu4P4Y$DX&nMOOM=%geK-R|#qy1G@s~ute$y2L%5^`=nNYe(YkW9mX`?c^}ch|cM~Z&{ObEDG?p;8_e&L6SYB&2 zTL-x#&mx7+l5*Qj5@_Hj4y)2`>V4Vb*S_rQj!h*b(e;(-UK*4*Vcxrth9`MAgCwEx zmVO<(IQx2yVNApxj~qBC3Il=FS{*F28qZBvIHMpMAF^MU^!H)M2};b?$-5gAh(Mz+ z;mDgJxtq6y?qq}N$%+0nZJa;GM=QQkUyb@>fjTvUue%fJkY}&8!gPevT58k?1*4D5w=>G@P4e-9;x(^y`L1=elw13M&9Uv| zUw(Uyxw(QfE3h4a6h*hZCY?s9<{b;yDY^|^IR#(11U_*G{4O3RF;}+T+{9*ozn)1= z6#boNi}si}X6x4-{^pB4*u zB%XynVDQ(_@TO8_W_$`a5>`*DAguqcEUR8I(jW?Q030ntn6zU3l0g(Lo_m=18g;I( zG@&%|HNdTUERa$)=ahkC58CEDG|;%){shlZT&mjUf7EZ1+TR<)K*oF39@|m$dY(H4 z4*jtjJhkl3j}kR`oLiKIP>)_pqR4V}1Xdk&R-`eB&y}?k+R=zwqBux?feQ0V;@aH$ zFoVmI@xY>B0%RSR#sgv)Mn~j!_ zC)*mZlbtJRF}?F_EExcoV10{47%uP9d{D{2eNaM=)sJxm_DH z-f)<%LG@vj8Q*0_jDr_XV3M_Y0s{g8iHoa2RQnbrj!*v<*9S8DW*}4tQkmXtXSVcK z&^-j-WzoWP@rS4_&1G>74NY42bf}CGGdSY*$(=>JGRqz_SJ2dL#)&mZT9>!A==&8h z()xU&)b6hl>S%#(St~Y49|Tg7Vzs*6KhB{p)inZ@XoQ}ESYih;2%33y+Ffy8g?Ojc zWKww-{|$1sYgvza1_8mhi6k0uav>x4ve8l$S=(Tqe2N|5-&ME`+_E|uN~z!Kx-S1m zuUXp1QeI7vpbS}6+!~~Kbi$k2!2s|YwoH^UIdicjx|b88Ut&Ft)3|$E37(r)*u>g8`;;1o1ebx03A_(AJl4FCTE=4 zv1YQwRM`ExASO1*{lzVsYteJ_`3i`Kc#8CKM#Lh|upLmJv%?e~91eKb!aM`p*0(86 z6T#_a9!Vo3rZhags_U}EM!zbbw1B8rEw- zW)XSzD~D|swuSs~YSq}PVfW9}%<3Kp>gHaog+S?Of zTUiRcMj62z1DNFBkrmC6McK4&)sg66#jXCQ4l4_~q;$ddOtYp3P=I-}nKM?7GJ^v@ z78CZ=O{heLad#*jk-{W;sSQgfNPMig)($pa>NLOFz#%QwpCVmlUa0(tRJOPkN|%3L zoJssVfa`qleZS;)+qkO7dOKDqhO8%hj~Q4EGbImd0{hQ;?NVhp6X0U-@nX+)Xwr)GC&$mBcUKMsA3Mqx)(a($AHU(< zf0JG&@H;_~5$7Qz(j0e?-?+gug7e7*9@^SNA)I-+1bP#YrVrwcBu0<*T<*g*3LYP> z{j@I2??jQ03|oh>t9BB*AcYn*AJW@(?SBy>?*+<^+Bjuh=5AmHrs9hTcffNHl&l%D z82wie*qY=CEd|XoDjuD(o`f*J;?C=w)fO(BuG56QlWyV=>YF21aOu^TJ#vk~IcaXb){@VcJ4vwMrqoIaxr@qA?;-*mnvcF&j$9I0fCaw29y^be%M8|leGIOXssnrTceao9K~pTJ+3;sJSVqD!pNPY7PG zVQ&Kd)zv1rQ(8qM$-HeLkA0uJl`7SXJnwbA`_v!EodJIshK8*8 zb|-P+1=Z&+<%cjw;f9|10FZ8lKGJB}y>n663nAleOoilmU#0~YlLgWc056H4K6HJ< zoffz8@YDlwRH7Z}Dx*6_03JKQmTU`7Ty09#eg?RlzxSV$wFK~TBqRq4K0)zlrtuGo z0qwVay9^myKx6W5%QQ|{A7j6=_E_<>I(zW`P-a+tv^-IN(nEoTYW9A7&4FsR1tNGP zbnE!e@8TMN!&VCCGehS{LCg5Q5->DMc451bSI%8QV<-<(LX2l}A<0IuZ%P;E*Xt2< zT;9X5yF5rhNaP(0@Q-(VwmBC2rPhj*wEo;U-w<CM;?~qL-?g=saa@c#= z4j9Oj&MWQVw9(r?LT&E=z6g0M{-wpc4J&{TAgLR(WTSWj`m3Tn$Kt4+c2^FHKLRX= z041tjZgUx@ygnK=^fri9%N4rstOxU*`;lctZ#=9E1=3`VRIW1NG-vDVb?Iq05!vj8 zu=>-lf6ORCKCWeh7fWIK(x9G`SSZM=#Qpy!3*Y>xVg(L7SsdZ3#R$B&)cn3Db|5JL zm{&;K6||0$08h87_ewU)NbLrDIWG=n-YX`X%`x#He-vABfxwQ*GU9C~;xJTQ5}8*1 zy1Cz;1tv~p1ZZ?o6-d90UVI3wv^X32%=sHABxtYM1Z8dvisE1mSThKiSdLQMys)}& zTXxhA%3yvtV-F#zSV@8Zk@23@l=77sPAe-8@|+BfMsl-r{lV-mg>XjInIFGB`%9gf;VMt1VhYe z|D}mJlF~yx)B;s_1IDAOc}U>mQk0#9aa1OywZVn30#Ipm_xyT3pZi{TJ5dS`!ydRB z=?gl#p_g19X%LuamImmBY$fusifE)7Zmb3WWeOLK{FJ>hnSvHS2Ml;nW1K3##cr}O z(73<~=V#=Kc$2a_of706>bY8ZCN7Din*G!dGwNH)@r=P8-IeLmT!Vf^4FX4vz5iCy zifY95`(7DPhWB_ToB8k`E3+bNSHkXlXNvS%$HjuYfpXNqTJ@O*?r?5w*8h_!(yPJ8 zo4TQ4wC~bmk&!7pv-I6Lk3JxMcHuZf>BwOoS8L6lYGn7`Wh^lY4jJC}30d^`T}&>D z?^&-0VzGc@8Kn6j)VS+KlDX-cIWJcHmL2rEp_9xoo1NS!4u?iGq7hLvccJ6+hz z)==C1F>R!>td&LH2D3{accjGNV&>)|TfTL80rf1#Zh`}o`~cj%IEDzqTKjTDv35iA z=dON&kGp!{HHl~A1mwI zW%iItytO7u`OCS8*2alhymww4Vs&r5hZZ82C1%&cj%!?))s~VgUy3!ql&S0RN>gSX z$#`AP?SnkCe_p~(2!9vGMk)Jx-3HRw%$?0I{qZ6hp)Ib7AP3G+HXF621#&?sO9 zRw8Ov3`<9mvvvPw#Mbz2+Jij7@EX_FEleJvg7ilAvDv4QGA+oi!ju-DcH z7C%10k%DiEKVU^0n#i05L%PEkyE)?X%|V>5?~RS~2&X{zY>S=1?Xrq>Ku(iPW9Rfje)RcbgFJk=~jMg=gD^H**g7akJH11x7$%Mh@lp$lKB0coHpe zlb{@Q$|(Ws@#fcxsnzG8lcEB$6Tr(8`GOyU@7`BpBASZ@lwSv4cCh_WU}^d4W1P<8 zi4jMJbuB&Pcd9Wip}9K)@sVXKochNSU3~q%m;4<{VicLN1Zyh% zEj~vv7~55srg|{CNlLvQWDaN94HxOb5xlq;-d(lQG*(SRX}HjNCt}&6GztWxC{34d z3e#~>h?|*@1DnxA=&O*~rxjJjUZA1f#(zeaQ?O)E1IDy1e3-oi$c#Y0VA=m(l3e9S zmWohxMF`gVFhoc0Q-~5ygb>B!KB_fje)I)#8^r1jboPG1Ahn$wB44= z;^@x4W1`?MX*$aahy3AMR<(o`iN7#nIgS`&-hXwK_eL3yKiJM#4-;@EWOT zTmWww>V)X;0j#=H0?&YfzU-AF9e_e+vu*-^Ae|`NwUaial#pkV=^oeRg|e}73$x=O zc+NreWkkvX3_m*#Z{A`JLMR=iNj#-zGbRnyl~z9k8)r3 zW5{-q06-TBmzLI6j@T{Ve~Ue_EfU;Lm+QzI=ITvS{H*U%?B{BL$_Th6;h`3C!hKI^ z&)S4)6yRQ+zhtvF*XKR4uw7P~u6f(IrMPIQw$u&J&5_jn(Ab}J8`>Us9AWRvPv+iV zC$ctrx&S_tj){VMS8YE`8K2?r;Bq+cYWI5_y>iLGT3IIkF&S?C5`2YV{_QR2#@B*5 z6n%k0_w{K6G}i?wAgST?KO%_aZql@pW5k20%?!q)pMb9)#TIiiJy_o)#ty4B(a54h?d?LavHTM~sWUky>nWN2c@V#u*LJ zQ{EW&d#}YNZN`7z?6X2tY1r_g&@CKnmB3}E@QM7lf!*)$TzVQ#Wrf=<%Q?C;!3Ra8 zG>p|z+Yt=giPF10a1kn0xj3rEOn7iS2Pf4uYV(K|u;ODA-kp6buFG(hOQ* zM;4}a^Y;P8+dyKgN(g=wvL03MyKjH2j_*DS|3keyNX`F{w%9=A@7*c3C3h}Vt zwSP_-zX6$2!an2YACLBUFb*AOdMs z2!&2@Heu60nMKaSWwXw5xtYuPVXgkF zf-W@4>bbod6dj8DI7*LH+|nY^c!JI>g0ar2Q#`tiSSxNb)P`rqj`*oK!5i>*>m@cL z3l8#+Z?PFsp%vRY%+m6?Q$Djx!U;(!JBV_QQ9j)TP)?(?3_Ax5pV_072uzkI6zDD>*i-f$2F&`D|iyI!M;bfe^pg3oQ3gG2Te@hJqz+2a> zv&Dq`sLs8N3n_7MPoZ55U+DWz;vjLb;0n18ISkmcG}XNeAv9zrg%j7t*D;A9lB;?T z5bewc> z>+sFATH%xen;QGM@L`dKK-%8^ByXg6ykI9y0`vsw7|5mY)DW(@>v=!szDs{GsAw1` zs(d4kTN0qHzOUAUEPU*(lGtE`m|jmylIArCXET}42+TBADkc-cH4U3K1|KT?^A?;2 zI4m+meZoovQm)aXz8`~{!1<$EcM#k5{&zcMzJ?A|FjO#CbW0tJyqj|#;r zpvC}1qKz3QHa0gY!P%nxU1Ot--+S@7Q8{af zntvqTPU|jn6UH-ew1K2}2M(XXxvHjP3qN47Z@4&J2TRym!72XDy-VH~-CYTCEfI?U2Dq|sR8)#y~x|Y-rZWMzb@pkOhK3Zto zV5sIv?d>OK+QbazcGIz_Dv)04IAixWG+O^)zY}&t6#+s!D%aYe&|B+HpF)KXFo3BK z9f6U6;~4h$_-(}uDhQp4O8fFI+=vdF0v;e$GYG1snVB814#-^0-dX6 zk=Ok&CjszyS1^U~g-^gJku{~rlOc5ZbRP2&3)B=|qaaPaNzM3$sqP{-2)nXaG|b^D z<)b5-4Tqji?Q}?BFHO6#cBf9 zL@7-LxYf$Bv3(WD=RtlH@uvlS>7ae}(UxA(f$kkrD&@ zz{}D|semM?S^z|ldrGp+y^*|wnhr34eOcMIGvu-~yutRmB7g3b&m_HQcFbf;akXMfKH1H#EHT*bbY32Q zWU2LGOsGQ61HpV=$(ke@`}$)E{~4-!s%kVP;cw_fOLZ7jjVlQRoU;7|5ICGa~St{?1^X6Oz!s(VMl_m7Kv%{0kdOmkftOF=aej zhMm~Q@?*M)-cEe^q7##|6Q1}Mb07Vmy7od{lVM5YTtfCpK0 zONcp!gmgWMKSr)*g4Y`>aUz}-?3GWYdozog+q1%15Rq_X%Cf`I_x!4vGmZxw*!{>4 zl4jWg*>)O?xI3!a60cCplD0H+5frBQoTJpcKP8o3vfMh8*?@1mV76~_U@J`(!eGFl z5bqEe0#dueI`ax8F@GW7tuU*flrw1i_SztDZWZQmhWU4OW zK1vjmmo*^MJ&5bz?mH*)r!M=iGYV|!1s4@Ost_3OT4AQMdrZ#c^L$#s=yFU|3MKe8yTKg1OFj`bKP%dOEHQ^S|c$ zE)MZ=iW0p6b~l=u792?%?fp%~;d}baJ8WlyDlzhfQr#nYy1*#`wF?KQ5@b=A@fI8e zl{C6*jJv+OxYP_GOZVxy@fYJ0tDC1dSsDlpz1SnZKfHxD15+u)i067Pk#`0wNfJHD z44pry%=l>N=>{y`t{cqo$EE&M0Qm^BBXKSe_1DSP8^hH}j{Kbq)@>*$Ya~$ewaLN7 zAmlORZ88~-Qd-`c-f5^VZ=A8Ug;^M?vPDi)5ctC&>1dw^yS2+So#&QJx-DqqA_All z!8k;r_fp?;AvEKTN80PS7SH*(=R$xm9Kn<*5bUyQ<}Ub;njesuu=z58tN38~F_DL~ zF7b&%Oe!uwUm~}(|3c6Sl3H# zgpVIKMI)JpbGaoaAB6r!dy?AXVl%x`ag!>$p+5rFJtds;rOl$=xC5_(*}l+hNnSs6 z`F)DvrqPOv0(AJ&C}(y!`0IZ}G)^r}uE?8ju8cv?Luv`C;))atk`w=HeM(scUvUsT z^p(pxKLV;8(eLsvJsZK6%$yR>5AQQ>=8l>$cg?M!pLwGaRL>_V>Es_tM)lL8OL~q> zzSeA8a?_7V0HPVH5}+5YmHQq@31DpH;L5KEg1JZnYv$VnN_K_`69!W;EiFZmNqNSw zk$y26C-&{1N418korlp$ddY`8Fmim`GN7mkA2+1Vo;vCdkdrrXZB?`2cVcisH)sVl zt~<{CrjEUOiqf6P4r7|_+64ssP02P?r9W&khNaG&kuugepeK5tA6uPStpk0>)u@#9 z(AN0#1S^3MJX_~{9rEg)6cqu?2-GMYrVh#kFcZh)F&a&HY0f-MqMnA?va?U7=>cy- zRTybC21Jni*u&sH^079zsHVJh?|sNmpXR|i>h;Df0MrG~u*R(v4FgjJcf^b!D1*NH zZ}7)^iQ7y}Fvj7$?Y%8@Vz{$v;lPmil);K@}Vd}YN3zPc7*FWt^} zM|aV;pMsu(1R_#7(!d>OqrOt78o3W{gr~ zKZxq zUgBwiEiTzaP9sO+a8l#tz1unGDiXl==$)ha^2jd*YSng5`i;wQ0c;CW()cfsJgeJE zzf#^ze~{oCRU*GESj-_xbVjs36Xp#$4pFDUtuA<}P$Czq7O&+1eI^s3M?t;_L_lud z+lT!aWgW5a`yKkQ9YSi@;YP6`IhB@|+s+V7DY~5Hrl-$3;GJwLrp6z>nH&P0yQ=kT zkRMOIdnpmQtdsIG<^C?0V~7Ure5PO6QAlQ%WtD^bnJ|z&EzrsAc|FKzy&`D_R3{%< zJ7%RQ-4nTWqyHtkSNO_khK~7G$^P`(Tby4D&lo_zFNm`dp9h9NyqojnV@D7RJt{1o z;i9+8{l|{w>&1KIw=0ZD@-{SM$gC~f?a#!V z@?+NM!o#k1PAy1;>ZUsG1*k0 zOIWNhwE%jhU~Q}WlJ&XuS07*Y>Bv0kMQGUw_ADK-`BkMJqq_~PkXEnNZ+FFld zGD=eu2?Ey%isU##-m712OEC3G2wpU#DlC)!gchdQSh58hfPR-Gdi1gNdXd@O9|6Cc zu`MbwV0S%1m&hAo*i{Nx4qUSYtLwc`RQMwZ2N4`4n3a=8=QxaO)c~r$lTxCMJZfr? z>oT7rtTo&=dVy*_5Pw;8qe<~*&z7&zy}E&**5LCeG`zOKIPnNvq*}L%1tA}dxYKZE zbA5#tSF(HqE_K28Y2n^KWJu+hs(jX+4$JT*m{p_1IJZ3AjOWjOHQWyUC_ooB+>FK{ zsTI!eXS$m zztv(`)DLQlv|su9$TO6**KhsA0Ac)juHSsl>-jEb2>IqCSvJu(EDTqC<%oAyvzlFm zDsqqR*T`h>K?kQ4N?S(>bD6gk*W=#rf3bFi@&YHQ+D&ABx$T~nBQ84Vadg$BNPQdV;2V`@J-MkVChwO|OaS2d z3bkVM?digmpk=7R*R zyCZPBvfx+UG-B-Y+V1}KK@H#LJ`T^#)Z+T+JZ6)DL1dZ{3W>@_cK|-PRO@)!w%4Mu|;m;k-X!5sM5qmP5;; z61q`H3erF?fMp10u0S)_+D#=raiuB4Ej=pqlFP;s&KY1DX>}Q}zT^&n)$w1+{;eu$ z5jn{E6E{KBo)4|qJFWfRjVYP5zh#5BwX`Je!ZOXzX-(Bs3ea-X6MsqeVD`6^b2e72 zmQGW^XG`{yWtpIp#E1~J^D`8rSGxoom?U~QTU-taO+oSM!G`6tw)T?WWn8551 zGpB(RQ<@nlDRm_IJCA`ytmnEki2CB*-krV4nr%5~_YfrH4O>h%yZ=2}^>iFVsL%Ek^tbU=Fi6X$ziWqAs}RtbC{Y{+=YELAVY4+ zI6IYaX02jAT$lB=W0rCn&lFU4?%_?6B=o=D7_b3*=R!qg!9Ys-xC~=y+(J_@G&wOH zNHDaI>+8{WHj$;!`;3Ky6J|asQV8D6L9zDV)mz2n5;P_8nNX3+t)CA7kUV+fihhM!^ zElDja)m<9e_==)q)8e)w9CW8FAs5c2mQ}pE;#Y12BhG)6x6 zz>$+%g(xVsRf;`}kd{bxNy4ATb9BYoqW3~BgfwOkg@CoyM&@T^Uq(m--0Qb&`p-R5 z)KA*gZPSy_7{eS$Vjx0jzmK5N9w#DsIPWcMA;Ff+YqA6aUJSQk-1T@DCp^y^DKJ-! z`HoC}m&f%*2OZvLDBRNBTk$IIW%zcNjnsd7duTOGPjC&3A~IU`VzcG?^p8Bltu&gU zn#@J>j-!&H8bQFSR%wN!kl{2&8dfFt$I-?rzee1WF+&n7)h-HJ zv`$U-ia1!snddJK|3x6$UU67akbN#-59{Rtg)<4@I+R!0-9Ve~$g*??c``c{mn=T} zLXK{<B31~Ab&L)#zRnMMTJBa@<7Nl@ILS4lUdix=` za+!$#X(>=<5I(*$-h4R(6zp;20D~2L<3|Esx~`5IQD2(_haxYx>3ve3*hqxux{Nv%(^e zhR*y{%V`cb*ROV_1pvae2(B^?N;1rY*nE2Ml%&id};vC-&OLWy63nDnC}Rhx!`@slQC_^O+~DLGUV_lEta z644YB=$?PcK)V`8OT}p>`c=XrbCi!$u_~3fk9+musJ8vZ!2@`Hmu|K`h|}yoZ1ZxC2h`^f+qW*Z!Wczr~BRF$b3Xdxy*(!v#T?9AKj|L6l@H!50&Fy!o@RobF z-q@i{uIy0Oz|4~YsgN67p3d3HRP40f+wnSe=heX^xu794ihTxYiuW2SYqDsix{8K) zc&>GSBu-wbtztx#1&!0IAzFfF18EAPi!a5~L{yoNAJ(JhqW$e<{6ONhAxtN8*%u$| zk{q#3BGOn=Dn`p4f{-;d69d*@N zdhonwzMSPaVe$z0`vkQR%{Xxf29T?g(m?vsFa)qI_cUt@* zvAaJ_fB3T2FPOKnTIE1f&Iw6XADF#ejq0o8O3Px^bw!Tw*U!5&g*66*6dg-ChvL+{iiqzqKLOxlcX{*%n~Rm%#v}l&9P)gyq>&hH(@=z<1WM|S;*l|Od~y=BEmIQTlubr)WDz5jAF z;>fC}>q#anbL$He?5J2`{Q3L=13!CZAGm7rIpAbJ8`d2N_pe5WXw}ue?vGMQ3a;Uui zYj?XY@Z~aEYms4cJ}G) z4;ap;EkHc86141#_+}zq`pywhZoA+5-2K9@*n0mVf@v(!fXbTQ1&MnR zkkFI-Bsz7k;bwEu%jgYQ}Dn!|8UgyO~HtV6rjT zLAQor4rd2dV_mEB1M|Wwcss!MVvI)XBV+$rGmY+CGd5BlA5im=*yq#d*|foadLB*; ze$5lzW!&j=vus!uY}`1!K1qII{!^T{ILh5|B5gkg*R!W^hFYC>-I=W1h!1Kh=Ts6;Y z4l8pM9+ut~iDCf#>O7b5s1DBDOxC^v+$0}(GecYbhH50RBpw7OOJD^5b>(m`4?C7B zEI+ikuw065#T_>OZ@m{EapdL%$dPBtPlxzXHW&I}kTpl79O4FB-t8{OAY|I4IWAL=W$g97tyOybaBU|Yg zktXSM{^T507D-5cWxWIE!<@U1ymjlt^~yTH*}f)_q}eI4;L}+ix6n3{N-`CL>ito_ zJnPOGD!XP&_o8QmM8>ZcU94uucH!u270_$PSj5QSl#=-S4FlM{DXP*YD2X6SqZlHm zI!u7Tt?>UA`MQUXjTjL#1}vx?3Vt!-Cyn^^Ux8Ycgt8a`7_fI#o{?cCGnWvxmo0pa zr1CpYK=y26)sn#PUvp5N%C{N)e1-U*SXw#$pP#*#beEd~5#gD)9FJ+!R@fz**yUJ(_tT=WgJ787C6 zYPJC=uMbtDsH&s;$k8MMuBV6|Yv2pX`FTHxDc&b5U~j7?FdI1$a^!#_;M1nF%tW3S%YZ zdi_Q4OJp8q_60;e7>sf#ABqXH${yNf87}=6Eo z&K)n@$ClM&S|0R(QH91X@1QfQGQQnWrlAuF1qbUoXzX!Uc(;dhrHPxc3+`MGbFub9 zG?viFr5X`ygK|@dIv9S*>*RZ7N)|+G{)B0kd0f>BkU*$wM4SE<;NH+Qm-r1nGro8g zCcYYh+C_#uKn4J1H|x9iNj>weQ?X zBvpIYEsC63D2GL7WAq9wEBPAQTA~+|#P^N6`(*aYVj@(wj^f{uPdnL`FEJ-?MRSwk z>1i5qju`7jIlJR3(KC1mAs(?iqw2TikmF^5md@x;uJ0cOp57G43W-jI+J!-w<%HJ{ zDSy8?o346xu|$kLa-IM&4j<=qzqH@sAEZ#~dV%KWUz)_7HvWQxz|;vTMQ#Xz^3Sk8 zihZFj7@8_tiV@BhIe67T(}0%`5xuwB^5WJ;F|t6F^=Dq(pqJ9YePpO>H+G;HxKb@9 zUQE9VCe-0KGH&~@9RZ>5{Q{KaZ0)6SAo8-X|3ugrByaF@MRz|{M#A?xMwnctR$RF{ zgsug}p{?MaEHbIW*QxM~6esCkO@AW^VkqL|$KmZS=Q*=1e)dBvW7}25-?)Z5itd-O zg~S@HH?4^zj8>zue1h`(_3_X5mXLY&&Wb#r&SSQ0&#$Wc!@MGJ+Jtz>xZzoP#a+Yf zZJ%AToCP!LMyYx~Rie|R*NYY?%N%l6WMcinMC-A^>A7U(rcAgMrs3{5xrxBN_CE;U z_zrtx#m1Av6<7>r3Ix{Pfx)Q`BSNG`YZE^WH%BvOBi38olgkczx6te-C@dc>N`Ow_ z)s0yrq6yzDk#_;rR#A8K&uE!LkR`k6lW^^{LXA6y@`K-}Z_E9Oh#aevcbOH`5@Xm7 z(4dx!E>2#@LlBq<;wq?&VRNrAYl3jhlZq0CjW1;@-kXuC)tlU_gKm1C`b)C{w7U7> zHb;R7CX8iFKEK2oX9Ng!I-H{aR|l+k-+XB8Buh=X!m)jSgJ)PXVYDiUDo<7WDn}OQ zIw2EUDb*YZJuuk+CGjjkKTkjf35J8QVN1)v*&IP)_q-B9&xD^wyb_MkByxKzyfXt& zX_f~sv!OI0H&Lat&1y@@g!535_L!ZutRZkYtN|(g7ixPP$bqc|t7&$?IS<)iqHVz! z5RF}qUhu>CJ&^CQheTmq7WljF-%EoZ^7BH^d$@&XKse0L`hYP*p+4va}Fu@3Sxu$wNY`LY)Rz%al(DxinnL(Q1(A^ zo6XII>ipe%f&WbruO8nKqdV^!ONkK$>oHD}Tg7UZ-k@p*U8=?KZV!C(wl8vkw;>f8 zV*D-?lb*_v^YMTJrjC(lv@)xd64Khm5;IeltH(Bc>An@9`HEuLPlDv6BTa8>AQV<` zN8_GOO<*gY&N<~*M-INhN3XwIcNSa)#7RxUVF+8?4KhrA1SVxqnB!WScDL{vtgLxF z%#|6zL||-R!y^_o2Ve*tZdMwnCcA*W1EoD}JhZPK5h_cZla}HYW3MfLS`0*pMCC z+^#;3wnHxqC5U!ga^NNL>TiId_L{>Q*749Nf}n8%!jPxD>UN#76$G)eF(rP}j`?+= z#{T{^@2S{=lyl-Y9f~(F5$uHqA^cIBf@|FSegv>nu3?(aMrRjd{tSQ&F04qPvNfa7 zA#tE@pA~9n#y2)#2(@g}xo~8Rb%X48=|E$Q`@KAd>GpA*B+7dqt}Qb?j~f`E2v|WF zhhv)%zc_$>pv@7U#mOF!c4M~?iSf7@Rxc$<93N~P5l5=8e*7&>pXZxWVbv$Ro!6kG z_$DEW#!GlYX!pvwUYhp3SY#K$=vX*(vjj!TSs0m+J)@FcO7#aQ8h^fMpGQMM)TmfX zxKV&p2LxsV0Mel)F)KN5y>Te`{|DKXQ%*Tmha*B&oL7# zd3Y6?XKuX?1XnwSh4!gdr~NG(;AqNDufQBh|3m5!lVTm6a?m|<*WE{DA<}PRl@gwl z)))@ZEDdjyRBqQRbA7~u=s*POC!dEiN-*0{)}CX_J}y3(!Fgn7x2sj1%I`b8?<^X* zpkz}7B#{DCx$aA?bAFm}eL@sQWInhJq=GF7C{;qcVzsUV#jk~bf~&}emXAy^))?+O z+w3w~C>Lm~Hp_Iy_*)t0bDBIe6{;ff>AmEi95= z{*qEl-xj7og0rr`cBmzx5+I-)dEh_6d7YV@HwkmTv^&L?8gNP+Ucazn-G+5<%T_oy z(_CH*uh9Fc=X4J$wm6we7un0CMoqCeL5h`00Fgi^Fhw^fH37hSsom-!kPLNIG_U_X zf=|PG*L2Tfbl6qgnH|jo4Eu>95H?W@F?fiNugR3JwASo-qmv|8rD{Eu{zfEe8Rw=~ z&n(I01yA=;DNK1AjLNFf2))zL8e}=(b4loV_vm>3y!Oy@WF!8O;go;lQhn2kI9*xy zlz4nS4fH_8a+xZy>8GP|CW=0%kQ)shbn9~qy(}OiSqH#}$h3EBz7%=pfNGX~*#U~5 zVDPIF2!CrXDJqyIf?-zoyT~(J99Ra+LFUkxpTE0*-`gGel-{ zjw~-SfAADPCc4UAxalu@U@12o1&N1R17swRmV4gq?ih?k(@uped7mrc8mR#$>|AGI zo6ttPN<;V`z=pl({BQ2FLT&F#7~iAej*vjIJ>`4nY|t7bp2B+XxMax^8hPd}MomGR%Rx_Z7ln{|s880uR)lP5n1gDuyhS?w9BS;rY>Z3cTdmWW7p+!`cdn|f1y zkY0tB?&UuhAxa+P?9&i_T;O+ov;_ZGf~vpg+5?xj-cw5xy7#-NcUr?slwS+CEJDxx zzG%79cA^t{@&-+6cHd|NSrJQ4u)I#f}0@?@cXS)+2xI#2V3r5fWP-gQz#Mn5AKDa=%UTPAP)q)7 zlX25Fzd|bxsT)7DOxg$ifCVLrq=QO8(hu#Jj$l?F+~3eb(0qC} z!-a4vs*87`ogmG>~2=X!H3JoYJU>E)$`gGQ9vSmyzmgCJ^p-}fbu(PWJp!Rko_+ER1;)d$;`uiZa@9Bl? zs3a>n3_la3l-_R_aogWmoqS-bZa!iIPeuOaBk2uf`U=TJwOUeFWnip4>q}${?@PR& z7RKZLcGujmw~azj42#rhImYIwpQ4bXf_kmW(2QC-=;;}cfjKkNB3;I-pPelX@cDTn zsmDsV>7Lv7KE`WP{2u1k6wjG7Ef{WD;lnfVZVioamKO@ui{NbWA!@y6=~~$wA_X=%gj#3vJq^Hw#@0yH@qm{OdoV)WZ4~-&2C;qg zQEQlqeLkzFcV*EFioZBXtoo&i*9VX8-h(`Ouc-wPX`5jqq~7Ye-M~@ zlO&uA1Q^iULaNxSq$B`2gL~l^LIM!tMomp<6ga779Xy7kh|u#-9EukonD4TB!uhI% zZ;r_Qf&|x&CptL_>$4Ppi(6(2U3GW`A}yHWkiCN;@2g6M$VBW#vj^qFw34BYa(>EH z*unWsSm77EUJuOX!d~QKc-1wSX$5;?)1!%nHy)8!TJ3Bd@%;e+@{6Bmn7#Z;KcuSk z+)2556V>7A`XEl=AGiyiUI}Q-X*=55+#9MVN2D4V0d~KmJ%7lynPhpy>jV6}dTt1# z4#Z;rbM)<@(B;RQ7J4@@C!;vXvlK6FaYD6G)}2wnkNl+F6+#Sk!}?WcCx68MW(|Rq z0zgLZ#n3AmD0(H*#6BV$MN%nSzBus$OykO-!^=AQQ3ysmJU9a9qmd-VNdEK!B%auX zMHsk&hOVyyB7C>PpJS^(vn5}nP!v6iT5{igq?@ypYPDn$P+aU?)+sxSDdPwDS@QnT zFj@h9Th9y8knV3Z?^@0%Oe<07xfVOJeY(N0H%7frRfY4(Kg2p3$2wDZN_dlTmd)fnT zw3!-GBSp4~(=%UAnse5o`F{O)8J+?l7;BW~U|6gF353Sa%*23o%hXprL;?F;7ZK!f^$huo zS>4tgoaelv!dfxW2^D@NB8Iyr71vpUahm@A(NW(;A^8@xd={*nZ|IMpdy|zua;D=O{ON0+XII(<0EP z=FKFayV9`n5B%cMl*Jk0v6tywM|+%!)M@Hdb3ee>F?kathk|dcoBfB%l7pPI!~kTa zTUL4SUXVa61!95yZ}*YUkGGfp5*b96%#exI9#Hxy+cN)u1BG_~X?~m8f1#(2=6SXN zAKXssbD!w`bZmM_M&#X}zl4!BYIq#^t`)LqlYXO0?8YP}H}-Tlx({MLpv$Y;5H8r; z&s$}BDvb?kC6DvqAjbrBa!zm^F6$7V14UR)T~9{KFp|iKX~+J#%SdyVF{d|j3Onw0 z^c>+796K9|@=yO@ev}D1KKAGUsyZ&mKPe6U#~qj;vf!b*a2fmagl}K_%v`4!SwqkN zF3j8OOB;OP-s^ZxKbt?xgUXY&Sk-Iz_f#DuF(IrufkY~Ku|V|kR-7-peHtzV49s=d%Z>~jgq9G39#Q>vhUPoa4ZYqJM-xdh432V^bZgXbBFD9oJC^8<(ooIq!EJ@G z+11lC+9hC*@BsXigCO7to$@_oBz&BKq+8Jd&ppf#-^9hp(7%tNO81D9xqPybU;a z)>oP2+}_|M$Bw__tlh~gOttX2o^-~Zq2U$&ag8l;K!s%M(ds}-9`u%bwuQltmeQdS zqT;FFj_HlS*SPw)6$GbB+pP)mt|~x0^c}Ju690U^?*&sPAL@V+*;<5ak*CU$VC$zs zWE;i+!*V6>tk`)`J)t%}V^TgYc00$`>yd!vq>c26?BZD@_UHhrIxgF!Mqzk3id#kQ zkOr!tJyr7PhpA2z*X7BqsX*<_L^vC;yWjw-Y9tZ)Rv;7>ktrzc$jQ{*j-)H}Az6Jn z2g{bCIh6o@rkf%-@g6TYWr!-1v>DG+Jp*oSsEUF!<%QXBqx|W6k6u0wegqf#f%5vp zq^L;UMpGYA;{kukZAl@viKu%20c4Jm9N~!2Q9t+$t-_sT^rGXqB^OC4`1Z$9X?6Yg4V8oJg37h(y7UXsf(Cr}h_H?>vFrnHZO1%n8>iGU!@;C5 zjW2msSdzo$c160#P>(c3<{xZ}L{+DR5;af9)y>(TCk2fZXW#auvl~tH3fiH0sP;0Z zeo~c|J|SE<-R?+|=_1LtnSZlyOin@W7qA|GqkUr{Lkgh%o%=ifFas*ZMt{eUx*44a ztIS`9R77Ix)3h#qOzND+-blwO-V?TaD?~$H%1F>m9}TP`VY))ja8~{uu`TjWeqwqF zmdd-C8@r!xfPqer2wSzbx;9@mXf?4a3r*iJauZQXe7P3@iT`IYCnyL5amzq#SZ=M@W@3RZIBkBc$n)W{_G`2GeWg zxAN?r)y2JUG`^XdI6JYbSdv$h5u^K_w&5W5<7Rj=i*@M z=r15oPkaR3&sM;0{7f9T7G1=$drorRVzdW<&=c`PC{M6r*t?uJPc90)i9QV$8T+Pu6ae5#hyf0v)#7B4@g;~C$QKDL zywNq>H({wv6*HU+5^_tL;a;F3hJfXdse=BvV)V_qt1S~;w)jzqwOdDP*jgf{bipFG z_n*GNxEgLIWmAhGk>=wSg#|x9!~VK{&!YZ#rSbRR6@e^;>%LfHAvzkS5^DzkCJQPn zULE`{_~($Y3&znc(90cjj=24d#2u^G9VH^Q*glpRwCDwaKlI|VghL{wqS{-sK|EJh z@TIfUiNEg=@GSW_`15$7jdt?bD;-`KJM+Zk`A+0?2JL4-lVU9=S| z$k={W9>awJvJI`Tihy8Ix`R}?m;f^!LB19@iUG688^qN^UC16j`}#ap$@&2WjKgLjGF>z1?W*#1I=8W(~8%R$W$*{BxGK*PoD9glC$0Y|9B5ep~F@6 zp-##4{`IjPWTso`$_iEyR+d!d-NG27#tVKj1xoHJR7FdKPtP<9*{ndC->86rUO0~O zQ0}OJoH6@tvX{FduQ&f#c4^=wTKPRrF0y3wYB*nmuy%H^mo;_#?Ey5--G;&8#o##} zv7@Cr*Jzj0Q8H^4EX%wG+?v=|*OD+_(9^HI#YNq6;0};bs5F1?ZZN)ZJ>NGAZ!QHG zH1BcN6i9W1>LlSHf(6K=)yPuimRy~Y!AxayK0xU{1a(&N^Zr{G+2|c6Nn1`5aG9Jl zuS7|7=4xuFSh=Av&-SnR0Tg;2xHkajKAo8^XV}dERRPQYJmU3Hz~&+YA`}B-@vDrB z%>X3E(pw266pB~i_)%26NU&R+yj9I~E499n3`|_Ba!V6hn+iRUtDq3!dwq_i0;qsC9xUC@KEbx;nYjkZUvH>n=(+lam{c6=n`7DsqU%R5ZH%TTc^c3^ z-g_@#a=C)owSbA^e+?B=h}7L)w}Qc^&w3Yqbi`YSN&+<9cy%0gx$r{9MhrFKUJ9+flHBG!);&s8y=L%3PIdD`^X^zn&U)T% zh%Dkvj8$qyq-qEIM@z$Sw5qW)zM0xOs*u$fL1Ao&aVvnfyY`mDtygxGGnvC)&}uDU z)u2A?z(?517c_Bsu6hUwCR<;5^1F=MHvzA#KCV@YiIz;C`sH!Qd;xUZX}fIvq*Tm& zlhBtmT`ytIdRzIYj;_$G)jAMt3OB>YYj~G5I&w$zsiP1ctv&rM;O5wt|@Z zP1M_Gy=QnLukLRSb8eP=(}tCcNuYoAG3WjfpPci9Z#HUg{H{xl|87z>_e25-Tj*nL zK!YJck5pymg;;CXjC3PNb2EHI_m&f00Oj%r}Xu97iX z4U0g7y1nR!uy#9Era2`|$FxlrfGjyRs>oB*p7|QW(NKBb?b^KP_X>x2(BsK~lAvNN zEad*9OfzZhyl|u(P;a`bqa5q*nj=i0=rweg0~ceU)NXJ{$Y|xiIrlbp_VbB~vc1*2 zp5#qZIB0h++Rf)b7-~yvug6oIu+3L^xV6Lq$Ss$){U)9MZlnEdlF5g7zkvDg*;%!> z-mVp=4u7QYleDjfe=Nb+!V9vzTG%_Mg$_wHy;u`cS zl~Ft1uAA#dJwaMV%AusB(HzXY&y^Xo#gEVp!Y0g|_owU%!~R#aI&A-7hy2JGx5jO> zltO!tdV`sAbS`vu$4NQnKIx2SRWv5` z4PFzvTw1h1fLFGxjA4#PZ@HE*j#%sGQXpXX4!EAAM!n$pw=p%V%>@P#8~o|yQno{n z6rl-pdWc`g}*=uT%@un4C~ ztCKE;sl1axd4ELdh^!nF9#w<^A*?(p$+|Gmf%P@Y@#L@iV8seY(~mukg5Hl?)kYElnsNNWS(Xr`8_F3 zh--LGMnH;-Sy!(Q0tIekKRrkij$0}PST(lVK#|x<>ZYb=aB9(rv6U83Fx zsi@^sKz$uWFn(35UPhK*$)*npAX0G9Q1y()gX1ZuktyqaHO6mB=!lLY%p38@bOygV z9?te2f_3RwbYDwxLa%r}pP)^n2D6MU98(-7C??!{nT6DER$RdLbuE%a1ZnBZ>9D*L zmm7IYd2v2u)gkn1AzTG$4@uLelL$w@Pu+qaZ z1lMC$E?X|{3k*KvcwT4HdbGG3(D12_Y`KdSyp_DB9h*{=*pEzx9ZiZz^{%nS&5sex z0LjBE&~&qc^0I@QH}($_CM|Uaikp6l2V;c>VSKoPPGdKNsil1{{$#fVh<)LwB4tgX z%V@)##mZq%mna+s8bT|NT?ZTs6oH*f|SDI zUAE;~{s9aC*@mNjqW6HZrv@kPv%vC~1M|-757;=mLN7H2_LE(g6p!a9pL1wqp=@=X zd!_dE{!#u@IA4lB3w_w_#0&;%oSUx2MGMd{=Rgt#RtN6dL9Q8sQfvf2S;=Ra{<#1& z;1|xwQ*v?rN5+vZoRGjGzMK8k5_ah}>>kS0fRJO(8S_c1f($QRFA-Mj(9XbYA<`c( z1xr$5A~Nd`G+CAwCS!GCz}V#<5W#G#3LDX23OwZNW1zaw_(&ynm*|7IIcAllQC3NM z%h>_S)SY47IA(%8HF*{kS11cjZPfZcOYci$V<pYsj=Q!vKjot9kLGdxB@2JRM>$y@QdMSCePkkwozNYICFPA+Xn33+`ZtnIhc1evdICX_MLc2(ZluTl{O*G*kLk>F|7J}=Zcyk+-Qqj|#zkHwihpB?+t9@fVrxo65SG}5#2i^2 zoSW@&Y6DnP)V=YUtA0_ROK_Z1@A{}n!%0bUk+BB1$21mD;!MHy`H-vsQT%KI!OvwB z!c$R_y=MSOWAcj2RAqz3TWWOUcJi+SxPDUzSTuJfkxYt+Cd~5Vkg6o=mq`%JK|++I z*Cc$;ny7wen>B{_1_b6b!Tbu1Fc5_N$g5Y7Zzgek}4Kdje+sT z)BiF|tPuzSaj7qs4Js%zKz!yPsESWLYN3hD37%8o;z)BW&a(IDS}tTriYimi^_$|u z4N@e!^q+b}NAfvz}P$4ffpSW?GV1F*nZkyeBYBsW*=QTj~pA` zWlO8bDV)%wgXrLflp@@tI}gI+D|IyaVRZMl@>#O+8yvjm3CdY&-Ts~CT-w>4RzFJY zlsxYAUSqT3@@El_KDEM5_?)*>=>4~By{z}0JMKEah#n*@@<7XEElnGD(Kb;4! z`VamiOjtmgrmGVPzv5ODj-xws79)AUHWm`33T;u|zgSXhj^KOMAxe$7N0B@&+X9+= z%dg%^9EVtrBWc5I06jp$zgMAdb`;qh_B+Y$vEHVe6HeR{8C25;o*&}6iw&?1 zP;$R^yPFu+qH|{}Q1H~IS77^=lol#xqSABVI5r-^I+`F_Mnbey)5P`4&oU~uC2n3C zovUY?qJ!IkfPRZ8<_4SZ)_(!j;OtM~rU4KN07iB#icMS86{CAZAR7dEQC;Z;(`Ow^ z<{cax$>b!Ebs1bNOCalAgf#7fbQJS-CD-Y3gRa}GLl)?0kjh9Co842QF2P>=59KH@ zpX zB@`zN!nyRR(25M}av%}YfSoT#!r0N127vZM?^p@_OqT>685~>^5!Y zFrZe?*(QaajPyj<44RSvZP`t)Ih%Eg0AMH%W!=wLsc?Uem}N3|vYzN=(|B$FY@N1> zgGetrIOfFa?K=jyyoY3%2o=6~mQkQLj9!D>xrkCe7+pRYHCj+zO zh)^}`OTSY#FR0c5^Y9$Eq>Sb_5uBx-iO&I6v!>;X`v|45yUL2R;>Yx zcGI}x((Cw~Jot$;R*JODy%WBIiAR0fWdA9b4#rH=GE|6^HUIsjPNr zPa3q*#+FS%ika`WIyZlN!(CR6`a`=i5>dfRYy^hRqfrP5Io6pSgufTS{hm9eY`8;3 z2A7aY9c0U>Q?Kd`6B)-bq34Q!_Qqy7Kf)+g;VHh}8|uv-D@RI__FVn;2@f%+?TeX#`<^2|Vl2E}jJV)q4X;BP zuuCQcwzTt(R9&O;1csD2LhJz6S2wU7owEAn#K)Bed@(^{IhLmH7u*K6W?uI^RGy<0 z@Ci)eF=d21r?>dDd3jg(xrjgxZLKJOYo@4)hcx}FBcXjt#yULKE960|;Ia2&497#( zJ{1``AkIR3a#$6#4nl#(O^{p3DRw9;-7M=tp^)<-(9cQ6p{VSkVW1VsokQ1DG^Wnj zReBnz5Z#Zn936`A^Y#E8c9T|p&(m-lq;o+}5&e}$O;q`hZ@AGgR7H@^ zh{ALE-~%*_z%h_=nGBM`J&xx{LrXBCs7Aj7s$iEgXtppqHe}>~Hybbf?T0?ngD}gp z7}Pm)d755EbplU9r8_fGzYs!IY^_IETPg|3#lp2YZa@R1(pHru(K%#-;yN9cYhU?Z z1@G?k+A9I31%VZuw^X>{Oe#?@1U5|)kp9f;E#?XsX}urif3O6J^yoWK?sR^4zwb#` z=7LwUeawDwF7@kzxNFd)8eRV1I5rr8YWHn$8mA5R!*eo*1;WMqtUJBaeDwtYu3h{C`<9YCBQl?UZgVE4 z8XaqXURR9PgG&_foIWdpbLsLOK;5LrKOSYYQ!I(4Av9fjrJTHW1`BgMKQ1(slZ-ow zYXEt8`BZNKfHOgGj}hXlTL?LqZmrv&$KpLlQcBkKQ<%wkhQ^^y;2%_nB9>5kioT$IDm#QoR9*u-*CjXL#yO2SSK4 zAYJA?f4*k(p&hL^CNecXadVOL(?dX=?k5u1UMoaf>D~bq7OXX3z`W)AJLg$_oOa~4 zBD>)zF9DMKuKbQ{O9=zx`o4=;0tDF4F_N>IMP7_6b}QzpU39BA&0RJyM%5#c6(Wz2 zZtU(>%0!rLV_YVO3q`Z47Tm=Ed=ED#i8J2PXzA1H8&^x0siPqZ5**@$8{VW>O8#^Z zLhB4=h|u_`ce1qmGiJ^z8cYg_<4a@G^GHdZMaXvzpLT`q)blx+0Hot~&muxQMW?`p z_%Ugk8*PPEM|Cmo=RAd5wgBSA4(tdV-{NI@yw09Q61l19`!BRVF3zbazxJs-_d&)l z$Jr&iiPa@r;qTXV-T|D;FA+qBkJ%jHqZ}XhVa?%m@=X{mxD2b>iZTymRNqYc$E|G} z{vn>9Ey_>{{_cA?IhR&kcVbunHttL&;kjqE>o+wrF#&ga3#c3(vGktSz7p3Hsq9it z84FipFPbd#&%JxR%Nq%V8j}%;Jxavrfk`MAEyEa&%h-h5pf#IkFqKA42yczX(Bess zw2HKw3>*<4gQpp+viVd-53rasyB^G#vfl@-F&WZVV?=Y5JBzC&dyg1HIwGG|~ZoOHQh7N=f5W{!c# zs&KugUgZ%MTQsp)#*_lHnB?CpjDa}Lu~;T82*2W_q=NY2>a0Tx6o+kDD88cj^u6C~ zoM==M9*E}`GyJfH_SC|FN*c-ASLPAW@u2P7Jx}6!FMH#T1+~sm*^SY*RP!$t@Skqa2c6#+4>iJ>Pe1(I8j<8WF|FzqLV|U^!V(A3*OimV|U~;qbSq)+jy=TNpG> z3-W?Y^qg%2vxE&URt0gwp0wDBb(9zZj^<_n;Y77GOPXkl+Fx!*Xf$lGQCww>S?XRI z{hibUVb83kFzt_uxrbXH1G^!;GF_Q+5~&tpUY^oVTWzvDr)awozt29NKKAyvbV3VK z3KoKGT)QZDMECs<7U*h6tMFH>uV1hudRAfxbY!>YP#NJ2F@i0hvad?KEF)QtCpnyn z056s*fSNDyVMj*gv2I1A*YoyN2u7}zlt+w0T)Dr=mc z*6$>yo-~g!pyG>f#JK0Lf%ZcITT~o!MYaGW#$K*GMPS4dGSOd_a~rW0MnpVt5At(H z!yiF69CE`froZ1EFm8+w;pVWGF;W_|2gy#vjMjN$Z!0tI^n|{*^3THxN!YOyFxdns z*ptZ8W-}Nsbj{)IH{Il)A99@vRO$qTNrf7@0=u|jy83fi)OUPkZgUiyBs!{ESf~3N zS!6{wiS}4K{F{Kjs*DBApvH~I$xnzoL5P8V6j8sLh@_UBI(XjgdkwK*YlCd7u{zj{ zPN#^x2IC(~K8lh}vj0J6oniD0CXzO!O5-`L206b}&2Hw{!1;5Sh9D(;4fIn2LdU>y z@Q!QRkTjKQ^zw*qIywalAu%BhnA)GKXVHY^+^|k**J6KFU>LvQh)!mDPXH z35*a>@r(Y+=nkw5M9ys4W&}yvcwV-P$6Sz09I8u_DY6 zv^+Cu%quz7Z8;<5ybrU=-MW-*f^SS-iRVRu(1VlW0>VE|y)+?BwS0qq?_ z>FL#XH2}CD5+>@nDpsZOD#TX((wj^6s?@txNl!R8x^rn02*5g2l?6mZmvvW%JYZil zGYNvYlwE$adiE_8oxo9?6jlnYJHbE3m#^{(+Zy3Du`18GDaMQl4Bh(?qFe6hUohJk zH%ikRoGN3q<=1pGJXn55bm{~fWZ$Qu@bf+=hvnY)7GTcb)cpk1>F;kSX-H!vl5PMd zo=W1_`L_jT4p!VMGpyUsGx}Bp2Ta@0R_~(>T*l|FE9|EngdPuiz*>!y$Eit$a{dlh ze(1d55XA4%pvOxh&a4!$@hWHYMS5l{>U{7H&5{U|=E9#dRaD)10|Uuld(x$HhCFi& z6#iMF=z~OZ7z}S8p52);4a7YsNA?ubT-*iH0KN^aEvPmg-nz&_=4xu?<~jczr(zDk zgz4CV3td~lr=*dOo3A_tiA|YXJZQJe=WaPK(C-NLjcKZOFP9>4ny9Fp-dmTOy?<5t z($*+ZT1G>6g~=2G0b>@V8xNLzeuREYlgWbCecRx!sN0t_^=LAdDfTTPU7xYgl1nq3 zcJ#-*O9>SNq<3g_saR}*v9|mF5Akkh;_vxJ4-`E}&0yn)$qoMj7sSCg*`HfebEv3T zRB3T8he)%BEJCSbbd@aeVbJCvvZu0EBsz72u}{gkQ#~;f11(QD2aqykx{jFRAR9Os zd)Z|Jo$Nf6UEsJS-Z#z_d#&$Cnn=z}secbzsUXIf;m=*G0uyYGgsiCu5o5%VvBJ14 zC4^6EfDsCqeC(cTuYJ2TvUCamWI8kAU79YUhxv7sx1ieRfz0t@H^4;HJ#eDu`_!Sp zdsektAAwXr+nmXrce1F)pDY7fa4{TSEhm7kaWI|^e|!s|Q&(ap)HMbjYYx1Q9_)TR z(>Mm2`CUV#O5^rtwC%^5tYroDh}T%<^Am_2WH<=eT+SiIAYGM;^fdyoN@H7g;O1il z2+K3l|AuJ9cl^_#*J{?9>h7;~glvSMF@9T8;QP~pqvgGF(N4}hDr-yK9U@I`0TCSYoZ8@Sh8n|D z-+8a6wYOX}mI`~&vNX;3#;P8-^VY~_1OAXezM$4)Yh9-9=H0O>0d7s;wfxU{EqERV zQnU1u?_TP^8fTH41-?!h=U4MIGnnW^ohn;#v%FnY_(rW|r(nxq_1smCqMv{fAVV}q z*EJdxbaFc8AHSrE5xfJz_*u?;UH}g_ZhWF7MSA)`J#nVgV^TD%Z7KuQFdJAhF6SeA z&vjg|_K-IeyvH&uB6rFpj&1JH@5L`V)hwp^q9V=NAVL^{Nb>cfdVv30vLtftfS+Vr zQmXQFvs%H2nY2(*TyZszIwTR=)vTs~`ZRaF%A6(YOddS;Q|%KH3DV?q4FSj@#39;Ecz`=QM9AWsvrFvDg-r3Ku85fL_LD1nxH@gFUAR zUJ)~a5OQrt2F%*fWgu6PB!_{JB@u_6*1V)0-GFYKH8f}&a1Uvg6#d+)1X27`Ji;Ra zCsOZOvej%(azIS&#vL25+I4~=RSlQ@kr0!TbcRIa;mUk9N~b8Z+g*_xw?$%}Y_gx! zso@fErDFEe0d=Qlk6rkNE~pFDpuIWsnLo4qOsGe%Otz3%579hZ&E3iNvo)51^;euh zgyEZv#@&afBE)YsUh!;w1z9<#W41&SX641MkSYq?Xo`Uk76c>6A>y*Ga}$CtQbbbt z7A}?J&UhA?6zSGR`{aa-4f2)us50K-M9NH&|1Q+Rp;I@dceKLZm|x@bS_&it?71i; zR~=6A$4dx7`l-bqeTFTvgKigy@^tu_h8@%@& zS`-;R6}PVAiK9M!jMkogl)dvbNa14It0}Zd_9Qbs6h@`bD4w4rs1j%Ppo;TlTgFpW zRmUNd8SuU{<9`2wYfw?D?oxI=?*}2Y1f5~4f zqn32YZM&O$+eKtfF=!KsHEk3-Cl(5aHoJ9C4f*|eoR%YZS(|b{u|BUei?#D+VvDmq zMHV0?r~BR7!UV~~4ZxXS=~}*R>d)2SDvGGL_rL9@%NLc`TGD92k`bNv zLQ~W4cX@#H@-Lk52-KQp8xl1#kGjx^znv$CiH`X}@&hQN7%lkZv`UUT* zi5mJzUk}g^!=4Vb6$FQpiQH%}VwQ4weqJc%WT*>K@6H>oHi>aDgc+4Q=-Mnz^O0u% z4V7c@bPCuY*h0#^fDsnw9`!mV6KMf-WkKzNvX#Qs^sL87Q(QJ8kCnQW!p_v_%19OD z(*wBYO>;tz7z7Z%m7*UK*6hmMOIRqqYKF1B1u;SK9dX7_Ds|wTVS462P%93o8K;eL^UUNoNj zq&oIK-F+(N`(lREpiu%Ngv!&T1_G27{5<4Jjw^)5bTxMi?m$A*yZo`CSXG6Idk_;D zi+m(Mks1U$<^1_eIc&O2I53?v;t8r_J}%+hT){Egk$<(po`+=Fjrlea8&yi>Aq4JD z#^P9V>i%`<`B(gSD(7y?e;Ns>U;{9W0XEGv*v#Ob?KwGue(1Xa(0i2bn?-22Q9~$( z5g8eaFjoI6w1RskrGL&XRR3|JYZF$4bRLukBydUN_;+#qI*I-r?|%-Iar`>8{v9*_ z2V%d&rTl*mslSIzKf|w2;nGOq8_TKC$5~UT4EZ7V<`rz-YhIqcTN$zQqTf&s zDv^BUhAq7t9ilF=$f#7|<4BH+6U`zXFxd~26}mZk$oL}|p#3%S?0`N#pehWRip-u= zMaU_8hkK|r)Qd*MYhr&z12!}^Y0{~OIf%ORvg$m>h`a;Q#-#5=Oi`eDxbORD{4&kL zPC*(Ws!E#cq=ex|(H*l$euY`zQKi?!)%QmgAFi!QWeggaP$Tb)*J;RBV3^$vH(}ab z7d4al+8pBwOJSD(5e99}h|h=hdnftTP_0VxtqZPUE6${$bgO9ExaeYcm z)eNrV!3cKe=65ClcPH60@Tc|~mc4z>p8QTSJ_wn>&mKODWM`Fij)_2F9cXXrh8-3W zAwnfe;-E2i5};bZ^XoTt>KA_`dqHtS?17`g?@*8a z0tWckNtYHC9d&DS?+_yq4)ydu_*r1g9#K@NAD*?SXLHM)Uf*}&E?Ft)7>x&-uByDl z@_$!PxRL|w&JJCT=|#2xkT_sZ9070$1aV(SFY9x{oZ2O5!5ftz`ab3c zOISLLZ{x(&k`B^7;_$LA)>m_^YG`c<5&+7x!V}Y9eC#%_wq>mPtHrBe6Dc=RsoDs@yhS0oL44#hm1AaKZLBV>yNBt67Vs|f zY(!4~BTyQ^$;2+}Hml(GwPuogqI5uLg#a%qy^-a6Cm3++{7xifuPu3ST}4!aqvcXn zht#Xlt`C5_QAq=aZ+X6#n@C##eW{3%zwud)ks!PyfScI}+Xo)&_iqiZ(lUZ5O|p2j zktwWIG^FFowa?>}H)~)B-GU|HcXvx92M|CBUrA+*TiiV*MUzG=Y zo$YweyBEqHstaP&OeA?d?K&MZ9Vv02LC54qH7d*5r2}*8+6U#oah#-BQ`HQ{LCHGX zlHOA!`GiN#OhUd&dY1w4DU;8d?&3SmNxZUR5E5RJ&b8Vc70U5%tB5l7uO~)SzBE(=%rCqwaVtu1Zq)iptxa@R3{7fRB?}wI8#c|A>W8V zOxw{^AUnP==jE4q=%z$ZtQBAtR1al8 z^O~Bi>`8^1Qo(80Qb9dIa{S3ol|Y#c`}cMU z6lO#-KI6Ju3;J%)(b#>~(j;*~_)l!e)xl)V(O0~kZWfq3Ijs6khh=H_jjs+Q!{~T= zn~Wby^?vLErn`Mmd?V7nZ-Ov?_=d((1m7a{Ju5ddJKlnOl2{4k>Uz-Fv@K_9in<^d zKTG1YtFRBudy*X*FewvjeMpQmTe3_%3faz7>9;6t%je$Z`!F}BJ|uiJ9)Yp7D13e7 zfq}evmRa>Md9WIY~*BbjLg`e5a@lO+K2d*7DzChHM!LG;+ z?fjw@dV7DEFEPchr7rXm_x<*=P4|AFuxnc>?B$@0O;f#LBtmmTf40{tMF(Y4%7H9f zeK2b!!qU*-=VO6YB9oOzxp;AMoqD^6R zZOToX5exT5s`9!(6of2@H^h))Tp8;50(8^R*3`^z;Hd_AbeN`tOI^nWpf{Yzo7HdO z0v-8Oe!iJ+bp)dgCEmY(f8T{Y0%UIY6!TYljY#gNt{t?XB zV*xXV1|DUltD>GuikhWOIXss8sOtHlw=B~euot$HSNYF3XHy*tzb6W(!9T2gi(QpM z5{5!)m1XH@K@xWlBBZF52WfCj(JxmPlEW?-K?WZnOFFJjqvkpR?DhlTXi^!pJ0Z3A z#NgQX&_#0azuhmK$7*YFPMzwcB}tOY&AjHWO5hLkd$@ybL8x$!h(qGeC?>HxVFQQf zxt4Kl;e@s$R14S{rb>>|0deo2ZW#F2&l!`V?V+rd3*m$ZNGt$>?{k)nPAaZD&HgB? z0krso)P2(qKFLBYOrN)f6OA=honv&l(;-MInB2J=pi+$3dM58^J}s#^va6NcMDb6} z<-lg2r{cZ`Dr6p8AuGV@m1Kv2;akTbvZm%ZoM;76ZPSI^WPn!HyKWXLygDs7k)l_r zdk>2j7H$jALU1rCp~9+Poi$Pr0F_Kgb<>*KQyhbE$`R|YLqBK10^&VEp2oUeG2g0n z-jB5mU_ahTfDM!8b^|WtWun#50j)&bik0+}bY?TySW*zx(QqnVEtFz7$Am~@MV}}e z0gLN#O+QnVkHxAJN$z=oMg6;)^j>7po6NZk)oN<0BcwA^C4pbb*2iix^8t$7X z@)`bt+u3;daV5`ie--EgjJH#z1G?pLEr+ZKk)azfHinT2(QRJm!y&pId3$P7ujK=9sA7GdObde)C@x-Tow@aY**DZsAW$Anih| zOtFMVz-BUL33i7(z=lm6+IkAQC*gz z^S=8L>k3^>QTs^&vwm2HZ!FO?Uol!l^!2QcZmf0E9AGzluyi|=uif!oHRoq)oxVCq z)Nv@NmlK^L_ZA@!Y)>SsNN>ECI#+*`ie@mq27)nH(R-WLlz^niY!tgcLB`@`)XtNn z<95Q)&pA9UTVK(|I`SQIaZy>~|61#NxM1OTOwx%@pWk1`5(uM{IHe$~LfP8KyYmAS zHa5uK#PoxiON|K;LaE>LttR3b@copv+|fSsE$ehwUYlixQ5P;Kmfu?jSeK&U^F zi>{Oscia>5h<52;8iBV_owpt`m|dRfQwUqytwNO|m0x{@xWWM|Ioh|F)Dn?yS2Dal z@Y5-blnPtWhG64gAN;J=*B>0iW`c>{=Oik>)D8vS-%aBU5vHXXJH#ZL#D@lf6N!k| z#k(A3M^BMd5n}&xh{n*DuC6{Hs>A$kqCzxeXi1-q{p(=ktAT%egGwKDzWQSh9~-{IN07&o6LK*2jR znH8AsMSsp~yvaQMU{K?h_*>BgM*kAvgR;^uB<-L~$rPYZsq8bD_xKYb2BeQpU`wbCF>T^*VS$g43! zIWQ99uAs}Gp58#%=PsNuxl|Y$9Cno0_vM+w1=kD})(;#oppI1LueRgrZ)!9Xib*@p z^5^Smwx@aE2SiB)Md^}Plcc`fwZX%5uYBsr>)7c1IPiXfi)9-T1HfB21^5k|wBc0a z*~?z3(|Gu%i;Hi&I}71u7693?kLYvS7$jx29}Fcn-IAyNT0R7mX&6}3>Xf&YA;?E2 zt4f70eg351XWamfs?Q^@>ou8kdndB3_{tUgHwZ`M%cbW`DFkZOUv9u?7QgSVdx_5h z;KoyeMg0ZxDRINCx(yb(JYY&>tAx?A3>JX6h;ich8Awx3GJ1(^)3P&eBkbaI^nJ+&0aPhO#lc zw|bD4l=P_pwi*i*Ry z1VQ(bcP`V;R@Iivh=__QXa~JgL31dYR|L_Q5_>SvOq9;JGD5+0xqc%$SU!%5`MBCt z1;XIS+&B-G)I?<|29?E~7t2+jSDW-yveuS7%(x4jESEiEv>XGX_3pc!3{MA40a+`V zlkTIDWwSUl4bTMW_~4z5PVvpysV`ad?qs;g-1qn}qjCUP-()H=da>-jKFrI{^o7iI z)xF;Gj3sn^oi9=RG>JKN&#N`Lkr7^_lR3)|$&z=oX2hmHQ?VPb<)H8KhF4TQyd;(C z1Fuy04+_8RIz4)8hW41k@kS5F#qK!|dk8UzhX{*@&4TJeVbfLkC~nhVucc7*)jVIA zVKn&P{MoFr0t*IwwNH?Tttv1;6qYczH;%`xmq-o7^UNHX8|m*r zFI<~>{PV77_XHyA8CRPOsJV0jS?AlAKsUR@#UL($)Q|#oz3tTq+Ef6<2~==A_1|se zLrenyKAqd)yLV@w=hkteeMH!IQ4Sm5>pErY7_o^Xwr2?bn^0+3QtfY|FbIY4tbyE)Jp3PGdMTA^ zt9h=b&k+HUy2eERX=XxqXXqoRj>CzMEhr@Wy;Hs;UNaM3>&^h;$FCW34Xv+*YUdK{ z+xKnwuriXd9#w6yYs-OyM(e$BsfOmf<=8z>!al1^6M6^0=aO6@)r(7+BVjr)sHgJz zpvn9C*qQ`aDtgI>#9>wY*pY@txab{wsZ690Od<>!2*X8|1`Yn)ly5W;IsX(Md)??h z9D><2^e#Ivd&LX3ANl6B*-DZlF$eu>c|`3e>~J$;*;zY#u*%99atqZh0!!d4wbPgU zM}9f!DBQC#oF6OW8@nUAbxQgFXS8VP-hWq0WAEw*RU?Pdt@Q)$+i{X(o-#=U`vn@6 z@G}IC2A1}K2s5vuCTxOb?BjoIFdFB#UjsR3LgrWS|0xWc@~A?BV@VXKT+xjPpIk`w zygq>Adyob3_lidbJdu!0RK9h#1xh+<%OkqF?R&Wcazm7r%FQNHN|y~EBqc&fx>|-p zY$ll_jqjt5-ZSQ7-NSsxc?-{bz5jWbPAj-kx(e=EQ0xs^Xi9fz_0V388N3p$!|U_@ zMZgkN1VmJ>l@qDRMAF^Ye4Ny|pqnEA8NN@2f`Jzzcg@)(k>C>qp)e_qLxkU&^Q;wW zhS2JpW^s60Sw;!@Bo4vCDj0PQwi$1X70<;sF z>^*>%O_XKx6W#ecfdUN=M6(DWLNtXz24RdDhV06lbfZK5K)dX=^G0)JKzG|U+e#wN zKYOFQsqc6JXADKz26I|zf&QNc#)ZkfGKne-EgcRFlS@O1XlyfY#I$&h`U0_AuaZQ^ zdL|r6`drjoXMHrdt4+qEm;KL)pD2$Djdlj|Z z7*2Mq=V(qvK^35Gii0v3rZ!3fjouxU=TNdxC3Y6+t@8@l9HQp$j_IrtkWM>K=OKV1 zvh+?y{TyzgTftstU^jnAo*gOi8jvetYlcnZ-;msWYDeG*+!i^xS|liSy(zhqz1q@- zR^g_Vw(}kbxGF1BSiHE+FFnp6z<@}b?NA>dBTNVvYO`wcWxnTpDZP(3Ow}XoMS{K1 zmBz`vdhG*162DNnQgjl^f4LFyPU$`AGmX6v1ncJf55wN6<<>fK@TgLXpXcj(1@CjPk&VEtgFkOmqwLL^LW-uCU2^p z2(KaUq}u}(hkL5NMJ0Pg`QkZ^`jMPlMLc%xZq*jM`NN05P>Tv{|s1B3g= zVeBa&T?9_Q#vyk{MSlLY>-x5X$eD2a>(=vO$E)DM0jm+N^jA>RACFuf*MA7}pZ(Pb zRXnyq_nuY&L0%61*-r_don*>~J_@7QEF)RBf-P@FwH@N7e+Q)>*um96e821z3&Yp% zb6v*3t7ng$M$ZoJn0X!et7%d2TB=5o*U(Yn;sVY#y0lt02e1(Xyvv~MIV`wfg^*h1a-fnPr4hJwD&K zRSJl(-~e@tphfabqp(&!lhKl)*y>Bm`T_l`UiW-|l zhJ^N)=O*IE$k4eDgQ#^&RJ(BtR?jjLlHbrD3C~MgKR|*=YM>K*>!v>*DWC5b7oZYo zf*aonB+3W`y~}-4d6#VMcXX_)o35gNUxf+Fo`UY-Y5E7s&RiYhQ?YY+V_YfACN>X) z`6O?GTwnw&te^4FyNXkXy5%kxUft1^Ij>1KS0=Xz-OoQ%i?CB|D6rd{pSlCDFmUWc zLKym&V<)s|nGGK;-7W%;v~MUr+UUPv-h?3!A)Yf2Cdp^g!+X-$il8kLA^sDE(2#n3 zrm2ryS8k%0N3W<&we?9f6n09!i3RulXe8wT-(uzBetO`Ln1Cx$f#`aHl+d}m3lp~H z9t0)py&<~WlDre2gYF4=y5+308~R<w6ke(I)1&N)1fpxUQ}@z{=BKj46g`!ZE%u^uw5V||DhLWI$p6IdgGS2N}k^VxDo?S$8tT&B2dbTlr3)^rGuG^PhsmJe;X7ydk zQ%s(XhDxoDd)D^>DTQ8XD4z=Na8KrQ>LVdC6x~087H@T%9~^}ZBJJag@TGrRxiQf! zJsikG8{?I#Xr@gJu{@q#+GC><=c#6U2nK5S(3^^SDB881%kccuZUHu`M?&ejf8({L z)-nf^obA9ciR3c_@^4c+=ed{^7pP*4FWU~e5z8c)21~8*HC0l-`H_UHnWgoshZ7a5 zDH?>OOlknim*t(esE6jxz|OTDiPfoj18brIwW^J8lf|$7NqA~(+y{>fYOjlNBb?^XI z>FY~TAXYf9`m}t(#H?q|)yU4=Z)yakoEatJecU~vqGo%>6BVwhG~Vx9rLY0(_Py(w#Zb; zv42I=X2C(Q_p1D>VI4@4PD2P6Wd^^kp{diV`aLBq*R4c8Mlbzbk466^1QGb1K|CKb z&g|_=Y9o-#KiQNoT=F3PS6#bAQ%M2?VBF*YwxPn*JFd-n@ANc{63^q;_(H&RWm&&| zt^sgIqJ08IX&#tp0*Qj*mA$((KZ3wdkQ&2|Co5ye)strR7(o~U%dA4jT0L^68UX%G z9u$;9!<4%3kDVe^gDcZ+9mrtFe4w%ATpN-*I9M|#q~f9}jt;Zh6>NTd6>bnqg<%N3 zHRu5Cv5xm~ZjGBw+>o>gcd1cA5HWeV8}&AM*6M^NS6zVf{+vkBew9W*+twNKbp(}Jv<{zi zTeynWpVUCr(27aCRiWp?1}8`IRHaF7Z!XOL6_Y0wYFP+=*&Ek}&d+}f)JCJ9%c5I! zujgL~8ojeQ_evt$CNX);__Gb~_oinxQ5pYgvlTWb;UtH{r5Ko=Lfq}bXXoqoM9L+# zF|ak!NrNXoyxHR?u0)rIXgz8=+lqEa`NuzU4zG+IR3PHdi$YCJ%o;Afc)lso4;2p_ zdPtK0VW;2nn|s-3Ghq;6>eNz{MSU>iXXWQE78Ho~HZ)u|E_z^y9vr^&T5@2rn#cMt zdI#|pM@QOZ_FcaA>>1XM6UdVERR_C>DVOCK6ZD(UzZEjb&hVrykS*kEf0^~bR3Pz_ zaG3CO+NCL@-0yy3Q;qN1Fx7PeWS^tG9=_rED-z3k@Zb-&^_RrZ5JIqxA3On0Ro-K) zrcdJ!PDw314up1!WjcF4ZKp8}_7FrQ+UAJ#TDQ@--XVLiBsRh0bM)Xj4S(OX>u9E~ z=qxQMheNKb@t8GmTV=c&_c=?n1w$rp89F2j+^VCj6DPvC7{Weto-E;)W*nOWf+>Yt zZ>&#r?V5BqTNK4+j;px`=jr;}ebNbNq5;e_XJJ6W*P3 z?~no*BxfZ@AyiZQPV>IJtkrzukme1 z$lvMTQY3;LtnKP(qia03f?B)SQQ&4&DE55Sgn{*)#$?!vDvMt`SfJka#c{E6xyivg z>jmo+ARXc<+$58nEVcf7f2dr2{%MHaHu%<$QsAt3%M9>X36F)v?F0`{KeXHqHqb1} zIsIm(&7IfRRB=0|6tb(X?f56WhFc866K6(uXaS6*RThiqDz8=VB`1|E3OPJbeE(5y z2u~`-I#5eE^M#~HsJp-4V;4^Omr8;p=QS*V3~_gGHNqenGsM*{{6S(abDBcERmiu% zp-6L@CIRUF-J}0D=Z}#C_Uo7J-O2Oy6Mm%M)vNpUZuRr;pVV#owKMfuZa=ik_Vh3Q z-4y+=OX}N8>e$Ki^s`Tqf9l#@eErM5ewfF@Y5KP7^;!||m!STw!2c@MkA|iCwtw|) zwe$4vzIWfNUq98nm(S6w=TZ8#^YvJu^u0xTm$13>*=?o*$v%(m?{K$Sh7jb?*CbFv z&SqmBtIy$&e>9Ob5=L=0Ku^vp2JjQ;p>Z^alLRDtn#0917TBF6*m7tysQ(!4M*ib6 z*fc5(HQHVDqxV~WQ(ab*mc^GwJX76s4%4ifgwzR+8_!;SEoij<#-K~D4O=WvHjzC! zcZ)3v3*>l)#QA)%7jeUI7>9pU&MZbXm5XAMY!q&N(@}sDjma!5l}gNk5gzzR2W4al#|o@@p&NarMbyaNR;kB zOF8glMzDfL9ziDI$tsb{U-$x&xUn`vpCR&Mx6Nj{p$1jBvCnXmX#D6x=;}=rB|AP+ ztg-m~qSG|Yh$&(Rp(+-tC_At0h4p~)7*dw>t-|6y(JQ(b$Ui|dgT9Ymh^5GjeOf}0 zMBG=$0-@Ozd}(WBcBBCMflz@dKx_|Z6C9Z&`0^(AkxSRZRJ|C}ju9wp{colHDq-7k z(L{CylOnUD#bzBdVHSoQo7@@2BKlUWgNL+PK zF*JmXm#e9b?+rK~z=?ehMxnTvCxuCnzak0^zqYt06UcgQaEV^V2d%w>R z9QI3K2Ncy88BTQjBz_c^H7$&HTf4^Vb7m)hpLntTBEhhfW@<_CIO_Il*D|COu+aEk z_SEOu#_B3!h_q^@5qlSab_JsowkeL8IZQ1gMf<+6rRL2n2&pCb9*r`n$%DWYU3ivv z&>k!p$s}Sal#vHLbv*z&woL_ztF_NGM}CK=r!Rt($+5v{Qw`iIU(diM0uSeIfo&>^ zknvr$?`6mr<|3CKAd{(Zafk9tBQs4I$Ldsm#j$%w82?9nmhSuU+9i9MX&c6zrvG8G zV3DhkW8`>h@4Z8X(fhZ&mqz&V)$(5As%E{z*;E!u?ANq-zUMHBvky6NGoXRa(E2Lm z@Zhy(V4ID8M243@nZszinxbNGr}b(5btR}ZK(m?>V6Oq}qG_++)HdpJuorl+saKaT z8OLfm-BKV?QX+$-W!CTQQNFy8-O0@ostcyrgY15 zK06FckvSA#`+zih?dLQp#Lbp!xgz+%PkwB@!q_2qM_AF06FKy@k{ruJ1511My_%+* zl;Ef40%;`t43)t{7%t(p=Q=WZoH-t#?yyOVdBfoywB@_aFD3Dyhulf%%D#v+JbZfN zCSo7NRMp^|U63!rimTvQuG-)TWj0KN0MR6OZ#X#Mz4`m0ToT(-DCelIT|o5qm?fk6 zP1PEOknKZAO9;axL%w3q0`Fm8KjJo}dPRKOZIBKIexJ!BqDgl^t=OwSd<3IjjSI6K zai?!NEznP-3mEIdo&axFJ$>5j8>O()G#sN9OF>V1%Z-xNqQ@iXB^5WLPbl#QmojIL zQDyM`iF6)7kKc4r26_n(dGEO67o)~;jw zj~4&R1p!px%LfSVR4OMc83PNPQ&4#K01K>&MpWea7!|U5SJNHhyg-D~r(VzXgCbcU z-b#prDhCwIj%q*Zz6bTRJr&E+=iRLGiijXoPa7nW2}>~_|G{IVr+<6VlqNRfGs=YP*OtkGcF6#)x-NE*a#gA2(-@BPKDPeMBP-RY#iHHP_?fz@pm{G<1Y*z9o7Uepm~_PAqpZF!^EtSNTO;e;sDbQ$rK0_C)j{F*&FloP=j9y;$9eQ{ z_;uw7tPXEV#?Fw5+3G=sj|=x>^b)`)R}d!{&L8*!DY!5nb_pwA@cMi#vSM|{&>Wlx zceRoQ&1iv`)Wup{a1G6u<8~iHQ{=qoT`m#}DhN63UDZF9(I=)w4WgotS#n!YV2enN^w^Q%?TM!^BY3 zG^NiuZT>1ca{ibV_S=Wi%Li=o_M1Bqnb>!QIb2$gJL=d4@(OGNG?k=UX{2V$|b#1+H_WE(ODyyERMOJpgTuW zqk*?>CXr7#{{Ui6a`kYHR3r^%YB6F*oA*lFG7$C9F$+6$VCGu5pHDo@kB;C1D!9Z? z(uo~y%E{|0!(4{UeL=C_uQEr9qrNbc=zczzJRBi5#5V@i4n;|L&=U#QY|yg<5b!&j zm9sxx+!>aLvd!NPhwHnylXVwcrd@Wx7~`$Z5?_G$H@Ki|1D*rllNs(K&Nm_AJRo9Q z>f}buS(0wkCGy^X@$=d)qi9iu;An@3Es3z8>T{%-r2>IVYt$I}; zvI_}fK4-yizXM!@fT1K~W8M3^o3lYgkc3K*4UY@ff-XSITQEjA3tRH)))u%Et?Jqc zU`3F|6MwGmUF_|XG)&I@wI}wN0clU*CLo~%_w;2)$!I)^L;>tp3Y$Wrtmv)rE8xlD z?SLoRF;ekc4kYr`RVjcrg@wqku6tzy?^gJarKw9%P62br)j2=;_7(2s%yRJ zsgNF_GoUS_Qx-_OsMTQSxqM2*hL?(9r~O||{JYt+DN&U&>wAPcTRJ@28#2?!UZj|1 z`p*d~UE#Vvq^jbx>TCF(J}{jp#lG9yRgb{FS607t-tB_Y*Hi)2h1#>E;xu+i{1#;m z_L^tmI%IYX6TwT;Yl&p|{ ztHlANFtV41#B9~lTHRwz(s_ad&v|h0f1VE`<(vD~-n3N27K-o(YFjhp&zwT(Rb30`K zd{RtQm8&pkjtKMRP$=Qrolld{7l+TodJmOyf!Z|;1*y(TUFz_+r6S` zaW#i?>6ESZRYP;VL0?VJ=&tKWf>y4yuEi;a{p@SF{nqpi^x@hsw~d256?C@(4g3C{QdW< zDd5L|N5RmT&o)j4$tfj)AXvHuAm5vLfJV%Ufh-Q9;E%(asOp>J0Gw4uAhwO$Iq49{ zMD(^;w*Mj1C3(+IpB&T{m++kEA#WZs>}Y1|*yE@_ILLywi|g#RV&%7_0q#I-AsI+9 zKX5|o_+p$tmA8$4|D1Zi*01W{zO4RqJ2SQfNS^5=^K6UB)n`#(H|%_w^pgI8=O_4? zIgwG(f}@y7?6;-H}qg(K1B*!3{7&`~4tU@IzZRJBBE zrutoYx+*o2lKZpZzs7(3yd;?uvU8Px%%3uM%6_7@<<~0}$fg$opcNR1hg3q4 z682F_$}3k%|CA{f1(jVpbH$ls7*XA-Wv1mGJ9bO^)2`m{1N;j^Li)DW ze@9?Qhz^7rzhtA{s{f7Z|GC1wkKmk9=nG+}KOHPn%=@AtqwXGZ?1#=ORBJAubrT>! zF6O6Cad@^*uC(*`D*B~ozxT&m^YPc8=Uw7{39GlCCPcg8JG0l0wmWy!`j;(ZUyjpA zKA9UK5BA&(iq~lfpx3YCy!bJ|KfX(Q#7@(K zKz+d3#IdRH>4u;C92yvA@d1Zxtd+A~HkicBA-X!6m%S6bbUqV z(>_gyeU^6I9jIKtl;t|%3iueEF)0(5f|N#jtlpac1{UbWnR-y#xIpr2LP>~0=w9at zFI$#pyKiZ^oVM5shnf0f#|{qj;ObVk<+MOX==c0JD-p71g4=H{5<^VS(9UxCP1r%+{~XE6|_c_Ta8Gf$o$vUSRUD5h0zJ zTO-2$>XYhbqRjm91`&D>tPsk{Jp}A3>6Ot+L*dUlx>Q9P31Mgt-MRoNp+`6!&^szo zk_u~4{XgLxltQjN6a$p`h0u8iOc&LKa-n-BXpMnC)$|v8Q6byX=cRC}_pMFa;blHl^Jb50!*j_*Km22sUpEMTpu7!syIak>J17dyOxUR zmWahS=n!t*D~~$AQj`pKKmb$-MxZtXtg?2NzZ4&&tLW{-e}Da-n-mW_@1Wh3G}MT~ zTc|1rpp}?)VRrk-Vopg!ypd<)RgXlkdv1w@^r)=~ahb6V7N~(+D2W>P5qhaRjYsgy z>-CSkv}~|!q5=JH1zXO9rfw|*8tkiu1aRORHd+ojDI`8-|F;zW>%_;d>W@=>(u*WQ z0L9EkL%kIXy@ajD=m=?u>Hn;WzkLPngi=ZMNa70Jl1iIJzP2L}(F|;>wq}_!FewH& zjEhiJYDmXGCYT@Sc)k!y95DfIng79mN)a$5q$^ATKxg{O!zaRjy5C>Ba|d0XRPvCj zIi$$v^8e)0M;KXLEEF^SJydpr-UYO9!~fK*G>l&f?(aq#K#cdC2WKx???v@O&j;ok}e8*>?NX8~RWfVbN$bg~y!RJBTu3c}0llvkVQ8iZfbj zd^C-d-oUHK~3L2C^*er29j`#>&6(ePL{T3jvitDe*yS@Mm~Wjs!fN1=cGK zcjf%3ru%cxs79?>QS5W+MtO5s&35Dc;k`+gLT;Sw4^{kY-1DAbn*Uuyadrm$zFksO zU2bbjUdU+-X`>E+b~y_N#;nc08151$+7?-_o4L?(Xt&MXaAn$JW#^(oYYIcej-DBV zs(vwk`PxWJ?$z7i@=@#R!KjqSP7+kb!Ibt5ck9Y5&TWJ*!(X^u2ItCXEr@@9^gCX;PyGQ?eoDmdz+4$zmgcrHu!nxFy7Z~l@?Z&niP4UTrnL$V{BG2rN*}Dt7psc(zLb^g|_LTG}a?S;;T~=9Ver)o2Ad=6ldgKe(wuPE{a7DEoQX z`o~{CMZDC>yuoYEXw&9RM-2!6jnlVpN3j~kzlF={emk@;TT=nK?1ggwXG%^OFadkp zo>+t{E|K8Fa5olDu^I=34}pS0YqH=Qx}xn3pEar0o^ulbiLG0AP-xcJuS1qBtaUp# zQ;jKpv2ii-KhG5h#FgnJ$nz1_Ud+eAjZ%ugst<7O>|wci}pg){gh;VnD^C}ZJ8 z9RP{~D%{r`N+X#kN)$D;tgM{DGeJ-;X%c7Q_ngMLH@WM_D+?8FBB6zp%ORAQLBXSO zTHxE-VatX7WM|w6Ua-jwCMLBHWlAC`T!+>LnrJ1{!~awx+h=PVj!0MNF_-90F~P^@ zj6py;p3R1SS#@b=EjzG1aUaa~^5uHx57GRkMov$I3vq#nMy2O}Q!^ku2PTr&))L|H z5`8^@FdnLIYQ40?@!8#0?z|pW<7bCU$p=V@X8hTrBQO8MWOvmU^Ctt30W_VxRKBl% znZL`pnBBzgF34~J;aGMGdV8uIZnoY!`cb!dw7sk6GuvMInD60j9FLCdQ{JgQkZ?i_5~*d!{ZKY} zyFc-@h3|b^)Kb$_R63|7u`jV?%1J=N=%qWZAGpCr3;MPIx5POyZ^KS*1~`_nLPY2@ zb1`|)gts>76KS}ljYh7RY$^kTw+d!$0iW!as|4l2@n0V_>(KHI8ZDTb0EDHh;v1L6 zpp3F1wWbKp2K#CLDSS=l@E3fQ&Eqnt6&83eu-s<{+Do#Jgsh_sS(N)ddqmq6Z5r zpCG;MTj-nmQI>^0OhzYSAeF@X{cx(%=OQBuTHciVLhyc%x6w_?l_DC#FV4MX9DyUk zwjpEQ^KRFU%3cp{+@h%^lah7B+wsaZT3&kIvjffK`vWv0X>ABH zt8KP`+6hTk0Yih#FZg#wtad>=bNZr)K1|DEZS9}N?3~&j%tN`)k4m+G-dn!rgWiFk z+|-`HDfX;`lr^soK64vlR8M}&Smg6u4{>2`o(+-u8*emIEr6JEQj`-Q1C@a_w&=|U zXmD95y?r*mz+cWX6o1V8+J$LM0P13|xg?G>5qsO2r{{-bS}n7|>-2j@;EE*-be3!_ zYLu1gKlPRvyB_#Xlz^$`BypZEIC%`kaUHikMShAu+Qmcm%Cf*w7Tf#izZSNCCF>=UzBEv4lRdPnK`fdMx2l#c4~@TpOPMX zxC}2k5(*SDRNLhh@1L!nf_zCsE(sD8CD}hW*CalBZ3i;+< zibmZR4wk82-248FRACqj zFq1;tl>M|`zU7Sr+oPht5;IV0Cfp;KK;Fx;#pq0{2<=7haTtKY;aB83rX~S@(z7?( zSrp34)aRV)r9}R%KRG?uV)4QuK^%uNi0A@m?ZPB!#5$ZF5syQOabMDkyXwY5ZOpx* zAUM26wV+@=%WRMeGU;0AT2nJ7tu_m2GL<$8bL+FZ3JoANw|U-or}_opb5t0D)l`O3 zyph^BXJLB&MiwE*boqphUa)29eS4Sju-3-sl2SN=DY8Y z@_Hlx)psVe4kd^`2-1}&iEA-|NX0*LfN7IORQYvFcGi*UeuYs3`4V6tyY?_%Re8(b z7Boq)YmTF!vh7ApIv^@M6+Wwq!rHD&T};N^xRYAD6sP19#q~fRS05(J#KUlm4wKh3 z;st$mi!@_ECJfEo)siC*r+Z}5%kAaJDZ7N|n!xxNX*I0DL7Uv|@{CQ_u{>Js2~AD? zMJAoLQ^{lp@Lk9ok5gJL+bMAAM^~OsD6vgus)u;Dc7cRdiB4P+OD{ ztEmr3=eqds2-a_*&LcfV;W3db=U-5DAc`i~r~1XIY90$pzXpm)rK)&vTPeABXwWM( zL-@lzQ!g2(cX~b~W3=v1KDD&{Xv|#v`V%ZoexP{_2>GhR6l}Rq1sM^Np+Bj#{)cq0 zw_7?OV98}RjF)9U=gt1Y)XmO;MHs60Uz=A}O6wJEFrLui_<@YX9EGtxZOex`R>!Y* z{ml+XtSOFqC_2OoSH_N&8d7)kFTLqBlAs*&W8hrFx%&MPtJa00arezc;Hh>jnHz^# z2erMHeFqU}&;A~l?b{Sr_~?(MP&TQAH1eU(h+;eb0cP$u4J62Rwt_=os}6ZC|5>tR}(#MSTyzOZH+jW;%P+vL_1$O5Q%+HOh0|WMKJhwdyRoVjkQ{mz}v8@>jbBXPib#lw`^fUC_PYji0$DPs>yq9u3PfT`;d5QUYGywexv zM8*K3DZPxqED1Uc3G1bfr?yzYKd<68|IZp{j*Pb$PPhkCbf@4)U=XvJ8DIb=>(MAq zl)mKcSaDf?5IyJRCc}D<4L>cFThd8i+$5Wmv7c$GKoKLIjPsGtmYVG$R7 zhd*ETctb-Axt44X=W6nrH6#E`pZB<*h6s0J*ZVdVF!e`y-%Nn_wA#)ghJvg$8N z8Mu^S!ePWa)HDG5tHmO&9=vV9^)0X*7;*>8U&m2?#=^P$qE#tWKhp#kR>86B#S1cg ze|57&&M^4yka-ifu%_mrAwJNjJiq(B>}=F8B`5Ggy~q*%U>HgCZml(uJ~S&QV1^-v z>6UTp@04jcRzHg$6kQaf3WPr!Jyg4eV8fQ|v3=G+U212wn_4=xh|uRk&T+<;VxH0M z6LJ7!Ow>=6LCHGJcIe@W9sTcgrLqBJ*$B7W)CSZGooi&n()lPU$M1^; z;&&6Q(Yd9H_l_8DZ*UrnKGZ^9hP|~LLK5hNEotCyY!FU6#kXU1sOS}B2HcY zj=r2FlQaQnY%+g3{am+{n{(neFYXq?E|zlz~9@q@ppe0L}qwC zv0VAKxArj4%fbbA&rpMr?g3JG)KEUhpdRwRZx%-$=^hb+6BVhEx=3&F;lBBXaP`07 zLzjrhR{uB97d1k;F3d{zS^I9yM`nZOs*R~9iiAw%ZhHk?v3 za7zD>eHns(emhSQb3*~88c@-V&=J9LB-!tdygZQ(=csfIC-S@l-PAGHE#Sr;;Bgx1 z&y_Uuhs*X`3bK;;Wuq17VOM2BQ0R2E5>F`2T1WM&jt{Os1)nlY{oR45NdAeUkhAdK zWJVf;GhdDbO|#;jJ#ZoYr6kGlbd31@OC!5l{0h(`a#8mXba~30LT#m^ySwXkCo@C+ zt!ft)^(?g{Y;qqyvtSF+=!CUh$WH8Tombp;VPk{zdwJTLuj-P3$1>|ib2d}!VC;px*(_91a^tvOWp~)H zi53ZEK*4TC6q9#!FlJD*ytGoa((IFNY{63ro}7gW3C@f^?B+to2e3y}sqJPJ7O6b| z&)++czLP`GMgnT?>S=^xcbzWuN*$!_0Vt*{NMx0L7pNFH0)(gF#8MMX#EacSaL4a|QT zU4qB>eUYbGMqtLz?25zF$ezm=UF=cTTE9s3?t_N0p$YQ)B3vnhI{xx?-i{Kq2+2-H zB~l$0O)m{aDy!k<_CpO~EM725x(7`NUDn&Zjjwo75+#|r^13AsiBVor=a2!1)+35R zfi+=Ug?cQAWCcv#G1cYbZtY&g&mmx6zfjt~DoyN1^Zrl>SW_J6O;fC7dd2OOgM=RM zy+Xccrl4`KsvFzc%F1&4hqvm;KFbL=uF0p}1N%YiS*3dgRWzE} zJuNH}#tCQb#bp@7)!ndZ>&=* zM2X@k&G=fE=Q9NE3O{g`KdTeAX*pj~W_)w=j(|iWMy4#ND73ZG(p1A5@BHfbmH)z8 z!I{IL;mCAh04zc3Lfc$i_w^5jmVx?plZH^r$+V56xLRgQt4tDY?rEoCUj!C~wPPJF zE#LaP&~)di8(rumu$Dr_^s}lK^U{F+G`6I1={1Q6?*>gj{Q}zqK^RSuH~ z3@jo4A`rN2Nb>7=N*kwoSL+yo5u`bacr1s6U9)%__GzKNNlmS7oOs)4kQOS|ejei7 zYn4Mtee8AAWt~c+4==1OZ&*t!+mtwyr!{N}AgRHFJ?pA6;wo3G6km52i}G4*f7(zp2Unts<71^xC?VWmEfbd?E6u#<>bt+;Nk}w^ph!| zxf9W$9=+V%9dU@k!z_o-prcfqkqXRBpcb^V3P-ZZilZdyYA#*+bWI9W{x)x|CUljO zS<%@VEY*m9Gh@N|YaH1M3M2ob9khQ|I#?@h`oyuP2ZFx@d_Y;36WjaCKj0xZxwNIKgy>6TCk$v7=5MYZ7}4T?3vGaaLFp|H}u4 zN)Om*)c-FgoKi*g7rF~KfWME_?%v&|A${tcdoU=eYghOUhL5P;Q6nqhn$2E@C-Wma zW^`a>w6;ix_8-_8Tt`z)c%hU<^k04s|jAOxdE0aM-^34 zVcgp$;O$ta(?2bV!%|=6?t&{g_dSZ%n9jR>6C%6sS8s1tM+9XTjME-2$j9l~@(2vc zz|-hi-h4~qwCv$+8lY&p?uB&A-sOCpASDRC?wGX5EH@We{JG3_Whyw?5_thD+$AK- zy}0I->Q!3UVi)`EjD#O>9qAB2&(vigb)h>FyUJLaQ{tVL1xYYF;&^}#;5$6GuvM&O z%vz~W)0GlF->sJ)Va&3y+iP!x_$hSuA&zBzxko7h~2O3l4A`=*)e zuR!x?at&!h&tW;{7ax+Yx{`niCp_NKn>n#9q9;T;Nax+hs#4POv;mDDq_ge={%I(D zJ&`Y+*dk8Jy`hiy*2AR{pcL-p|bK3zU`qQPGv3SuM(=cZ6F+2jo~MuIG3IEu$8`b3|lsF_>!Raytig1cxK z*xzD3T@;={GlX&R2-oP(y!AFk#1uZp{c)yMH3+GnkVT7Vr!rq7U$7l$f!Xk z?(f|`^k@LARH=YJPBAz_39Nxc1xJmPnr(2DMUgjn=Y=A%jYL^F2MhQfWFG zmvus$@OfH}L5CLPVZ45m70)E9mjVl%#fZ`j<+L%3u(L-q!cKYPKyjrW!V(_34cotY0<#~k0Utu{ZBIU=uXptv*ItPCDEUio!(p&!c=$h zSdoRiWt1}3XTgeXlwcs5{#dmwAnU)sG&K{{=7FXg$WQR6{PmB_M{3`2Jw=K_`0&}E zp3Q9Gid3d&@4xpgxp;xCSD#kn0zBm;0gx%7$psw8KIhM`*gIQSAFq7>;QxmOzJGN5 zc(I>dti6A>ynk@Mul@L?{rFnV`}1q`%~kdB;=X@mzkhf%tkUIf{QXh^(#;wuux$JC2y4{Te z$6ZAgFXR2bK*3A%0`xkZWohg+GhDR7m@SQ^xyW^kY^nput8&qoB(Kqb%n*mo`w+Yo zOLqM-{Nn;zX(ZfC7_H^CFsKtX&$sQa@^NV}z#jwde~uT`FK#bk3=`I`m7Wc7WHtv?PPl zpJVgx6us-%Fae0CCbg_QIJCXyE~}&FIb33uDK;*dt#uuNxB^yD42lED3TmE z^seO&BiPL6rqND>RG3=l*nc7~tdYcxx}1ut8vI~k1%bE$l}>DFP8P(|Lo*$APb+)t zuKq4uS=6tQelL%+gk}7e`8HS3bocAtG;BQ{CS6#VFGgL>!VlD(4JSHQP(!e~h8oM8 zY9Th(Z(~ZyhGt4~qfOEO-S_JD1R%-D3Pi_CPdR!B1_hR#fb+-pqUG@u9riAVm zmrd&WAAtE))oq9pY}bOKNtAC#SZj)%md0>BRI0UXSG5< zW!nGc`UZ`c4-6kVcxP;aJ=So^nKQL(N8{1W*0^|=qry@-_*aTh ztYA^bLA2_I#!1k5QF2k%wj^94-!>EjI!5uDuz5{rAAjkyyqT6d7%wTAz`-d|kjYL( zoO1t+X1Gw4+RQuk+%N<{n~Lj3>9dqGVfA4qlhV&n*eE-uSkxTm*Ur5=f`*+q?6e|d znT!20I+!gi+gxOW-8kV9gVo&@Jx6t+Vr&Kk>ZUkv^fIE9FU)|szfz=+aQz%M&LbC) zDrKGGK27AE&q>mCO2Xs!=NJO88c@p*W@9=Ky+PIYd!=0F>ZJ%RBJ)~!gfdJsHI@<- z^k!w;MiX11@6E$%)#V^mx@30dvbuk)#i?J-&^pRFKpIR;@hV*UvYOu^IM+!kE;!-{ zd1YXWZlCgP3#*DX9Otoq7!7u;DkWvDMu`xTM9Nt6E|BO4wus6$(x-vG`kP#_)TsKyksdz6&IQFTsRr`fMdP+<77jmWgsm9ug zcPkLDEjJ0y6^Q$Jtc_=1BQbO=#BMvkK``4h>Igk;%bzT_%a|p*MPyIZ$%%A4P)(c} zEGi7mo$PnH4~KMK@%0fNAA5-Ncmn#ifw12xkAx8M!)|m7-G^<>MHs)eo{-oxCu8(} zc9aX9K=~tqy;7zahkLVY**a0I9_sCX{{~ydF)M z+oyD{pW`Od!$2HTgUXU+Zylf}bCi2^uwA6I%tSN^TADrTvFcFQ0qy=Qq2DWUQ}#KE zj-d4Kz_s8kxe@H=gs2Hb`|8wAFl`ML=N?>xU%^y6;_0AU>ue5CW@l>}CNGV;8T+;$ z3^fC{m5Ba_`du+R_eW5D6c1g73iH5QnJ)8OFnf>$J0afoO9b!)bObdm2U&c|rxmG7 z{=tQKjt=I2>cqnb#x6%4o6uSlm{0l(_Gp5ZSH6@cP3%wm-IsB+Rm(ic{kh2^K&nRaQy2TrV}}kpfT4ipW5Ig&-y`c^uwMHSXZ85 zPP1(ya?maR>#<5Fk1iNkzD!G~ZNEBSZ{ov;@q%-}Ls9OnSD^TG#JBeSW+(5`*lyra zK8KLv{THe@D-^J0ZGE0UpOG9E$=_2gMxXoUCik=1`Kx*`M+4!Vt?a*OVEdUv>zv8at5_uO(tG7WH^$7!q34uirZFMGa zgfz)Yx5L#@Ot}P4{sRw@Hcz|>Q9b%ZM;^;m-DGGG3u4Q_h3mOd3_nG4G!bZMZJiuX zX*5J<9x@V1b41_tv3?ySZ;9^YPY7xvG~)#)7`gKnUkMD)H2|ElV;`wOEJ*&Swz$ep zl$+3Z%S}wevKvMB%8}FE)ErF0q8Cbin@v|1)G91H@KMfL-MD{&0&Q25)pu@6;cz%0 zj0sSqV*|c$ImL&97sKQ%w*JyhbWpSXFzxqy7BggY{OWBB;?@%Pt}7~vO~TL=yK_}R zT!0Zj&FYG!z;+w7w0e?pV}e0Gvy0(|rNgv(FxBWP*@)bZAo)#%+BHSOw1?S_nqp-h z_Uiz7X`b0g1xyqH$%^Cly41?ob`fA+B6*!I+{I3h;3bC4f{4<+U#+sgkpKa!g*nVi zd0xqeXFExhtr8t8`&O?z`t!j`=TWIQO}cbKaCT6n=(0GWWI3isA_)_Ibn~GDg_q<6 zfRyKL`WZA~)2o8shUn1x6{HV9$L?Dj1RB~Zm<3^ztAcdQKj&)Zq4#C88ku-F9)kWqplYgDE`e*G>su}uoFy$zz#_XEtV-TV{t)ONw$PB6R zMxEYC@z%MZHS{u-DFIVKUsNw_cYyl8V!wE(>q15Td{{Nk1+r`S@Pmm(DV~mKFcBbg zN_BDN^yZV`-6$HA3Rz4F@{f^&osPpg!u*hEp1Ag_(Bw}86K)8IwFV1}6v_C(>rNgX za5v2)(OJqFz>!XhxTOaZ*jg#&!;qeM5?-QYm@hS(#$Jp3F^&v??uxkUg1a)n=r3P2 zz`1w!`~ibJv|nEbU#E#33bR7!ZAh(1hxNwZ9E@ONXdGs3Sb0_mLmE3K{>BWtB7Y%I zilTIuQcRs7g()iX(9}o#YAuLRS6V? z0E^`8FHa6{ZTWT&r2pAQcvdfNeiRL6?fOEl=o(FYSx~u~nfd(y3a6DS_yz#kTJ|Hv z@bJnGB!nIZ>mPw1PEk|M3%cgQkTxd@Q*@+1B|pZliIm%;fNFe_`lFxb7?;_=>zVQh z9LvRovXeY#Fc<|=&=fOe3Gaf+ul_9M^25f?(o4oFeS*O^28^P?4dUvM3{=M{26Go{ zT||F?ZVr}DO5uT(fno{T4w*N#vU^k@_mlC>GKGJP(PBn@ohz_UEc4 zIK?yIidPZuiR?YEYd%vEJ7tcgPA5$L%E(BsLI8!V2g?5g0IMo6l9NsPd+P+mG2WCd zr#ow2_TwZJPeVzb>laN@OK@kVVSsYOaZGob{v&@uMx8>JNvz6fr2(GU$-w}Li1UkH znH5}Ts+W%5*tTI;EgNbzT8N1SLuGC#s=`s9PoQZZ=9=RfMCGX&oy2>Cqw!>CV5U+0 z97&XtH*Ck9G8#mBit2#>)L6atPk$ODI6H|xsCOjrYq1T7<}bGSmP;skO>ANb;5fl3 zR~b4~3wZEcpSSWGc(cN~imB6o!P>u!rpPrSIr~Usrc2jl@%8)kVD~Qexag4Oudc>8<~+tfp9( z?5j~Q)u;jCDL2D|DQ}ryjy65A=mJoVs)h(GTgfb33WrufDipnLyy{)%J*hdjwzn5hN~(8iMpj@4TzS9@RQp<3MY?7~;fpF{RZNYOnK`AF)8Vy?A~%hEr3VBgE^)ZLH@ zPHGJ-6jedmk}ywelyI-#B?7c%Ng8f*ww-po`G2vywa6xJi(3?dst zW{yYbotIhT07iEiF+W~}j+Kh#8h$F>ay;hTZq zPWF&2do~VZ+}A;`*Guc$e;sac{r!B_wDg}RbE~Dj>P;TS68bBypwvR6hXjR5ppM2a zi1A-nbm-!ux8=FuR_+dB4!0MS)98Tx`pQvAy{N5PKtS@nRRm_~5k;B2G8p)D9$Z`> z+Mx!>DYX!u`93|S0q}K5p{u9Os7cI=^f^azeWOG~F1? z@~M6FJ0i~(8_WIOuZ_~wP}v#mq=%t#zvfq85Yk<{lb0G*jn+CC`WPEvsA_%k2z)S)lg-oiH42!9p|vGTCi!68%+#2()_(jwmf^> zxU>iZzo00%P{3JB5AGuQ+zsFa-@b{<$mV`_q>7S5x4h(<%X{ehbaINrS8QB=_5q0h zGTBq>Mc4Rxqx+SdSewlQtQxlZ*J*<@uJpEOcrwmJAcsauDxIl$OC-qPncQQKMlRzA zR~94RnZ|ST!?{ym&MlC6c=9g9+3mp_|AE<+<5>;XghJ*yEZlU{&4$}t{~%t$$O%!o z+9%u?iY+=PCSzh3^{ei@rc;R3Lr4WAo8D&`b4G%jD)CLn2sf3{k-%IxTfRw2N&!O? z>G~aTh-ChsbdajYL95I z=S~h!|01b0;b_;VU7eSO*DQyUWBW=o>0CrNU`FwafdkiySd7=rS*)&11F(1^CAg8S zQYU5q@sshaCH}5G;;c>)ir5aYEwqsG7pA$r9mHjJnfojmoT}`3SyXEft=dI7As!>e z>(IpP*m`I(AX|pRT)K+^40omAG-6ObInbM|ZIw;zBlQ_nv4t`}m2h;MqBC)_3wB37 zFzd;{&L)^7DN~%SZ!9!QB(stI?DIuko?-HbG!a8|@c^^$hZ8(B7MYBsl7=3z+MVV> zu5@7!ff+uR0N0p0bnw=ln2m%eUH~#_wjDO}im8_HE9WZOG|(3GLpzy-A`!SLUyvo8x5FKH3gceI?KO*I01Lcw75#O7hXUnt2$0pwha`VD7QDVw+USd|6rU`Ua$3j|8R zgvbwSIhT0&*iQ%*;(>B}H6m63(XN)=Jxtnku;u4h>o9^}>yLG;YY&%t^SK^EsiLAX zO-7-gxe!W(E1j@ou0_LMt96=MwO+@$eLglXtL^ngoo<`bFtHM17lm|7y;4#Q#vIUl zUCY87!bAC+woDyTd|S@J4&8UAE0vcp(DB{UPCj->=Fx>4bn)L>#O7r?Le@w!?8iVR zcrNuP;3aDu37C*tC1RcAPl9B03O4H4%w_<6)K2n$eDMr=tL+UIY5wzuCOJM%)N^wj zM|Q_wENVb!!HgXQ^9FiFpbDOjV_0iu%vWcfImi|exbb6fn^P_t>5B4<8iMMr-YgGOviK@R z;D|9L$!sokJl!szBB;*X1Eb`VBXM$erZi+enRs&u`__qL<$EfUjzP6S;{FJt{LK(0 zkl;t}D=6XveE>fXCT)GSL4Z;%L%ohk6)PDUfOacmfbU~{mEm(d)-#@f_NTIGruiHo-|ROf3!jU5q{pcf#hQ;GeD^+U;;QSRPMH}M_M|7 zP$`N7(1c*l$VdZLF_DxAS#mrHoc9-gc&Eruxdi%-nl;66(&~vb>9dI$s^!Wt6aIy~ zaOxRlR#5MaPRFhH8r93H4)x&ENk1^x$HOwl&}328BA4prC$F&pOq$#N5Nb%9eF{S5 z!S%`28OUz+Z)gec^Jk{Oc`?GdWdc{&qQw?4=06tQS+Cq!CE|~(z8|iAp*)+k(NKQs z+sED0+zL>P2Yz9njBQBWAS7B99}k zv%Y~z!iPiS>iwmUHXcRE2Qc1&^#b65`xt=rs)E~5rLI74DVXd$X=XUVX@Fin9fMk< z^OJw+I*PEV#2GN(aI8W+m8r3M6ISQBu^g7So|%Po`;kXZWcc+1O(}_{Vbp4;zE8pJ zO4W;Nsz6Jf8wQr$)MBbol!>?%A0XW(v_;LnUL0aBat`9l#*}VU4+(U?cwRppWzK#u z54(ok?Nx@{gvIOojVmt}8zeSpi;!@k{#-%=LSPVs19B$(tS+40kR1MzL;-X~xT{uc4y?L_a= zk_ICG8KgIS49CD6tkoc(KZ<6xt+}b71c7SAXv4lv(CIn_HcHI)Y_aNvs(fy+B{&Zi z*O~M^C@%9ZPJOlT_p>_acNcw-0=U5V3XGR6_upuoUSEhiK)N$*+;)iSe4c!Dw44x~ z8g4zI3L1w|7mf^n^3Nozcg7>r*1po&nV0Am7f8Y`9D5RVsbrB11WW zk6dl-QZ;E2>WfeQgL@Q#u`D&pgT2{ajYehl{{VDAi@zC|V<(Sj<_t5k6u41{+E}km ze2Xp=-~Gb5S=`*b!w;noi`(V}$-q93t4R?hO8L(8O!ZE_-bi^Qgx}kcb3brp-gPDY zf7Xrcjmv8CIm9qa$(i7_oMOeEl+_gMTQiTP8|3ZQXX()^;|_yaU%Z+p2vrahb+bTu z&U#>)TKS@MBrMZG5@mC;U%(?d%!vO{cgKCT8YPzVL8bM~{kuUN10pxu<&AQ&l&aLv zbL?tPf9xio?zchtefK|^Dak^v8nTL^gCtdMVK!Q|F7Pkkg!t8X;(aZDGb=LcHgoro z{{qA<#wcqgY@uj7Set2J;DXppzz4z5!gB?N53P_F1?=wWsgZ_gAPQ)q&5B9ph@bcR zA0s{R{g7QP>n>9>dURtQ5RA)(94Uj_FnrefD!6y|DkVBgEsx=zSV%qzVT9DEa{bx% zzAdK$a~jZ%9T?IzgvOIY%`1H)om!pEK6Oaj7%vUskMVUSvl&Yr1nI_B#?B_E#Q8az znN}>z0nK{jlf!?bsN5L1CEoA3(>?UyO7a80vEKJlJP7z@JYv!^e_yiE-aY`7$t`trLU{??yByynco zwC!8imQgfIyrVF038cydwEL`Fs{(uJE@_u4JXSok@@5@+kQTt>Q#clj$(8NLaDIld zO(~yRofbxdj%fdEUztOwa_$7MG~aEQNbKyPVgpxjl95s|mt*9 z34Y-3?>{~wFz+%n^@f+i5^Ed+D#Fe!ab@@pSTTC+q5*TH1@hI&i^%yu4iDY=y#E_h zt2JV&w7Aj8p?j33CunLR``S))*wKbYz|?hO3l97t&^qj%n~GeR08@9cVjMxb-FM5a zNt#V`R6L5aeMSwgsVe}7494=4q++~DH`{kJ9iDN?2pdChw&2DJu?2E;6Sb9HJ9#0G zpT?h#vQ&Yah2I^Ii1RyUP z+#C!9g3u|V5J*N}^#$4ofuU!o4O zd|i99{CYWRnz!3eYH!$R8&B^NlLr%U5wW#^t|sqLxgXG&R#&kLM6U3|vb#7yt6|zt zY-5~OEq6Da2i>dT^P6F0BQJ}dt6!O`j9cu(JdCTP-j}-VJQ7r=drmK?rGc~5%3~=V z>6ZaR1F8dS6q~l77vQ{tknavWXZR*bu7HS=`6fHqq&p?@@+%m|=3x597HxL<4bhq! z;?T*Mg~%^PEx{&b5%R`PW`QeeP$A=hB@hlLK#aqoc$QKO#^`+iL`ihdxtP0?-}ouw zbcU{I4s-=2frn@k7Aiv0br=rUN`bdTG)bl~rV_29;TPpg9JqnwJXbQGcw3u7DN9$_ zOB=x#3dZA`ZzmP8zWP#C-A~rPXN@wDaL*?<)Y2ZtqE8Q_w%8Y?12*kid`0J5gK%&G z$)v#k8!k}j>Ao0h%-TV)l7Byvr>aiIyII$lCObAzC>`wGML!dsvH`^8<{pi+=nr zwih_A2)VKK2!q9sm1;d}7cjl|E0Y3`yx${%Ly8xwWHCP-MZmK(+}E|yp*YwN5&t@f zypi*d5x?x3Aot1|Fe!#6@j1Rl(dNdkzeNQbQJ)kv*z~J($BencWK-)`3m~CWHf`>o z`-R9iGZbeHN@_eAdh99*Kk-lc3|t#S^lfb>aek56R>$6Ss}h#8!*k~5zdpGsAr0)? z^*D^Zx#x|O16WD|R2ypybo}cI*N`eR%VGY&U(?4(%6e611NnNbLUT%2f@f}_C`nKp zFv5PXF%~#ygHHqh5L0yF0oVT&Rsb#!)S#e#_==mMmVDsLw58V+7bfFXfcYOu890}i zJ*=#kqnc4#DaiLoyzlHsj+!>)+20_!PKL(2Hzx(&>DSjYyp zTsi$R*%m&-g)sSgs-*EC{{0F>Qmc#LNR1D@ny4!%h&9yFk6=|6O2a<`2!aFKSQOznBEMG*Wr z(V_sQ{?{Rg!El^4@g`-O?Ep1#(Y$u5mFQ6`9wM}Pbi)Fa!9 z0X&2?AHsU)=rQp*QA2=)4K~pj8Pb);#uw4Ek3zL^6>FeByBd zD7_SDs$Jaz=v zdyB-j=k_LRAZ1-O#3!cGj&gT0&u4bq5N~RN`tkVgwj!sW*JAQ#642o9TY&uoAW*>r>yIi>}$4B_x0IIZrL&J zb~_PwtDX9f^$+13%)srAb)5FdbcPqKrCj5}lZKt2(*Gnli93`d4^5*mV0~A!B%qy* z)9*t`-cTS*7@!mWc2C?EKTS|9L8 zrv_TEzL>3x9z*Q{Tg9wKp{%Lj-M~grWO0S2xRy)HUEy##B>BRE33S`kkcsg%CXZoo*c%Enzh2TkOEn&R!t3;r1jQ`kqS& z1L94AhT)RH!Kv2ZRK&3Qj-!wY3GDc1|3hNagL~+?A`r<{O>USysiNd;Fd(A+2{Sv= z0$L}0fceM+E?e5nzSZY`{|$e~ZjXzq-jK8@4mclqH5;zOfI()Mb+K{Sk7hIQOFuKfuK0$drrt1;H7nFBj>5VG>F=(Gd>!xuI$v?@Th|Y+S1AK)mrqvRBgeg*}UALufjy z&wUHw%t9;ph&CoiLLWbRpqL)@I28W_w@ifP=ehVZ#FgOqlqSJJbF!y>#c42Dl-{sZ zaHSQf@~lRy06C+!XnUpvxGq%I*vZ5tlJOuL2yi|Xrw%iWZ|2}Mg_1ay$;X}|I3-kG zbQ$>zv}s?8^9gGNM7Nt7d~kp7J4kz8%L-JJMT8m@o+%b1PSj?+v=K)_vr>HK^RNO! z3KRgsNF#wT;F(m;&f7eN^|Uy1|WZ=R!XK$)Yb z%*bxl@pkxJ=y9N;L7!RIs|Rm1>*duDs4gvA#&5zVVNldrrU?#8RY)Xj+LUOiORxdi z8({n+MBVHDiT=JtaP=6Ct7<)Z)`O4h>ilq~xPf{2_80=KL7~j&vYhUvlgkqM83Bv&&Kco$79IJD zMzk;S(JXWyAFom&#`DlEv7TtWBKBZ7y{WECBQfKn&>i-GAG}DLG!WJ%7w>N?5@nZu zR7DB+kh)u3RBmJMFExpex06rz6vh*ul80kN3{mo9+NZed1CKv$VVCr{mP}#X+zCFZ z>4AIQ-2vo;QQ`wex9i!}sHY#-Q&Zj0Bx&bzavt4#ZqQ~0f)Gfg=zmtrf2!nNZ>fDd@S(ndDeyys$e#~D#O8N3K{acm( zt>wOcp-+()>f9gIU^E}qwIAxUqv5W8t&;s)b$tCe@1BSHwrBlY?|l6qzIC6gWIt7; z@``;=mlx7`C9e5TlcVD(3D-O_8rB@|vu^@ml+VY4)LLEespjNeq6lQ79UfbF^L-&{ zQ@>Yi{@abP^PcM@5xf9o$<>Z>fD|EYYk+duC`SIy`KP83V2}>r^n_A5GmkH4z23@T z)EG?L?hX+#9PSQZ20~HVk&@>b{P?1YOA?&FSrpkAgXf`>2y6d%#s+|SL@3u4$m#|N z?^6?i@4%Z+1H#ytDW4fYE9P-A<5GLNX6!v^Fsg1Ti<+>5$`7ICdI7Qh#NdY8wbh15{g zo->T3BGgOhlK)tl%y9+m~yv2FTD(rxV!a36=}7*gOQp zkh4ouKh0@wLHKY5t-F|AqG%1oPq~615!+=sB2mdz&;Tfn=nU`oWNcw3PFmmmo(wG5 zaps>w1w{g?oj|1Q1~-V{*LWZ>-+}e(kdsz#neqL$-ghA`qk(P{{tqp+04gsh7lST{ z9+jJPsmUe&B6GbAK6HCHdNpB1HEVGHJRo2=L*eEAHU0_6{lB)+Fkb;vc{_724CCa4 zU6H_z!PLPQ%}n?XMdS+8I*Tyr$VW%=GddT2Tiz99J47qdSX(1>;+2pmDYLp{MzK?$ z=m_5`k4@xnz|nVT`x9QNdc>aPeE=%1-gWjD*Sf7}H*yy8mKh>sc=k;i~H2QS?WgPncYeg?Y$v_^zh&XPDb z&Ae9`;q1lBe1H4a)|~hfHHrM&QBvSvK~hp>Pwwa1t+Ab)5Rv}PL}4BaX?Jg7-MMlC zM;KQZzjE`TRgmX{fc8ZJ3fe7tpufC93V9WEX;f7F*x97;l9Q(ek&>R^0SHmp@pzaUOYyfaB(2l~vUPs{jYxEPYqgwp1Uz{ z2mG9%~S=A(`l3Pxo1`?!*f)OZ}$K(&RyA9;qCYN2uA2vM5)0p;nTE z>lN&S2=(E`iZMaR4vA$MT5Hwto{VX}E2_a*c)UV* ztQ{@*46#K{G!;&>4j(<#92plkCY`}ZIoVO z-jKbu-+_Zy=_DehyRR{x8@I0!8~%|t=mY33^2ihqhPZuckih)Da{Cqh1u`XEHh8lV zCJ_(To%{-2I$pG&x4cbHfOu`#jRyFbrGQZ_QMn0ige-O0 z*!cFy!%n_XeX*4<-z_RR#dbdp2WjN7&d4`YHK-sXU4>xV7-ay`DQ6P&vv+j5(CNkJ zEw>CM!~B{PO%w)UI~@q#@IaLPF(r9v3Sk1Rq8jirkcxuV(iZ;f8sZj{^Y_BjeNih3 z1vrQ3yI*I?Vr1yx44AQu1rUhm)L^h6Ky{$uujy-8X!OEn&638Jz8$E3c=s}3-r^fd zO5S`0ras?Kl zhGoKI&O@vZX}pDCAU;#zMA!B+>e=6lgZ7#Wf2F(xrx_Ov9|7dtz7cPjttUy1G(6B- z$Pm%&8g0pjbWz=(d2A8;U>kJOP6ge-{~pSpUVKxmkYj2le94{=5o4x(z})@$=Kn#Z zU1>8%3RqV!VLf`8O_>>dtB>`n}| zrg@WqYEYY!)3%sSkjhbC0YJ>8-qXX@^RrtP1#m5ynnQ@ChZ#a~@FDQl#%CX|wXkG? z@m(xL>;>CE>bpdd5jF7nU~AUeOF3*2d=JXhtnhQf{i%y9AE01{9@a3;`RggM?kyIM zmdgv!36iQAgl`37*@nZZ)iindyu+TOReAX5Xjo~094#m0P7_u~{^{O)fdXQ(>L{uS zmDSDpGya1W2>Q>Wru#fWgZ-!#ilYEQ?0P8XU@3WQwegf)Jf}f~l|aVxqZ0*zyFZ67 zZVzL$^0R^tMvgX`#79OOOn=4e%K<@uMz+0!AM_J>_1zQAhh;~qX3m8%zx#*Ax5hD0 zwZgm;*<(1Ct(bs~o(S!~T_kx2C5u!KK3_zAm{hSRtNqtr$e&V5`Ixgh|2O$eltMwm z?G(&E3si!p=(@Eo7K~`O-ATAt-wu_B<9~m95bs`>$SFNkTVPta+d0(YnRx z0Ej6zgiT2m-{}h4PE%um^D8<9_#|}D+vLF;6Od`Y`d7nSg>a`|eJY?6N^TeJhC^Wb zi8;YuzTnAcvi1|4wxj*6%DDBT>uJs3l7Budi2b)i=LGka!cv zq9@avr`gV_4olRp@X!536=5MPaK_rL1SVhB&A%$8G97pZtX0|V3sF)5i~A7XP0GDy z)W5U`wJ`!mPMXQ;%mGz)^16ybhL_1aCCE~eVc}<6BN#8L6h&n^|a;!Rh!7aD8hSUOqncp@F_1KjnC?b75{t3kp5ibzrW~iw%5m(Lk`!x9ubX6{ExAQoJ(ewk;Ab z%Raz%{7`eG875{RKRgzm+4DSz=mCqNog61_#ks~AcA4O2hUUpG7AQ`wrJL}mcMHN) zm%_#D$%zlnf|kV^XK7?(UZ$T5#odncmzF*9zu=nna&lW?Nt0I6?Qxw!@E0%s=^R5C zwjfp&VRfYz>B_JnXW*Fs6!x{za%QV|#l-41W2{TuZjdPLIPZ!9q=HW~LuiUv(=O5y z46I9_^UV^XKO68rHRSK&IE@5K{%-Ilv0Dajo|OT#aj9l=*-$Q9#7j^jFH}6@K0`Cl z^r|7GZ+nmyE;5+Og*)kj*J?YY?Kl{D2$7RZFCnRBmz??KaWOXKLEUkt{wbu1_amy0K^bgF?6M2bQVY-KS!-e)k&A&0$DvJ#X3%|pd)lY#j zH|C0De1M5-BZuaZZ##SJq-jD%D?fl1|5i&q|18zD?Yyu@&ooVi7xDv=Nc!fb+M+O5 zkun1ax-|zyF^GA6gqH)X!aHhm&Exd`LeoVu_zmg^cy^%Es|ioOYCcDX{GCzm)a6kq zf5r{Q+R;Sjp7?mV!Ghf~by}>97cEjvnL9_A3YNT4bSqr#9i=#*$zV!ntnlUeqLiCB zh<$|9WsJXu74jNUg^*iIm-lfBg5@^rB@*M!z$=rC;_E z(fZD4uyE>)qZ@O+jZly+Z3Z1uSZ>KE2Mv0EK$OQ(Wy#>FqwIYPZT~}4AThuwJVq@s z{?}9q%xuKZC06N+=oaAtp&T6Cr$79Lsh7RLV;Mf|=fy3*={o>gwaEO%BUl)*I*LHx!7b`9D+9_5aDrXQ z6gt#vD}B61O9KT&-fzP=fcFu8;kF{{F{^>xc?EjN5W@i6Nfd#z=d6m=SMBuwT71V- zRjN^lI1(lyh&DAkgh}?@rZyYrh_rzGg9g-Cg&<0UChateiUm?g8p)9L`a7IVK=$3^ zbzwvl)p;eYeXT$8!}y(r$<|m*5E`{7Z%-nBIi!%I)vH44+_(skr(M%MgWg7xf_F*T z!ogiP%?H`Z)nJv*DFtIzVl(vwSEv5HS`>E9wA_ADx}7^B`Tu=sk6|?tJ85qOe2XrL zmNRbOjb6B>gjb4$P7^8xq&JB|DO3_KKzK7ekxgNvjNmUbWDyD*9xFp0RvRe4uR0=Mz=O48 z3L(k+SI;F+Q4QK`DcvSg`2?4LuA*O*f0S^89(I6~CT z_abs6X`B8L5y^6@#;qxnyBWQ_9pg18CYm{T;x>Ap#Pp0SHbUxOZWG;}_n#c9o0i?w zbC}j{oWna-SXr{dc^KRvU(x?i?r~Y9S4_5SF7{b@HW(@11MXlC{BBrWhFZrC`+r?V zinowT#=+vkeO3qC&I1=;?Hd&CzUZJeghNKEOL zn0^4YrX{%SVJ0b=@;Lbin_B?fm8QGKevU?JUyE)q$oGw#P~vV$7bJ)z6r{|i&>Abd z3S>wY3jMv*53Sw(2*rc{D#Wt}Y5x-l_60-u|5Fo(a?h3gTu`LP=r)>2qJ&K%sQal%T=$~bePD7TD{ zFCogcFvCZy+OD1`C_9ZK>-|@sYq81_?tBXXX_ODO?%T_dFy<69tkNaUW6&KL=(Q0m zmGE&kzRbL6P2>oUy~7I1w5Hj%8~tct4o>GW6+~9HvQBs=T__GHYtX%6pY7rd5quXZ z84Xqgm67SCK#10F8g(4M?FGkAef=vg|u#ZH>5tv%Jsoz2Q)zL zKYtC^xj*{k$q&s&27i=xjs~qU6bQdjDr`)ZgWZ*G6!)EqDZtRw zK{+XXkyysC5#LgSL$5eS3s>MMm|42&9X|ZrIna;LAg_l9``(iAFT0QcPhZ@uA7pFm zieO~yuQqlTR78`tmn!rsN?^puS2%L)p^g@>vA5|u8|*nq7}Bl~O#d6Ha)x{BxB+=Q z0%&xpMF_ZP2{y$ICGru|0Fzsfg~0}`@h2f6w!BiRk+k`%YA1r(BGTgD_k}g^x1tc6 z6dqFsdSA@{2>djJvzH6p!N&|sh@Szbo#T688~8auDku5Xudm;4gM{g#k{~9|zeD~V z33-ls4n2XDl#W(zHbfDy+|WLxPbPYB*mxB;ntD24v3K(=;ifJEV| zXvl4MPB*W15A?i}E=B)eMl8C1jJ;_8UD>z;Y!RQj5<8j~Cs#cb*%`^{i^L0{OXEn; zLW5jn&(rFCkE?_qAn+p|9MKBk zw)F#Up!eT7m(=pm46Cm<<31>L*(n7QTwzQlk2r%qJ(Hq&ytvHv*2=jxrr~s_n5>Sh zX?Ge#lz5RClP}Ga_i?8;Gy6y|w^_{`(atxW_E3+0gi-1YBi5U*^ht^pF_yU2W10NK zAMFJ2UL;{+RCa}d;JbzQJ@V`)JQ~zJdQwz8DA^opPTKs=h9nCAL(VaqdCmrhWW7q~ zJ?<{M&95GD+;zgLk(@n3b_M6Qw4;l4w1dj@?j z{K2eCcJ#wLEJW%If7-&z%)%^^_5nMqDXfCp*8 z7ge-F4ixK#G7R;1eZdmVYK#+~1*a!)*2InDp108>Re}z=3dZHQ27(iIv){-`S5wy4 zH%4)-(c0NUxO>!GsB|phbeP9w{eI#JaKOeK8RStS{|GO&B9!HU$?lQwm;Ee(E_|u; z?_=r+{5&Jda(n2?JL61BrhI=sM6?l`QLRUgNPdkq5PF+nQc9L)~y=& za{OV}&eMdn8yo|knkAJ#a>h}!xUpRw)%=M{c{%G_jFjg89~q$@r!bmHJI83Wu;l=` z@!!8=)4W5s{DJ&SO)e2j4zi+1Pu04uz`0DV*Fi20EjFh*?^2oYMQL zs6!LA4I`fUKhl1|UQ0txo0F**_zZ&@EjvBHN!FyvYGgX0o=^>o$1tbMo+tB#V`&VM z^&=0LLl>e+g1hzJOmY)FFlUkh78*RDq-t`&m=Y4=z&58PDI_{Y@&e5v`&xjt&KCFo zJk!X|o<)8F0>8$ci+IOQiTzU*Hcd{8BUBAcG2>J#zQPg?2yRzoYbMK@^k*M8M+EE`A4;Ad(o*n__pUA!RFnYd3;`ThU>#<-!Q*wXE_xYY4km>1hL3WcY;F z=eUeIkHwWG)MKu!$>lw3C7!re;JHVo{d{{}$rg!TtH|OHCMe*zXBhFN;0!+KlDx{? zj5BzPL#^#-R|?N;||b4L^m+>%wmxbn<5f7<@4{dB@taJbxb%{y!XGX8rup z9=_&&5M8bQ+^C>>Hv|$|M zw5J$~?>GsrbwdW8NB~C}>hUdw03|eX@7T=K`;zmwO@>q`+mr>7AxNBbvQd-4ly~Rw zlC%O8todwzMhR)8fru=h21m1X0I15!e`~XMt=E7Gv?XpCnUtAoC z$;TKKvNa!CL)4+y7y})B7+yunvxD5iDtHCq2kZ7%ed@sP5HROw8eZ|YVlBxr~dF7(^9Ep`PSv)BQ>OtK(Etzh5J>N`d?n zJWBG~)LL1y$zs${&^`RsZ_2ZhT%S)Kkl64c49io%ZZA}TqHm2NrhN&71hPn32AE6M&g)%}fT48Q9JZ7xY ztC=L%`yiya$&fe<_lq`ztxe_kz$<;Q2+}K-2AXvNFB$VXp)DPb*FpSqI8o4tdXj9J z^y7p#8yNMDQ<(gZU7kVDZPQX7QA%J?o}7eXp%6L2h~Fx0_Xx4@1=> zmPtOWbK(J4h?~c*Wb(c~I_ph-=LvhBp8;5yK79+mi|)AW4IE4xNp^hXua^Kd)?w+{ z@-FSqV9n(D6qLjTX-cHZT~1yfXVa#nsE-PIC;Jtp2H{-tg5Rnu|i3F@c1`hDw zV)1l7v<^*lMZZQBGWr+hvWCA2_o1O25P%ny=f8EwtlP@EAGvT`Z-_)&RZH!nf8A1h z`E5zhJ|Heat-@~r>JV}9B_M>sq#oaeX>zDbRVYuPRtpcc{Kzp}Ea+qzM_i>qT?7=`lTF#@%QU7=A?X=Axnc%R>GaAgC3xDOWuO1bQPGFjrqq zDYG?zcOt7zqT2HtR<|prcTv=IQNe++9JU)~H#$+(74u3^gH!cQu!R`=RxNS-P6N)U z^Y%xpK*N54#;`gZn8|MhJ5Aws2k}4np7ZpT5V?yDYR>YOuYO`oj#xm%)XU!^J@E-t z7%EliI*@*6{F>g zzEd$Ms5f^KW%7CzR}A<)9(k9;P*x7B2mUH;5l5Cv#dHhhPWa9V^ImfzM+^ZQTOPhD+ngm?=+a9VDwSMwyEKi%F zHW(cNG}4ie?ZMH6;34kLEOS9|u^)ydR{$VoR$bNT(0l(yG)C=g4!miQZf4%5R`J0gosvt2dVvq`5(| z5z&jL(A0IXUnw&cj9Yy$2G@Hz#fLV5eI&H(v4*e25a@& z0whLaQSyvJW^R1@=-NY~;3jg1rq?r2wJDOOl}1UB>}9?g)BU?#uqgyHhauoDbWNBL z@S(mSa0*wyb%lNHpX zA{b+3`#!@woY{9X=VaY;r9SnWvuV}*vtS(J7r6)H`NC^lDNPC~yjO?egT7bQaPJA) z#|!JfO5-gy_>WEoYUJ-dBS!-`hq1t=2%-J6^L38OHmu9TX$aA*<0iws0Kxv!H$|#( z*&b?el|m`WBkZ|xx#5(C6DEmtciMllCe3l$r@7E4xTnI{gWs>MEH;hI-#24NwvuKP z`S?)xq}~*R`g1@+H^RGr=@n76TAu$>2b`#C|2H%pERvgJ2)rot--pqupw_7YQ!17i z7T}l)&dELT8lfJN$%f%QE>|Wxws|5#j^-~AHn7WSXwqGbAL_TwLGE34*+Ou^>suf-Y+F&gfGY$_GZ? z_*zFjre*O?9DoLpSwWBRu2(U@Ni|kuUsq9dISRz>8iBa5F{lcH*Z#m3f3D=~*H=3s z7);*NC&BWZ&Gxs8&Nsb&ZX|qzSKa32-9y0{>!VB)1Iq5;( z^OsUa`?uJbKyFUW46ssg+ zlTtD8_z$t8>kHBA-~Uf`0#q(0>dSd30QUr`r#-rmnz3N<*i+$pE2PZ%E#I*9X&TXY z>C6Mi2SptP)>XB3p2i1Mv&gV)9Y1lMVz%f^5U`D-rL-`&c*1Ex!HWJuV z&cC`sxz+D!Y9Wzq4|*=#SnFWrr~fg%fuUC+z1BxHfzZHN;`PMoXVLMYHYQ@hs*e9j zNPLWAhv)EqE{4T*0@t&S>^c{?vKtJ1m*e>koTfgW0){B|;VWOtP@#Ai5ZFc+S*e8C z8>jGOys9qoGwidT){?9J^xa@* zBc&~h{1iY5ktW8Z?7Q**NyUPInka&0!ejZ4d@u8t>3SoLJIQ-^_r>KyANLv+`n);~ zMnEIYMS}T_4H799xvhw0cesO!6o3v-{I# zyXB($`Lw3@U~h`o(<<6}$#8FXQ}jOo_gR?qFdVr;=O7x0d zh7NTRDrWj+eaqsW)$@0}t~M2>%rfxG7BzL)QXMk&lsIR`HMX;CccrCVWM(859;?># z%fX%x62JIFe?UDU8vHl7OlSU>^qseZ3)hFowQM;u;f<*AM1^mqzOwk zjQV3n8)vX3>)k4#ejgKRQFT>;AMrj?nf9Kt)~fpFkMregXRXSnzWKa~=sV=@lQujshghdZ>Z! z%mb@jt}TSYVS66Xaz{2p{e{ zE(?+XJ%;~gpd8Py5*4n^{|?YlC#z5cTm7 z;{cv?%uUEy7I!!eO_6G`cT&!o)a;#qonf4zegc&FFA%5mhuh+bfgC1n zq&&XV&q&s*n2Yk?%)!J(Z*ZUcagVpzn17}8i5yyIIfwIRV7@Y zBxh8medx{BQs?-+_zuBJX;&a<><;sap6a2uQ8Qz{jrBBx zDijh=LLFCze8xY+xmC!iCdILOz~Z!Z0fPYxJyN18JkH4UdGMspXsLE1d5QJ0e&7WZ z2WwU`cbR4KXqw_>+nq@R3isEh!5s@`tN#>f-jnC-qhWAhp3Rv(A{JwNJFYrRF8gqk zOODkiM&LajV)lW@i%Ku>wV*5@WQIYsv6lozTc`dWklg_oDRf!fBqSGn+NKEwEo zTI{><8hOaa^+oI%CzDPs55IH7)@&UdVLF<#ET+GUDAoY)AZ4@PlWOw~f>)3T-Oy>JpVT?L$_(G#af?BTFDR z9$LsMJ5v5QH9zE{>+sn9QDxQ~ltTb~^LPL(5Y79V#WhD-*$w2M{NSOwyl(bfqbXWE zu8}i*r~{vZ0{lbs!EG5B~Oi5gqy=nC7Ch77%_HXq|^CkT6A~ z9{Th-XR7L2$#&kmKJ!+{-F z?JThnVg=5MJ7eIeY>GF~Xo1QxP@bvaH#M3#mdVGSA~+>in3Ir8kusjifqen3)Fl3| z*tzPvd+_zC6K?b&u3+EWdjU1+I()Cz@PV`UcFD}Y-2odE$sZE3Uy{m zSl~;uB~>;C2rKPr4!+2DMv&bS3!MRGC((Inajc*tcedEd0!Gp^(`$C@$7@27{ZASY zw&r{#yFA54$i;ifq&VqiRvh39JX6046QkyXbc{b4-YQ4D;h@gRR^?t5{b#OgQLPuq z5E5B8OS7;>v8C$KQ(bp95DhZR;V5w~m&ls3Q5tlWmb#4lAr=_{T)I~85xtlairJPJ zxPfJ8MZBiWGK?Do*00O1r@c1MvbP(ll`oNI!US+yt2RJ@{UX?~B z-yyr@DSOlscB{k~{_w!DdmVOGr{Cj8mIgfgHdVVFpketTw+;5G!!3wZwE;zq3O z@iOyWSip`N$qpQM6M91LKNPz47FtG8vCyaPhcAa|1S6`ZH2yI5qg%iAuTjUuBgeXa z11q|gmpinBaV*#|yWwv`&PW=7UJyY6Rm z;j!GssS=8G<#KG-IM*hE&FzN z_UJp0?b5H?&|mv+kJ{P$b%XZrZ|&&^_U=dfdMf?B6aQP($L-!v+kO7tgMV$r;r+TL z`*&;ow{-dFzqd?3Zr=XhmA`K4|69-}?cMM8^+o%3!}i?2w{ibA_5kqi7iO1@2AN(5 z|9*Zx;;=1B2RC!)5C)5GQd>4Aj!YC|R-k%oMQ-v$Kl~T$e0uXK&%%YR%h5Va{M4}5 zCzu!Eesd6tK;T|?Y;OgsnX98Rp}~de=*;F9NBfzc32ibz+6l*WIdZQm0fi)YoXwS$ zRWo%E)UmWqWjMm9ez^SYx+W4Eg()+#Gnn--5etXZiNoqaTIxVDstB5}6y~fv$^>$& z3&zK(jneiQ?z0IM;V{?!*{3Q16}^VWkyEdK{~)~<=&T4a3xc`QCZlAzoa99yjTfk! zg%R^>SRKlg@}>b1g`59aK|gNN=mH6lQ`%7SpwfgG5^s{w5639vU~|y(&flFo>z70? zfu7fD=jPH=nRPlo1}=|vnUMbzAL^`m$*vZ`QrgIMhVcy!ZS9kw#s4zfAH zPhFs~JNL|=hf!OG7+a&|$svow>}0npA?VY)CyWu)qXt3r%ZaYoMx{f4PuFKx(&Re% z;tAdp=v%_Y3HT``4q$5wE-{ahVzmE7f^W1GC`xbA@{3i; zkwetRLNFrCJeTRQt%b$jf`LHnA7T!s`2|B4 zMix{mlaND_oR_Pc{S#ZlNNz}!rv-1@wEL4Vnq(YeTU^ZXN7>ifHkGSUp7X;E$NN`kZjmZm{kTB)&*m#h)ohi5vsa( z3j*YqZGg{6Fpw>Uaxvz7Ire@^dHzIxPX0YE%(N&`3=oUsTSGm-$Qr^1; z{v&#i{O=yfW?Uq;lnmf zGAEWqr3rdV>Eazkgj(Rpcr7pB2mB7X?7H-E38ISX8%UXBbxC**t5@herLzKun7M^B z8)QMwHG~x})(;i0@BRTpC$BnswsmN*E?WFiLfW}0*S+R(9b6O7ZT|sBbD=Jpg$kwW z*A8EfQ04^AZYFmF%InwbEX8aW=h^&(T7T(;ngSE!va-^)r(^xr-CDgBo?Rs~_WGCJ zoN>}i@O;?-jrhF@?O_!huT-&j-(zm*lM3_3sR&2~n!+uaNSIw$U0Ac7nq7+nzPgJ< zI}}DWkf)YoxSEW@lx6+=fy$8h9dkU(1^XZf96}EQT3cm3@-?c4_zL4{H!~vQNrV7U zK(D_|`Wn-E_y~X#VVDFX%hBgySpQ$=>WTS&E=~z+^ou_c_kw*994ci!~a zlf(*EQh=k1=7JKUIYnR2R~~Y>^OeVk&)1)Z!o1oWKMZ2bY3~@&HVem3$~JXsPiI90 zMTFMu01_Y=!Jed?{MTs%kqx>Dxe(TZXCeqIMCtBSY|Mv37U1rrg`&EU1Ec^Bk$hzm zUSM|`ZIprY_SGYLg9U&VZT=YBO2f@KA48P#EW`-Y2}?u>y=6Iw5#N;O_y?$k7|aXs z&)7`+eI2vFC80a}c6m#v$8jrQ*yMk3_y?Z^H3LKcfBH)7f;xWgYU1h2UUgJ>F->2r z7SK8|ix%WsuDZWo^93#%Aqef7HW%%fr1jW9Jf$eL{k9;EfL9)Z>ZB6!^7G*YynMX) zK`$RKJ`hXC*Hm4I-5i!@GsSiO!r9Gv_nyh24`8I)>FyFk4`I+$h=j8r;~{!QXyd*A zefS9+q|2-Q97W@e9hT)*J@bMIezw9*7hS@o z3NK||7=Il(2P1b+fB%1Z0dtL5sgk*za%`(_w%dI90}ex47UN+Z$0BOtjmf}N(IvrW#ktLJm&2F%>jovQ#>=_kO;-^0@KfZ4n*Tc~&iq ze%oEW)soWvZI<(dkBN$~Cfa`t1Q#cF-zi8!o1l;1FkmLVKxb0H9%vT*v)l?xwz?Ho zqMRE**lYbM=46W^sZ~09meGtr0D>&LfBgojwV?2D9;{&@&eFiz?J@K{5B$PtW*ZyB zwBjqbmJCf)2YoOiz^JaM*{(c9-%6LAkAsLbSPjFr5a_4o#SbcY1}chCSS2T4%ZL^O z^d1ZsyiXa3AIu-0izOp=&#_tu{cqlg^z-%H#W5)|6NFD-bo9U5N)5Hp(TTZ<-FGlF z<;*B}Gr7(9uU#f_V_JG2$Y`krU*qVsp_yo=%YPR{yLlFs>GED9Ks@(*$b z$uO?t97AFNez^KJZ$p$a>7GRwmmego#8uAXGKvE1lplg&B4xM%o*Y4G|8ChJr5`lR z*oHO8pmwpps59wEzh$+;l0y;Z8#3wsbE7U>yiEe3*svah7HRg^*l)!n&Bg*}M{{iH9jRO#h zl(@8^0IhwI?Q>d7)dPw?z%&l7Cp}l8u-tP|g2r5`>?)&~|;H zgmlcE{n9s6?Y5eW8BW*oc3Naqcd{Ev7mRF>-aa(AWHzWUQTXrMByT*$x@1ApI5DO@ z|4A4Q(@Cz?Zp&$LnCX@%X%S1FuDpPG zl1gAHUEOfU8x3Ucx6njpO~h{0yQwmm-YvM&$hK*;Y$y=L&5cEPgPi38wjv@eVtA82{%a4S3RXog9{w-jpB6~>q@ytdsn{Q&#hq&f=po)7Oeq9|8m4-KS~{@ z$=*=I%z)hoNX+=d1<1DVF)xwAnq?686lL@N({7biX&aA(RU8XL?h z!`(S4tK;PCSenSvqnog$>lS(trwghlO_IS|!aNF*j?3Ru_xSI`-Hf%avQMGObvDOSEp1lYUo=H8Dc?Bx#shcH5O_YZ$$6x3ob*n9(Ws}3rzQ>WeDY>I$s<$gb^)r#Vcpi1yMyprjE3-$0>`V*qKvRtpGG z(dFMf2Z{)3$C)Bd21A)M@|lj4?q(4npyM+lRSl926lf3ce`HN+X84Ldc@{~D;^XhM z#6Ve<9iRUAggylR^&5QG?w?gQ#!EQ+Icq?>Db91Jw?p!l#tVuB%%F9|xWfR%co)03 ziCjX&+oc@87WWLMPp&TZPUyE+(YmS2AkYQu*E=lo#kZ0|4baoXEhpcQ2M9IR&LkAW zwc$Y~q&G5aN`IjyQVc5@zyR(|DC`};cWuEH^+zwGfKl=6lqS#O*F3NjK5V7Kex z)Zb;9MD!}>6Y&K^*)~Zah2Yel0zwpBUs}DjbK(dTFT_0uO*zsAKL6++6wm z-0?W#D8HG{U*oz#v#^Dybx%xF0S74IgfX`saQ@JwTVtYV8t|jn)m44Ok?Ncd+eX8w zjk}HXymC_x``=%)KC&|))!*c#8FzY#)^AT@N-WSBa_4R(^T9EdeKXQP*V&7|J``9Wor_UIo@0S9F97OA zTK0tmag6qjHk&s=jaWOX=`}QJ+z?uW-GgTY0%-(wb(P_$ir%q5Qg%i#UvU6MnB#oD zrNk>t?g?9C9KbdKJO z>t8DgfcTcRq%a1i6#TZYbhyRw=cIxPK=S88{T~p*pEvW&$~)~D|5WS4n`ZL7$k0}jLq8+%V#`-AVxX7G@hHCr-2VN zo+&Qbhdvr8#<6|KdNr=|qO@Zom%fL1nUg~a>1La)RhBhCg^~JCdFXJ-@FRw@DEFfl zCF(la3^w+|QlIZRk;`(ol+FxJczWaZOyX^;_|U4!z2!JVD~nx>C3dYBjtW9^q;d6# zLFB*z^EBKHd*2EB0HPHt4k>cUXdRwJ4l^Lf5g&X4xA1RSS7hP@Qs>$hv$C8CDN>jo zHRb{arV!;4U`d}xS6`1D_Mjq2G&7nlaTz%6F}CmAdXf7mQ)je7iiB zlO~>V_Ua7F#_ic~?ptq4ITIpnjq(#T4XOX7HGq~v3P22m@CObO~+K_s*$=Li#9}KKz`@?(V zo~UTwG-^7qBS)UcG61dTDMb$-HBcNLUjF!TZi5T!g+c|c?1>dj$J@P{7sS~=k&S*K zfB8@BoQ~~0rtx|;udT7ttig*chHJ2#e+W_mouckZv>5<0v#o?X$l@j7u6#dI;ehKJ zyrT82B@;(a_suc(A)q+ci&+V;Xq5U|{b*NLev)n8+l_TzT>9tt$rk}n;#k9bo}z6$ zPw~AqVEflt$tM{tXIHJww4JnMo9QNPbbb^+f+$u82xt`WK`o^j01NMuv(k`cZs*gJ zmUfzNo9kj=7<#L5U$}n#EtGzBUa1Y}tSbsh2US~dnPCZzHZ!s`6nkQ@>9>+tnJ_1^ zz=3focCd1=`{0i!SP?tF4pa|}t@lf{iFT!!XLzx>bUZ`;f`*n6B8% z`?W9yDB!#&hRm)eJHMU25x5>JvFCuPh8!uarj%jm11d1O)L!&ubhM~Ks`TU9a~&7# zNw!D-KD7<$itbYK5E4oDd+z*RKJ^i+z4~=mhbOaJpoUB;W3rakItYIBI?ou=&FrtO zQHVSUMkBnCM0`#%b;UyX*?*Px#yA~4mBOu{n3;BEz~u#}-CE}EHw`(p#m5~+4kEquZ!!O1 zMJnA4G2{2r9q()`-qzCPM-+!Ej%M`qv0Wy3{H%tN7=v?bBu_0-BhEytZoLvtpN5Gn za*G{~Nj>MW?oj#yE=a2v@v5q+sv8mo1G_i%0NA~Vts%vMKXI(_!9(!c8JNfC_A)}x zO2`q36st~$13hO}jz*{;kfj3~Vq|T=R7i@H$;3fu-PO?8*`&h;4p4FY4l7RgoMQVy z&W`iut_`|=e1OQpm)hy{AqB*MwU(!02&$!dmo1K$y=M{h5&02Xohc~=TI9Mie7@4M zI(!i^2{#}@%bZl~!h&B6CwH{e(i?E<&MdUj#Y*3aCLNdY500p@@9lnKo0HL?Hk32O z!gb8&1R59NaN0XzdBNUh1Lyw88r+17DwsDQpPeVW{^VSwPkwso6FddgpDU4}qA<72 zoJk?>3Wt?L^vHrK$4VDjUJ+bKkIg6O!K(UtR)aHyb)41YRv6>$3Nhm26eTZ#hqAV) zp*|6g@Z0S`tT0bdY2ksCeiMF*9>6(=%V3UdNsZOtn}3}@hoixsYGeoipLpCl`3;?OlnjWYD_&HNb!BFomp{b_(h^&Hk=B(n$eg^A+q<;S zaS2{!hLPyJI!#YWZCrV&ChFK!6$g8=nf?-?;*bGaHG%p1pC_=EiqaqkztoaepQ*Rv zGb}7?<>N~))U#NombBeSmxJqKs@TcFqmzmO z5+56ESqfw{zqW|SJ1H{DNkGJKnFDc@$=po%I#>sdKtL8X4}o@fYR5^Mx9Y-*47ITU zAoq_cCJNE>$1=D)04}Wcr5#0(2qHY^SjQ?!+-mp5q^i%9 z2A5iBSw(F|(px%>JA{ssx`|VSoq+vku3cdO^~JQ#ry)gpbQn5Yi3^kd*8~n7Z#z)D+IYoO1VoimF_iC zt-kwzcT-cFUzY56FR%YQ|1Com%-m!y-F=KK8(<=7-_q|;>f4K+PeSwRQUQ0cyKqJ` z^S7QAWs3p!P-RpqmXv(r3J;&F6e~QFo@7)P{~e*aiexj!RdvNelo@xlSUH-qy@Ho* zoVvye`aiC3s&@}>3*P&n-Gy3R-oi6aZWOK3#WBqJ3CfO+{KUateQh*4hxli9#B8uV zey2pKLsX`-?2gX@TK7>fOR=FvvrEr*VgZ^9`krbJkQ~+jNkEu#(T9Cr?+DNyu~Tfy zO9V8iiT`}U&%1*l)Tx6Bp$QPciujj9IUHq7zZyiZ;g02No#_`dhU7kSICg0bxm6R7 zEy)Iqg@X5Wc}1kZg>iNh>6ZN}2#3m<9;%2VcH0IY0ew66dcCN)Sb6T61WVJZY)q-f zV}{TamE4YMrarfj$7W7V$-=saWkXUYohFjKRt;8A?Qmd@NxRGcRKbj-f<=_6{~T-4 z@?}uo;l5|;#9=xRtt(!{61@(jHeMX=^^QZr1b-`+_><~)Lipd!UGpN7%)T@T!+B7k z-fIkPEt|GAf49^9b_u~Yvg64$1Wlx?wOh49{MpevA~`Cb0tkhp)nS5rQAj-cAnFKc z+Kf`PgiUR@a4VCL?J{C{5e-b^9Q9Wdk2lACeg6W-k;Fic*|tiPo{4^~q_y;(CxnD{ zVR&`lfCpWPCq~tbivC#}BJd62(<++Mf~O~xTPFR++9pwel{#tmt%VL2c;cd;`u;AQ zls|G)ph!icVo=P~*LzXG;Z*%8=6W(&kk>UDMnyZ0d{zA;KJUbPiS`7m+@E>|W-`+g zPObEK@9;4-xZ!m5Cm)?Pzjfhm*BXoJKWO=}S76Iib)C_O_Kav87qHn(g=S{vQfH$M zK{Cm_!}}ENZ>NUx!!a~z^yD&Ryc;&!uri$lWq#ku+!BmK0rW zja-}?U%IEdD8*SYG(=tGih>|u&knTB*i7}ge|yo_d_yv`Z7fdrU@nn&3+ZAhjyRb|GRakJiE z^L~v93n(EKNSa(%=q9a9WQmaw#=nEFmo~amXU~|Pk=JocArm^NaHs^K58>}HIpd|c z5>~p#XTsxPk}QSvLO4~SLLtWG7(T}a`ri)v8^9TLd-O8zJ@6E0N)SEoWyNZxNvIMRJ6`Ac* zkr*m}l}V7=#G5?RPAL}q{TeC@XEHG<=ti`IBz#BRI6XKLijD9VdrGEdcbrn;Jy@-sj$j#&~HPMX#+dp6CkFIoEVaJl~RFGt?5 ztp+=Q;s^`>FYf}7r;k-{8(3@3;Zs`mEOj$*UtC#z6IFHFKfKl&U$_TX~}F0^LT;zh4ad^ZBH&{3v6ZKip>WXhF>&3y0;U`kp; zqI`|0oNwe2;xbxXd}%#D&)vqNVY%syNlA9`;5523bscng_BU9tKnAm-34PQlXVj%# zq~R06y0NR>0`-!$8yymyet6_Jj5p}H(&6Pzv(O_)y&=@H0(TS;YP^Np4aG9sE?#m5 zdLpJT4B32EalHN&Vo=X!gOa!p*g+SbirXv4Orp0hvJx7kJ>cplTl^5xc9{5D)?S+* zpGCVP5R`r(E+78|E9j(cz)&SQiMx!jmS69XWKM-2;$Nf%V3Abjfnw=x_cf263qYx7X%fni3KFPK-zEl#LSder!j?B=%4roKpAwlXCzD}80A-uP*1A> z1*TxDQHX}t48x*%aOQm;Ww+oK(A`pMu;^ZV z|1f03j^uCn34DwURKq&Jf~Ww1g%66!>MiVcMajF0SarPO81!Yc`A}(BxarCDt4$lDo*8?t5P$Mf0xTwsr!a9{F{S@%&MUL>V=c*4X{VoeexBHr)%| zZ>L2uwF1c|t(s9f^x87I8VB?cO>lf0%)8}4!NNKantiRSUD;xG4zESgg|R)zPr=}; z&xMo=wO=WrJHfc#LH{A~l6gwJJ*-x;C@63c|5#mTx0U%NGZWd<1rtOLS`;9M9|0U-M? z2u^_WtR?U8-wS0%c4<{!P?lmt>`q&^K0TOGqMVX8OrP^fQua1oE2ed7DUZvoL1vk1e`FLt=_d-@wM%0r*6K+i1~N$F2Z(peP4RADLmH`}X|}o2*k?uGlx+aj26P*~ zU(XK=$4-zuB2EsCjwsGs*dFQ8Z=^XIT+)@}si#;F8Girb7MiN>VkS)SfRzU@}lv2Z?l{ZGJ0)OpGQ zCR^*o6kn>y4$UFbNLJqeCg5jk2x2}?5POSjD)x6wv%LVni4gLihjJOp4)DJgAFjmy z!`BTWP8(3R?}Ag(3S4u{NGSk9P36y(Sh$bq;AaydLJ0TeXjZ(ETa&Va*$bk4HiRRr z&j->#CQ6zJEnET5CGzQ7S#rv5`A(Y;t~fVb$!@vEgdL{@Y$UA7eK*Hh#WWE7=~@Ad zdwH(CZY3#V#-xI4K}5N=w7E6xi!G>Q8%zdt{GoC-zGT}98gr^|< zd?0qcDT}sT@HK!tv!7sUNp4HQU{E+SvJ7j7t+iAZHJC3ax7VXTN!z3ctZS@#|8Qu1 z8@p5>Q0MbpV^zuc;~8%{@Y_CDFhWjmXz9Sc+hj2t$n9(@rV5GFJbTe+T0o4`7O@LG zE)gXU$au`$dY6CP_i`fAxbEKWxqX9^ zoBkR}g@>C7(gG7>HL}c5P53Eyu>Rt$olw>SNuOSCTAm^OEfUT&fKM593X( z*ryg^6l(xX=pikVJs#kI(o%zRkf{61SiHd)^Hb)hu>%zSicR{aVV#4O(O28}B6>ky z6nAnc61pKAwL@DX-Ov>_r|{kppDbKhgP(h_dl9f2sgn+11bks;!|W~o;Hl+)Q%OUa zwig9zBZUW)LFp3WeI>d-ZW2eci57#b9iCpv6iS8&sPMtcwd8|Y0i>wpw7PP5elRVZ zGhgnB3!*QL1@6BhUTX!c(%G-fWEIJ9Yh*NZ?LIqN+pw65@;tQ4Q`sa}%mZK;Npp>t zXQ`|}(>@kqS(AtVa~Cy_j<7Q@m%vwC-uinv4)u$)4x+HIWO)Bt8`o|%v6rgXz9#T~ z`>eF>smYS<3eM!x zf_{?kLbWj@q$#C;_2Ihg=bXkuID-Q3~`b*12tNc!P2e1etUV; z1v-Q%5p;K6RDAf3m1!Kaol%CL+AZb26&=Y2vtNA~sO9kP`b*Ph{|XLl_sGwCiA(@< zCpRg@_HwA53RS?EJxSml)Pr^+9*wABZ z>WH%d=&0Ey9H8x_>db^N^%A4Y!eGhHZ@ibP3oKb%Buc+*cPpd(uELhzk~J&R`G$CS zIn>7(2f9`Up?`kxXOhsBQe;L09wHLs>B;h;=4HBbgt7^E6H@s+-m1-jT_bEps63P^ ztz-JC)${?7z;g*sC9i^A?I>E9#qgbmfcrh7>D{!06-K!+!+OH$*pWtCgf|F~pz;l> zgIu}ru0P_aKIobdx8{2<=A%)s`_ubzZ;q@?w+*~dhVRYnZIZQI{Dh`jEK&bYBXG?} zk{R^LU$0N;HE%(myl{SpiJBeAzV)t+1~Ar@zUKv+?&d(&N~Zl^bhx}e7fz^&yQKAA z=Hu{t?om8_)^-@b>1MK=6d@Cr$-{daPnU?qPfg;_Co@XtOA!H7!UK3<8${iC{6iAx)fb!1wHLdhJ_|(;F7Ut7SyUsp z7b5Hg02V{ahHty>F&KE!rR`VjlII5=;X;H9rTfTS)jsQtoO(zJlW_GQg>?|aTewYO zu)1%TA2h0IEUlnQgI+S-dp&slYIeExV+9y=tzIHtsrVP_PU}`L&hEorpmU?^QDfb9 zAr6otG%!;xZt@6%om$t~iby^YyOXynA&W9JO7#%j)E8*f$u zRcpA90eM_J7J%XZ$0Z`CrigFW0UVcA5wHi3If+5?7K(oLxDXh z{}rMO4E;DteilVuoMCaRY(L(OTr%j%(cmg3t9`0ahF(%TXUycBI}uq7hfn2wJ%CB` zV`a7aThxQ@vwOuQYlqGvW|Y6l_obiQrKK!V5o%r&H8=Roe}y{8jZMD+hGD)Mr9UvH zor9P2HRGCSb^&)6~+Z5pVwR7wmd zc}xwZ(i;a|Z!TUd?Cyv>|uXKT7&HW70RU{t-O%^zi~-uj3+ z^xA5!NmKQTpwviPmGSy`9_H0UVx`wk4C>YPg~-=jri%c<5m}--JhXYl*qlh$Guy=Y zO{MthfyA7NEK1!(Xd5=J0X*N{y7D2@^Iode_c&noIf1}can=5?7Lpr-^P|T{B+D>L z->P0bb*V~vYU7{}nHL{W5eO6i6b`*GuIXS<)yt;~Y>-BA+Nv$qp1JvuozIN1Xdywn zfl(YgSHq}dpE7kMu=A1$-5tiwp6=+A!Lz9Z^iz9zo9>$9YgTIW#`W6+S(&&0c1~C? zSm|)tL`;1tMB_Yu(z^>7WRj=(7d3Ar^vYEipg*Qe>R(z>6Rb%P{HJ$l|4$`{=hHMD z@!@$$H@q=iV?&d5GiIok^vOENb1I!Q~AjSo^IexOs=xS5_dWCTX3u$!fUUp6=mzLyS!%8UfqnC7GT zzdDHa6rtKWsawD6NKfC4j;Rz{Yk3-cYaM#+&1|>jsIJqs1l`r(vzgM;fMl2mzwLqB zf(m?1)L2TA^8sTT;NlEY3rIzV37B4QU=$FkB0ZH}lwKJVb1rH17%r^Ril`Ks?Sm=M zVfPUjM+X@SBdq=rVg#OIDOa^1Y|g&CNldS@uoI1WS-Rle9&yg`<3S|2sOgLB-Pypv zeBY(tSK#a5cZ8DgS=5K*(1VVv5_iO2%eK3)pE}xl|#7Ty>$F)hvX^?D@d<58l!;paER}5@oQKz1>>( zv^z%YAp8)@wy`{i)!>?Oq(SZ)o8R8jP;exHCaD*(iCFfT3+7>83Ny;cvdf~`Fy+N%v{}=Tt>#+ANC2M= z6D&Xg)m^X9&lg^Bh)?HwIu4Uarkqa90I3}tWiBFHuyYl~H238pC1y~X8Pw*mjb3aB z9-wH1g~`kYBQ?y+O%Fpx!bR3xL^xjMC)@L8_X-q(5RID8N`?K{7|XI*`AwKg6OL^ilVX02N3aq}o6C)!gSFGSYbuzUiB%eiHJ z7Lj0_4q|2+XZPt<9b!a*+eEn7@yUf=Pn_QQ4t0Xju^hg@2V8Scjve`Gj3jjmXraG@ z)>QEFl7q+G-=HzDGYSN@y9_F!=s|hlsI2(C6Sp;vpN8!B*%VVaD`Qf6^>yot(c#!{ zU=%Lt1)BgmNbRabLUiiuUaE*wN`JreJoxG{+f`68>h(^|S1 zf}%4oEFsOL?k=VQGj*?(7YY)^La`Z*;5dWo&%tu)%NmMaz90&8L|ZuD3Xe>n@3b0%Z0Ex)x=e?}_&g4{J`PE@o!h_y@xP#W8Fg`lmYWzmZ9(q8pUonC(4F zIE3v*pnUF)Ig%tZa=1t6UluYZ4VZ;}?S)AvhS)Z7{)5v9A3~BD?M2KPHf)Vzd~}HT zJfm$#YB?hJrm?Rk><@Z?GMp(bv%KAp3|w@N6t!j%amEV3ijG4OGw*04bd6b1^#;x+5wu~V3zKp7l3CF$%dnH%qwi!POq3%rI#SIuxp~v9h0fP>X7V~ ziNAb~^`@}{!1LskDFANzQj(nI$l02>w~Jne9n-u~j89!Dw*}BhH|G2SNwOU4VS;&* zh=;VbZhU}JK6;vBM{hhuNn9mvaywmNV!Eiu1_&rkxMBXl%Ro2qOzxFHVNTXa5S| zV-59{o9aw)T_$h1f34;VYt{rd=t+weprMD`FYVNl=I8`NYgkDGxMmn|r?>bEJK`d7zrmUiG92mT zo{CV53Tnp!Qup~Eax^5w0PMnZyz?0r(X7_N5hnBes~$9M2b+jPD84@1^2(2?{0I&; z+8+T)r}q%bBda$oV!__IcEZSYO1pcQJhzknT`DfGTCk~qRFb+e)Fw4nJ$V%?TKtuc z$c&Cy@0~y5AM}FiMg^bD#wQz(tDNhtuwqR&Rh?_cH zd~%lrWC`a*5;s7>!cH#~KJ)-N%DrP!pj9JG)}vP%ek~`Apig;1_uG|U+1J{aIreDU zy$({c)-vGIC22FriKqDV4}IfB(|rbwbO!LA_fg!Poc&WZP<{SMxqs;{z^nEEW#n5N=INu5;Z9#Tx$$_qteg1^Kkj0P?t5-eMM+t3x8-w4S1WR4L6 zIPK!v!l()D>&h_xNL`yKT&xlw^+`eVkyeC`KC`_i2(ihoog!l1miy^SCa`m?j+rCx z>5;Q*QJD|Xe%f8_0^vI;lBS(921Oi9(c+~s+=}G2g{h% zb8*AfLIbs0*v|;TW~CxLz1Mf1)O4jR%+q--z_E}JZ@HlOVBV&y+$S+5Prs2qPJ~WLYbLh@VH} zv3nfIy1@@5S}LlXZFx+9F@5Ea@7vOzpdP3`!ahhG#0A=R$#I0m0cC&jPZ{LLLdPSL zMYe#H8$%RKL{|cl&$E$FUhK$e{O%WGu>J&mFx4cZeWr#Z#&o9hHW*eM;}aI_ezYJ6 zSy436A?r(=p{>I7_5-is`gn_j6TpdMRJq!zJKtk-DLuP>8Y;n%Whg5%=nKf)Si)f; zdjMa^rr1(%`eLQnr5UMX%EJKipUkz0KqfN=NghBZ^>da^d0vKZ808ub1eC@VE2#W7 zpTg!+!|0_{D&Au*cQ4rWpjBuqRUzCcoX@Nnn^Lv!%G#a8;j}w!N?yBEw(lKZ&)a>Z zin9^Je>o0a7XNq#g`QQ?-O$N3ANXq;bkCvb;7jfryK)Y~Lon7s_y^9CP9=zQS@Nl( zZ!#Gac%7OLIfgWIW#THPEXgcYdvD za5QCXGjofw5(1ul!Z~xdaq+^;RVP)=`AM{jA)jov7OoXwXuj#3OBMzeQk z{)o;9cd)jQ^83IBJ56iSMv>Wd&RCP+^4CbNqM%0|s=iXQbxL6?QY|O=4_qgE7`k|R zSbwDQ7WHx8Ql3y#Pd$QATxeAz(5>vg!uWWA-#&$ea|VWZ3G5)1 z60S}$wfeeUmP@HmOfAhbyb-)RKgxj(V$uf*_-G;*iRGOSv>m*9X3niAh6tcNC4^~m z5_EDP`_L=k7xX%e!(oUNgK>k{)vD31KTGc?zY+uWx6b{fBK9lB^#$3rZ2}C~n?M;y zk(zY}h7EJw*L|7{<#gj==E!D@LA<+@x>*>H_Zz^Ck*&Cn(06Db%CX+%%XHo$pnO)u zL}lsCNX$F84PVJBtDIN?2Lua#vp?u}C?gg>wPVu+L0KU2B@8B#r?C;nA64{?!wu37>R^eX32-mEr;dL($!{#2fq*9Qdng84 zb}f1)yR>~V@R3nv$csNnIJcSAZcqD}ut9g>vxy^mO$z5?ZPm~p15yWNZf+n$m$52{ z&di%6Jz@F*pXYmgE6T@F_3b@HHxAY?PSm63dgY^8T;mdyePLOS3ocXUKn%Fj(&))+ z$Q**$c`VEGI^OTCjtO6#wJSbL4l(rFNszu;x4mh?T0x<&uPo>b2@n1>vpuh^t+E7Y zKEXlo_!kT{TWAW1^&J6Y&l7;v>pzV8he4V-zSlJ>ISD#4L$D_%E@LYb1Himi+NNHQ zd;=#5=OS8Iub*P$XFH~*G2>QY<_K=;8cjE~`fcl#16_GRoFp|A?x!K`EH}gH*No&m z_@ej*V_Kx!iA(|&M|vOfiQV)Yr#}yelGTBB^%EA*DjFol43bui)M?i(6&sCP-Cbo2 z0G`5KZq_J+ITxxFTJWz*oce>6FQ>w9^z){Yb4RT3B)3MV8dSef`IhyhA>_5nmvD2j zJ%y+DcG&2=m$cmfV&GA~tJ@fob!n7<9p`#X*2GG03i7KsXmwL<-xk)?dTA8(6jUi# zBph%fSj0}ajvO3Y!&;%GWiD}bghXUBE^BER$t@;ai z9W5Ri7PR~hNtV)oMGt96C)eUX=|Sa_k|hzJ>K>l1)pYTWWeb~*77%f#=S);R+fknFhEhlJa0vZ%;sc&2Cc zqJIR)x3NRU!gTwo8cz@TuA=O3Aay5(cH>>(&L#!fG{vbx&H+wNZfOV4i%0JdS{?%# zJ)F*9yuHGW7^-oZyPmPVWwwtGIX~q}ttxUHhXp9#ck+9>cWiVXBp1R^?P~TLoYi(! zPsEmOYg)$RA3_#2>i>BCH0ga!)qRcZgH{=(*=jVR`BGELlhg~WhADmYNcIhA5+E<7 zx?mVH1``f;-kVXgaTao=cbMr(x~+@bvG|*56@ST@>(u0r`(4&>_d)=rY27YgCu!L| z_jDR#o<=kY+y|c`wVf_lT$@Y%wZGp5>pYA+XuG1B4<))LSq~>p;@Q40+BzfKg9%43#z0j!Sp0R>mQfOvF|3|4v_vxCU3nSZX9?PL7OuV*^h4{Ageqxu&$3r7L zwxKEJ6;u*dwq#Q5BQpC1LTTLbqH~`ye^11u^Q-ZXG9>UJDhppAICIcQd< z=bk}i{;dj?O%Sv!n5E^rYLs+yHne7Za_oJ1Znk^zar+nO1(W@)b_?NQf_bk?a ztU7hUjMXjBaM{Wos!)Y?nheF4ITkz@>S}y z0!^Lh4U&ZzsCqDfIBymXb`gpjXouZAGu_+BF_Rzq1s5((#YSBwR<~?+gF=1dd9c}I zZ$|VnoM}&W(2d#8Cpy}h^o`B^AnJc)L4NKX4w4q2y4xyd44x^tzp-M}K_>$;f#7k6 z?ve;(?l>wJi*cYrvl5v{5M+Vs9@NGZGYVQhm(ml zG{`p3TzjmTrtLr0(n2{>;xR+6rV$ z>h%C2uvGV7RGu2l6KPg}m0wwRM6)A-<-`H#7swm-S6sVx7)6lp8;Z~OQPn}=$XxBT zTLL?@_jc2fV_S)}sGlTt8y({Qt$&oX3l<-5pA)tscRfs}P@81r>1` z7up=S+5CtC4%%H^iIb`npK9Ddid0lnm~5{;3rbhTu&jQ$%|qQ&FgCiJ*(mkV%-rbW z3$shCQhk8cL1IS2$4mfw>-N-7;Ir8McItw82*NnBZ>4+ntmC~NU8%CIC5G3iL7I5v zyvavLRTz=~RQ}rSYT8ycH+)_0B|8)%DbyChz1iw4$yRg_u`b)a(V?z4b@KjRLq(W6 zX|P|;OREoC=e?*ro)m-~RnEK(EDO-N;r6zjRhNs*CSGKdIP&(Wi!( z$j2nScUhcd^^S0VEi#*5xCtJpWWC5HC<5HSM6H3jk##%)%LO$0=%Gg!gW89wKTr7$ zvJw1VJpwcm{WSwsiyx3sArQc39son@a9U6ZB;mXFx|6(~%osCT z(eRUW>f){lqez0#`KL_0ZojAUJX8;2a5wOwMqxDunC&kR-u6aqBh%j~yFDi#2Ot`A z?*8v^2|YHMRQ0ClbL-lvhe<;zPe7IT5im+P5AGxy$23n8!^4epk#ZNrMr&jzYjlLv zTg(x9fLD1L;~l62k9P1;lS6p329k*6XZ$_m3zu5F6`{cXQl8~FW$!fG%u%VN+-wuN zcRi@|TfGl18Xy?hRkAOJ8uWI@jn__62#c%_w|TDN%6x`)BTyk>h_B%PbgoL(hk+07 z&3aAeBv9-m#^k9MBDx6t0uf%is(T^oP5wOBv{|HfI=yzlC@75rNg17P1Q^c3A`cHXA;iyN`hUPtz68r3frSV}-D zP=upZ21A6$D<&lk8Y<(Of!IVtd?x>b0go|YpX~IpU(VjlxT3llR7jpiYo#uWk`tCb z$37(@P_e-W+Fg#`35f-^k2sa;p}rC0dLTsh>xaUfHzfM9R`eRxTWAUwus;w^O)s_{ zwen2V8}3&BCi=z#)T}q$YMusbaSnvLTE)w+V4Nf?5vZI+8|Hxp-GoxD@nIj@0tMeH z7MmWhcaOAiC|67_9u8Bt%IA|Go1Np^&flZ=o<+>dIsC2U1C0{-uv8M`GK(O)6}0_H zxoWgM3~xEH{qVNSTVCuzXCIZ|uAvJuUwL^RTD}8qVtIXSXe?AOx9O}<)TjU|Gn&&L z_U4j(*d+>X&OwE}@nK>o|!krdOfjFs9m`$5Re0{$a!7 zO#um+A!w@Burd49a@RaicnmONzq97e?PWuytCt)aT zEN&4ALoNNW=oGzG+25#2`=INwTg+6z4yY - -HDTit::HDTit(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::HDTit), - hdtController(new HDTController()), - lastDir(QDir::currentPath()) -{ - ui->setupUi(this); - //this->setUnifiedTitleAndToolBarOnMac(true); - - ui->matrixView->setManager(hdtController); - ui->subjectView->setModel(hdtController->getSubjectModel()); - ui->predicateView->setModel(hdtController->getPredicateModel()); - ui->objectView->setModel(hdtController->getObjectModel()); - ui->resultsTable->setModel(hdtController->getSearchResultsModel()); - ui->headerView->setModel(hdtController->getHeaderModel()); - ui->regexResultsView->setModel(hdtController->getRegexModel()); - - ui->subjectPatternEdit->getSuggestions()->setController(hdtController); - ui->predicatePatternEdit->getSuggestions()->setController(hdtController); - ui->objectPatternEdit->getSuggestions()->setController(hdtController); - ui->subjectPatternEdit->getSuggestions()->setRole(hdt::SUBJECT); - ui->predicatePatternEdit->getSuggestions()->setRole(hdt::PREDICATE); - ui->objectPatternEdit->getSuggestions()->setRole(hdt::OBJECT); - - // Context menus - connect(ui->resultsTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint))); - connect(ui->subjectView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint))); - connect(ui->predicateView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint))); - connect(ui->objectView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint))); - - // Camera - connect(ui->matrixView, SIGNAL(rotationChanged()), this, SLOT(updateViewButtons())); - - // Dataset - connect(hdtController, SIGNAL(datasetChanged()), ui->matrixView, SLOT(reloadHDTInfo())); - - // Predicate Status - connect(ui->predicateCountSlider, SIGNAL(valueChanged(int)), hdtController->getPredicateStatus(), SLOT(setMinimumPredicateCount(int))); - connect(hdtController->getPredicateStatus(), SIGNAL(minimumPredicateCountChanged(int)), ui->predicateCountSlider, SLOT(setValue(int))); - connect(hdtController->getPredicateStatus(), SIGNAL(predicatesChanged(unsigned int, unsigned int)), ui->matrixView, SLOT(updateGL())); - connect(ui->selectAllPredicatesButton, SIGNAL(clicked()), hdtController->getPredicateStatus(), SLOT(selectAllPredicates())); - connect(ui->selectNoneButton, SIGNAL(clicked()), hdtController->getPredicateStatus(), SLOT(selectNonePredicates())); - connect(hdtController->getPredicateStatus(), SIGNAL(predicatesChanged(unsigned int,unsigned int)), hdtController->getPredicateModel(), SLOT(itemsChanged(uint,uint))); - connect(hdtController->getPredicateStatus(), SIGNAL(predicateSelected(int)), ui->predicateView, SLOT(selectRow(int))); - - // Search pattern - connect(hdtController, SIGNAL(searchPatternChanged()), this, SLOT(refreshSearchPattern())); - connect(hdtController, SIGNAL(numResultsChanged(int)), this, SLOT(updateNumResults())); -} - -HDTit::~HDTit() -{ - delete ui; - delete hdtController; -} - -void HDTit::updateNumResults() -{ - ui->numResultsLabel->setText( - QString(tr("%1 results found.")) - .arg(QLocale::system().toString((quint64)hdtController->getNumResults())) - ); -} - -void HDTit::searchPatternEdited() -{ - std::string subject = ui->subjectPatternEdit->text().toUtf8().constData(); - std::string predicate = ui->predicatePatternEdit->text().toUtf8().constData(); - std::string object = ui->objectPatternEdit->text().toUtf8().constData(); - - hdt::TripleString ts(subject, predicate, object); - hdtController->setSearchPattern(ts); - - this->updateNumResults(); - - ui->resultsTable->scrollToTop(); - - ui->matrixView->updateGL(); - - ui->subjectView->selectRow(hdtController->getSearchPatternID().getSubject()-1); - ui->predicateView->selectRow(hdtController->getSearchPatternID().getPredicate()-1); - ui->objectView->selectRow(hdtController->getSearchPatternID().getObject()-1); - -} - -void HDTit::refreshSearchPattern() -{ - if(hdtController->hasHDT()) { - hdt::TripleString &ts = hdtController->getSearchPatternString(); - ui->subjectPatternEdit->setText(QString::fromUtf8(ts.getSubject().c_str())); - ui->predicatePatternEdit->setText(QString::fromUtf8(ts.getPredicate().c_str())); - ui->objectPatternEdit->setText(QString::fromUtf8(ts.getObject().c_str())); - } else { - ui->subjectPatternEdit->clear(); - ui->predicatePatternEdit->clear(); - ui->objectPatternEdit->clear(); - } -} - - -void HDTit::openHDTFile(QString &file) -{ - hdtController->openHDTFile(file); - - hdtChanged(file); -} - -void HDTit::importRDFFile(QString &file, const string &baseUri, hdt::RDFNotation notation, hdt::HDTSpecification &spec) -{ - hdtController->importRDFFile(file, baseUri, notation, spec); - - hdtChanged(file); -} - -void HDTit::hdtChanged(QString &file) -{ - ui->subjectPatternEdit->clear(); - ui->predicatePatternEdit->clear(); - ui->objectPatternEdit->clear(); - - ui->predicateCountSlider->setMaximum(hdtController->getPredicateStatus()->getMaximumPredicateCount()+1); - ui->predicateCountSlider->setValue(0); - ui->statusBar->showMessage(file); - ui->statsLabel->setText(HDTSummaryGenerator::getSummary(hdtController)); - updateNumResults(); - - bool hasDataset = hdtController->hasHDT(); - ui->actionSaveHDT->setEnabled(hasDataset); - ui->actionExportRDF->setEnabled(hasDataset); - ui->subjectPatternEdit->setEnabled(hasDataset); - ui->predicatePatternEdit->setEnabled(hasDataset); - ui->objectPatternEdit->setEnabled(hasDataset); - - // Enable/Disable substring search tab. - bool hdtHasSubstring = false; - if(hdtController->hasHDT()) { - hdtHasSubstring = hdtController->getHDT()->getDictionary()->getType()==hdt::HDTVocabulary::DICTIONARY_TYPE_LITERAL; - } - ui->tabRegex->setEnabled(hdtHasSubstring); - if(hdtHasSubstring) { - if(ui->resultTabs->count()<4) { - ui->resultTabs->insertTab(3, ui->tabRegex, "Substring Search"); - } - } else { - ui->resultTabs->removeTab(3); - } - - refreshSearchPattern(); -} - - - -void HDTit::on_actionOpenHDT_triggered() -{ - QString file = QFileDialog::getOpenFileName(this,tr("Select HDT File"), lastDir , tr("HDT Files(*.hdt *.HDT *.hdt.gz *.HDT.gz)"), 0, 0 ); - if(!file.isEmpty()) { - lastDir = file; - openHDTFile(file); - } -} - -void HDTit::on_actionImportRDF_triggered() -{ - HDTSpecForm hdtSpecForm; - int result = hdtSpecForm.exec(); - if(result>0) { - hdt::HDTSpecification spec; - hdtSpecForm.fillHDTSpecification(spec); - - QString file = hdtSpecForm.getFileName(); - string baseUri = string(hdtSpecForm.getBaseUri().toLatin1()); - hdt::RDFNotation notation = hdtSpecForm.getNotation(); - importRDFFile(file, baseUri, notation, spec); - } -} - -void HDTit::on_actionSaveHDT_triggered() -{ - QString file = QFileDialog::getSaveFileName(this,tr("Select Output HDT File"), lastDir, tr("HDT Files(*.hdt *.HDT)"), 0, 0 ); - if(!file.isEmpty()) { - lastDir = file; - hdtController->saveHDTFile(file); - } -} - -void HDTit::on_actionExportRDF_triggered() -{ - if(!hdtController->getSearchPatternID().isEmpty()) { - QMessageBox::warning(0, tr("Export Search Results"), tr("Warning: Only those triples matching the selected search pattern will be exported.")); - } - - QString file = lastDir; - file.replace(".hdt",".nt"); - - // TODO: Rename lastDir - file = QFileDialog::getSaveFileName(this,tr("Select Output RDF File"), file, tr("RDF Files(*.rdf *.RDF *.n3 *.N3 *.nt *.NT *.ttl *.TTL)"), 0, 0 ); - if(!file.isEmpty()) { - // FIXME: Select notation. - lastDir = file; - hdtController->exportResultsRDFFile(file, hdt::NTRIPLES); - } -} - -void HDTit::updateViewButtons() -{ - Camera &cam = ui->matrixView->getCamera(); - ui->actionFrontView->setChecked(cam.isFrontView()); - ui->actionLeftView->setChecked(cam.isLeftView()); - ui->actionTopView->setChecked(cam.isTopView()); - ui->action3Dview->setChecked(cam.is3DView()); -} - -void HDTit::on_actionFrontView_toggled(bool state) -{ - if(state) { - ui->resultTabs->setCurrentIndex(2); - ui->matrixView->getCamera().setFrontView(); - updateViewButtons(); - } -} - -void HDTit::on_actionLeftView_toggled(bool state) -{ - if(state) { - ui->resultTabs->setCurrentIndex(2); - ui->matrixView->getCamera().setLeftView(); - updateViewButtons(); - } -} - -void HDTit::on_actionTopView_toggled(bool state) -{ - if(state) { - ui->resultTabs->setCurrentIndex(2); - ui->matrixView->getCamera().setTopView(); - updateViewButtons(); - } -} - -void HDTit::on_action3Dview_toggled(bool state) -{ - if(state) { - ui->resultTabs->setCurrentIndex(2); - ui->matrixView->getCamera().set3DView(); - updateViewButtons(); - } -} - -void HDTit::on_actionReset_triggered() -{ - ui->matrixView->getCamera().toDefaultValuesAnimated(); -} - -void HDTit::setPatternSubject(QModelIndex index) -{ - ui->subjectPatternEdit->setText(hdtController->getSubjectModel()->data(index).toString()); -} - -void HDTit::setPatternPredicate(QModelIndex index) -{ - ui->predicatePatternEdit->setText(hdtController->getPredicateModel()->data(index).toString()); -} - -void HDTit::setPatternObject(QModelIndex index) -{ - ui->objectPatternEdit->setText(hdtController->getObjectModel()->data(index).toString()); -} - -void HDTit::setPatternGlobal(QModelIndex index) -{ - //cout << "Index: " << index.row() << ", " << index.column() << endl; - - switch(index.column()) { - case 0: - ui->subjectPatternEdit->setText(hdtController->getSearchResultsModel()->data(index).toString()); - break; - case 1: - ui->predicatePatternEdit->setText(hdtController->getSearchResultsModel()->data(index).toString()); - break; - case 2: - ui->objectPatternEdit->setText(hdtController->getSearchResultsModel()->data(index).toString()); - break; - } -} - -void HDTit::setPatternContextSubject() -{ - ui->subjectPatternEdit->setText(lastContextMenuTable->model()->data(lastContextMenuCell).toString()); -} - -void HDTit::setPatternContextPredicate() -{ - ui->predicatePatternEdit->setText(lastContextMenuTable->model()->data(lastContextMenuCell).toString()); -} - -void HDTit::setPatternContextObject() -{ - ui->objectPatternEdit->setText(lastContextMenuTable->model()->data(lastContextMenuCell).toString()); -} - -void HDTit::copyResultTableSelection() -{ - QApplication::clipboard()->setText(hdtController->getSearchResultsModel()->data(lastContextMenuCell).toString()); -} - -void HDTit::on_actionAbout_triggered() -{ - Abouthdt aboutForm; - aboutForm.exec(); -} - -void HDTit::on_actionFull_Screen_triggered() -{ - static bool maximized=false; - if(isFullScreen()) { - if(maximized) { - showMaximized(); - } else { - showNormal(); - } - } else { - maximized = isMaximized(); - showFullScreen(); - } -} - -void HDTit::showContextMenu(QPoint pos) -{ - lastContextMenuTable = qobject_cast(QObject::sender()); - if(lastContextMenuTable==NULL) { - return; - } - lastContextMenuCell = lastContextMenuTable->indexAt(pos); - if(!lastContextMenuCell.isValid()){ - return; - } - - QMenu menu; -#if 0 - menu.addAction(tr("Copy")), this, this, SLOT(copyResultTableSelection()); - menu.addSeparator(); -#endif - menu.addAction(tr("Search as Subject"), this, SLOT(setPatternContextSubject())); - menu.addAction(tr("Search as Predicate"), this, SLOT(setPatternContextPredicate())); - menu.addAction(tr("Search as Object"), this, SLOT(setPatternContextObject())); - menu.exec(lastContextMenuTable->mapToGlobal(pos)); -} - - -void HDTit::on_actionClose_triggered() -{ - hdtController->closeHDT(); - QString str; - hdtChanged(str); -} - -HDTController * HDTit::getManager() -{ - return hdtController; -} - -void HDTit::on_actionSparql_triggered() -{ - SparqlForm *jf = new SparqlForm(this); - - jf->show(); -} - -void HDTit::on_regexSearchButton_clicked() -{ - this->on_regexEdit_editingFinished(); -} - -void HDTit::on_regexEdit_editingFinished() -{ - hdtController->getRegexModel()->setQuery(ui->regexEdit->text()); - ui->regexResultsView->scrollToTop(); -} - -void HDTit::on_regexResultsView_doubleClicked(const QModelIndex &index) -{ - if(index.column()==1) { - ui->objectPatternEdit->setText(hdtController->getRegexModel()->data(index).toString()); - ui->resultTabs->setCurrentIndex(1); - } -} diff --git a/hdt-it/hdtit.hpp b/hdt-it/hdtit.hpp deleted file mode 100644 index 51c124d3..00000000 --- a/hdt-it/hdtit.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef HDTIT_HPP -#define HDTIT_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hdtcontroller.hpp" - -namespace Ui { - class HDTit; -} - -class HDTit : public QMainWindow -{ - Q_OBJECT - -private: - Ui::HDTit *ui; - HDTController *hdtController; - QString lastDir; - QModelIndex lastContextMenuCell; - QTableView *lastContextMenuTable; - - void hdtChanged(QString &file); - -public: - explicit HDTit(QWidget *parent = 0); - ~HDTit(); - - void openHDTFile(QString &file); - void importRDFFile(QString &file, const string &baseUri, hdt::RDFNotation notation, hdt::HDTSpecification &spec); - - HDTController *getManager(); -private slots: - void on_actionOpenHDT_triggered(); - void on_actionImportRDF_triggered(); - void on_actionSaveHDT_triggered(); - void on_actionExportRDF_triggered(); - void on_actionClose_triggered(); - - void on_actionFrontView_toggled(bool arg1); - void on_actionLeftView_toggled(bool arg1); - void on_actionTopView_toggled(bool arg1); - void on_action3Dview_toggled(bool arg1); - void on_actionReset_triggered(); - - void searchPatternEdited(); - void refreshSearchPattern(); - - void setPatternSubject(QModelIndex index); - void setPatternPredicate(QModelIndex index); - void setPatternObject(QModelIndex index); - - void showContextMenu(QPoint pos); - void setPatternContextSubject(); - void setPatternContextPredicate(); - void setPatternContextObject(); - void copyResultTableSelection(); - - void setPatternGlobal(QModelIndex index); - void on_actionAbout_triggered(); - - void updateViewButtons(); - void updateNumResults(); - void on_actionFull_Screen_triggered(); - void on_actionSparql_triggered(); - void on_regexSearchButton_clicked(); - void on_regexEdit_editingFinished(); - void on_regexResultsView_doubleClicked(const QModelIndex &index); -}; - -#endif // HDTIT_HPP diff --git a/hdt-it/hdtit.ui b/hdt-it/hdtit.ui deleted file mode 100644 index 74ac262a..00000000 --- a/hdt-it/hdtit.ui +++ /dev/null @@ -1,875 +0,0 @@ - - - HDTit - - - - 0 - 0 - 845 - 514 - - - - HDT-it ! - - - - :/images/logo-hdt.png:/images/logo-hdt.png - - - - - 0 - 0 - - - - - - - Qt::Horizontal - - - - - - - Triple Search Pattern - - - - - - - - false - - - Insert a Subject Search Pattern - - - - - - - - - - false - - - Insert a Predicate Search Pattern - - - - - - - S - - - - - - - P - - - - - - - false - - - Insert an Object Search Pattern - - - - - - - O - - - - - - - - - - - - No results. - - - - - - - - - - - 300 - 0 - - - - 0 - - - - Info - - - - - - QFrame::Panel - - - QFrame::Sunken - - - 1 - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">No dataset.</p></body></html> - - - - - - - - Subjects - - - - - - Qt::CustomContextMenu - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 400 - - - 200 - - - true - - - 20 - - - false - - - - - - - - Predicates - - - - - - - - Show only triples from most used predicates. - - - Filter least used predicates: - - - - - - - 0 - - - - - - - - - 0 - - - true - - - Qt::Horizontal - - - false - - - false - - - QSlider::NoTicks - - - - - - - - - All - - - - - - - None - - - - - - - - - Qt::CustomContextMenu - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 400 - - - 200 - - - true - - - 20 - - - false - - - - - - - - Objects - - - - - - Qt::CustomContextMenu - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 400 - - - 200 - - - true - - - 20 - - - - - - - - - - - - 2 - - - - Metadata - - - - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 300 - - - 200 - - - 20 - - - - - - - - Search Results - - - - - - Qt::CustomContextMenu - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 300 - - - 50 - - - true - - - 20 - - - - - - - - Matrix View - - - - - false - - - Substring Search - - - - - - Search Literal: - - - - - - - - - - - - Search - - - - - - - - - Qt::CustomContextMenu - - - true - - - Qt::ElideMiddle - - - QAbstractItemView::ScrollPerPixel - - - 100 - - - 100 - - - true - - - 20 - - - false - - - - - - - - - - - - - - 0 - 0 - 845 - 22 - - - - - File - - - - - - - - - - - - - Views - - - - - - - - - - - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - - - false - - - - - Open HDT - - - Ctrl+O - - - - - Import RDF - - - Ctrl+I - - - - - false - - - Save HDT - - - Ctrl+S - - - - - false - - - Export RDF - - - Ctrl+E - - - - - false - - - false - - - Views: - - - - - true - - - true - - - Front - - - Front View - - - Ctrl+1 - - - - - true - - - Left - - - Left View - - - Ctrl+2 - - - - - true - - - Top - - - Top View - - - Ctrl+3 - - - - - true - - - 3D - - - 3D View - - - Ctrl+4 - - - - - About - - - About HDT-it! - - - Ctrl+A - - - - - Quit - - - Quit HDT-it! - - - Ctrl+Q - - - - - true - - - Full Screen - - - Switch Full Screen - - - Ctrl+F - - - - - Reset - - - Reset to Initial view - - - Ctrl+R - - - - - Close - - - Ctrl+W - - - - - SPARQL - - - - - - - MatrixViewWidget - QWidget -

matrixviewwidget.hpp
- - numMaxPredicateCountChanged(int) - predicateRangeChanged(int,int) - maxPredicateCountChanged(int) - updateGL() - selectAllPredicates() - selectNonePredicates() - setMinimumPredicateCount(int) - set3Dview() - - - - QClearLineEdit - QLineEdit -
qclearlineedit.hpp
-
- - - - - - - subjectPatternEdit - textChanged(QString) - HDTit - searchPatternEdited() - - - 170 - 106 - - - 354 - 261 - - - - - predicatePatternEdit - textChanged(QString) - HDTit - searchPatternEdited() - - - 170 - 142 - - - 354 - 261 - - - - - objectPatternEdit - textChanged(QString) - HDTit - searchPatternEdited() - - - 170 - 178 - - - 354 - 261 - - - - - objectView - activated(QModelIndex) - HDTit - setPatternObject(QModelIndex) - - - 95 - 280 - - - 354 - 261 - - - - - subjectView - activated(QModelIndex) - HDTit - setPatternSubject(QModelIndex) - - - 111 - 453 - - - 354 - 261 - - - - - actionQuit - triggered() - HDTit - close() - - - -1 - -1 - - - 354 - 261 - - - - - predicateCountSlider - valueChanged(int) - numPredicateCount - setNum(int) - - - 95 - 282 - - - 135 - 310 - - - - - resultsTable - doubleClicked(QModelIndex) - HDTit - setPatternGlobal(QModelIndex) - - - 483 - 96 - - - 354 - 261 - - - - - predicateView - activated(QModelIndex) - HDTit - setPatternPredicate(QModelIndex) - - - 65 - 293 - - - 395 - 255 - - - - - diff --git a/hdt-it/hdtoperation.cpp b/hdt-it/hdtoperation.cpp deleted file mode 100644 index b7a202cb..00000000 --- a/hdt-it/hdtoperation.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -#include "hdtoperation.hpp" - -#define USE_DIALOG -//#define OPERATION_CANCELABLE - -#ifdef WIN32 -#include -#define sleep(a) Sleep((a)*1000) -#else -#include -#include -#define sleep(a) usleep(a) -#endif - - -HDTOperationDialog::HDTOperationDialog() -{ -} - -void HDTOperationDialog::closeEvent(QCloseEvent *event) -{ -#ifdef OPERATION_CANCELABLE - event->accept(); -#else - event->ignore(); -#endif -} - -HDTOperation::HDTOperation() : hdt(NULL), hdtInfo(NULL), errorMessage(NULL) -{ -} - -HDTOperation::HDTOperation(QString fileName) : fileName(fileName), hdt(NULL), hdtInfo(NULL), errorMessage(NULL) -{ -} - -HDTOperation::HDTOperation(hdt::HDT *hdt) : hdt(hdt), hdtInfo(NULL), errorMessage(NULL) -{ -} - -HDTOperation::HDTOperation(hdt::HDT *hdt, HDTCachedInfo *hdtInfo) : hdt(hdt), hdtInfo(hdtInfo), errorMessage(NULL) -{ -} - -void HDTOperation::execute() { - errorMessage=NULL; - try { - switch(op) { - case HDT_READ: { - hdt::IntermediateListener iListener(dynamic_cast(this)); - iListener.setRange(0,70); - - // TODO: Decompress GZIP here using progress bar. - // TODO: Detect whether .hdtcache and .hdt.index exist to be more accurate with the progress -#if 1 - hdt = hdt::HDTManager::mapIndexedHDT(fileName.toLatin1(), &iListener); -#else - hdt = hdt::HDTManager::loadIndexedHDT(fileName.toLatin1(), &iListener); -#endif - iListener.setRange(70, 100); - hdtInfo = new HDTCachedInfo(hdt); - if(fileName.endsWith('.gz')){ - fileName.left(fileName.length()-3); - } - QString infoFile = fileName + ".hdtcache"; - hdtInfo->load(infoFile, &iListener); - - break; - } - case RDF_READ:{ - hdt::IntermediateListener iListener(dynamic_cast(this)); - - iListener.setRange(0,80); - hdt = hdt::HDTManager::generateHDT(fileName.toLatin1(), baseUri.c_str(), notation, spec, &iListener); - - iListener.setRange(80, 90); - hdt = hdt::HDTManager::indexedHDT(hdt); - - iListener.setRange(90, 100); - hdtInfo = new HDTCachedInfo(hdt); - hdtInfo->generateGeneralInfo(&iListener); - hdtInfo->generateMatrix(&iListener); - - break; - } - case HDT_WRITE: - hdt->saveToHDT(fileName.toLatin1(), dynamic_cast(this)); - break; - case RDF_WRITE:{ - hdt::RDFSerializer *serializer = hdt::RDFSerializer::getSerializer(fileName.toLatin1(), notation); - hdt->saveToRDF(*serializer, dynamic_cast(this)); - delete serializer; - break; - } - case RESULT_EXPORT: { - hdt::RDFSerializer *serializer = hdt::RDFSerializer::getSerializer(fileName.toLatin1(), notation); - serializer->serialize(iterator, dynamic_cast(this), numResults ); - delete serializer; - delete iterator; - break; - } - } - emit processFinished(0); - } catch (char* err) { - cerr << "Error caught: " << err << endl; - errorMessage = err; - emit processFinished(1); - } catch (const char* err) { - cerr << "Error caught: " << err << endl; - errorMessage = (char *)err; - emit processFinished(1); - } - sleep(1); // To ensure that dialog receives the signal and closes. -} - - -void HDTOperation::notifyProgress(float level, const char *section) { -#ifdef OPERATION_CANCELABLE - if(isCancelled) { - cerr << "Throwing exception to cancel" << endl; - throw (char *)"Cancelled by user"; - } -#endif -#ifdef USE_DIALOG - emit progressChanged((int)level); - emit messageChanged(QString(section)); -#endif -} - -void HDTOperation::notifyProgress(float task, float level, const char *section) -{ -#ifdef OPERATION_CANCELABLE - if(isCancelled) { - cerr << "Throwing exception to cancel" << endl; - throw (char *)"Cancelled by user"; - } -#endif - int levelInt = (int) level; - if(levelInt<0) { - levelInt=0; - } - if(levelInt>=100) { - levelInt=99; - } - - emit progressChanged((int)level); - emit messageChanged(QString(section)); -} - -void HDTOperation::saveToRDF(QString &fileName, hdt::RDFNotation notation) -{ - this->op = RDF_WRITE; - this->fileName = fileName; - this->notation = notation; -} - -void HDTOperation::saveToHDT(QString &fileName) -{ - this->op = HDT_WRITE; - this->fileName = fileName; -} - -void HDTOperation::loadFromRDF(hdt::HDTSpecification &spec, QString &fileName, hdt::RDFNotation notation, const string &baseUri) -{ - this->op = RDF_READ; - this->spec = spec; - this->fileName = fileName; - this->notation = notation; - this->baseUri = baseUri; -} - -void HDTOperation::loadFromHDT(QString &fileName) -{ - this->op = HDT_READ; - this->fileName = fileName; -} - -void HDTOperation::exportResults(QString &fileName, hdt::IteratorTripleString *iterator, unsigned int numResults, hdt::RDFNotation notation) -{ - this->op = RESULT_EXPORT; - this->fileName = fileName; - this->iterator = iterator; - this->numResults = numResults; - this->notation = notation; -} - -hdt::HDT *HDTOperation::getHDT() -{ - return hdt; -} - -HDTCachedInfo *HDTOperation::getHDTInfo() -{ - return hdtInfo; -} - - -int HDTOperation::exec() -{ - -#ifdef USE_DIALOG - dialog.setRange(0,100); - dialog.setAutoClose(false); - dialog.setFixedSize(400,130); - - switch(op) { - case HDT_READ: - dialog.setWindowTitle(tr("Loading HDT File")); - break; - case RDF_READ: - dialog.setWindowTitle(tr("Importing RDF File to HDT")); - break; - case HDT_WRITE: - dialog.setWindowTitle(tr("Saving HDT File")); - break; - case RDF_WRITE: - dialog.setWindowTitle(tr("Exporting HDT File to RDF")); - break; - case RESULT_EXPORT: - dialog.setWindowTitle(tr("Exporting results to RDF")); - break; - } - -#ifndef OPERATION_CANCELABLE - QPushButton btn; - btn.setEnabled(false); - btn.setText(tr("Cancel")); - dialog.setCancelButton(&btn); -#endif - - QFutureWatcher watcher; - - connect(&watcher, SIGNAL(finished()), this, SLOT(finished()), Qt::QueuedConnection); - - connect(this, SIGNAL(progressChanged(int)), &dialog, SLOT(setValue(int)), Qt::QueuedConnection); - connect(this, SIGNAL(messageChanged(QString)), &dialog, SLOT(setLabelText(QString)), Qt::QueuedConnection); - connect(this, SIGNAL(processFinished(int)), &dialog, SLOT(done(int)), Qt::QueuedConnection); - -#ifdef OPERATION_CANCELABLE - connect(&dialog, SIGNAL(canceled()), this, SLOT(cancel())); -#endif - - isCancelled=false; - QFuture f = QtConcurrent::run(this, &HDTOperation::execute); - watcher.setFuture(f); - - int result = dialog.exec(); - - if(errorMessage) { - result = 1; - QMessageBox::critical(NULL, "ERROR", QString(errorMessage) ); - } - - QApplication::alert(QApplication::activeWindow()); - return result; -#else - this->execute(); - if(errorMessage!=NULL) { - return 1; - } else { - return 0; - } -#endif -} - -void HDTOperation::cancel() -{ - //cerr << "Operation cancelled" << endl; - isCancelled = true; -} - -void HDTOperation::finished() -{ - cerr << "Finished! :)" << endl; - emit processFinished(0); -} diff --git a/hdt-it/hdtoperation.hpp b/hdt-it/hdtoperation.hpp deleted file mode 100644 index 9bdf5e8d..00000000 --- a/hdt-it/hdtoperation.hpp +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef HDTOPERATION_HPP -#define HDTOPERATION_HPP - -#include -#include -#include -#include -#include -#include -#include - -#include "hdtcachedinfo.hpp" - - -class HDTOperationDialog : public QProgressDialog { - Q_OBJECT -public: - HDTOperationDialog(); - void closeEvent(QCloseEvent *event); -}; - -class HDTOperation : public QObject, public hdt::ProgressListener { - Q_OBJECT - -private: - hdt::HDTSpecification spec; - hdt::HDT *hdt; - HDTCachedInfo *hdtInfo; - hdt::IteratorTripleString *iterator; - unsigned int numResults; - QString fileName; - hdt::RDFNotation notation; - string baseUri; - char *errorMessage; - bool isCancelled; - HDTOperationDialog dialog; - - enum Operation { - HDT_READ, - RDF_READ, - HDT_WRITE, - RDF_WRITE, - RESULT_EXPORT - } op; - -public: - HDTOperation(); - HDTOperation(QString fileName); - HDTOperation(hdt::HDT *hdt); - HDTOperation(hdt::HDT *hdt, HDTCachedInfo *hdtInfo); - void saveToRDF(QString &fileName, hdt::RDFNotation notation); - void saveToHDT(QString &fileName); - void loadFromRDF(hdt::HDTSpecification &spec, QString &fileName, hdt::RDFNotation notation, const string &baseUri); - void loadFromHDT(QString &fileName); - void exportResults(QString &fileName, hdt::IteratorTripleString *iterator, unsigned int numResults, hdt::RDFNotation notation); - hdt::HDT *getHDT(); - HDTCachedInfo *getHDTInfo(); - void execute(); - int exec(); - void notifyProgress(float level, const char *section); - void notifyProgress(float task, float level, const char *section); -signals: - void progressChanged(int progress); - void messageChanged(QString message); - void processFinished(int status); -private slots: - void cancel(); - void finished(); -}; - -#endif // HDTOPERATION_HPP diff --git a/hdt-it/hdtresources.qrc b/hdt-it/hdtresources.qrc deleted file mode 100644 index 141fd6fd..00000000 --- a/hdt-it/hdtresources.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - editreset.png - logo-hdt.png - loading.gif - - diff --git a/hdt-it/hdtspecform.cpp b/hdt-it/hdtspecform.cpp deleted file mode 100644 index 11d59ca1..00000000 --- a/hdt-it/hdtspecform.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include -#include - -#include "hdtspecform.hpp" -#include "ui_hdtspecform.h" - -#include - -HDTSpecForm::HDTSpecForm(QWidget *parent) : - QDialog(parent), - ui(new Ui::HDTSpecForm) -{ - ui->setupUi(this); -} - -HDTSpecForm::~HDTSpecForm() -{ - delete ui; -} - -void HDTSpecForm::on_triplesTypeCombo_currentIndexChanged(int index) -{ - switch(index) { - case 0: - // BitmapTriples - ui->streamXcombo->setEnabled(false); - ui->streamYcombo->setEnabled(true); - ui->streamZcombo->setEnabled(true); - break; - case 1: - // TriplesList - ui->streamXcombo->setEnabled(false); - ui->streamYcombo->setEnabled(false); - ui->streamZcombo->setEnabled(false); - break; - case 2: - // PlainTriples - ui->streamXcombo->setEnabled(true); - ui->streamYcombo->setEnabled(true); - ui->streamZcombo->setEnabled(true); - break; - case 4: - // FoQTriples - ui->streamXcombo->setEnabled(false); - ui->streamYcombo->setEnabled(false); - ui->streamZcombo->setEnabled(false); - break; - } - ui->triplesOrderCombo->setEnabled(index!=4); -} - -void HDTSpecForm::on_inputFileButton_clicked() -{ - static QString lastDir = QDir::currentPath(); - QString file = QFileDialog::getOpenFileName(this,tr("Select Input RDF File"), lastDir, tr("RDF Files(*)"), 0, 0 ); - if(file!="") { - lastDir=file; - if(getBaseUri()=="") { - ui->baseUriText->setText(""); - } - - QString noCompression=file; - - if(file.endsWith(".gz", Qt::CaseInsensitive)) { - noCompression = file.left(file.length()-3); - } - - if(noCompression.endsWith(".ttl", Qt::CaseInsensitive)) { - ui->rdfInputCombo->setCurrentIndex(2); - } else if(noCompression.endsWith(".nt", Qt::CaseInsensitive)) { - ui->rdfInputCombo->setCurrentIndex(0); - } else if(noCompression.endsWith(".n3", Qt::CaseInsensitive)) { - ui->rdfInputCombo->setCurrentIndex(1); - } else if(noCompression.endsWith(".rdf", Qt::CaseInsensitive) || noCompression.endsWith(".xml", Qt::CaseInsensitive)) { - ui->rdfInputCombo->setCurrentIndex(3); - } - } - ui->rdfInputFile->setText(file); -} - -QString HDTSpecForm::getFileName() -{ - return ui->rdfInputFile->text(); -} - -QString HDTSpecForm::getBaseUri() -{ - return ui->baseUriText->text(); -} - -std::string HDTSpecForm::getStreamType(int index) { - switch(index) { - case 0: - // LogStream - return hdt::HDTVocabulary::SEQ_TYPE_LOG; - case 1: - // IntegerStream - return hdt::HDTVocabulary::SEQ_TYPE_INT32; - case 2: - // HuffmanStream - return hdt::HDTVocabulary::SEQ_TYPE_HUFFMAN; - case 3: - // WaveletStream - return hdt::HDTVocabulary::SEQ_TYPE_WAVELET; - } - return ""; -} - -void HDTSpecForm::fillHDTSpecification(hdt::HDTSpecification &hdt) -{ - hdt.set("triplesOrder", hdt::getOrderStr((hdt::TripleComponentOrder)(ui->triplesOrderCombo->currentIndex()+1))); - - hdt.set("header.type", hdt::HDTVocabulary::DICTIONARY_TYPE_PLAIN); - - switch(ui->dictionaryTypeCombo->currentIndex()) { - case 0: - // FourSectionDictionary - hdt.set("dictionary.type", hdt::HDTVocabulary::DICTIONARY_TYPE_FOUR); - break; - case 1: - // PlainDictionary - hdt.set("dictionary.type", hdt::HDTVocabulary::DICTIONARY_TYPE_PLAIN); - break; - case 2: - // LiteralDictionary - hdt.set("dictionary.type", hdt::HDTVocabulary::DICTIONARY_TYPE_LITERAL); - break; - } - - switch(ui->triplesTypeCombo->currentIndex()) { - case 0: - // BitmapTriples - hdt.set("triples.type", hdt::HDTVocabulary::TRIPLES_TYPE_BITMAP); - break; - case 1: - // TriplesList - hdt.set("triples.type", hdt::HDTVocabulary::TRIPLES_TYPE_TRIPLESLIST); - break; - case 2: - // PlainTriples - hdt.set("triples.type", hdt::HDTVocabulary::TRIPLES_TYPE_PLAIN); - break; - } - - if(ui->streamXcombo->isEnabled()) { - hdt.set("stream.x", getStreamType(ui->streamXcombo->currentIndex())); - } - - if(ui->streamYcombo->isEnabled()) { - hdt.set("stream.y", getStreamType(ui->streamYcombo->currentIndex())); - } - - if(ui->streamZcombo->isEnabled()) { - hdt.set("stream.z", getStreamType(ui->streamZcombo->currentIndex())); - } -} - -hdt::RDFNotation HDTSpecForm::getNotation() -{ - switch(ui->rdfInputCombo->currentIndex()) { - case 0: - return hdt::NTRIPLES; - case 1: - return hdt::N3; - case 2: - return hdt::TURTLE; - case 3: - return hdt::XML; - } - return hdt::NTRIPLES; -} - -void HDTSpecForm::accept() -{ - if(getFileName()=="") { - QMessageBox::warning(NULL, tr("Select a file name."), tr("Please insert a file name or URI.")); - } else { - done(1); - } -} diff --git a/hdt-it/hdtspecform.hpp b/hdt-it/hdtspecform.hpp deleted file mode 100644 index 50f41e5a..00000000 --- a/hdt-it/hdtspecform.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef HDTSPECFORM_HPP -#define HDTSPECFORM_HPP - -#include - -#include -#include -#include - -namespace Ui { - class HDTSpecForm; -} - -class HDTSpecForm : public QDialog -{ - Q_OBJECT - -public: - explicit HDTSpecForm(QWidget *parent = 0); - ~HDTSpecForm(); - -public: - QString getFileName(); - QString getBaseUri(); - void fillHDTSpecification(hdt::HDTSpecification &spec); - hdt::RDFNotation getNotation(); - -private: - Ui::HDTSpecForm *ui; - std::string getStreamType(int index); - -private slots: - void on_triplesTypeCombo_currentIndexChanged(int index); - void on_inputFileButton_clicked(); - void accept(); -}; - -#endif // HDTSPECFORM_HPP diff --git a/hdt-it/hdtspecform.ui b/hdt-it/hdtspecform.ui deleted file mode 100644 index ecc38d2d..00000000 --- a/hdt-it/hdtspecform.ui +++ /dev/null @@ -1,361 +0,0 @@ - - - HDTSpecForm - - - Qt::WindowModal - - - true - - - - 0 - 0 - 470 - 533 - - - - Import RDF File to HDT - - - - - - - - InputRDF file name or URI - - - - - - - - - - - - - ... - - - - - - - - NTRIPLES - - - - - N3 - - - - - TURTLE - - - - - RDF-XML - - - - - - - - - - - Base URI for the dataset - - - - - - - - - - - - - - - - Header - - - - - - - Plain - - - - - - - - Type: - - - - - - - - - - Dictionary - - - - - - - 0 - 0 - - - - Type: - - - - - - - - 0 - 0 - - - - - Plain Front Coding - - - - - Plain - - - - - - - - - - - Triples - - - - - - Type: - - - - - - - - BitmapTriples - - - - - TriplesList - - - - - PlainTriples - - - - - - - - - SPO - - - - - SOP - - - - - PSO - - - - - POS - - - - - OSP - - - - - OPS - - - - - - - - Order - - - - - - - false - - - - LogStream - - - - - IntegerStream - - - - - HuffmanStream - - - - - - - - - LogStream - - - - - IntegerStream - - - - - HuffmanStream - - - - - - - - - LogStream - - - - - IntegerStream - - - - - HuffmanStream - - - - - - - - StreamX: - - - - - - - StreamY: - - - - - - - StreamZ: - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - HDTSpecForm - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - HDTSpecForm - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/hdt-it/hdtsummarygenerator.cpp b/hdt-it/hdtsummarygenerator.cpp deleted file mode 100644 index c78d6f7e..00000000 --- a/hdt-it/hdtsummarygenerator.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "hdtsummarygenerator.hpp" - -#include - -#include -#include -#include -#include - -#include "stringutils.hpp" - -QString HDTSummaryGenerator::getSummary(HDTController *hdtController) -{ - hdt::HDT *hdt = hdtController->getHDT(); - if(!hdt) { - return tr("No open file."); - } - - hdt::Header *head = hdt->getHeader(); - hdt::Dictionary *dict = hdt->getDictionary(); - hdt::Triples *triples = hdt->getTriples(); - QString output; - QLocale loc = QLocale::system(); - - output.append(tr("

Dataset:

")); - QString fileName = hdtController->getFileName(); - output.append(tr("File name: ")); - output.append(fileName); - output.append("
"); - - try { - QString baseUri = stringutils::escapeHTML(head->getSubject(hdt::HDTVocabulary::RDF_TYPE.c_str(), hdt::HDTVocabulary::HDT_DATASET.c_str()).c_str()); - output.append(tr("Dataset base URI: ")); - output.append(baseUri); - output.append("
"); - } catch (const char *e) { - } - - quint64 originalSize=0; - quint64 hdtSize=0; - try { - originalSize = head->getPropertyLong("_:statistics", hdt::HDTVocabulary::ORIGINAL_SIZE.c_str()); - output.append(tr("Original Size: ")); - output.append(stringutils::sizeHuman(originalSize)); - output.append("
"); - } catch (const char *e) { - } - - try { - hdtSize = head->getPropertyLong("_:statistics", hdt::HDTVocabulary::HDT_SIZE.c_str()); - output.append(tr("HDT Size: ")); - output.append(stringutils::sizeHuman(hdtSize)); - output.append("
"); - } catch (const char *e) { - } - - if(originalSize!=0 && hdtSize!=0) { - output.append(tr("Compression ratio: ")); - output.append(QString::number(hdtSize*100.0/originalSize, 'f', 2)); - output.append("%
"); - } - - try { - string issued = head->getProperty("_:publicationInformation", hdt::HDTVocabulary::DUBLIN_CORE_ISSUED.c_str()); - QString qissued =QString(issued.c_str()).replace("\"", ""); - int idx; - if((idx = qissued.lastIndexOf("+"))!=-1) { - qissued = qissued.left(idx); - } - QDateTime date = QDateTime::fromString(qissued, Qt::ISODate); - if(date.isValid()) { - output.append(QString(tr("Issued: %1
")).arg(loc.toString(date.date()))); - } - } catch (const char *e) { - } - - -#if 0 - output.append(tr("

Header:

")); - output.append(QString(tr("Number of triples: %1
").arg(loc.toString(head->getNumberOfElements()))); -#endif - - output.append(tr("

Dictionary:

")); - output.append(QString(tr("Number of entries: %1
")).arg(loc.toString((quint64)dict->getNumberOfElements()))); - output.append(QString(tr("Different subjects: %1
")).arg(loc.toString(dict->getNsubjects()))); - output.append(QString(tr("Different predicates: %1
")).arg(loc.toString(dict->getNpredicates()))); - output.append(QString(tr("Different objects: %1
")).arg(loc.toString(dict->getNobjects()))); - output.append(QString(tr("Shared area: %1
")).arg(loc.toString(dict->getNshared()))); - output.append(QString(tr("Type: %1
")).arg(stringutils::escapeHTML(dict->getType().c_str()))); - - output.append(tr("Dictionary Size: ")); - output.append(stringutils::sizeHuman(dict->size())); - output.append(tr("
")); - - output.append(tr("

Triples:

")); - output.append(QString(tr("Number of triples: %1
")).arg(loc.toString((quint64)triples->getNumberOfElements()))); - - output.append(QString(tr("Type: %1
")).arg(stringutils::escapeHTML(triples->getType().c_str()))); - - output.append(tr("Triples Size: ")); - output.append(stringutils::sizeHuman(triples->size())); - output.append(tr("
")); - - output.append(tr("Triples Order: ")); - output.append(hdt::getOrderStr(triples->getOrder())); - output.append("
"); - - return output; -} diff --git a/hdt-it/hdtsummarygenerator.hpp b/hdt-it/hdtsummarygenerator.hpp deleted file mode 100644 index 385fe885..00000000 --- a/hdt-it/hdtsummarygenerator.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef HDTSUMMARYGENERATOR_HPP -#define HDTSUMMARYGENERATOR_HPP - -#include -#include -#include "hdtcontroller.hpp" - -class HDTSummaryGenerator : public QObject -{ - Q_OBJECT -public: - static QString getSummary(HDTController *hdtController); -}; - -#endif // HDTSUMMARYGENERATOR_HPP diff --git a/hdt-it/hdtwinico.ico b/hdt-it/hdtwinico.ico deleted file mode 100644 index a19b922c370de4e0a30b381b5e4c1917abef08bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36098 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 z%0A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 z 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≫n~KaJN94o_MiDj?%L!&tvuRoo8Lw; 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 a16|rB2WEnRr;-DMD0d8|4*e(~w*Lp5@|SS{ diff --git a/hdt-it/headermodel.cpp b/hdt-it/headermodel.cpp deleted file mode 100644 index 4076373f..00000000 --- a/hdt-it/headermodel.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include "headermodel.hpp" -#include - -HeaderModel::HeaderModel(HDTController *view) : hdtController(view), triples(NULL) -{ - this->updateDatasetChanged(); -} - -HeaderModel::~HeaderModel() -{ - if(triples!=NULL) { - delete triples; - triples = NULL; - } -} - -int HeaderModel::rowCount(const QModelIndex &parent) const -{ - if(hdtController->hasHDT()) { - return (int)hdtController->getHDT()->getHeader()->getNumberOfElements(); - } - return 0; -} - -int HeaderModel::columnCount(const QModelIndex &parent) const -{ - return 3; -} - -QVariant HeaderModel::data(const QModelIndex &index, int role) const -{ - if(triples == NULL) { - return QVariant(); - } - - switch(role) { - case Qt::EditRole: - case Qt::ToolTipRole: - case Qt::DisplayRole: - { - //cout << "HeaderModel.data " << index.row() << "," << index.column() << endl; - // Compiler complains that by calling findTriple we are modifying internal - // state, which is illegal due to this function being const. But we need to - // modify the currentIndex and currentTriple, so we can avoid it. - HeaderModel *noConstThis = const_cast(this); - noConstThis->findTriple(index.row()); - - switch(index.column()) { - case 0: - return currentTriple->getSubject().c_str(); - case 1: - return currentTriple->getPredicate().c_str(); - case 2: - return currentTriple->getObject().c_str(); - } - - return QVariant(); - } - case Qt::FontRole: - { - static QFont font; - font.setPointSize(10); - return font; - } - - } - return QVariant(); -} - - -QVariant HeaderModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - - switch(role) { - case Qt::DisplayRole: - { - if(orientation == Qt::Horizontal) { - switch(section) { - case 0: - return tr("Subject"); - case 1: - return tr("Predicate"); - case 2: - return tr("Object"); - } - } else { - return QString::number(section+1); - } - break; - } - } - - return QVariant(); -} - -void HeaderModel::updateDatasetChanged() { - if(triples!=NULL) { - delete triples; - triples = NULL; - } - - if(hdtController->hasHDT()) { - triples = hdtController->getHDT()->getHeader()->search("","",""); - if(triples->hasNext()) { - currentTriple = triples->next(); - } - } else { - triples = NULL; - currentTriple = NULL; - } - currentIndex = 0; - - emit layoutChanged(); -} - - -void HeaderModel::findTriple(unsigned int index) -{ - if(triples == NULL) { - return; - } - - if(currentIndex > index) { - currentIndex = 0; - triples->goToStart(); - if(triples->hasNext()) { - currentTriple = triples->next(); - } - } - - while(currentIndex < index && triples->hasNext()) { - currentTriple = triples->next(); - currentIndex++; - } - - //cout << "Access " << currentIndex << " => " << *currentTriple << endl; -} - -Qt::ItemFlags HeaderModel::flags(const QModelIndex &index) const -{ - return Qt::ItemIsEnabled | Qt::ItemIsSelectable /*| Qt::ItemIsEditable*/; -} - -bool HeaderModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if (index.isValid() && role == Qt::EditRole) { - - HeaderModel *noConstThis = const_cast(this); - noConstThis->findTriple(index.row()); - - string str(value.toString().toLatin1()); - switch(index.column()) { - case 0: - currentTriple->setSubject(str); - break; - case 1: - currentTriple->setPredicate(str); - break; - case 2: - currentTriple->setObject(str); - break; - } - - emit dataChanged(index, index); - return true; - } - return false; -} - - - - - - diff --git a/hdt-it/headermodel.hpp b/hdt-it/headermodel.hpp deleted file mode 100644 index 90eb32f6..00000000 --- a/hdt-it/headermodel.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef HEADERMODEL_HPP -#define HEADERMODEL_HPP - -#include - -#include - -#include "hdtcontroller.hpp" - -class HDTController; - -class HeaderModel : public QAbstractTableModel { - Q_OBJECT -private: - HDTController *hdtController; - hdt::IteratorTripleString *triples; - hdt::TripleString *currentTriple; - unsigned int currentIndex; - - void findTriple(unsigned int index); - -public: - HeaderModel(HDTController *view); - ~HeaderModel(); - - int rowCount(const QModelIndex &parent = QModelIndex()) const ; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - Qt::ItemFlags flags(const QModelIndex &index) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData(const QModelIndex & index, const QVariant & value, int role); - - void updateDatasetChanged(); -signals: -}; - - -#endif // HEADERMODEL_HPP diff --git a/hdt-it/loading.gif b/hdt-it/loading.gif deleted file mode 100644 index 8add8e2770cc27b59e11afc2f57a88973e8d12ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2465 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 B5vBkD diff --git a/hdt-it/logo-hdt2.png b/hdt-it/logo-hdt2.png deleted file mode 100644 index 0e4ea59903cd7687987e02512fbcaabe76b42974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46972 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 diff --git a/hdt-it/main.cpp b/hdt-it/main.cpp deleted file mode 100644 index 10dc0c40..00000000 --- a/hdt-it/main.cpp +++ /dev/null @@ -1,39 +0,0 @@ - -#include -#include -#include -#include "myapplication.hpp" -#include "hdtit.hpp" - -#include - -int main(int argc, char *argv[]) -{ - MyApplication a(argc, argv); - - QTranslator qtTranslator; - qtTranslator.load("qt_" + QLocale::system().name(), - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - a.installTranslator(&qtTranslator); - - QTranslator myappTranslator; -#ifdef __APPLE__ - myappTranslator.load("../Resources/hdt-it_"+QLocale::system().name()); -#else - myappTranslator.load("hdt-it_"+QLocale::system().name()); -#endif - a.installTranslator(&myappTranslator); - - HDTit w; - - a.setHDTit(&w); - - w.show(); - - if(argc>1) { - QString str(argv[1]); - w.openHDTFile(str); - } - - return a.exec(); -} diff --git a/hdt-it/matrixviewwidget.cpp b/hdt-it/matrixviewwidget.cpp deleted file mode 100644 index ad376039..00000000 --- a/hdt-it/matrixviewwidget.cpp +++ /dev/null @@ -1,501 +0,0 @@ -#include "matrixviewwidget.hpp" - -#include "Color.h" -#include -#include "stringutils.hpp" - - -MatrixViewWidget::MatrixViewWidget(QWidget *parent) : - QGLWidget(parent) -{ - setMouseTracking(true); - connect(&camera, SIGNAL(cameraChanged()), (QObject *)this, SLOT(updateGL())); - connect(&camera, SIGNAL(rotationChanged()), (QObject *)this, SIGNAL(rotationChanged())); - - timer.setInterval(20); - connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL())); - - //timer.start(); - -#ifdef GESTURES - //grabGesture(Qt::PanGesture); - grabGesture(Qt::PinchGesture); - //grabGesture(Qt::SwipeGesture); -#endif -} - -MatrixViewWidget::~MatrixViewWidget() { - -} - -void MatrixViewWidget::setManager(HDTController *hdtManager) -{ - this->hdtController = hdtManager; -} - -Camera & MatrixViewWidget::getCamera() -{ - return camera; -} - -void MatrixViewWidget::initializeGL() -{ - glClearColor(BACKGROUND_COLOR); - //glClearDepth(1.0f); - - //glEnable(GL_DEPTH_TEST); - //glDepthFunc(GL_LEQUAL); - - // FIXME: Check support of alpha blending - glEnable (GL_BLEND); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -} - -void MatrixViewWidget::paintShared() -{ - size_t nshared = hdtController->getHDT()->getDictionary()->getNshared(); - - glColor4d(SHARED_AREA_COLOR); - glBegin(GL_QUADS); - glVertex3f(0, 0, 0); - glVertex3f(0, nshared, 0); - glVertex3f(nshared, nshared, 0); - glVertex3f(nshared, 0, 0); - glEnd(); - - glColor4d(SHARED_AREA_BORDER_COLOR); - glBegin(GL_LINE_STRIP); - glVertex3f(0, nshared, 0); - glVertex3f(nshared, nshared, 0); - glVertex3f(nshared, 0, 0); - glEnd(); -} - -void MatrixViewWidget::paintScales() -{ - hdt::Dictionary *dict = hdtController->getHDT()->getDictionary(); - size_t nsubjects = dict->getMaxSubjectID(); - size_t nobjects = dict->getMaxObjectID(); - size_t npredicates = dict->getMaxPredicateID(); - - // Draw subject scale - for (size_t i = 0; i <= nsubjects; i += 1+nsubjects / 15) { - QString str; - if (nsubjects > 20000) { - str.append(QString("%1K").arg(i/1000)); - } else { - str.append(QString("%1").arg(i)); - } - glColor4d(TEXT_COLOR); - this->renderText(0.0, i+nsubjects*0.01, 0, str); - - glColor4d(GRID_COLOR); - glBegin(GL_LINES); - glVertex3f(0, i, 0); - glVertex3f(nobjects, i, 0); - glVertex3f(0, i, 0); - glVertex3f(0, i, npredicates); - glEnd(); - } - - // Draw object scale - for (size_t i = 0; i <= nobjects; i += 1+ nobjects / 15) { - QString str; - if (nobjects > 20000) { - str.append(QString("%1K").arg(i/1000)); - } else { - str.append(QString("%1").arg(i)); - } - glColor4d(TEXT_COLOR); - this->renderText(i, 0.0, 0, str); - - glColor4d(GRID_COLOR); - glBegin(GL_LINES); - glVertex3f(i, 0, 0); - glVertex3f(i, nsubjects, 0); - glVertex3f(i, 0, 0); - glVertex3f(i, 0, npredicates); - glEnd(); - } - - // Draw predicate scale - for (size_t i = 0; i <= npredicates; i += 1+npredicates / 10) { - QString str = QString::number(i); - //texto(str, 0, 0, i); - glColor4d(TEXT_COLOR); - this->renderText(0, 0, i, str, QFont()); - - glColor4d(GRID_COLOR); - glBegin(GL_LINES); - glVertex3f(0, 0, i); - glVertex3f(nobjects, 0, i); - glVertex3f(0, 0, i); - glVertex3f(0, nsubjects, i); - glEnd(); - } - - // Draw outter axis - glColor4d(AXIS_COLOR); - glBegin(GL_LINES); - glVertex3f(0, 0, 0); - glVertex3f(0, nsubjects, 0); - glVertex3f(0, 0, 0); - glVertex3f(nobjects, 0, 0); - - glVertex3f(0, 0, npredicates); - glVertex3f(0, nsubjects, npredicates); - glVertex3f(0, 0, npredicates); - glVertex3f(nobjects, 0, npredicates); - - glVertex3f(0, 0, 0); - glVertex3f(0, 0, npredicates); - - glVertex3f(0, nsubjects, 0); - glVertex3f(0, nsubjects, npredicates); - - glVertex3f(nobjects, 0, 0); - glVertex3f(nobjects, 0, npredicates); - - glVertex3f(nobjects, 0, 0); - glVertex3f(nobjects, nsubjects, 0); - - glVertex3f(nobjects, nsubjects, 0); - glVertex3f(0, nsubjects, 0); - glEnd(); - - // Draw labels - glColor4d(TEXT_COLOR); - renderText(0, nsubjects * 1.04, 0, "Subjects"); - renderText(nobjects * 1.05, 0, 0, "Objects"); - renderText(0, 0, npredicates*1.05, "Predicates"); -} - -void MatrixViewWidget::paintPoints() -{ - if(hdtController->getNumResults()==0) { - // Do not render anything - } else if(hdtController->getNumResults()<5000) { - // Render directly from iterator. - hdt::IteratorTripleID *it = hdtController->getHDT()->getTriples()->search(hdtController->getSearchPatternID()); - - glPointSize(3); - glBegin(GL_POINTS); - while(it->hasNext()) { - hdt::TripleID *tid = it->next(); - - Color *c = hdtController->getHDTCachedInfo()->getPredicateColor(tid->getPredicate()-1); - - if(hdtController->getPredicateStatus()->isPredicateActive(tid->getPredicate()-1)) { - glColor4d(c->r, c->g, c->b, 1.0); - } else { - glColor4d(c->r/4, c->g/4, c->b/4, 0.3); - } - - glVertex3f((float)tid->getObject(), (float)tid->getSubject(), (float)tid->getPredicate()); - } - glEnd(); - delete it; - - } else { - // Render from cached points. - glPointSize(RDF_POINT_SIZE); - glBegin(GL_POINTS); - vector triples = hdtController->getTriples(); - for(size_t i=0;imatch(hdtController->getSearchPatternID())) { - Color *c = hdtController->getHDTCachedInfo()->getPredicateColor(tid->getPredicate()-1); - - if(hdtController->getPredicateStatus()->isPredicateActive(tid->getPredicate()-1)) { - glColor4d(c->r, c->g, c->b, 1.0); - } else { - glColor4d(c->r/4, c->g/4, c->b/4, 0.3); - } - - glVertex3f((float)tid->getObject(), (float)tid->getSubject(), (float)tid->getPredicate()); - } - } - glEnd(); - } - -} - - - -void MatrixViewWidget::paintSelected() -{ - hdt::TripleID selectedTriple = hdtController->getSelectedTriple(); - - // Draw selected triple - if (selectedTriple.isValid()) { - size_t nsubjects = hdtController->getHDT()->getDictionary()->getMaxSubjectID(); - size_t npredicates = hdtController->getHDT()->getDictionary()->getMaxPredicateID(); - size_t nobjects = hdtController->getHDT()->getDictionary()->getMaxObjectID(); - - float x = selectedTriple.getObject(); - float y = selectedTriple.getSubject(); - float z = selectedTriple.getPredicate(); - - glColor4f(CROSS_COLOR); - glBegin(GL_LINES); - - // Draw + - glVertex3f(0, y, z); - glVertex3f(nobjects, y, z); - glVertex3f(x, 0, z); - glVertex3f(x, nsubjects, z); - - glEnd(); - - // Draw point - glPointSize(5); - glBegin(GL_POINTS); - Color c; - ColorRamp2 cr; - cr.apply(&c, z, 0, npredicates); - glColor4f(c.r, c.g, c.b, c.a); - glVertex3f(x, y, z); - glEnd(); - } -} - -void MatrixViewWidget::paintGL() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if(!hdtController->hasHDT()) { - return; - } - - glLoadIdentity(); - - camera.applyTransform(); - - size_t nsubjects = hdtController->getHDT()->getDictionary()->getMaxSubjectID(); - size_t nobjects = hdtController->getHDT()->getDictionary()->getMaxObjectID(); - size_t npredicates = hdtController->getHDT()->getDictionary()->getMaxPredicateID(); - - glScalef(1.0f / (float) nobjects, 1.0f / (float) nsubjects, 1.0f / (float) npredicates); - - // PAINT SHARED AREA - paintShared(); - - // RENDER SCALES - paintScales(); - - // RENDER POINTS - paintPoints(); - - // RENDER SELECTED - paintSelected(); -} - -void MatrixViewWidget::resizeGL(int w, int h) -{ - //std::cout << "Widget resize: " << w << ", " << h << std::endl; - camera.setScreenSize(w,h); - this->updateGL(); -} - -void MatrixViewWidget::mousePressEvent(QMouseEvent *event) -{ - //std::cout << event->type() << "DOW Btn: "<< event->buttons() << " Mod: " << event->modifiers() << " " << event->x() << ", " << event->y() << std::endl; - - lastClickX = lastX = event->x(); - lastClickY = lastY = event->y(); - buttonClick = event->buttons(); -} - -void MatrixViewWidget::mouseReleaseEvent(QMouseEvent *event) -{ - //std::cout << event->type() << "REL Btn: "<< event->buttons() << " Mod: " << event->modifiers() << " " << event->x() << ", " << event->y() << std::endl; - - if(event->x()==lastClickX && event->y()==lastClickY) { - //std::cout << "Mouse CLICK" << std::endl; - if(buttonClick & Qt::LeftButton) { - //std::cout << "Left Mouse CLICK" << std::endl; - if(hdtController->getSelectedTriple().isValid()) { - hdtController->getPredicateStatus()->selectPredicate(hdtController->getSelectedTriple().getPredicate()); - } - } else if (buttonClick & Qt::RightButton) { - //std::cout << "Right Mouse CLICK" << std::endl; - hdtController->getPredicateStatus()->selectAllPredicates(); - } - } -} - -void MatrixViewWidget::unProject(int x, int y, double *outx, double *outy, double *outz) -{ - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - camera.applyTransform(); - - hdt::Dictionary *dict = hdtController->getHDT()->getDictionary(); - - glScalef(1.0f / (float) dict->getMaxObjectID(), - 1.0f / (float) dict->getMaxSubjectID(), - 1.0f / (float) dict->getMaxPredicateID()); - - // UnProject - GLint viewport[4]; - GLdouble modelview[16], projection[16]; - GLdouble wx = x, wy, wz; - - glGetIntegerv(GL_VIEWPORT, viewport); - y = viewport[3] - y; - wy = y; - - glGetDoublev(GL_MODELVIEW_MATRIX, modelview); - glGetDoublev(GL_PROJECTION_MATRIX, projection); - glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz); - //printf("Orig: %f %f %f\n", wx, wy, wz); - gluUnProject(wx, wy, 0, modelview, projection, viewport, outx, outy, outz); - //printf("Dest: %f %f %f\n", *outx, *outy, *outz); -} - -void MatrixViewWidget::mouseMoveEvent(QMouseEvent *event) -{ - //std::cout << event->type() << "MOV Btn: "<< event->buttons() << " Mod: " << event->modifiers() << " " << event->x() << ", " << event->y() << std::endl; - - int diffx = event->x() - lastX; - int diffy = event->y() - lastY; - - lastX = event->x(); - lastY = event->y(); - - bool left = event->buttons() & Qt::LeftButton; - bool right = event->buttons() & Qt::RightButton; - bool shift = event->modifiers() & Qt::ShiftModifier; - - if(right || (left && shift)) { - camera.moveOffset(1.8*diffx, 1.8*diffy); - emit cameraChanged(); - } else if(left) { - camera.rotateCamera(diffx, diffy); - emit cameraChanged(); - } - - if(hdtController->getHDT()==NULL) - return; - - if(!camera.isFrontView()) { - hdtController->clearSelectedTriple(); - return; - } - - GLdouble subject, predicate, object; - this->unProject(event->x(), event->y(), &object, &subject, &predicate); - - hdt::Dictionary *dictionary = hdtController->getHDT()->getDictionary(); - if ( (subject > 0 && subject < dictionary->getMaxSubjectID()) && - (object > 0 && object <= dictionary->getMaxObjectID()) - ) { - hdtController->selectNearestTriple(subject,predicate, object); - - QString subjStr = stringutils::escapeHTML(stringutils::toQString(dictionary->idToString(hdtController->getSelectedTriple().getSubject(), hdt::SUBJECT).c_str())); - QString predStr = stringutils::escapeHTML(stringutils::toQString(dictionary->idToString(hdtController->getSelectedTriple().getPredicate(), hdt::PREDICATE).c_str())); - QString objStr = stringutils::escapeHTML(stringutils::toQString(dictionary->idToString(hdtController->getSelectedTriple().getObject(), hdt::OBJECT).c_str())); - stringutils::cut(objStr, 1000); - QString tooltip = QString("

S: %1

P: %2

O: %3

").arg(subjStr).arg(predStr).arg(objStr); - QPoint point = this->mapToGlobal(event->pos()); - QRect rect = QRect(point.x()-10, point.y()+10, 20, 20); - QToolTip::showText(point, tooltip, this, rect); - } else { - hdtController->clearSelectedTriple(); - QToolTip::hideText(); - } - - updateGL(); -} - - -void MatrixViewWidget::wheelEvent( QWheelEvent* e ) -{ - int delta = e->delta(); - if (e->orientation() == Qt::Horizontal) { -#ifdef GESTURES - camera.moveOffset(delta/2, 0); -#endif - } else { -#ifdef GESTURES - camera.moveOffset(0, delta/2); -#else - camera.increaseZoom(delta); -#endif - } - hdtController->clearSelectedTriple(); - e->accept(); -} - -#ifdef GESTURES -bool MatrixViewWidget::event(QEvent *event) -{ - static qreal previousZoom; - if (event->type() == QEvent::Gesture) { - QGestureEvent *gestureEvent = static_cast(event); - if (QGesture *swipe = gestureEvent->gesture(Qt::SwipeGesture)) { - QSwipeGesture *swipeGesture = static_cast(swipe); - } else if (QGesture *pan = gestureEvent->gesture(Qt::PanGesture)) { - QPanGesture *panGesture = static_cast(pan); - if(panGesture->state() == Qt::GestureStarted) { - //cout << "Panning start" << endl; - } - if(panGesture->state() == Qt::GestureFinished) { - //cout << "Panning end" << endl; - } - return true; - } else if (QGesture *pinch = gestureEvent->gesture(Qt::PinchGesture)) { - QPinchGesture *pinchGesture = static_cast(pinch); - - QPinchGesture::ChangeFlags changeFlags = pinchGesture->changeFlags(); - if (changeFlags & QPinchGesture::RotationAngleChanged) { - qreal value = pinchGesture->property("rotationAngle").toReal(); - qreal lastValue = pinchGesture->property("lastRotationAngle").toReal(); - camera.rotateCamera(2.0*(lastValue-value), 0); - return true; - } - - if (changeFlags & QPinchGesture::ScaleFactorChanged) { - if(pinchGesture->state() == Qt::GestureStarted) { - previousZoom = camera.getZoom(); - } - qreal value = pinchGesture->property("scaleFactor").toReal(); - camera.setZoom(previousZoom*value); - return true; - } - } - } - return QGLWidget::event(event); -} -#endif - -QSize MatrixViewWidget::minimumSizeHint() const -{ - return QSize(300,150); -} - -QSize MatrixViewWidget::sizeHint() const -{ - return QSize(800,600); -} - -void MatrixViewWidget::reloadHDTInfo() -{ - if(hdtController->getHDT()==NULL) { - return; - } - - updateGL(); -} - - - - - - - - - diff --git a/hdt-it/matrixviewwidget.hpp b/hdt-it/matrixviewwidget.hpp deleted file mode 100644 index 118683e1..00000000 --- a/hdt-it/matrixviewwidget.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef MATRIXVIEWWIDGET_HPP -#define MATRIXVIEWWIDGET_HPP - -#include -#include -#include - -#ifdef __APPLE__ -#include -#else -#include -#endif - -#include -#include - -#include "colors.hpp" -#include "Camera.h" -#include "StopWatch.hpp" - -#include "hdtcontroller.hpp" -#include "searchresultsmodel.hpp" -#include "triplecomponentmodel.hpp" - -class SearchResultsModel; -class TripleComponentModel; -class HDTController; - -#ifdef __APPLE__ -//#define GESTURES -#endif - -class MatrixViewWidget : public QGLWidget -{ - Q_OBJECT - -private: - QTimer timer; - Camera camera; - int lastX, lastY, lastClickX, lastClickY, buttonClick; - HDTController *hdtController; - - void unProject(int x, int y, double *outx, double *outy, double *outz); - - void paintShared(); - void paintScales(); - void paintPoints(); - void paintSelected(); - -public: - explicit MatrixViewWidget(QWidget *parent = 0); - ~MatrixViewWidget(); - - void setManager(HDTController *hdtManager); - - QSize minimumSizeHint() const; - QSize sizeHint() const; - - Camera &getCamera(); -protected: - void initializeGL(); - void paintGL(); - void resizeGL(int width, int height); - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void wheelEvent( QWheelEvent* e ); -#ifdef GESTURES - bool event(QEvent *); -#endif - -public slots: - void reloadHDTInfo(); - -signals: - void rotationChanged(); - void cameraChanged(); -}; - - -#endif // MATRIXVIEWWIDGET_HPP diff --git a/hdt-it/myapplication.cpp b/hdt-it/myapplication.cpp deleted file mode 100644 index 607b0843..00000000 --- a/hdt-it/myapplication.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "myapplication.hpp" - -MyApplication::MyApplication(int &argc, char **argv) : QApplication(argc, argv), hdtIt(NULL) -{ -} - -bool MyApplication::event(QEvent *event) -{ - switch (event->type()) { - case QEvent::FileOpen: - loadFile(static_cast(event)->file()); - return true; - default: - return QApplication::event(event); - } -} - -void MyApplication::loadFile(QString fileName) -{ - if(hdtIt) { - hdtIt->openHDTFile(fileName); - } -} - -void MyApplication::setHDTit(HDTit *hdtIt) -{ - this->hdtIt=hdtIt; -} - -bool MyApplication::notify(QObject *o, QEvent *e) -{ - try { - return QApplication::notify(o, e); - } catch (char *err) { - std::cerr << "Exception caugth in notify (char *): " << err << endl; - } catch (const char *err) { - std::cerr << "Exception caugth in notify (const char *): " << err << endl; - } catch (const std::exception& ex) { - std::cerr << "Exception caugth in notify (std::exception &): " << ex.what() << endl; - } catch (const std::string& ex) { - std::cerr << "Exception caugth in notify (std::string &): " << ex << endl; - } catch (...) { - std::cerr << "Unknown Exception caugth in notify: " << endl; - } -} diff --git a/hdt-it/myapplication.hpp b/hdt-it/myapplication.hpp deleted file mode 100644 index a0b78fe8..00000000 --- a/hdt-it/myapplication.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MYAPPLICATION_HPP -#define MYAPPLICATION_HPP - -#include -#include "hdtit.hpp" - -class MyApplication : public QApplication -{ - Q_OBJECT -private: - HDTit *hdtIt; - void loadFile(QString fileName); -public: - explicit MyApplication(int &argc, char **argv); - bool event(QEvent *); - void setHDTit(HDTit *hdtIt); - bool notify(QObject *, QEvent *); -signals: - -public slots: - -}; - -#endif // MYAPPLICATION_HPP diff --git a/hdt-it/predicatestatus.cpp b/hdt-it/predicatestatus.cpp deleted file mode 100644 index 8c1a3d2c..00000000 --- a/hdt-it/predicatestatus.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "predicatestatus.hpp" - -PredicateStatus::PredicateStatus(HDTController *manager) : - controller(manager), minPredicateCount(0), maxPredicateCount(0) -{ -} - -size_t PredicateStatus::getMinimumPredicateCount() -{ - return minPredicateCount; -} - -size_t PredicateStatus::getMaximumPredicateCount() -{ - return maxPredicateCount; -} - -bool PredicateStatus::isPredicateActive(size_t i) -{ - return activePredicate[i]; -} - -void PredicateStatus::setPredicateActive(size_t i, bool b) -{ - if(activePredicate[i]!=b) { - activePredicate[i] = b; - setMinimumPredicateCountInternal(0); - emit predicatesChanged(i,i); - } -} - -void PredicateStatus::refreshAll() -{ - activePredicate.clear(); - if(controller->hasHDT()) { - activePredicate.resize(controller->getHDT()->getDictionary()->getNpredicates(), true); - this->maxPredicateCount = controller->getHDTCachedInfo()->getMaxPredicateCount(); - setMinimumPredicateCountInternal(0); - } -} - -void PredicateStatus::selectAllPredicates() -{ -// cout << "selectAllPredicates" << endl; - for(size_t i=0;igetHDTCachedInfo()->getPredicateUsages(i)>=(size_t)count; - } - emit predicatesChanged(0, activePredicate.size()); - emit minimumPredicateCountChanged(count); - } -} diff --git a/hdt-it/predicatestatus.hpp b/hdt-it/predicatestatus.hpp deleted file mode 100644 index aa81a906..00000000 --- a/hdt-it/predicatestatus.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PREDICATESTATUS_HPP -#define PREDICATESTATUS_HPP - -#include -#include "hdtcontroller.hpp" - -class PredicateStatus : public QObject -{ - Q_OBJECT -private: - vector activePredicate; - size_t minPredicateCount; - size_t maxPredicateCount; - HDTController *controller; - - void setMinimumPredicateCountInternal(int count); -public: - explicit PredicateStatus(HDTController *controller); - - size_t getMinimumPredicateCount(); - size_t getMaximumPredicateCount(); - - bool isPredicateActive(size_t i); - void setPredicateActive(size_t i, bool b); - -signals: - void predicatesChanged(size_t min, size_t max); - void minimumPredicateCountChanged(size_t newval); - void predicateSelected(size_t npred); - -public slots: - void refreshAll(); - void selectPredicate(size_t pred); - void selectAllPredicates(); - void selectNonePredicates(); - void setMinimumPredicateCount(int count); -}; - -#endif // PREDICATESTATUS_HPP diff --git a/hdt-it/qclearlineedit.cpp b/hdt-it/qclearlineedit.cpp deleted file mode 100644 index 78ea3b43..00000000 --- a/hdt-it/qclearlineedit.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "qclearlineedit.hpp" -#include -#include - -QClearLineEdit::QClearLineEdit(QWidget *parent) - : QLineEdit(parent) -{ - clearButton = new QToolButton(this); - QPixmap pixmap(":/images/editreset.png"); - clearButton->setIcon(QIcon(pixmap)); - clearButton->setIconSize(pixmap.size()); - clearButton->setCursor(Qt::ArrowCursor); - clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); - clearButton->hide(); - connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); - connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateCloseButton(const QString&))); - int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(clearButton->sizeHint().width() + frameWidth + 1)); - QSize msz = minimumSizeHint(); - setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), - qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); - - suggestions = new DictionarySuggestions(this); -} - -QClearLineEdit::~QClearLineEdit() -{ - delete suggestions; - delete clearButton; -} - -void QClearLineEdit::resizeEvent(QResizeEvent *) -{ - QSize sz = clearButton->sizeHint(); - int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - clearButton->move(rect().right() - frameWidth - sz.width(), - (rect().bottom() + 1 - sz.height())/2); -} - -void QClearLineEdit::updateCloseButton(const QString& text) -{ - clearButton->setVisible(!text.isEmpty()); -} - -DictionarySuggestions * QClearLineEdit::getSuggestions() -{ - return suggestions; -} diff --git a/hdt-it/qclearlineedit.hpp b/hdt-it/qclearlineedit.hpp deleted file mode 100644 index d818da9e..00000000 --- a/hdt-it/qclearlineedit.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef QCLEARLINEEDIT_HPP -#define QCLEARLINEEDIT_HPP - -#include - -#include "dictionarysuggestions.hpp" - -class QToolButton; - -class QClearLineEdit: public QLineEdit -{ - Q_OBJECT - -public: - QClearLineEdit(QWidget *parent = 0); - ~QClearLineEdit(); - DictionarySuggestions *getSuggestions(); - -protected: - void resizeEvent(QResizeEvent *); - -private slots: - void updateCloseButton(const QString &text); - -private: - QToolButton *clearButton; - DictionarySuggestions *suggestions; -}; - -#endif // QCLEARLINEEDIT_HPP diff --git a/hdt-it/regexmodel.cpp b/hdt-it/regexmodel.cpp deleted file mode 100644 index 64891215..00000000 --- a/hdt-it/regexmodel.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include "stringutils.hpp" -#include "regexmodel.hpp" - -#include -#include - -class QFont; - -#include "../hdt-lib/src/dictionary/LiteralDictionary.hpp" - -RegexModel::RegexModel(HDTController *manager) : hdtController(manager), numResults(0), results(NULL) -{ -} - -RegexModel::~RegexModel() -{ - if(results!=NULL) { - free(results); - } -} - -void RegexModel::setQuery(QString query) -{ - if(hdtController->hasHDT()) { - hdt::LiteralDictionary *dict = dynamic_cast(hdtController->getHDT()->getDictionary()); - if(dict==NULL) { - QMessageBox::warning(NULL, tr("ERROR"), tr("This HDT does not support substring search")); - return; - } - if(query.length()==0) { - numResults = 0; - } else { - QByteArray arr = query.toUtf8(); - numResults = dict->substringToId((uchar *)arr.data(), arr.size(), &results); - } - emit layoutChanged(); - } -} - -int RegexModel::rowCount(const QModelIndex &parent) const -{ - return (int)numResults; -} - -int RegexModel::columnCount(const QModelIndex &parent) const -{ - return 2; -} - -QVariant RegexModel::data(const QModelIndex &index, int role) const -{ - if(results==NULL) { - return QVariant(); - } - - switch(role) { - case Qt::ToolTipRole: - case Qt::DisplayRole: - { - hdt::Dictionary *d = hdtController->getHDT()->getDictionary(); - - try { - switch(index.column()) { - case 0: - { - hdt::Triples *t = hdtController->getHDT()->getTriples(); - - hdt::TripleID tripleObject(0, 0, results[index.row()]); - hdt::IteratorTripleID *it = t->search(tripleObject); - - int nResults = it->estimatedNumResults(); - delete it; - - return nResults; - } - case 1: { - return stringutils::toQString(d->idToString(results[index.row()], hdt::OBJECT).c_str()); - } - } - - } catch (char *e) { - cerr << "Error accesing dictionary: " << e << endl; - } catch (const char *e) { - cerr << "Error accesing dictionary: " << e << endl; - } - return QVariant(); - - break; - } - case Qt::FontRole: - { - static QFont font; - font.setPointSize(10); - return font; - } - - } - return QVariant(); -} - -QVariant RegexModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - switch(role) { - case Qt::DisplayRole: - { - if(orientation == Qt::Horizontal) { - switch(section) { - case 0: - return tr("Triples "); - case 1: - return tr("Object Literal"); - } - } else { - return QString::number(results[section]); - } - break; - } - } - - return QVariant(); -} - -void RegexModel::updateDatasetChanged() -{ - if(results==NULL) { - free(results); - } - numResults = 0; - results=NULL; - - emit layoutChanged(); -} diff --git a/hdt-it/regexmodel.hpp b/hdt-it/regexmodel.hpp deleted file mode 100644 index 887e966d..00000000 --- a/hdt-it/regexmodel.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef REGEXMODEL_HPP -#define REGEXMODEL_HPP - -#include - -#include "hdtcontroller.hpp" - -class HDTController; - -class RegexModel : public QAbstractTableModel -{ - Q_OBJECT - -private: - HDTController *hdtController; - uint32_t numResults; - uint32_t *results; - -public: - explicit RegexModel(HDTController *manager); - ~RegexModel(); - - void setQuery(QString query); - - int rowCount(const QModelIndex &parent = QModelIndex()) const ; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - - void updateDatasetChanged(); -signals: - -public slots: - -}; - -#endif // REGEXMODEL_HPP diff --git a/hdt-it/resultcounter.cpp b/hdt-it/resultcounter.cpp deleted file mode 100644 index f831e2b6..00000000 --- a/hdt-it/resultcounter.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "resultcounter.hpp" -#include - - -ResultCounter::ResultCounter(QObject *parent, HDTController *controller) : - QObject(parent), - hdtController(controller), - iterator(NULL) -{ -} - -void ResultCounter::startCounting() -{ - if(!hdtController->hasHDT()){ - return; - } - iterator = hdtController->getHDT()->getTriples()->search(hdtController->getSearchPatternID()); - shouldCancel = false; - QtConcurrent::run(this, &ResultCounter::run); -} - -void ResultCounter::cancel() -{ - shouldCancel = true; -} - -void ResultCounter::run() -{ - if(iterator==NULL) { - return; - } - StopWatch cl; - unsigned int numResults = 0; - while(!shouldCancel && iterator->hasNext()) { - iterator->next(); - numResults++; - - cl.stop(); - if(cl.getReal()>10000) { - cl.reset(); - emit numResultsChanged(numResults); - } - } - delete iterator; - iterator = NULL; - emit finished(); -} diff --git a/hdt-it/resultcounter.hpp b/hdt-it/resultcounter.hpp deleted file mode 100644 index e2671ee9..00000000 --- a/hdt-it/resultcounter.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef RESULTCOUNTER_HPP -#define RESULTCOUNTER_HPP - -#include - -#include - -class ResultCounter : public QObject -{ - Q_OBJECT -private: - HDTController *hdtController; - hdt::IteratorTripleID *iterator; - bool shouldCancel; -public: - explicit ResultCounter(QObject *parent, HDTController *hdtController); - - void run(); -signals: - void numResultsChanged(int numResults); - void messageChanged(QString message); - void finished(); -private slots: - void startCounting(); - void cancel(); -public slots: - -}; - -#endif // RESULTCOUNTER_HPP diff --git a/hdt-it/searchresultsmodel.cpp b/hdt-it/searchresultsmodel.cpp deleted file mode 100644 index e03a38d3..00000000 --- a/hdt-it/searchresultsmodel.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include "stringutils.hpp" -#include "searchresultsmodel.hpp" -#include - -SearchResultsModel::SearchResultsModel(HDTController *view) : hdtController(view), triples(NULL) -{ - this->updateResultListChanged(); -} - -SearchResultsModel::~SearchResultsModel() -{ - if(triples!=NULL) { - delete triples; - triples = NULL; - } -} - -int SearchResultsModel::rowCount(const QModelIndex &parent) const -{ - // FIXME: QTableView crashes when returning more than 100 Million rows :( - return numResults > 100000000 ? 100000000 : numResults; -} - -int SearchResultsModel::columnCount(const QModelIndex &parent) const -{ - return 3; -} - -QVariant SearchResultsModel::data(const QModelIndex &index, int role) const -{ - if(triples == NULL) { - return QVariant(); - } - - switch(role) { - case Qt::ToolTipRole: - case Qt::DisplayRole: - { - // cerr << "SearchResultsModel.data " << index.row() << "," << index.column() << endl; - // Compiler complains that by calling findTriple we are modifying internal - // state, which is illegal due to this function being const. But we need to - // modify the currentIndex and currentTriple, so we can avoid it. - SearchResultsModel *noConstThis = const_cast(this); - noConstThis->findTriple(index.row()); - - hdt::Dictionary *d = hdtController->getHDT()->getDictionary(); - - try { - switch(index.column()) { - case 0: - return stringutils::toQString(d->idToString(currentTriple->getSubject(), hdt::SUBJECT).c_str()); - case 1: - return stringutils::toQString(d->idToString(currentTriple->getPredicate(), hdt::PREDICATE).c_str()); - case 2: - return stringutils::toQString(d->idToString(currentTriple->getObject(), hdt::OBJECT).c_str()); - } - } catch (char *e) { - cerr << "Error accesing dictionary: " << e << endl; - } catch (const char *e) { - cerr << "Error accesing dictionary: " << e << endl; - } - return QVariant(); - - break; - } - case Qt::FontRole: - { - static QFont font; - font.setPointSize(10); - return font; - } - - } - return QVariant(); -} - - -QVariant SearchResultsModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - - switch(role) { - case Qt::DisplayRole: - { - if(orientation == Qt::Horizontal) { - switch(section) { - case 0: - return tr("Subject"); - case 1: - return tr("Predicate"); - case 2: - return tr("Object"); - } - } else { - return QString::number(section+1); - } - break; - } - } - - return QVariant(); -} - -void SearchResultsModel::updateResultListChanged() { - if(triples!=NULL) { - delete triples; - triples = NULL; - } - - if(hdtController->hasHDT()) { - triples = hdtController->getHDT()->getTriples()->search(hdtController->getSearchPatternID()); - if(triples->hasNext()) { - currentTriple = triples->next(); - } - } else { - triples = NULL; - currentTriple = NULL; - numResults=0; - } - currentIndex = 0; - goingUp = true; - numResults = hdtController->getNumResults(); - - emit layoutChanged(); -} - -void SearchResultsModel::updateNumResultsChanged() -{ - unsigned int old = numResults; - numResults = hdtController->getNumResults(); - - if(old!=numResults) { -#if 0 - beginInsertRows(QModelIndex(), old+1, numResults); - endInsertRows(); - //emit dataChanged(createIndex(old+1,0), createIndex(numResults,2)); -#else - emit layoutChanged(); -#endif - } -} - - -void SearchResultsModel::findTriple(unsigned int index) -{ - if(triples == NULL) { - return; - } - - if(triples->canGoTo() && abs((long int)currentIndex-(long int)index)>5) { - triples->goTo(index); - goingUp = true; - currentTriple = triples->next(); - currentIndex = index; - //cerr << "Jump: " << currentIndex << " => " << *currentTriple << endl; - return; - } - - while(currentIndex > index && triples->hasPrevious()) { - if(goingUp) { - // On direction changes, we need to move one extra position. - goingUp = false; - currentIndex++; - } - currentTriple = triples->previous(); - currentIndex--; - } - - while(currentIndex < index && triples->hasNext()) { - if(!goingUp){ - // On direction changes, we need to move one extra position. - goingUp = true; - currentIndex--; - } - currentTriple = triples->next(); - currentIndex++; - } - - //cerr << "Access " << currentIndex << " => " << *currentTriple << endl; -} diff --git a/hdt-it/searchresultsmodel.hpp b/hdt-it/searchresultsmodel.hpp deleted file mode 100644 index f4afdcfc..00000000 --- a/hdt-it/searchresultsmodel.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef SEARCHRESULTSMODEL_HPP -#define SEARCHRESULTSMODEL_HPP - -#include - -#include - -#include "hdtcontroller.hpp" - -class HDTController; - -class SearchResultsModel : public QAbstractTableModel { - Q_OBJECT -private: - HDTController *hdtController; - hdt::IteratorTripleID *triples; - hdt::TripleID *currentTriple; - unsigned int currentIndex; - unsigned int numResults; - bool goingUp; - - void findTriple(unsigned int index); - -public: - SearchResultsModel(HDTController *view); - ~SearchResultsModel(); - - int rowCount(const QModelIndex &parent = QModelIndex()) const ; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - - void updateResultListChanged(); - void updateNumResultsChanged(); -signals: -}; - - -#endif // SEARCHRESULTSMODEL_HPP diff --git a/hdt-it/sparqlform.cpp b/hdt-it/sparqlform.cpp deleted file mode 100644 index a67a5891..00000000 --- a/hdt-it/sparqlform.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "sparqlform.hpp" -#include "ui_sparqlform.h" - -#include "sparqlmodel.hpp" -#include "hdtit.hpp" - -SparqlForm::SparqlForm(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::SparqlForm) -{ - ui->setupUi(this); - - HDTit *hdtit = reinterpret_cast(parent); - sparqlModel = new SparqlModel(hdtit->getManager()); - ui->sparqlResultTable->setModel(sparqlModel); -} - -SparqlForm::~SparqlForm() -{ - delete ui; -} - -void SparqlForm::on_pushButton_clicked() -{ - sparqlModel->setQuery(ui->sparqlTextEdit->toPlainText()); - ui->sparqlResultTable->scrollToTop(); -} diff --git a/hdt-it/sparqlform.hpp b/hdt-it/sparqlform.hpp deleted file mode 100644 index 03bada67..00000000 --- a/hdt-it/sparqlform.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef JOINFORM_HPP -#define JOINFORM_HPP - -#include - -#include "sparqlmodel.hpp" - -namespace Ui { - class SparqlForm; -} - -class SparqlForm : public QMainWindow -{ - Q_OBJECT - -public: - explicit SparqlForm(QWidget *parent = 0); - ~SparqlForm(); - -private slots: - void on_pushButton_clicked(); - -private: - Ui::SparqlForm *ui; - SparqlModel *sparqlModel; -}; - -#endif // JOINFORM_HPP diff --git a/hdt-it/sparqlform.ui b/hdt-it/sparqlform.ui deleted file mode 100644 index 9ffcf56c..00000000 --- a/hdt-it/sparqlform.ui +++ /dev/null @@ -1,112 +0,0 @@ - - - SparqlForm - - - - 0 - 0 - 603 - 664 - - - - SPARQL Search - - - - - 0 - 0 - - - - - - - Qt::Vertical - - - - - 0 - 0 - - - - SPARQL - - - - - - - 0 - 1 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SELECT ?x ?y ?z WHERE {?x ?y ?z . }</p></body></html> - - - - - - - Search - - - - - - - - Qt::Horizontal - - - - - 0 - 4 - - - - true - - - Qt::ElideMiddle - - - 300 - - - 50 - - - 20 - - - - - - - - - - - 0 - 0 - 603 - 22 - - - - - - - - diff --git a/hdt-it/sparqlmodel.cpp b/hdt-it/sparqlmodel.cpp deleted file mode 100644 index f81c43d9..00000000 --- a/hdt-it/sparqlmodel.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "sparqlmodel.hpp" -#include - -#include - -#include - -SparqlModel::SparqlModel(HDTController *controller) : - hdtController(controller), - binding(NULL), - currentIndex(0), - numresults(0) -{ -} - -void SparqlModel::find(unsigned int index) { - if(currentIndex>index) { - currentIndex=0; - binding->goToStart(); - binding->findNext(); - } - while(currentIndexfindNext()) { - currentIndex++; - } else { - numresults = currentIndex+1; - emit layoutChanged(); - break; - } - } -} - -SparqlModel::~SparqlModel() -{ - -} - -class SparqlQuery { -public: - set vars; - vector patterns; -}; - -SparqlQuery parseSparql(string query) { - struct SparqlQuery output; - string word; - unsigned int phase = 0; - vector pattern; - - stringstream in(query, ios::in); - - while(in >> word) { - cout << word << endl; - if(word.size()==0) { - continue; - } - if(phase==0) { - if(word.at(0)=='?') { - output.vars.insert(word); - } else if(word=="WHERE") { - phase++; - } - } else { - if(word.at(0)=='.') { - if(pattern.size()!=3) { - throw "Pattern should have 3 components"; - } - hdt::TripleString trip(pattern[0], pattern[1], pattern[2]); - output.patterns.push_back(trip); - pattern.clear(); - } else { - if(word.at(0)=='{') { - - } else if(word.at(0)!='.'){ - cout << "**"<< word << "**" << endl; - pattern.push_back(word); - } - } - } - } - return output; -} - -void SparqlModel::setQuery(QString queryTxt) -{ - throw "Not implemented"; -#if 0 - SparqlQuery query = parseSparql(string(queryTxt.toAscii())); - - if(binding) { - delete binding; - } - - binding = hdtManager->getHDT()->searchJoin(query.patterns, query.vars); - binding->findNext(); - numresults = binding->estimatedNumResults(); - currentIndex = 0; - - emit layoutChanged(); -#endif -} - -int SparqlModel::rowCount(const QModelIndex &parent) const { - return numresults; -} -int SparqlModel::columnCount(const QModelIndex &parent) const { - if(binding==NULL) { - return 0; - } - return binding->getNumVars(); -} -QVariant SparqlModel::data(const QModelIndex &index, int role) const { - if(binding == NULL) { - return QVariant(); - } - - switch(role) { - case Qt::ToolTipRole: - case Qt::DisplayRole: - { - // Compiler complains that by calling findTriple we are modifying internal - // state, which is illegal due to this function being const. But we need to - // modify the currentIndex and currentTriple, so we can avoid it. - SparqlModel *noConstThis = const_cast(this); - noConstThis->find(index.row()); - - return binding->getVar(index.column()).c_str(); - } - case Qt::FontRole: - { - static QFont font; - font.setPointSize(10); - return font; - } - - } - return QVariant(); -} -QVariant SparqlModel::headerData(int section, Qt::Orientation orientation, int role) const { - if(binding==NULL) { - return QVariant(); - } - switch(role) { - case Qt::DisplayRole: - { - if(orientation == Qt::Horizontal) { - return binding->getVarName(section); - } else { - return QString::number(section+1); - } - break; - } - } - return QVariant(); -} diff --git a/hdt-it/sparqlmodel.hpp b/hdt-it/sparqlmodel.hpp deleted file mode 100644 index 0e5147fd..00000000 --- a/hdt-it/sparqlmodel.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef JOINMODEL_HPP -#define JOINMODEL_HPP - -#include - -#include - -#include "hdtcontroller.hpp" - -class SparqlModel : public QAbstractTableModel { - Q_OBJECT -private: - HDTController *hdtController; - - hdt::VarBindingString *binding; - unsigned int currentIndex; - unsigned int numresults; - void find(unsigned int index); -public: - SparqlModel(HDTController *controller); - virtual ~SparqlModel(); - - void setQuery(QString query); - - int rowCount(const QModelIndex &parent = QModelIndex()) const ; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; -signals: -}; - -#endif // JOINMODEL_HPP diff --git a/hdt-it/stringutils.cpp b/hdt-it/stringutils.cpp deleted file mode 100644 index 1ce01a8a..00000000 --- a/hdt-it/stringutils.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include -#include "stringutils.hpp" - -QString stringutils::sizeHuman(unsigned long long size) -{ - static const char *sizes[] = { "EB", "PB", "TB", "GB", "MB", "KB", "B" }; - static const quint64 exbibytes = 1024ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL; - - quint64 multiplier = exbibytes; - - if(size==0) { - return QString("0"); - } - - for (unsigned int i = 0; i < 7; i++, multiplier /= 1024) - { - if (size < multiplier) { - continue; - } - - return QString("%1 %2") - .arg(QString::number((double)size / multiplier, 'f', 1)) - .arg(sizes[i]); - } - return QString("0"); -} - -QString stringutils::toQString(const char *str) -{ - - QString out = QString::fromUtf8(str); - - return out; -} - -QString stringutils::escapeHTML(QString in) -{ - return in.replace("<", "<").replace(">", ">"); -} - -void stringutils::cut(QString &in, int size) -{ - if(in.length()>size) { - in = in.left(size)+"..."; - } -} diff --git a/hdt-it/stringutils.hpp b/hdt-it/stringutils.hpp deleted file mode 100644 index 3935e83d..00000000 --- a/hdt-it/stringutils.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef STRINGUTILS_HPP -#define STRINGUTILS_HPP - -#include -#include - -class stringutils -{ -public: - static QString sizeHuman(unsigned long long size); - static QString toQString(const char *str); - static QString escapeHTML(QString in); - static void cut(QString &in, int size); -}; - - - -#endif // STRINGUTILS_HPP diff --git a/hdt-it/triplecomponentmodel.cpp b/hdt-it/triplecomponentmodel.cpp deleted file mode 100644 index 85aeaa89..00000000 --- a/hdt-it/triplecomponentmodel.cpp +++ /dev/null @@ -1,146 +0,0 @@ - -#include - -#include "triplecomponentmodel.hpp" - -#include "stringutils.hpp" - -TripleComponentModel::TripleComponentModel(HDTController *view, hdt::TripleComponentRole compRole) : - hdtController(view), tripleComponentRole(compRole) -{ - -} - -int TripleComponentModel::rowCount(const QModelIndex &parent) const -{ - size_t numResults = 0; - - Q_UNUSED(parent); - if(hdtController->getHDT() != NULL) { - hdt::Dictionary *dict = hdtController->getHDT()->getDictionary(); - switch(tripleComponentRole) { - case hdt::SUBJECT: - numResults = dict->getNsubjects(); - break; - case hdt::PREDICATE: - numResults = dict->getNpredicates(); - break; - case hdt::OBJECT: - numResults = dict->getNobjects(); - break; - } - } - - // FIXME: QTableView crashes when returning more than 100 Million rows :( - return (int)(numResults > 100000000 ? 100000000 : numResults); -} - -int TripleComponentModel::columnCount(const QModelIndex &parent) const -{ - return 1; -} - -QVariant TripleComponentModel::data(const QModelIndex &index, int role) const -{ - if(!hdtController->hasHDT()) { - return QVariant(); - } - - switch(role) { - case Qt::ToolTipRole: - case Qt::DisplayRole: - { - //cerr << "Data: " << index.row() << " role: " << role << " type: " << tripleComponentRole << endl; - hdt::Dictionary *d = hdtController->getHDT()->getDictionary(); - try { - return stringutils::toQString(d->idToString(index.row()+1, tripleComponentRole).c_str()); - } catch (char *e) { - cerr << "Error accessing dictionary: " << e << endl; - } catch (const char *e) { - cerr << "Error accessing dictionary: " << e << endl; - } - return QVariant(); - } - case Qt::FontRole: - { - QFont font; - font.setPointSize(10); - return font; - } - case Qt::CheckStateRole: - if(tripleComponentRole==hdt::PREDICATE) { - return hdtController->getPredicateStatus()->isPredicateActive(index.row()) ? Qt::Checked : Qt::Unchecked; - } - break; - case Qt::DecorationRole: - if(tripleComponentRole==hdt::PREDICATE) { - HDTCachedInfo *info = hdtController->getHDTCachedInfo(); - Color *color = info->getPredicateColor(index.row()); - return color->asQColor(); - } - break; - } - return QVariant(); -} - -bool TripleComponentModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if(hdtController->getHDT() == NULL) { - return false; - } - - switch(role) { - case Qt::CheckStateRole: - if(tripleComponentRole==hdt::PREDICATE) { - hdtController->getPredicateStatus()->setPredicateActive(index.row(), value.toBool()); - } - } - return true; -} - -QVariant TripleComponentModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - - switch(role) { - case Qt::DisplayRole: - { - if(orientation == Qt::Horizontal) { - switch(tripleComponentRole) { - case hdt::SUBJECT: - return tr("Subject"); - case hdt::PREDICATE: - return tr("Predicate"); - case hdt::OBJECT: - return tr("Object"); - } - } else { - return QString::number(section+1); - } - break; - } - } - - return QVariant(); -} - -Qt::ItemFlags TripleComponentModel::flags(const QModelIndex &index) const -{ - Q_UNUSED(index); - if(tripleComponentRole == hdt::PREDICATE) { - return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; - } else { - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; - } -} - -void TripleComponentModel::itemsChanged(unsigned int ini, unsigned int fin) -{ - QModelIndex first = createIndex(ini, 1); - QModelIndex last = createIndex(fin, 1); - emit dataChanged(first, last); -} - -void TripleComponentModel::notifyLayoutChanged() -{ - emit layoutChanged(); -} diff --git a/hdt-it/triplecomponentmodel.hpp b/hdt-it/triplecomponentmodel.hpp deleted file mode 100644 index 8c633279..00000000 --- a/hdt-it/triplecomponentmodel.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef TRIPLECOMPONENTMODEL_HPP -#define TRIPLECOMPONENTMODEL_HPP - -#include - -#include - -#include "hdtcontroller.hpp" - -class HDTController; - -class TripleComponentModel : public QAbstractTableModel { - Q_OBJECT -private: - HDTController *hdtController; - hdt::TripleComponentRole tripleComponentRole; -public: - TripleComponentModel(HDTController *view, hdt::TripleComponentRole compRole); - - int rowCount(const QModelIndex &parent = QModelIndex()) const ; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData(const QModelIndex & index, const QVariant & value, int role); - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - Qt::ItemFlags flags(const QModelIndex &index) const; - -public slots: - void itemsChanged(unsigned int ini, unsigned int fin); - void notifyLayoutChanged(); -signals: -}; - -#endif // TRIPLECOMPONENTMODEL_HPP diff --git a/lib/.gitignore b/lib/.gitignore deleted file mode 100644 index d9f53942..00000000 --- a/lib/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/Makefile.am -/dummy.c diff --git a/lib/Makefile.in b/lib/Makefile.in deleted file mode 100644 index 8664e08f..00000000 --- a/lib/Makefile.in +++ /dev/null @@ -1,803 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2014 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# Copyright (C) 2002-2014 Free Software Foundation, Inc. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This file is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this file. If not, see . -# -# As a special exception to the GNU General Public License, -# this file may be distributed as part of a program that -# contains a configuration script generated by Autoconf, under -# the same distribution terms as the rest of that program. -# -# Generated by gnulib-tool. -# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build --no-conditional-dependencies --no-libtool --macro-prefix=gl warnings - - - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = lib -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ - $(top_srcdir)/m4/gnulib-common.m4 \ - $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ - $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/build/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LIBRARIES = $(noinst_LIBRARIES) -AM_V_AR = $(am__v_AR_@AM_V@) -am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) -am__v_AR_0 = @echo " AR " $@; -am__v_AR_1 = -libgnu_a_AR = $(AR) $(ARFLAGS) -am__DEPENDENCIES_1 = -am_libgnu_a_OBJECTS = dummy.$(OBJEXT) -libgnu_a_OBJECTS = $(am_libgnu_a_OBJECTS) -LTLIBRARIES = $(noinst_LTLIBRARIES) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/build -depcomp = $(SHELL) $(top_srcdir)/build/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libgnu_a_SOURCES) $(EXTRA_libgnu_a_SOURCES) -DIST_SOURCES = $(libgnu_a_SOURCES) $(EXTRA_libgnu_a_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -HEADERS = $(noinst_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/build/depcomp -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -ARFLAGS = @ARFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_ZLIB = @HAVE_ZLIB@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBCDS_CFLAGS = @LIBCDS_CFLAGS@ -LIBCDS_HDR = @LIBCDS_HDR@ -LIBCDS_LIB = @LIBCDS_LIB@ -LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ -LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ -PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ -RANLIB = @RANLIB@ -RAPTOR2_CFLAGS = @RAPTOR2_CFLAGS@ -RAPTOR2_HDR = @RAPTOR2_HDR@ -RAPTOR2_LIB = @RAPTOR2_LIB@ -SED = @SED@ -SERD_CFLAGS = @SERD_CFLAGS@ -SERD_HDR = @SERD_HDR@ -SERD_LIB = @SERD_LIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -WARN_CFLAGS = @WARN_CFLAGS@ -ZLIB_LIB = @ZLIB_LIB@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -gl_LIBOBJS = @gl_LIBOBJS@ -gl_LTLIBOBJS = @gl_LTLIBOBJS@ -gltests_LIBOBJS = @gltests_LIBOBJS@ -gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ -gltests_WITNESS = @gltests_WITNESS@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -runstatedir = @runstatedir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -zlib_CFLAGS = @zlib_CFLAGS@ -zlib_LIBS = @zlib_LIBS@ -AUTOMAKE_OPTIONS = 1.9.6 gnits -SUBDIRS = -noinst_HEADERS = -noinst_LIBRARIES = libgnu.a -noinst_LTLIBRARIES = -EXTRA_DIST = -BUILT_SOURCES = -SUFFIXES = -MOSTLYCLEANFILES = core *.stackdump -MOSTLYCLEANDIRS = -CLEANFILES = -DISTCLEANFILES = -MAINTAINERCLEANFILES = -AM_CPPFLAGS = -AM_CFLAGS = -libgnu_a_SOURCES = dummy.c -libgnu_a_LIBADD = $(gl_LIBOBJS) -libgnu_a_DEPENDENCIES = $(gl_LIBOBJS) -EXTRA_libgnu_a_SOURCES = -all: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits lib/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnits lib/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) - -libgnu.a: $(libgnu_a_OBJECTS) $(libgnu_a_DEPENDENCIES) $(EXTRA_libgnu_a_DEPENDENCIES) - $(AM_V_at)-rm -f libgnu.a - $(AM_V_AR)$(libgnu_a_AR) libgnu.a $(libgnu_a_OBJECTS) $(libgnu_a_LIBADD) - $(AM_V_at)$(RANLIB) libgnu.a - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) check-recursive -all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS) -installdirs: installdirs-recursive -installdirs-am: -install: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -clean: clean-recursive - -clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ - clean-noinstLTLIBRARIES mostlyclean-am - -distclean: distclean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-local - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(am__recursive_targets) all check install install-am \ - install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool \ - clean-noinstLIBRARIES clean-noinstLTLIBRARIES cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ - pdf-am ps ps-am tags tags-am uninstall uninstall-am - -.PRECIOUS: Makefile - - -mostlyclean-local: mostlyclean-generic - @for dir in '' $(MOSTLYCLEANDIRS); do \ - if test -n "$$dir" && test -d $$dir; then \ - echo "rmdir $$dir"; rmdir $$dir; \ - fi; \ - done; \ - : - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libcds/COPYRIGHT b/libcds/COPYRIGHT deleted file mode 100644 index a2a1d92d..00000000 --- a/libcds/COPYRIGHT +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/libcds/Changelog b/libcds/Changelog deleted file mode 100644 index fb874b85..00000000 --- a/libcds/Changelog +++ /dev/null @@ -1,38 +0,0 @@ - -Version 0.9: - -- static_bitsequence: - - added sdarray -- static_sequence: - - added sequence representation based in sdarray (no efficient access) - -Version 0.8: - -- trying: - - git -- missing: - - improve design and class names - - add namespaces - - reference counters for coders and util clases -- static_bitsequence: - - Added base class with virtual functions - - Added testing naive rank/select - - Added rank/select with one-level sampling - - Added compressed representation -- static_sequence - - Added wavelet tree without pointers - - Added wavelet tree with pointers - - Added coder for giving huffman/normal shape to the wavelet tree - - Added Golynski et al.'s data structure for large alphabets -- static_permutation - - Added Diego Arroyuelo's implementation of Munro et al.'s permutations - - Added base classes - - TODO: check interface and add functionality -- coders - - temporal coders for the wavelet tree - - TODO: add coders and a general interface for them -- utils - - Added the alphabet mapper interface - - Added a dummy alphabet mapper - - diff --git a/libcds/Doxyfile b/libcds/Doxyfile deleted file mode 100755 index 09423c4c..00000000 --- a/libcds/Doxyfile +++ /dev/null @@ -1,307 +0,0 @@ -# Doxyfile 1.5.5 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = libcds -PROJECT_NUMBER = 1.0.3 -OUTPUT_DIRECTORY = docs/ -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = src/ -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 2 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -BUILTIN_STL_SUPPORT = NO -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -TYPEDEF_HIDES_STRUCT = NO -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = src -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl \ - *.C \ - *.CC \ - *.C++ \ - *.II \ - *.I++ \ - *.H \ - *.HH \ - *.H++ \ - *.CS \ - *.PHP \ - *.PHP3 \ - *.M \ - *.MM \ - *.PY \ - *.F90 \ - *.F \ - *.VHD \ - *.VHDL -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = cds_static::sperm \ - cds_static::table_offset \ - cds_static::THuff \ - cds_static::Ttree \ - cds_utils::Array::ArrayModifier \ - cds_static::selects3 \ - cds_static::selectd2 \ - cds_static::auxbwd \ - cds_static::wt_node_internal \ - cds_static::wt_node_leaf \ - cds_static::wt_node -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = NO -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -HTML_DYNAMIC_SECTIONS = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -MSCGEN_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = YES -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/libcds/Makefile.am b/libcds/Makefile.am deleted file mode 100644 index 9b772df3..00000000 --- a/libcds/Makefile.am +++ /dev/null @@ -1,172 +0,0 @@ -SUBDIRS = . tests - -AUTOMAKE_OPTIONS = subdir-objects - -AM_CPPFLAGS = -I$(builddir)/include $(WARN_CFLAGS) - -include_HEADERS = -lib_LTLIBRARIES = - -if WANTS_LIBCDS -include_HEADERS += \ - include/Array.h \ - include/BitmapsSequence.h\ - include/BitSequenceBuilderDArray.h\ - include/BitSequenceBuilder.h\ - include/BitSequenceBuilderRG.h\ - include/BitSequenceBuilderRRR.h\ - include/BitSequenceBuilderSDArray.h\ - include/BitSequenceDArray.h\ - include/BitSequence.h\ - include/BitSequenceRG.h\ - include/BitSequenceRRR.h\ - include/BitSequenceSDArray.h\ - include/BitString.h\ - include/Coder.h\ - include/comparray4.h\ - include/cppUtils.h\ - include/factorization.h\ - include/factorization_var.h\ - include/huff.h\ - include/HuffmanCoder.h\ - include/interface.h\ - include/LCP_DAC.h\ - include/LCP_DAC_VAR.h\ - include/LCP_FMN.h\ - include/LCP.h\ - include/LCP_naive.h\ - include/LCP_PhiSpare.h\ - include/LCP_PT.h\ - include/LCP_Sad.h\ - include/libcdsBasics.h\ - include/libcdsSDArray.h\ - include/libcdsTrees.h\ - include/MapperCont.h\ - include/Mapper.h\ - include/MapperNone.h\ - include/MapperRev.h\ - include/mmap.h\ - include/NPR_CN.h\ - include/NPR_FMN.h\ - include/NPR.h\ - include/NSV.h\ - include/perm.h\ - include/PermutationBuilder.h\ - include/PermutationBuilderMRRR.h\ - include/PermutationBuilderWT.h\ - include/Permutation.h\ - include/PermutationMRRR.h\ - include/PermutationWT.h\ - include/PSV.h\ - include/RMQ_succinct.h\ - include/RMQ_succinct_lcp.h\ - include/sdarraySadakane.h\ - include/SequenceAlphPart.h\ - include/SequenceBuilderAlphPart.h\ - include/SequenceBuilderGMRChunk.h\ - include/SequenceBuilderGMR.h\ - include/SequenceBuilder.h\ - include/SequenceBuilderStr.h\ - include/SequenceBuilderWaveletMatrix.h\ - include/SequenceBuilderWaveletTree.h\ - include/SequenceBuilderWaveletTreeNoptrs.h\ - include/SequenceBuilderWaveletTreeNoptrsS.h\ - include/SequenceGMRChunk.h\ - include/SequenceGMR.h\ - include/Sequence.h\ - include/SuffixTree.h\ - include/SuffixTreeY.h\ - include/TableOffsetRRR.h\ - include/TextIndexCSA.h\ - include/TextIndex.h\ - include/timing.h\ - include/WaveletMatrix.h\ - include/WaveletTree.h\ - include/WaveletTreeNoptrs.h\ - include/WaveletTreeNoptrsS.h\ - include/wt_coder_binary.h\ - include/wt_coder.h\ - include/wt_coder_huff.h\ - include/wt_node.h\ - include/wt_node_internal.h\ - include/wt_node_leaf.h -lib_LTLIBRARIES += libcds.la -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = cds.pc -endif -libcds_la_SOURCES = \ -src/static/bitsequence/BitSequenceBuilderDArray.cpp\ -src/static/bitsequence/BitSequenceBuilderRG.cpp\ -src/static/bitsequence/BitSequenceBuilderRRR.cpp\ -src/static/bitsequence/BitSequenceBuilderSDArray.cpp\ -src/static/bitsequence/BitSequence.cpp\ -src/static/bitsequence/BitSequenceDArray.cpp\ -src/static/bitsequence/BitSequenceRG.cpp\ -src/static/bitsequence/BitSequenceRRR.cpp\ -src/static/bitsequence/BitSequenceSDArray.cpp\ -src/static/bitsequence/sdarraySadakane.cpp\ -src/static/bitsequence/TableOffsetRRR.cpp\ -src/static/coders/huff.cpp\ -src/static/coders/HuffmanCoder.cpp\ -src/static/mapper/MapperCont.cpp\ -src/static/mapper/Mapper.cpp\ -src/static/mapper/MapperNone.cpp\ -src/static/mapper/MapperRev.cpp\ -src/static/permutation/perm.cpp\ -src/static/permutation/PermutationBuilderMRRR.cpp\ -src/static/permutation/PermutationBuilderWT.cpp\ -src/static/permutation/Permutation.cpp\ -src/static/permutation/PermutationMRRR.cpp\ -src/static/permutation/PermutationWT.cpp\ -src/static/sequence/BitmapsSequence.cpp\ -src/static/sequence/SequenceAlphPart.cpp\ -src/static/sequence/SequenceBuilderAlphPart.cpp\ -src/static/sequence/SequenceBuilderGMRChunk.cpp\ -src/static/sequence/SequenceBuilderGMR.cpp\ -src/static/sequence/SequenceBuilderStr.cpp\ -src/static/sequence/SequenceBuilderWaveletMatrix.cpp\ -src/static/sequence/SequenceBuilderWaveletTree.cpp\ -src/static/sequence/SequenceBuilderWaveletTreeNoptrs.cpp\ -src/static/sequence/SequenceBuilderWaveletTreeNoptrsS.cpp\ -src/static/sequence/Sequence.cpp\ -src/static/sequence/SequenceGMRChunk.cpp\ -src/static/sequence/SequenceGMR.cpp\ -src/static/sequence/WaveletMatrix.cpp\ -src/static/sequence/WaveletTree.cpp\ -src/static/sequence/WaveletTreeNoptrs.cpp\ -src/static/sequence/WaveletTreeNoptrsS.cpp\ -src/static/sequence/wt_coder_binary.cpp\ -src/static/sequence/wt_coder.cpp\ -src/static/sequence/wt_coder_huff.cpp\ -src/static/sequence/wt_node.cpp\ -src/static/sequence/wt_node_internal.cpp\ -src/static/sequence/wt_node_leaf.cpp\ -src/static/suffixtree/factorization.cpp\ -src/static/suffixtree/factorization_var.cpp\ -src/static/suffixtree/LCP.cpp\ -src/static/suffixtree/LCP_DAC.cpp\ -src/static/suffixtree/LCP_DAC_VAR.cpp\ -src/static/suffixtree/LCP_FMN.cpp\ -src/static/suffixtree/LCP_naive.cpp\ -src/static/suffixtree/LCP_PhiSpare.cpp\ -src/static/suffixtree/LCP_PT.cpp\ -src/static/suffixtree/LCP_Sad.cpp\ -src/static/suffixtree/NPR_CN.cpp\ -src/static/suffixtree/NPR.cpp\ -src/static/suffixtree/NPR_FMN.cpp\ -src/static/suffixtree/NSV.cpp\ -src/static/suffixtree/PSV.cpp\ -src/static/suffixtree/RMQ_succinct.cpp\ -src/static/suffixtree/RMQ_succinct_lcp.cpp\ -src/static/suffixtree/SuffixTree.cpp\ -src/static/suffixtree/SuffixTreeY.cpp\ -src/static/textindex/comparray4.cpp\ -src/static/textindex/mmap.cpp\ -src/static/textindex/qsufsort.cpp\ -src/static/textindex/suftest3.test.cpp\ -src/static/textindex/TextIndex.cpp\ -src/static/textindex/TextIndexCSA.cpp\ -src/utils/Array.cpp\ -src/utils/BitString.cpp\ -src/utils/cppUtils.cpp\ -src/utils/timing.cpp diff --git a/libcds/README b/libcds/README deleted file mode 100644 index 4ea46337..00000000 --- a/libcds/README +++ /dev/null @@ -1,12 +0,0 @@ -libcds implements low-level succinct data structures such as bitmaps, -sequences, permutations, etc. The main goal is to provide a set of -structures that form the building block of most compressed/succinct -solutions. In the near future we are planning to add compression -algorithms and support for succinct trees. - -You can find more information at http://libcds.recoded.cl/ - -Right now we are just fixing bugs and testing some new things in here, -but most of the effort is being put into libcds2, this rewrite aims at -solving many problems with 64bits systems. This is necessary in order -to index bigger inputs. \ No newline at end of file diff --git a/libcds/cds.pc.in b/libcds/cds.pc.in deleted file mode 100644 index ad88e76e..00000000 --- a/libcds/cds.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libcds -Description: CDS library -Version: 1.0.12 -URL: @PACKAGE_URL@ -Libs: -L${libdir} -lcds -Cflags: -I${includedir} diff --git a/libcds/docs/delete_me b/libcds/docs/delete_me deleted file mode 100644 index e69de29b..00000000 diff --git a/libcds/include/Array.h b/libcds/include/Array.h deleted file mode 100644 index e7814c3e..00000000 --- a/libcds/include/Array.h +++ /dev/null @@ -1,184 +0,0 @@ -/* array.h - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Array interface - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include -#include - -#ifndef ARRAY_H -#define ARRAY_H - -#include - -using namespace std; - -namespace cds_utils -{ - /** Class for arrays with variable bit-width - * @author Francisco Claude - */ - class Array - { - public: - class ArrayModifier - { - protected: - uint * data; - size_t len; - uint bitsPerItem; - size_t pos; - public: - ArrayModifier(uint * _data, size_t _len, uint _bitsPerItem, size_t _pos) - : data(_data), len(_len), bitsPerItem(_bitsPerItem), pos(_pos) {} - inline uint operator=(const uint v) { - set_field(data, bitsPerItem, pos, v); - return v; - } - }; - public: - /** Reads and Array from a file stream - * @param input input file stream - */ - Array(istream & input); - - /** Creates an array from a vector - * @param A vector with the elements - * @bpe bits per element - */ - Array(const vector & A, uint bpe=0); - - /** Creates an array from a vector iterator - * @param ini initial position - * @param fin final position - * @bpe bits per element - */ - Array(const vector::iterator & ini, const vector::iterator & fin, uint bpe=0); - - /** Creates an array from a set iterator - * @param ini initial position - * @param fin final position - * @bpe bits per element - */ - Array(const set::iterator & ini, const set::iterator & fin, uint bpe=0); - - /** Creates an array copying part of a previously existing array - * @param A source array - * @param n length of the source array - * @param bpe bits per element (0 uses the max in A[i,j] - */ - Array(uint * A, size_t n, uint bpe = 0); - - /** Creates an array copying part of a previously existing array - * @param A source array - * @param i initial position - * @param j final position - * @param bpe bits per element (0 uses the max in A[i,j] - */ - Array(uint * A, size_t i, size_t j, uint bpe = 0); - - /** Creates and array with n elements that can store elements between 0 and _maxValue - * @param n length (in elements) of the array - * @param _maxValue maximum value that could be stored in the array - */ - Array(size_t n, uint _maxValue); - - /** Destroys the array */ - ~Array(); - - /** Retrieves Array[pos] - * @paran pos position - * @return Array[pos] - */ - inline uint getField(const size_t pos) const - { - assert(pos - -#define RRR02_HDR 2 -#define BRW32_HDR 3 -#define RRR02_LIGHT_HDR 4 -#define SDARRAY_HDR 5 -#define DARRAY_HDR 6 -#define BS375_HDR 7 - -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -namespace cds_static -{ - - /** Base class for static bitsequences, contains many abstract functions, so this can't - * be instantiated. It includes base implementations for rank0, select0 and select1 based - * on rank0. - * - * @author Francisco Claude - */ - class BitSequence - { - - public: - virtual ~BitSequence() {}; - - /** Returns the number of zeros until position i */ - virtual size_t rank0(const size_t i) const; - - /** Returns the position of the i-th zero - * @return (size_t)-1 if i=0, len if i>num_zeros or the position */ - virtual size_t select0(const size_t i) const; - - /** Returns the number of ones until position i */ - virtual size_t rank1(const size_t i) const; - - /** Returns the position of the i-th one - * @return (size_t)-1 if i=0, len if i>num_ones or the position */ - virtual size_t select1(const size_t i) const; - - /** Return the first position starting at i that contains a 1. - * In case there are no more ones in the bitsequence, the function - * returns the length of the bitmap - */ - virtual size_t selectNext1(const size_t i) const; - - /** Return the first position starting at i that contains a 0. - * In case there are no more zeros in the bitsequence, the function - * returns the length of the bitmap - */ - virtual size_t selectNext0(const size_t i) const; - - /** Return the first position starting at i moving to the left that contains a 1. - * In case there are no more ones to the left in the bitsequence, the function - * returns (size_t)-1. - */ - virtual size_t selectPrev1(const size_t i) const; - - /** Return the first position starting at i moving to the left that contains a 0. - * In case there are no more zeros to the left in the bitsequence, the function - * returns (size_t)-1. - */ - virtual size_t selectPrev0(const size_t i) const; - - /** Returns the i-th bit */ - virtual bool access(const size_t i) const; - virtual bool access(const size_t i, size_t &r) const; - - /** Returns the length in bits of the bitmap */ - virtual size_t getLength() const; - - /** Returns how many ones are in the bitstring */ - virtual size_t countOnes() const; - - /** Returns how many zeros are in the bitstring */ - virtual size_t countZeros() const; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const=0; - - /** Stores the bitmap given a file pointer*/ - virtual void save(ostream & fp) const=0; - - /** Reads a bitmap determining the type */ - static BitSequence * load(istream & fp); - - protected: - /** Length of the bitstring */ - size_t length; - /** Number of ones in the bitstring */ - size_t ones; - - }; - -}; - -#include -#include -#include -#include -#endif /* _STATIC_BITSEQUENCE_H */ diff --git a/libcds/include/BitSequenceBuilder.h b/libcds/include/BitSequenceBuilder.h deleted file mode 100644 index e015af2a..00000000 --- a/libcds/include/BitSequenceBuilder.h +++ /dev/null @@ -1,59 +0,0 @@ -/* BitSequenceBuilder.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSEQUENCEBUILDER_H -#define BITSEQUENCEBUILDER_H - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - /** Base class for BitSequence builders, it defines the build function - * that takes only a bitmap. The parameters for construction are can - * be set in any way by the builder, but none are received when - * the actual building takes place. - * - * @author Francisco Claude - */ - class BitSequenceBuilder - { - public: - BitSequenceBuilder() { userCount=0; } - virtual ~BitSequenceBuilder() {} - virtual void use() { userCount++; } - virtual void unuse() { userCount--; assert(userCount>=0); if(userCount==0) delete this; } - virtual BitSequence * build(uint * bitseq, size_t len) const = 0; - virtual BitSequence * build(const BitString & bs) const = 0; - - protected: - int userCount; - }; -}; - -#include -#include -#include -#include -#endif diff --git a/libcds/include/BitSequenceBuilderDArray.h b/libcds/include/BitSequenceBuilderDArray.h deleted file mode 100644 index c31eb423..00000000 --- a/libcds/include/BitSequenceBuilderDArray.h +++ /dev/null @@ -1,47 +0,0 @@ -/* BitSequenceBuilderDArray.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Rodrigo Canovas - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSEQUENCEBUILDERDARRAY_H -#define BITSEQUENCEBUILDERDARRAY_H - -#include -#include -#include - -namespace cds_static -{ - /** Base class for BitSequence builders, it defines the build function - * that takes only a bitmap. The parameters for construction are can - * be set in any way by the builder, but none are received when - * the actual building takes place. - * - * @author Rodrigo Canovas - */ - class BitSequenceBuilderDArray : public BitSequenceBuilder - { - public: - BitSequenceBuilderDArray(); - virtual ~BitSequenceBuilderDArray(); - virtual BitSequence * build(uint * bitseq, size_t len) const; - virtual BitSequence * build(const BitString & bs) const; - }; -}; -#endif diff --git a/libcds/include/BitSequenceBuilderRG.h b/libcds/include/BitSequenceBuilderRG.h deleted file mode 100644 index 7f64e1a8..00000000 --- a/libcds/include/BitSequenceBuilderRG.h +++ /dev/null @@ -1,46 +0,0 @@ -/* BitSequenceBuilderRG.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSEQUENCEBUILDERRG_H -#define BITSEQUENCEBUILDERRG_H - -#include -#include -#include - -namespace cds_static -{ - /** BitSequence builder for BitSequenceRG - * - * @author Francisco Claude - */ - class BitSequenceBuilderRG : public BitSequenceBuilder - { - public: - BitSequenceBuilderRG(uint factor); - virtual ~BitSequenceBuilderRG() {} - virtual BitSequence * build(uint * bitseq, size_t len) const; - virtual BitSequence * build(const BitString & bs) const; - protected: - uint factor; - }; -}; -#endif diff --git a/libcds/include/BitSequenceBuilderRRR.h b/libcds/include/BitSequenceBuilderRRR.h deleted file mode 100644 index e9fb0655..00000000 --- a/libcds/include/BitSequenceBuilderRRR.h +++ /dev/null @@ -1,48 +0,0 @@ -/* BitSequenceBuilderRRR.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSEQUENCEBUILDERRRR_H -#define BITSEQUENCEBUILDERRRR_H - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - /** BitSequence builder for RRR BitSequences. - * - * @author Francisco Claude - */ - class BitSequenceBuilderRRR : public BitSequenceBuilder - { - public: - BitSequenceBuilderRRR(uint sample_rate); - virtual ~BitSequenceBuilderRRR() {} - virtual BitSequence * build(uint * bitseq, size_t len) const; - virtual BitSequence * build(const BitString & bs) const; - protected: - uint sample_rate; - }; -}; -#endif diff --git a/libcds/include/BitSequenceBuilderSDArray.h b/libcds/include/BitSequenceBuilderSDArray.h deleted file mode 100644 index edf83141..00000000 --- a/libcds/include/BitSequenceBuilderSDArray.h +++ /dev/null @@ -1,47 +0,0 @@ -/* BitSequenceBuilderSDArray.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSEQUENCEBUILDERSDARRAY_H -#define BITSEQUENCEBUILDERSDARRAY_H - -#include -#include -#include - -namespace cds_static -{ - /** Base class for BitSequence builders, it defines the build function - * that takes only a bitmap. The parameters for construction are can - * be set in any way by the builder, but none are received when - * the actual building takes place. - * - * @author Francisco Claude - */ - class BitSequenceBuilderSDArray : public BitSequenceBuilder - { - public: - BitSequenceBuilderSDArray(); - virtual ~BitSequenceBuilderSDArray(); - virtual BitSequence * build(uint * bitseq, size_t len) const; - virtual BitSequence * build(const BitString & bs) const; - }; -}; -#endif diff --git a/libcds/include/BitSequenceDArray.h b/libcds/include/BitSequenceDArray.h deleted file mode 100644 index 3745f61d..00000000 --- a/libcds/include/BitSequenceDArray.h +++ /dev/null @@ -1,74 +0,0 @@ -/* BitSequenceSDArray.h - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This class is a wrapper for the file sdarraySadakane, - * implemented by K. Sadakane. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _BITSEQUENCEDARRAY_H -#define _BITSEQUENCEDARRAY_H - -#include -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - class BitSequenceDArray: public BitSequence - { - - public: - /** Builds the DArray (Sadakane's dense version for rank/select*/ - BitSequenceDArray(const BitString & bs); - /** Builds the DArray */ - BitSequenceDArray(uint * buff, size_t len); - virtual ~BitSequenceDArray(); - virtual size_t select1(const size_t i) const; - virtual size_t rank0(const size_t i) const; - virtual size_t rank1(const size_t i) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static BitSequenceDArray * load(istream & fp); - - protected: - uint m; //number of 1's - uint nl, s_ss, s_sl; - uint *a; //bitarray - uint *lp; - uint *sl; - uint *ss; - uint *p; - uint *rl; - uchar *rs; - - /** Internal building function, same parameters as the base constructor. */ - void build(uint *buff, size_t len); - - /** Protected constructor for loaders, you have to initialize data before - *using an object built with this constructor. - */ - BitSequenceDArray(); - - }; -}; -#endif diff --git a/libcds/include/BitSequenceRG.h b/libcds/include/BitSequenceRG.h deleted file mode 100644 index bd18cf43..00000000 --- a/libcds/include/BitSequenceRG.h +++ /dev/null @@ -1,101 +0,0 @@ -/* BitSequenceRG.h - Copyright (C) 2005, Rodrigo Gonzalez, all rights reserved. - - New RANK, SELECT, SELECT-NEXT and SPARSE RANK implementations. - Adaptation to libcds by Francisco Claude - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef _STATIC_BITSEQUENCE_BRW32_H -#define _STATIC_BITSEQUENCE_BRW32_H - -#include -#include -#include - -namespace cds_static -{ - - ///////////// - //Rank(B,i)// - ///////////// - //_factor = 0 => s=W*lgn - //_factor = P => s=W*P - //Is interesting to notice - //factor=2 => overhead 50% - //factor=3 => overhead 33% - //factor=4 => overhead 25% - //factor=20=> overhead 5% - - /** Implementation of Rodrigo Gonzalez et al. practical rank/select solution [1]. - * The interface was adapted. - * - * [1] Rodrigo Gonzalez, Szymon Grabowski, Veli Makinen, and Gonzalo Navarro. - * Practical Implementation of Rank and Select Queries. WEA05. - * - * @author Rodrigo Gonzalez - */ - class BitSequenceRG : public BitSequence - { - private: - //bool owner; - size_t n,integers; - size_t factor,b,s; - uint *Rs; //superblock array - - //uso interno para contruir el indice rank - size_t BuildRankSub(size_t ini,size_t fin); - void BuildRank(); //crea indice para rank - BitSequenceRG(); - size_t SpaceRequirementInBits() const; - size_t SpaceRequirement() const; - - public: - uint *data; - /** Build the BitSequenceRG with a sampling factor factor - * The factor value has to be either 2,3,4 or 20, being the first one the fastest/bigger. - */ - BitSequenceRG(uint *bitarray, size_t n, uint factor); - - /** Build the BitSequenceRG with a sampling factor factor - * The factor value has to be either 2,3,4 or 20, being the first one the fastest/bigger. - */ - BitSequenceRG(const BitString & bs, uint factor); - - ~BitSequenceRG(); //destructor - - virtual bool access(const size_t i) const; - //Nivel 1 bin, nivel 2 sec-pop y nivel 3 sec-bit - virtual size_t rank1(const size_t i) const; - - // gives the largest index i<=start such that IsBitSet(i)=true - virtual size_t selectPrev1(const size_t start) const; - // gives the smallest index i>=start such that IsBitSet(i)=true - virtual size_t selectNext1(const size_t start) const; - // gives the position of the x:th 1. - virtual size_t select0(const size_t x) const; - // gives the position of the x:th 1. - virtual size_t select1(const size_t x) const; - virtual size_t getSize() const; - - /*load-save functions*/ - virtual void save(ostream & f) const; - static BitSequenceRG * load(istream & f); - }; - -} -#endif diff --git a/libcds/include/BitSequenceRRR.h b/libcds/include/BitSequenceRRR.h deleted file mode 100644 index 5c2a4598..00000000 --- a/libcds/include/BitSequenceRRR.h +++ /dev/null @@ -1,126 +0,0 @@ -/* BitSequenceRRR.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * RRR02 Bitsequence - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _STATIC_BITSEQUENCE_RRR02_H -#define _STATIC_BITSEQUENCE_RRR02_H - -#include -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - // block size can't be changed in this implementation - // it would require more than just changing the constant - #define BLOCK_SIZE 15 - - #define DEFAULT_SAMPLING 32 - - /** Implementation of Raman, Raman and Rao's [1] proposal for rank/select capable - * data structures, it achieves space nH_0, O(sample_rate) time for rank and O(log len) - * for select. The practial implementation is based on [2] - * - * [1] R. Raman, V. Raman and S. Rao. Succinct indexable dictionaries with applications - * to encoding $k$-ary trees and multisets. SODA02. - * [2] F. Claude and G. Navarro. Practical Rank/Select over Arbitrary Sequences. SPIRE08. - * - * @author Francisco Claude - */ - class BitSequenceRRR : public BitSequence - { - public: - /** Builds an RRR bitsequence. - * @param bitseq bitstring - * @param len lenght of the bitstring - * @param sample_rate sampling for partial sums - */ - BitSequenceRRR(uint * bitseq, size_t len, uint sample_rate=DEFAULT_SAMPLING); - - /** Builds an RRR bitsequence. - * @param bs bitstring - * @param sample_rate sampling for partial sums - */ - BitSequenceRRR(const BitString & bs, uint sample_rate=DEFAULT_SAMPLING); - - virtual ~BitSequenceRRR(); - - virtual size_t rank0(const size_t i) const; - - virtual size_t rank1(const size_t i) const; - - virtual size_t select0(const size_t i) const; - - virtual size_t select1(const size_t i) const; - - virtual bool access(const size_t i) const; - - virtual bool access(const size_t i, size_t &r) const; - - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - /** Reads the bitmap from a file pointer, returns NULL in case of error */ - static BitSequenceRRR * load(istream & fp); - - /** Creates a new sampling for the queries */ - void create_sampling(uint sampling_rate); - - /** Frees the space required by the table E, which is static and global - * to all instances. - */ - static void delete_E() { - delete E; - } - - protected: - /** Internal building function, same parameters as the base constructor. */ - void build(const uint * bitseq, size_t len, uint sample_rate=DEFAULT_SAMPLING); - - /** Protected constructor for loaders, you have to initialize data before - * using an object built with this constructor. - */ - BitSequenceRRR(); - - /** Classes and offsets */ - uint *C, *O; - /** Length of C and O (in uints) */ - uint C_len, O_len; - /** Bits required per field for C and in total for O */ - uint C_field_bits, O_bits_len; - /** C and O samplings */ - uint *C_sampling, *O_pos; - /** Length of the samplings */ - uint C_sampling_len,O_pos_len; - /** Lenght in bits per field */ - uint C_sampling_field_bits,O_pos_field_bits; - /** Sample rate */ - uint sample_rate; - - static table_offset * E; - }; - -} -#endif /* _STATIC_BITSEQUENCE_RRR02_H */ diff --git a/libcds/include/BitSequenceSDArray.h b/libcds/include/BitSequenceSDArray.h deleted file mode 100644 index c0657a9b..00000000 --- a/libcds/include/BitSequenceSDArray.h +++ /dev/null @@ -1,60 +0,0 @@ -/* BitSequenceSDArray.h - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This class is a wrapper for the file sdarraySadakane, - * implemented by K. Sadakane. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _BITSEQUENCESDARRAY_H -#define _BITSEQUENCESDARRAY_H - -#include -#include -#include -#include - -#include -using namespace cds_utils; - -namespace cds_static -{ - class BitSequenceSDArray: public BitSequence - { - - public: - /** Builds the SDArray */ - BitSequenceSDArray(const BitString & bs); - /** Builds the SDArray */ - BitSequenceSDArray(uint * buff, size_t len); - virtual ~BitSequenceSDArray(); - virtual size_t select1(const size_t i) const; - virtual size_t rank1(const size_t i) const; - virtual size_t selectNext1(const size_t i) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static BitSequenceSDArray * load(istream & fp); - - protected: - selects3 sd; - BitSequenceSDArray(); - - }; -}; -#endif diff --git a/libcds/include/BitString.h b/libcds/include/BitString.h deleted file mode 100644 index 6d2f9bb6..00000000 --- a/libcds/include/BitString.h +++ /dev/null @@ -1,114 +0,0 @@ -/* BitString.h - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * BitString definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BITSTRING_H -#define BITSTRING_H - -#include - -#include - -using namespace std; - -namespace cds_utils -{ - /** BitString class - * @author Francisco Claude - */ - class BitString - { - public: - - /** Reads a BitString from a file stream - * @param input input file stream - */ - BitString(istream & input); - - /** Creates a BitString with len bits of space */ - BitString(const size_t len); - - /** Creates a bitmap from a vector (up to len bits) */ - BitString(const vector fields, const size_t len); - - /** Creates a bitmap from an array (len bits) */ - BitString(const uint * array, const size_t len); - - /** Destroys a bitmap */ - ~BitString(); - - /** Sets the pos-th bit - * @param pos position - * @param bit value [0-1] - */ - inline void setBit(const size_t pos, const bool bit=true) { - if(bit) bitset(data,pos); - else bitclean(data,pos); - } - - /** Gets the pos-th bit - * @param pos position - */ - inline bool getBit(const size_t pos) const - { - return bitget(data,pos); - } - - /** operator [] for getBit - */ - inline bool operator[](const size_t pos) const - { - return bitget(data,pos); - } - - /** Saves the bitmap to a file - * @param out file stream - */ - void save(ostream & out) const; - - /** Returns the size in bytes of the BitString */ - inline size_t getSize() const - { - return uintLength*sizeof(uint)+sizeof(this); - } - - /** Returns the length in bits of the BitString */ - inline size_t getLength() const - { - return length; - } - - /** Returns a pointer to the buffer storing the values - */ - inline uint * getData() const - { - return data; - } - - protected: - size_t length; - size_t uintLength; - uint * data; - - /** Initializes the class fields */ - void initData(const size_t len); - }; -}; -#endif diff --git a/libcds/include/BitmapsSequence.h b/libcds/include/BitmapsSequence.h deleted file mode 100644 index e4879d03..00000000 --- a/libcds/include/BitmapsSequence.h +++ /dev/null @@ -1,73 +0,0 @@ -/* static_sequence.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * static_sequence definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _BITMAPSSEQUENCE_H -#define _BITMAPSSEQUENCE_H - -#include -#include -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - /** static_sequence represented using one bitmap per symbol, doesn't support efficient access - * - * @author Francisco Claude - */ - class BitmapsSequence : public Sequence - { - - public: - BitmapsSequence(uint * seq, size_t n, Mapper * am, BitSequenceBuilder * bsb); - BitmapsSequence(const Array & a, Mapper * am, BitSequenceBuilder * bsb); - - virtual ~BitmapsSequence(); - - virtual size_t rank(uint c, size_t i) const; - - virtual size_t select(uint c, size_t i) const; - virtual size_t selectNext(uint c, size_t i) const; - - virtual uint access(size_t i) const; - - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - /** Reads a bitmap determining the type */ - static BitmapsSequence * load(istream & fp); - - protected: - uint sigma; - BitSequence ** bitmaps; - Mapper * am; - - BitmapsSequence(); - - }; - -}; -#endif /* _BITMAPSSEQUENCE_H */ diff --git a/libcds/include/Coder.h b/libcds/include/Coder.h deleted file mode 100644 index 8f1d4bd7..00000000 --- a/libcds/include/Coder.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Coder.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef CODER_H -#define CODER_H - -#include -#include -namespace cds_static -{ - - class Coder - { - public: - virtual size_t encode(uint symb, uint * stream, size_t pos) const = 0; - virtual size_t decode(uint * symb, uint *stream, size_t pos) const = 0; - virtual size_t maxLength() const = 0; - virtual size_t getSize() const = 0; - virtual void save(ostream & fp) const = 0; - static Coder * load(istream & fp); - }; - -}; - -#include -#endif diff --git a/libcds/include/HuffmanCoder.h b/libcds/include/HuffmanCoder.h deleted file mode 100644 index 2a086d87..00000000 --- a/libcds/include/HuffmanCoder.h +++ /dev/null @@ -1,77 +0,0 @@ -/* HuffmanCoder.h - Copyright (C) 2008, Francisco Claude, all rights reserved. - - Wrapper for huff written by Gonzalo Navarro - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef HUFFMAN_CODES_H -#define HUFFMAN_CODES_H - -#include -#include -#include -#include - -using namespace cds_utils; -namespace cds_static -{ - - #define HUFF_HDR 1 - - /** Wrapper for the canonical huffman implementation of Gonzalo Navarro. - * - * @author Francisco Claude - */ - class HuffmanCoder : public Coder - { - - public: - /** Creates the codes for the sequence seq of length n */ - HuffmanCoder(uint * seq, size_t n); - HuffmanCoder(uchar * seq, size_t n); - HuffmanCoder(Array & seq); - - virtual ~HuffmanCoder(); - - /** Encodes symb into stream at bit-position pos, - * returns the ending position (bits) */ - virtual size_t encode(uint symb, uint * stream, size_t pos) const; - - /** decodes into symb from stream at bit-position - * pos, returns the new position */ - virtual size_t decode(uint * symb, uint * stream, size_t pos) const; - - /** Returns the maximum length of a code */ - virtual size_t maxLength() const; - - /** Returns the size of the table */ - virtual size_t getSize() const; - - /** Saves the coder to a file */ - virtual void save(ostream & fp) const; - - /** Loads a coder from a file */ - static HuffmanCoder * load(istream & fp); - - protected: - HuffmanCoder(); - THuff huff_table; - }; - -}; -#endif diff --git a/libcds/include/LCP.h b/libcds/include/LCP.h deleted file mode 100644 index 9af2015e..00000000 --- a/libcds/include/LCP.h +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _LCP_H -#define _LCP_H - -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -namespace cds_static -{ - - static const size_t NAIVE = 2; - static const size_t SAD_GON_OS = 3; - static const size_t FMN_RRR_OS = 4; - static const size_t PT = 5; - static const size_t PHI = 6; - static const size_t DAC = 7; - static const size_t DAC_VAR = 8; - - /** Base class for LCP, contains many abstract functions, so this can't - * be instantiated. - * @author Rodrigo Cnovas - */ - class LCP - { - public: - size_t lcp_type; - - virtual ~LCP() {}; - - /**Return LCP[i], being faster if sequential acceses to the LCP had been done*/ - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const=0; - - /**Return LCP[i]*/ - virtual size_t get_LCP(size_t i, TextIndex *csa) const= 0; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const= 0; - - /**compute the LCP array, using Karkkainen, Manzini, and Puglisi (2009) Algorithm - * @param csa The Compressed Suffix Array - * @param text The text - * @param n The length of the text - * @param q Sample interval*/ - virtual uint * create_lcp(TextIndex *csa, char *text, uint n, int q) const; - - /** Stores the structure given a file pointer*/ - virtual void save(ostream & fp) const=0; - - /** Reads a LCP determining the type */ - static LCP * load(istream & fp); - }; -}; - -#include -#include -#include -#include -#include -#include -#include -#endif diff --git a/libcds/include/LCP_DAC.h b/libcds/include/LCP_DAC.h deleted file mode 100644 index 9c758df4..00000000 --- a/libcds/include/LCP_DAC.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_DAC_H -#define LCP_DAC_H - -#include -#include - -namespace cds_static -{ - - class LCP_DAC: public LCP - { - - private: - size_t *next_p; //usefull for get_seq_LCP - factorization *rep; - LCP_DAC(); - - public: - size_t n; - - /* LCP encoding using Susana's static factorization, - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * */ - LCP_DAC(TextIndex *csa, char *text, size_t n); - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static LCP_DAC * load(istream & fp); - virtual ~LCP_DAC(); - }; -}; -#endif diff --git a/libcds/include/LCP_DAC_VAR.h b/libcds/include/LCP_DAC_VAR.h deleted file mode 100644 index c8690bf9..00000000 --- a/libcds/include/LCP_DAC_VAR.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_DAC_VAR_H -#define LCP_DAC_VAR_H - -#include -#include - -namespace cds_static -{ - - class LCP_DAC_VAR: public LCP - { - private: - LCP_DAC_VAR(); - - factorization_var *rep; - size_t *next_p_var; - - public: - size_t n; - - /*Compute the "optimal" block size given an array of frequencies - * @param max_lcp Maximun value in the array - * @param frec_acu Array that contain the acumulate frequency - * @param kvalues Array where the block sizes obtained will be stored - * @param nkvalues Size of the array kvalues - * */ - void calc_kvalues(uint max_lcp, uint *frec_acu, ushort **kvalues, uint *nkvalues) const; - - /* LCP encoding using Susana's factorization_var, - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * */ - LCP_DAC_VAR(TextIndex *csa, char *text, size_t n); - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static LCP_DAC_VAR * load(istream & fp); - virtual ~LCP_DAC_VAR(); - }; - -}; -#endif diff --git a/libcds/include/LCP_FMN.h b/libcds/include/LCP_FMN.h deleted file mode 100644 index a0780c8e..00000000 --- a/libcds/include/LCP_FMN.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_FMN_H -#define LCP_FMN_H - -#include -#include - -using namespace cds_static; - -namespace cds_static -{ - - class LCP_FMN: public LCP - { - private: - LCP_FMN(); - virtual void generate_OZ(BitSequence *U, uint **O, uint **Z, uint length); - - BitSequence *O, *Z; - size_t b_length; //length of the bitmaps - size_t OZ_type; - - public: - - /*Johannes, Veli & Gonzalo LCP encode - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * @param op_rs Choose rank/select implementation that will be used (must be RRR02_HDR or SDARRAY_HDR) - * */ - LCP_FMN(TextIndex *csa, char *text, size_t n, size_t op_rs=RRR02_HDR); - - LCP_FMN(LCP *lcp, TextIndex *csa, size_t n, size_t op_rs=RRR02_HDR); - - /**Return LCP[i]*/ - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - - /**Return LCP[i], being faster if sequential acceses to the LCP had been done*/ - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const; - - /** Stores the structure given a file pointer, return 0 in case of success */ - virtual void save(ostream & fp) const; - - /** Reads a LCP determining the type */ - static LCP_FMN * load(istream & fp); - - virtual ~LCP_FMN(); - }; -}; -#endif diff --git a/libcds/include/LCP_PT.h b/libcds/include/LCP_PT.h deleted file mode 100644 index abc3f4ba..00000000 --- a/libcds/include/LCP_PT.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_PT_H -#define LCP_PT_H - -#include -#include - -namespace cds_static -{ - - class LCP_PT: public LCP - { - private: - LCP_PT(); - - virtual int calc_delta(unsigned int i, unsigned int j) const; - - int logv; - size_t length; - int mask; - int v; - int m; /*size of rev_ess*/ - int *rev_cover; - int *delta; - int cover_size; - int *rev_ess; - RMQ_succinct *rmq; - - public: - /*Puglisi and Turpin encoding of the LCP, - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * @param _logv logarithm (base 2) of the period of the difference cover you would like to use. Valid values for "logv" are 2,3,4,5,6,7 and 8 - * */ - LCP_PT(TextIndex *csa, char *text, size_t n, int _logv=8); - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static LCP_PT * load(istream & fp); - virtual ~LCP_PT(); - }; -}; -#endif diff --git a/libcds/include/LCP_PhiSpare.h b/libcds/include/LCP_PhiSpare.h deleted file mode 100644 index 14a2a893..00000000 --- a/libcds/include/LCP_PhiSpare.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_PHISPARE_H -#define LCP_PHISPARE_H - -#include - -namespace cds_static -{ - - class LCP_PhiSpare: public LCP - { - private: - int q; - size_t n; //length of LCP - int *plcp; //psi lcp - - LCP_PhiSpare(); - - public: - /*Karkkainen, Manzini, and Puglisi encoding of the LCP, - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * @param _q The sample period to use (if q = -1 its mean that we will not use any sample) - * */ - LCP_PhiSpare(TextIndex *csa, char *text, size_t _n, int _q = 32); - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static LCP_PhiSpare * load(istream & fp); - virtual ~LCP_PhiSpare(); - }; -}; -#endif diff --git a/libcds/include/LCP_Sad.h b/libcds/include/LCP_Sad.h deleted file mode 100644 index 40f72f24..00000000 --- a/libcds/include/LCP_Sad.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_SAD_H -#define LCP_SAD_H - -#include -#include - -namespace cds_static -{ - class LCP_Sad: public LCP - { - private: - LCP_Sad(); - size_t U_type; - - public: - BitSequence *U; - size_t U_length; //length of bitmap U - - /*Create Sadakane encoding of the LCP, that use 2n+o(n) bits, - * @param csa The compressed suffix array of the text - * @param text The text - * @param n The length of the text - * */ - LCP_Sad(TextIndex *csa, char *text, size_t n, size_t op_rs = BRW32_HDR); - - /*Create the LCP representation starting from a precomputed LCP array*/ - LCP_Sad(LCP *lcp, TextIndex *csa, size_t n, size_t op_rs = BRW32_HDR); - - /**Return LCP[i]*/ - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - - /**Return LCP[i], being faster if sequential acceses to the LCP had been done*/ - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const; - - /** Stores the structure given a file pointer*/ - virtual void save(ostream & fp) const; - - /** Reads a LCP determining the type */ - static LCP_Sad * load(istream & fp); - - virtual ~LCP_Sad(); - }; -}; -#endif diff --git a/libcds/include/LCP_naive.h b/libcds/include/LCP_naive.h deleted file mode 100644 index 911ea210..00000000 --- a/libcds/include/LCP_naive.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LCP_NAIVE_H -#define LCP_NAIVE_H - -#include - -namespace cds_static -{ - - class LCP_naive: public LCP - { - private: - LCP_naive(); - uint *lcp_array; - size_t b; - size_t length; - - public: - - LCP_naive(TextIndex *csa, char *text, size_t n); - - /**Return LCP[i]*/ - virtual size_t get_LCP(size_t i, TextIndex *csa) const; - - /**Return LCP[i], being faster if sequential acceses to the LCP had been done*/ - virtual size_t get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const; - - /** Stores the structure given a file pointer, return 0 in case of success */ - virtual void save(ostream & fp) const; - - /** Reads a LCP determining the type */ - static LCP_naive * load(istream & fp); - - virtual ~LCP_naive(); - }; -}; -#endif diff --git a/libcds/include/Mapper.h b/libcds/include/Mapper.h deleted file mode 100644 index 950c0cf9..00000000 --- a/libcds/include/Mapper.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Mapper.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Mapper definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _MAPPER_H -#define _MAPPER_H - -#include -#include - -using namespace std; - -namespace cds_static -{ - - #define MAPPER_NONE_HDR 2 - #define MAPPER_CONT_HDR 3 - #define MAPPER_REV_HDR 4 - - /** Base class for alphabet mappers - * - * @author Francisco Claude - */ - class Mapper - { - public: - Mapper(); - virtual ~Mapper() {} - /** Maps the symbol */ - virtual uint map(uint s) const=0; - /** Unmaps the symbol */ - virtual uint unmap(uint s) const=0; - /** Returns the size of the mapper */ - virtual size_t getSize() const=0; - /** Saves the mapper to a file */ - virtual void save(ostream & out) const=0; - /** Loads the mapper from a file */ - static Mapper * load(istream & input); - /** Reference counter incrementor */ - virtual void use(); - /** Reference counter decrementor */ - virtual void unuse(); - - protected: - /** Nr of references */ - int userCount; - }; -}; - -#include -#include -#include -#endif /* _MAPPER_H */ diff --git a/libcds/include/MapperCont.h b/libcds/include/MapperCont.h deleted file mode 100644 index 9b93d2c0..00000000 --- a/libcds/include/MapperCont.h +++ /dev/null @@ -1,64 +0,0 @@ -/* mapper_cont.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * mapper_cont definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _MAPPERCONT_H -#define _MAPPERCONT_H - -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -namespace cds_static -{ - - /** Mapper that makes the values in the set contiguous - * - * @author Francisco Claude - */ - class MapperCont : public Mapper - { - public: - MapperCont(const Array & seq, const BitSequenceBuilder & bsb); - MapperCont(const uint * A, const size_t len, const BitSequenceBuilder & bsb); - - virtual ~MapperCont(); - - virtual uint map(uint s) const; - virtual uint unmap(uint s) const; - virtual size_t getSize() const; - - virtual void save(ostream & out) const; - static MapperCont * load(istream & input); - - protected: - MapperCont(); - BitSequence * m; - }; - -}; -#endif /* _MAPPERCONT_H */ diff --git a/libcds/include/MapperNone.h b/libcds/include/MapperNone.h deleted file mode 100644 index 3c267050..00000000 --- a/libcds/include/MapperNone.h +++ /dev/null @@ -1,51 +0,0 @@ -/* MapperNone.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * MapperNone definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _MAPPERNONE_H -#define _MAPPERNONE_H - -#include - -#include -#include - -using namespace std; - -namespace cds_static -{ - - /** Mapper that doesn't change the value (identity) - * - * @author Francisco Claude - */ - class MapperNone : public Mapper - { - public: - MapperNone(); - virtual ~MapperNone() {} - virtual uint map(uint s) const; - virtual uint unmap(uint s) const; - virtual size_t getSize() const; - virtual void save(ostream & out) const; - static MapperNone * load(istream & input); - }; -}; -#endif /* __MAPPER_NONE_H */ diff --git a/libcds/include/MapperRev.h b/libcds/include/MapperRev.h deleted file mode 100644 index 13b50007..00000000 --- a/libcds/include/MapperRev.h +++ /dev/null @@ -1,61 +0,0 @@ -/* MapperRev.h - * Copyright (C) 2012, Francisco Claude, all rights reserved. - * - * MapperRev definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _MAPPERREV_H -#define _MAPPERREV_H - -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -namespace cds_static -{ - - /** Mapper that reverses the bits (considering how many bits are required - * to represent the maximum value in the sequence) - * - * @author Francisco Claude - */ - class MapperRev : public Mapper - { - public: - MapperRev(const Array &a); - MapperRev(const uint *A, const size_t len); - virtual ~MapperRev() {} - virtual uint map(const uint s) const; - virtual uint unmap(const uint s) const; - virtual size_t getSize() const; - virtual void save(ostream & out) const; - static MapperRev * load(istream & input); - - protected: - MapperRev(); - uint bits; - }; -}; -#endif /* __MAPPER_REV_H */ diff --git a/libcds/include/NPR.h b/libcds/include/NPR.h deleted file mode 100644 index 3211ee82..00000000 --- a/libcds/include/NPR.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef NPR_H -#define NPR_H - -#include - -namespace cds_static -{ - - static const size_t FMN_NPR = 2; - static const size_t CN_NPR = 3; - - class NPR - { - public: - size_t npr_type; - - virtual ~NPR() {}; - - // Return the position of the next smaller value of i (NSV[i]) - virtual size_t find_NSV(size_t i, TextIndex *csa, LCP *lcp) const= 0; - - // Return the position of the previous smaller value of i plus one (PSV[i]+1) - virtual size_t find_PSV(size_t i, TextIndex *csa, LCP *lcp) const= 0; - - //Return the first previous position, from i, that contains a value < d - virtual size_t bwd_PSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const= 0; - - //Return the first next position, from i, that contains a value < d - virtual size_t fwd_NSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const= 0; - - //Return the range minimum query over the LCP array, between the positions x and y - virtual size_t find_RMQ(size_t x, size_t y, TextIndex *csa, LCP *lcp) const= 0; - - //Return the size, in bytes, of the NPR structure - virtual size_t getSize() const = 0; - - virtual void save(ostream & fp) const=0; - - static NPR * load(istream & fp); - }; - -}; -#include -#include -#endif diff --git a/libcds/include/NPR_CN.h b/libcds/include/NPR_CN.h deleted file mode 100644 index e1adad65..00000000 --- a/libcds/include/NPR_CN.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef NPR_CN_H -#define NPR_CN_H - -#include - -namespace cds_static -{ - /***************************** - There are r=(log(n)/log(b))-1 levels - ****************************/ - - class NPR_CN: public NPR - { - private: - NPR_CN(); - void create_first_level(LCP *lcp, TextIndex *csa); - void create_next_level(size_t r); - size_t find_NSV_level_r(size_t value_v, size_t next_pos, size_t r) const; - size_t find_PSV_level_r(size_t value_v, size_t next_pos, size_t r) const; - size_t find_RMQ(size_t x, size_t y, size_t r, size_t *min_r) const; - - size_t n; //size of lcp - size_t b; //block Size - size_t bits_b; //bits for representated b - size_t l; //number of levels - uint **min_level; //array for each level that contain the min value of each block - uint **min_pos; // array for each level that contain the local position of the min value of each block - uint *level_size; //size of each level - - public: - /*NPR Data structure base on Canovas and Navarro "Practical Compressed Suffix Trees" - * @param lcp Any LCP array data structure - * @param block_Size Block size that will be used - * @param csa The compresses suffix array - */ - NPR_CN(LCP *lcp, size_t block_Size, TextIndex *csa); - - virtual ~NPR_CN(); - - // Return the position of NSV[i] - virtual size_t find_NSV(size_t i, TextIndex *csa, LCP *lcp) const; - - // Return the position of PSV[i]+1 - virtual size_t find_PSV(size_t i, TextIndex *csa, LCP *lcp) const; - - virtual size_t bwd_PSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const; - - virtual size_t fwd_NSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const; - - //Return the left-most position j, x<= j <= y , where is the minimun in the range [x,y] - virtual size_t find_RMQ(size_t x, size_t y, TextIndex *csa, LCP *lcp) const; - - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - static NPR_CN * load(istream & fp); - - }; - -}; -#endif diff --git a/libcds/include/NPR_FMN.h b/libcds/include/NPR_FMN.h deleted file mode 100644 index 88103952..00000000 --- a/libcds/include/NPR_FMN.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef NPR_FMN_H -#define NPR_FMN_H - -#include -#include -#include -#include - -namespace cds_static -{ - - class NPR_FMN: public NPR - { - private: - NSV *nsv; - PSV *psv; - RMQ_succinct_lcp *rmq; - - NPR_FMN(); - - public: - - /*NPR Data structure base on Fisher, Makinnen, and Navarro "Faster Entropy-Bounded Compressed Suffix Trees" - * @param lcp Any LCP array data structure - * @param block_Size Block size that will be used - * @param csa The compresses suffix array - * @param levels Number of levels that the recursion will use. (in general is better to use only 2 or 3 levels) - * */ - NPR_FMN(LCP *lcp, size_t block_Size, TextIndex *csa, size_t levels = 2); - - virtual ~NPR_FMN(); - - virtual size_t find_NSV(size_t i, TextIndex *csa, LCP *lcp) const; - - virtual size_t find_PSV(size_t i, TextIndex *csa, LCP *lcp) const; - - virtual size_t bwd_PSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const; - - virtual size_t fwd_NSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const; - - virtual size_t find_RMQ(size_t x, size_t y, TextIndex *csa, LCP *lcp) const; - - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - static NPR_FMN * load(istream & fp); - }; - -}; -#endif diff --git a/libcds/include/NSV.h b/libcds/include/NSV.h deleted file mode 100644 index 4c7d8bec..00000000 --- a/libcds/include/NSV.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef NSV_H -#define NSV_H - -#include -#include - -namespace cds_static -{ - class NSV - { - - private: - NSV(); - virtual void create_first_level(LCP *lcp, TextIndex *csa); - virtual void create_level_r(LCP *lcp, size_t level, TextIndex *csa); - virtual void create_last_level(LCP *lcp, TextIndex *csa); - virtual size_t find_NSV_r(size_t v, size_t level, TextIndex *csa, LCP *lcp) const; - - size_t r; /*levels*/ - size_t b; /*block size*/ - size_t n; /*number of element of lcp*/ - BitSequence **P; /*bitarray with the pioneer for each level*/ - BitSequence **R; /*bitarray with the pioneer and their answers*/ - uint *A; /*stored values for the last level*/ - size_t b_A; /*bits needed per value in A*/ - - public: - - /*NSV Data structure base on Fisher, Makinnen, and Navarro "Faster Entropy-Bounded Compressed Suffix Trees" - * @param lcp Any LCP array data structure - * @param levels Number of levels that the recursion will use (in general is better to use only 2 or 3 levels). - * @param block Block size that will be used - * @param csa The compresses suffix array*/ - NSV(LCP *lcp, size_t levels, size_t block, TextIndex *csa); - - //return the position where is the NSV of v - virtual size_t find_NSV(size_t v, TextIndex *csa, LCP *lcp) const; - - //memory use for NSV in bytes - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - static NSV* load(istream & fp); - - virtual ~NSV(); - }; - -}; -#endif diff --git a/libcds/include/PSV.h b/libcds/include/PSV.h deleted file mode 100644 index 4a0636b4..00000000 --- a/libcds/include/PSV.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef PSV_H -#define PSV_H - -#include -#include - -namespace cds_static -{ - class PSV - { - - private: - PSV(); - virtual void create_first_level(LCP *lcp, TextIndex *csa); - virtual void create_level_r(LCP *lcp, size_t level, TextIndex *csa); - virtual void create_last_level(LCP *lcp, TextIndex *csa); - virtual size_t find_PSV_r(size_t v, size_t level, TextIndex *csa, LCP *lcp) const; - - size_t r; /*levels*/ - size_t b; /*block size*/ - size_t n; /*number of element of lcp*/ - BitSequence **P; /*bitarray with the pioneer for each level*/ - BitSequence **R; /*bitarray with the pioneer and their answers*/ - uint *A; /*stored values for the last level*/ - size_t b_A; /*bits needed per value in A*/ - - public: - /*PSV Data structure base on Fisher, Makinnen, and Navarro "Faster Entropy-Bounded Compressed Suffix Trees" - * @param lcp Any LCP array data structure - * @param levels Number of levels that the recursion will use (in general is better to use only 2 or 3 levels). - * @param block Block size that will be use - * @param csa The compresses suffix array*/ - PSV(LCP *lcp, size_t levels, size_t block, TextIndex *csa); - - //Return the position (plus 1) where is the PSV of v - virtual size_t find_PSV(size_t v, TextIndex *SA, LCP *lcp) const; - - //Memory use for PSV in bytes - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - static PSV* load(istream & fp); - - virtual ~PSV(); - }; - -}; -#endif diff --git a/libcds/include/Permutation.h b/libcds/include/Permutation.h deleted file mode 100644 index 90b2635d..00000000 --- a/libcds/include/Permutation.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Permutation.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#ifndef __PERMUTATION_H -#define __PERMUTATION_H - -using namespace cds_utils; - -namespace cds_static -{ - class Permutation - { - public: - Permutation(); - virtual ~Permutation(); - - /** Compute the value at position i - */ - virtual uint pi(uint i) const; - - /** Compute the position where i appears */ - virtual uint revpi(uint i) const; - - /** Compose pi k times. - */ - virtual uint pi(uint i, uint k) const; - - /** Compose revpi k times - */ - virtual uint revpi(uint i, uint k) const; - - /** retrieves the length of the permutation - */ - virtual size_t getLength() const; - - /** Size in bytes - */ - virtual size_t getSize() const = 0; - - /** Saves permutation to stream */ - virtual void save(ostream & fp) const; - - /** Loads the permutation */ - static Permutation * load(istream & fp); - - protected: - size_t length; - }; -}; - -#define MRRRPERM 1 -#define WTPERM 2 - -#include -#include -#endif diff --git a/libcds/include/PermutationBuilder.h b/libcds/include/PermutationBuilder.h deleted file mode 100644 index 56e276ec..00000000 --- a/libcds/include/PermutationBuilder.h +++ /dev/null @@ -1,46 +0,0 @@ -/* PermutationBuilder.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef PERMUTATIONBUILDER_H -#define PERMUTATIONBUILDER_H - -#include -#include - -namespace cds_static -{ - - class PermutationBuilder - { - public: - PermutationBuilder() { userCount=0; } - virtual ~PermutationBuilder() {} - virtual Permutation * build(uint * perm, uint n) const = 0; - virtual void use() { userCount++; } - virtual void unuse() { userCount--; assert(userCount>=0); if(userCount==0) delete this; } - - protected: - int userCount; - }; -}; - -#include -#include -#endif diff --git a/libcds/include/PermutationBuilderMRRR.h b/libcds/include/PermutationBuilderMRRR.h deleted file mode 100644 index f00ad3a7..00000000 --- a/libcds/include/PermutationBuilderMRRR.h +++ /dev/null @@ -1,42 +0,0 @@ -/* PermutationBuilderMRRR.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef PERMUTATIONBUILDERMRRR_H -#define PERMUTATIONBUILDERMRRR_H - -#include -#include -#include - -namespace cds_static -{ - - class PermutationBuilderMRRR : public PermutationBuilder - { - public: - PermutationBuilderMRRR(uint sample, BitSequenceBuilder * bmb); - virtual ~PermutationBuilderMRRR(); - virtual Permutation * build(uint * perm, uint len) const; - protected: - uint sample; - BitSequenceBuilder * bmb; - }; -}; -#endif diff --git a/libcds/include/PermutationBuilderWT.h b/libcds/include/PermutationBuilderWT.h deleted file mode 100644 index 623ebc9b..00000000 --- a/libcds/include/PermutationBuilderWT.h +++ /dev/null @@ -1,39 +0,0 @@ -/* PermutationBuilderWT.h - * Copyright (C) 2011, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef PERMUTATIONBUILDERWT_H -#define PERMUTATIONBUILDERWT_H - -#include -#include -#include - -namespace cds_static -{ - - class PermutationBuilderWT : public PermutationBuilder - { - public: - PermutationBuilderWT() {} - virtual ~PermutationBuilderWT() {} - virtual Permutation * build(uint * perm, uint len) const; - }; -}; -#endif diff --git a/libcds/include/PermutationMRRR.h b/libcds/include/PermutationMRRR.h deleted file mode 100644 index e1c0bf30..00000000 --- a/libcds/include/PermutationMRRR.h +++ /dev/null @@ -1,58 +0,0 @@ -/* PermutationMRRR.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Permutation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _STATIC_PERMUTATION_MRRR_H -#define _STATIC_PERMUTATION_MRRR_H - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - /** Wrapper for Diego Arroyuelo's implementation of Munro et al.'s permutations. - * @author Francisco Claude - */ - class PermutationMRRR : public Permutation - { - public: - PermutationMRRR(uint * elems, uint nelems, uint t, BitSequenceBuilder * bmb); - virtual ~PermutationMRRR(); - /** Computes the i-th element of the permutation */ - virtual uint pi(uint i) const; - /** Computes the inverse of i */ - virtual uint revpi(uint i) const; - /** Saves the permutation to fp, returns 0 in case of success */ - virtual void save(ostream & fp) const; - /** Returns the size of the permutation */ - virtual size_t getSize() const; - /** Loads a static_permutation from fp */ - static PermutationMRRR * load(istream & fp); - protected: - perm permutation; - PermutationMRRR(); - }; - -}; -#endif diff --git a/libcds/include/PermutationWT.h b/libcds/include/PermutationWT.h deleted file mode 100644 index 0b4df593..00000000 --- a/libcds/include/PermutationWT.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Permutation.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef __PERMUTATIONWT_H -#define __PERMUTATIONWT_H - -#include - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - class WaveletTree; - - class PermutationWT:public Permutation - { - public: - PermutationWT(uint * perm, size_t len); - virtual ~PermutationWT(); - - /** Compute the value at position i - */ - virtual uint pi(uint i) const; - - /** Compute the position where i appears */ - virtual uint revpi(uint i) const; - - /** Size in bytes - */ - virtual size_t getSize() const; - - /** Saves permutation to stream */ - virtual void save(ostream & fp) const; - - /** Loads the permutation */ - static PermutationWT * load(istream & fp); - - protected: - PermutationWT() {} - BitSequence * marks; - Sequence * wt; - uint runs; - }; -}; -#endif diff --git a/libcds/include/RMQ_succinct.h b/libcds/include/RMQ_succinct.h deleted file mode 100644 index 6e79d9cb..00000000 --- a/libcds/include/RMQ_succinct.h +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _RMQ_succinct_h -#define _RMQ_succinct_h - -#define MEM_COUNT - -#include -#include -#include -#include -#include -using namespace std; -using namespace cds_utils; - -typedef unsigned char DTsucc; -typedef unsigned short DTsucc2; - -namespace cds_static -{ - class RMQ_succinct - { - private: - RMQ_succinct(); - public: - /*array*/ - int *a; - - /* liefert RMQ[i,j]*/ - virtual unsigned int query(unsigned int, unsigned int); - - /*Johannes RMQ encode - * @param a The array - * @param n Number of elements in the array - * */ - RMQ_succinct(int* a, unsigned int n); - - uint getSize(); - void save(ostream & fp); - RMQ_succinct * load(istream & fp); - - ~RMQ_succinct(); - - protected: - /* size of array a*/ - unsigned int n; - /* table M for the out-of-block queries (contains indices of block-minima)*/ - DTsucc** M; - /* because M just stores offsets (rel. to start of block), this method re-calculates the true index:*/ - inline unsigned int m(unsigned int k, unsigned int block) { return M[k][block]+(block*sprime); } - /* depth of table M:*/ - unsigned int M_depth; - /* table M' for superblock-queries (contains indices of block-minima)*/ - unsigned int** Mprime; - /* depth of table M':*/ - unsigned int Mprime_depth; - /* type of blocks*/ - DTsucc2 *type; - /* precomputed in-block queries*/ - DTsucc** Prec; - /* microblock size*/ - unsigned int s; - /* block size*/ - unsigned int sprime; - /* superblock size*/ - unsigned int sprimeprime; - /* number of blocks (always n/sprime)*/ - unsigned int nb; - /* number of superblocks (always n/sprimeprime)*/ - unsigned int nsb; - /* number of microblocks (always n/s)*/ - unsigned int nmb; - /* return microblock-number of entry i:*/ - inline unsigned int microblock(unsigned int i) { return i/s; } - /* return block-number of entry i:*/ - inline unsigned int block(unsigned int i) { return i/sprime; } - /* return superblock-number of entry i:*/ - inline unsigned int superblock(unsigned int i) { return i/sprimeprime; } - /* precomputed Catalan triangle (17 is enough for 64bit computing):*/ - static const unsigned int Catalan[17][17]; - /* minus infinity (change for 64bit version)*/ - static const int minus_infinity; - /* stuff for clearing the least significant x bits (change for 64-bit computing)*/ - static const DTsucc HighestBitsSet[8]; - virtual DTsucc clearbits(DTsucc, unsigned int); - /* Least Significant Bits for 8-bit-numbers:*/ - static const char LSBTable256[256]; - /* return least signigicant bit in constant time (change for 64bit version)*/ - virtual unsigned int lsb(DTsucc); - /* the following stuff is for fast base 2 logarithms: (currently only implemented for 32 bit numbers)*/ - static const char LogTable256[256]; - virtual unsigned int log2fast(unsigned int); - }; -}; -#endif diff --git a/libcds/include/RMQ_succinct_lcp.h b/libcds/include/RMQ_succinct_lcp.h deleted file mode 100644 index 2ee55ff3..00000000 --- a/libcds/include/RMQ_succinct_lcp.h +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _RMQ_succinct_LCP_H -#define _RMQ_succinct_LCP_H - -#define MEM_COUNT - -#include - -typedef unsigned char DTsucc; -typedef unsigned short DTsucc2; - -namespace cds_static -{ - - class RMQ_succinct_lcp - { - private: - RMQ_succinct_lcp(); - - public: - // liefert RMQ[i,j] - virtual uint query(uint i, uint j, TextIndex *csa, LCP *lcp); - - /*Johannes RMQ encode - * @param lcp The LCP array - * @param n Number of elements in the array - * @param csa The compressed suffix array - **/ - RMQ_succinct_lcp(LCP *lcp, TextIndex *csa); - - virtual uint getSize(); - - virtual void save(ostream & fp); - - static RMQ_succinct_lcp * load(istream & fp); - - virtual ~RMQ_succinct_lcp(); - - protected: - // array DT *a; - uint n; //number of element of lcp - DTsucc** M; // table M for the out-of-block queries (contains indices of block-minima) - - uint M_depth; //depth of table M - uint **Mprime; // table M' for superblock-queries (contains indices of block-minima) - uint Mprime_depth; // depth of table M': - DTsucc2 *type; // type of blocks - DTsucc** Prec; // precomputed in-block queries - uint s; // microblock size - uint sprime; // block size - uint sprimeprime; // superblock size - uint nb; // number of blocks (always n/sprime) - uint nsb; // number of superblocks (always n/sprimeprime) - uint nmb; // number of microblocks (always n/s) - - // because M just stores offsets (rel. to start of block), this method - // re-calculates the true index: - inline uint m(uint k, uint block) { - return M[k][block]+(block*sprime); - } - - // return microblock-number of entry i: - inline uint microblock(uint i) { return i/s; } - - // return block-number of entry i: - inline uint block(uint i) { return i/sprime; } - - // return superblock-number of entry i: - inline uint superblock(uint i) { return i/sprimeprime; } - - // precomputed Catalan triangle (17 is enough for 64bit computing): - static const uint Catalan[17][17]; - - // minus infinity (change for 64bit version) - static const int minus_infinity; - - // stuff for clearing the least significant x bits (change for 64-bit computing) - static const DTsucc HighestBitsSet[8]; - - DTsucc clearbits(DTsucc, uint); - - // Least Significant Bits for 8-bit-numbers: - static const char LSBTable256[256]; - - // return least signigicant bit in constant time (change for 64bit version) - uint lsb(DTsucc); - - // the following stuff is for fast base 2 logarithms: - // (currently only implemented for 32 bit numbers) - static const char LogTable256[256]; - - uint log2fast(uint); - }; - -}; -#endif diff --git a/libcds/include/Sequence.h b/libcds/include/Sequence.h deleted file mode 100644 index c8c04943..00000000 --- a/libcds/include/Sequence.h +++ /dev/null @@ -1,111 +0,0 @@ -/* Sequence.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Sequence definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _SEQUENCE_H -#define _SEQUENCE_H - -#include -#include - -using namespace cds_utils; -using namespace std; - -namespace cds_static -{ - - #define BS_HDR 1 - #define WVTREE_HDR 2 - #define WVTREE_NOPTRS_HDR 3 - #define GMR_HDR 4 - #define GMR_CHUNK_HDR 5 - #define ALPHPART_HDR 6 - #define WVMATRIX_HDR 7 - #define WVTREE_NOPTRSS_HDR 8 - - /** Sequence base class - * - * @author Francisco Claude - */ - class Sequence - { - - public: - /** Builds and sets the length */ - Sequence(size_t length); - virtual ~Sequence() {} - - /** Count the number of occurrences of c up to position i included - */ - virtual size_t rank(uint c, size_t i) const; - - /** Retrieve the i-th position where c appears. - * It returns (size_t)-1 if i=0 and length if the number of - * c's is less than i - */ - virtual size_t select(uint c, size_t i) const; - - /** Retrieves the next occurrence of a c starting at position i (included). - * It return length if there are no occurrences of c after position i. - */ - virtual size_t selectNext(uint c, size_t i) const; - - /** Retrieve the symbol at position i. - */ - virtual uint access(size_t i) const; - - /** Retrieve the symbol at position i and its rank. - */ - virtual uint access(size_t i, size_t & r) const; - - /** Size of the structure in bytes. - */ - virtual size_t getSize() const = 0; - - /** Length of the sequence. - */ - virtual size_t getLength() const { return length; } - - /** Saves the structure to the stream - */ - virtual void save(ostream & fp) const = 0; - - /** Reads a bitmap determining the type */ - static Sequence * load(istream & fp); - - protected: - size_t length; - uint sigma; - - }; - -}; - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#endif /* _SEQUENCE_H */ diff --git a/libcds/include/SequenceAlphPart.h b/libcds/include/SequenceAlphPart.h deleted file mode 100644 index d6121d98..00000000 --- a/libcds/include/SequenceAlphPart.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SequenceAlphPart.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Sequence definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _SEQUENCEALPHPART_H -#define _SEQUENCEALPHPART_H - -#include -#include - -using namespace cds_utils; -using namespace std; - -namespace cds_static -{ - - /** Sequence Alphabet Partitioning - * - * @author Francisco Claude - */ - class SequenceAlphPart : public Sequence - { - - public: - - SequenceAlphPart(uint * seq, size_t n, uint cut, SequenceBuilder * lenIndexBuilder, SequenceBuilder * seqsBuilder); - SequenceAlphPart(const Array & values, uint cut, SequenceBuilder * lenIndexBuilder, SequenceBuilder * seqsBuilder); - - SequenceAlphPart(); - - virtual ~SequenceAlphPart(); - - virtual size_t rank(uint c, size_t i) const; - - virtual size_t select(uint c, size_t i) const; - - virtual uint access(size_t i) const; - - virtual size_t getSize() const; - - virtual size_t getLength() const { return length; } - - virtual void save(ostream & fp) const; - - static SequenceAlphPart * load(istream & fp); - - protected: - // reverse permutation for sorted symbols - uint * revPermFreq; - // symbols sorted by frequency - uint * alphSortedByFreq; - // the sequence indexing the lengths of the symbol in each position - Sequence * groupsIndex; - // sequences indexing the elements groupes by length - Sequence ** indexesByLength; - // cut corresponds to the number of symbols that are not represented in indexesByLength (the most frequent ones) - uint cut; - uint origsigma; - // maxLen corresponds to the maximum length of a symbol in bits, - // this-cut+1 corresponds to the maximum index in indexesByLength. - uint maxLen; - - }; - -}; -#endif /* _SEQUENCEALPHPART_H */ diff --git a/libcds/include/SequenceBuilder.h b/libcds/include/SequenceBuilder.h deleted file mode 100644 index 572c0080..00000000 --- a/libcds/include/SequenceBuilder.h +++ /dev/null @@ -1,53 +0,0 @@ -/* SequenceBuilder.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include - -#ifndef SEQUENCEBUILDER_H -#define SEQUENCEBUILDER_H - -namespace cds_static -{ - - class SequenceBuilder - { - public: - SequenceBuilder() { userCount=0; } - virtual ~SequenceBuilder() {} - virtual Sequence * build(uint * seq, size_t len)=0; - virtual Sequence * build(const Array & seq)=0; - virtual void use() { userCount++; } - virtual void unuse() { userCount--; assert(userCount>=0); if(userCount==0) delete this; } - - protected: - int userCount; - }; -}; - -#include -#include -#include -#include -#include -#include -#include -#endif diff --git a/libcds/include/SequenceBuilderAlphPart.h b/libcds/include/SequenceBuilderAlphPart.h deleted file mode 100644 index 0c26be4e..00000000 --- a/libcds/include/SequenceBuilderAlphPart.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderAlphPart.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include - -#ifndef SequenceBuilderAlphPart_H -#define SequenceBuilderAlphPart_H - -namespace cds_static -{ - class SequenceBuilderAlphPart : public SequenceBuilder - { - public: - SequenceBuilderAlphPart(SequenceBuilder * groupIndexBuilder, SequenceBuilder * indexBuilder, uint cut); - virtual ~SequenceBuilderAlphPart(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - SequenceBuilder * groupIndexBuilder; - SequenceBuilder * indexBuilder; - uint cut; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderGMR.h b/libcds/include/SequenceBuilderGMR.h deleted file mode 100644 index 03c1ba12..00000000 --- a/libcds/include/SequenceBuilderGMR.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderGMR.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include - -#ifndef SequenceBuilderGMR_H -#define SequenceBuilderGMR_H - -namespace cds_static -{ - class SequenceBuilderGMR : public SequenceBuilder - { - public: - SequenceBuilderGMR(BitSequenceBuilder * bsb, SequenceBuilder * sqb, uint chunk_len=0); - virtual ~SequenceBuilderGMR(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - SequenceBuilder * sqb; - uint chunk_len; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderGMRChunk.h b/libcds/include/SequenceBuilderGMRChunk.h deleted file mode 100644 index b0b6c976..00000000 --- a/libcds/include/SequenceBuilderGMRChunk.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderGMRChunk.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SequenceBuilderGMRChunk_H -#define SequenceBuilderGMRChunk_H - -namespace cds_static -{ - class SequenceBuilderGMRChunk : public SequenceBuilder - { - public: - SequenceBuilderGMRChunk(BitSequenceBuilder * bsb, PermutationBuilder * pmb); - virtual ~SequenceBuilderGMRChunk(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - PermutationBuilder * pmb; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderStr.h b/libcds/include/SequenceBuilderStr.h deleted file mode 100644 index 8bebfb0a..00000000 --- a/libcds/include/SequenceBuilderStr.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SequenceBuilderStr.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SequenceBuilderStr_H -#define SequenceBuilderStr_H - -namespace cds_static -{ - class SequenceBuilderStr : public SequenceBuilder - { - public: - SequenceBuilderStr(const string & options); - virtual ~SequenceBuilderStr(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - virtual SequenceBuilder * getBuilder(const Array & seq); - - string str; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderWaveletMatrix.h b/libcds/include/SequenceBuilderWaveletMatrix.h deleted file mode 100644 index cea5cdfb..00000000 --- a/libcds/include/SequenceBuilderWaveletMatrix.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderWaveletTreeNoptrs.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SEQUENCEBUILDERWAVELETMATRIX_H -#define SEQUENCEBUILDERWAVELETMATRIX_H - -namespace cds_static -{ - class SequenceBuilderWaveletMatrix : public SequenceBuilder - { - public: - SequenceBuilderWaveletMatrix(BitSequenceBuilder * bsb, Mapper * am); - virtual ~SequenceBuilderWaveletMatrix(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - Mapper * am; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderWaveletTree.h b/libcds/include/SequenceBuilderWaveletTree.h deleted file mode 100644 index 3c09caa3..00000000 --- a/libcds/include/SequenceBuilderWaveletTree.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SequenceBuilderWaveletTree.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SEQUENCEBUILDERWAVELETTREE_H -#define SEQUENCEBUILDERWAVELETTREE_H - -namespace cds_static -{ - class SequenceBuilderWaveletTree : public SequenceBuilder - { - public: - SequenceBuilderWaveletTree(BitSequenceBuilder * bsb, Mapper * am, wt_coder * wc=NULL); - virtual ~SequenceBuilderWaveletTree(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - Mapper * am; - wt_coder * wc; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderWaveletTreeNoptrs.h b/libcds/include/SequenceBuilderWaveletTreeNoptrs.h deleted file mode 100644 index 02e591f9..00000000 --- a/libcds/include/SequenceBuilderWaveletTreeNoptrs.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderWaveletTreeNoptrs.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SEQUENCEBUILDERWAVELETTREENOPTRS_H -#define SEQUENCEBUILDERWAVELETTREENOPTRS_H - -namespace cds_static -{ - class SequenceBuilderWaveletTreeNoptrs : public SequenceBuilder - { - public: - SequenceBuilderWaveletTreeNoptrs(BitSequenceBuilder * bsb, Mapper * am); - virtual ~SequenceBuilderWaveletTreeNoptrs(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - Mapper * am; - }; -}; -#endif diff --git a/libcds/include/SequenceBuilderWaveletTreeNoptrsS.h b/libcds/include/SequenceBuilderWaveletTreeNoptrsS.h deleted file mode 100644 index 15af9ab1..00000000 --- a/libcds/include/SequenceBuilderWaveletTreeNoptrsS.h +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderWaveletTreeNoptrsS.h - * Copyright (C) 2012, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -#include -#include -#include - -#ifndef SEQUENCEBUILDERWAVELETTREENOPTRSS_H -#define SEQUENCEBUILDERWAVELETTREENOPTRSS_H - -namespace cds_static { - class SequenceBuilderWaveletTreeNoptrsS : public SequenceBuilder { - public: - SequenceBuilderWaveletTreeNoptrsS(BitSequenceBuilder * bsb, Mapper * am); - virtual ~SequenceBuilderWaveletTreeNoptrsS(); - virtual Sequence * build(uint * seq, size_t len); - virtual Sequence * build(const Array & seq); - - protected: - BitSequenceBuilder * bsb; - Mapper * am; - }; -}; - -#endif - diff --git a/libcds/include/SequenceGMR.h b/libcds/include/SequenceGMR.h deleted file mode 100644 index 6aaba089..00000000 --- a/libcds/include/SequenceGMR.h +++ /dev/null @@ -1,72 +0,0 @@ -/* SequenceGMR.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * GMR - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SEQUENCEGMR_H -#define SEQUENCEGMR_H - -#include -#include -#include -#include -#include -#include -#include - -using namespace cds_utils; -namespace cds_static -{ - //using namespace std; - - class SequenceGMR : public Sequence - { - public: - /** Builds the GMR structure. - * @param sequence Sequence of unsigned ints - * @param n length of the sequence - * @param chunk_length length of the regular partitioning (called chunks in the paper) - * @param bmb builder for the bitmap B (as called in the paper) - * @param ssb builder for the representation used for each chunk. - */ - SequenceGMR(uint * sequence, size_t n, uint chunk_length, BitSequenceBuilder * bmb, SequenceBuilder * ssb); - SequenceGMR(const Array & sequence, uint chunk_length, BitSequenceBuilder * bmb, SequenceBuilder * ssb); - - ~SequenceGMR(); - virtual size_t rank(uint c, size_t j) const; - virtual size_t select(uint c, size_t j) const; - virtual uint access(size_t j) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - /** Loads the SequenceGMR object from the stream. - */ - static SequenceGMR * load(istream & fp); - - protected: - SequenceGMR(); - void build(uint * sequence, BitSequenceBuilder * bmb, SequenceBuilder * ssb); - uint * get_ones(uint * sequence); - - uint sigma, chunk_length; - Sequence ** chunk; - BitSequence * B; - }; - -}; -#endif diff --git a/libcds/include/SequenceGMRChunk.h b/libcds/include/SequenceGMRChunk.h deleted file mode 100644 index fe5b5a84..00000000 --- a/libcds/include/SequenceGMRChunk.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SequenceGMRChunk.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * gmr_chunk - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SEQUENCEGMRCHUNK_H -#define SEQUENCEGMRCHUNK_H - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cds_static -{ - //using namespace std; - - /** Implementation of the Chunk of Golynski et al's rank/select - * data structure [1]. - * - * [1] A. Golynski and I. Munro and S. Rao. - * Rank/select operations on large alphabets: a tool for text indexing. - * SODA 06. - * - * @author Francisco Claude - */ - class SequenceGMRChunk: public Sequence - { - public: - /** Builds the structures needed for the chunk - * @param sequence sequence as array of unsigned integers. - * @param chunk_length length of the sequence. - * @param bmb bitmap builder for X (as named in the paper). - * @param pmb permutation builder for Pi (as named in the paper). - * */ - SequenceGMRChunk(uint * sequence, uint chunk_length, BitSequenceBuilder *bmb, PermutationBuilder *pmb); - SequenceGMRChunk(const Array & sequence, BitSequenceBuilder *bmb, PermutationBuilder *pmb); - - /** Destroy the chunk */ - ~SequenceGMRChunk(); - - virtual uint access(size_t j) const; - virtual size_t select(uint i, size_t j) const; - virtual size_t rank(uint i, size_t j) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static SequenceGMRChunk * load(istream & fp); - - protected: - /** Bitmap */ - BitSequence * X; - /** Permutation */ - Permutation * permutation; - /** Size of the alphabet */ - uint sigma; - - SequenceGMRChunk(); - }; -}; -#endif diff --git a/libcds/include/SuffixTree.h b/libcds/include/SuffixTree.h deleted file mode 100644 index 63568a6f..00000000 --- a/libcds/include/SuffixTree.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SUFFIXTREE_H -#define SUFFIXTREE_H - -#include -using namespace cds_utils; - -namespace cds_static -{ - - static const size_t CSTY = 1; - - class SuffixTree - { - protected: - size_t length; - - public: - /*Operations*/ - - //Return true is [vl,vr] is the root - virtual bool isRoot(size_t vl,size_t vr) const=0; - - //Return, in [vl,vr], the Root - virtual void Root(size_t *vl, size_t *vr) const=0; - - //Return vr-vl+1 - virtual size_t Count(size_t vl, size_t vr) const=0; - - //Return true if [wl,wr] is ancestor of [vl,vr] - virtual bool Ancestor(size_t wl, size_t wr, size_t vl, size_t vr) const=0; - - //Return the String Depth of the node [vl,vr] - virtual size_t SDepth(size_t vl, size_t vr) const=0; - - //If [vl,vr] is a leaf (vr == vl), then return the suxffix array value at position v_l, Otherwise NULL. - virtual size_t Locate(size_t vl, size_t vr) const=0; - - //Return, in [parent_l, parent_r], the parent of the node [vl,vr] - virtual void Parent(size_t vl, size_t vr, size_t *parent_l, size_t *parent_r) const =0; - - //Return, in [fchild_l, fchild_r], the first child of the node [vl,vr] - virtual void FChild(size_t vl, size_t vr, size_t *fchild_l, size_t *fchild_r) const =0; - - //Return, in [nsibling_l, nsibling_r], the next sibling of the node [vl,vr] - virtual void NSibling(size_t vl, size_t vr, size_t *nsibling_l, size_t *nsibling_r) const =0; - - //Return, in [slink_l, slink_r], the suffix link of the node [vl,vr] - virtual void SLink(size_t vl, size_t vr, size_t *slink_l, size_t *slink_r) const =0; - - //Return, in [slinki_l, slinki_r], the suffix link applied i times over the node [vl,vr] - virtual void SLink_i(size_t vl, size_t vr, size_t i, size_t *slinki_l, size_t *slinki_r) const =0; - - //Return, in [lca_l, lca_r], the lower common ancestor between nodes [vl,vr] and [wl,wr] - virtual void LCA(size_t vl, size_t vr, size_t wl, size_t wr, size_t *lca_l, size_t *lca_r) const =0; - - //Return, in [child_l, child_r], the child of the node [vl,vr] which label path start with the char a - virtual void Child(size_t vl, size_t vr, uchar a, size_t *child_l, size_t *child_r) const =0; - - //Return the i-th letter of the label-path of the node [vl,vr] - virtual uchar Letter(size_t vl, size_t vr, int i) const =0; - - //Return the tree depth of the node [vl,vr] - virtual size_t TDepth(size_t vl, size_t vr) const =0; - - //Return, in [laq_s_l, laq_s_r], the highest ancestor of [vl,vr] with string-depth >=d - virtual void LAQs(size_t vl, size_t vr, size_t d, size_t *laq_s_l, size_t *laq_s_r) const =0; - - //Return, in [laq_t_l, laq_t_r], the highest ancestor of [vl,vr] with tree-depth >=d - virtual void LAQt(size_t vl, size_t vr, size_t d, size_t *laq_t_l, size_t *laq_t_r) const =0; - - //Memory use in bytes - virtual size_t getSize() const =0; - - virtual void save(ostream & fp) const =0; - - static SuffixTree * load(istream & fp); - - virtual ~SuffixTree() {}; - }; - -}; - -#include -#endif diff --git a/libcds/include/SuffixTreeY.h b/libcds/include/SuffixTreeY.h deleted file mode 100644 index f45eda57..00000000 --- a/libcds/include/SuffixTreeY.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SUFFIXY_H -#define SUFFIXY_H - -#include -#include -#include - -namespace cds_static -{ - - class SuffixTreeY : public SuffixTree - { - private: - SuffixTreeY(); - - TextIndex *csa; - LCP *lcp; - NPR *npr; - - public: - /*Create the compressed suffix tree data structure base on Canovas and Navarro "Practical Compressed Suffix Trees" - * @param text The text from where the suffix tree will be create - * @param n The length of the text - * @param lcp_type The lcp data structure that will be use (NAIVE|SAD_GON_OS|FMN_RRR_OS|PT|PHI|DAC|DAC_VAR). - * @param npr_type The npr data structute that will be use (FMN_NPR|CN_NPR). - * @param b The block size used in NPR - * */ - SuffixTreeY(char *text, size_t n, size_t lcp_type = DAC, size_t npr_type = CN_NPR, size_t b = 32); - - /*Create the compressed suffix tree data structure base on Canovas and Navarro "Practical Compressed Suffix Trees" - * @param _lcp The LCP array data structure - * @param _npr The NPR data structure - * @param csa The Compressed suffix array data structure - * */ - SuffixTreeY(LCP *_lcp, NPR *_npr, TextIndex *csa); - - /*Operations*/ - - //Return true is [vl,vr] is the root - virtual bool isRoot(size_t vl,size_t vr) const; - - //Return, in [vl,vr], the Root - virtual void Root(size_t *vl, size_t *vr) const; - - //Return vr-vl+1 - virtual size_t Count(size_t vl, size_t vr) const; - - //Return true if [wl,wr] is ancestor of [vl,vr] - virtual bool Ancestor(size_t wl, size_t wr, size_t vl, size_t vr) const; - - //Return the String Depth of the node [vl,vr] - virtual size_t SDepth(size_t vl, size_t vr) const; - - //If [vl,vr] is a leaf (vr == vl), then return the suxffix array value at position v_l, Otherwise NULL. - virtual size_t Locate(size_t vl, size_t vr) const; - - //Return, in [parent_l, parent_r], the parent of the node [vl,vr] - virtual void Parent(size_t vl, size_t vr, size_t *parent_l, size_t *parent_r) const; - - //Return, in [fchild_l, fchild_r], the first child of the node [vl,vr] - virtual void FChild(size_t vl, size_t vr, size_t *fchild_l, size_t *fchild_r) const; - - //Return, in [nsibling_l, nsibling_r], the next sibling of the node [vl,vr] - virtual void NSibling(size_t vl, size_t vr, size_t *nsibling_l, size_t *nsibling_r) const; - - //Return, in [slink_l, slink_r], the suffix link of the node [vl,vr] - virtual void SLink(size_t vl, size_t vr, size_t *slink_l, size_t *slink_r) const; - - //Return, in [slinki_l, slinki_r], the suffix link applied i times over the node [vl,vr] - virtual void SLink_i(size_t vl, size_t vr, size_t i, size_t *slinki_l, size_t *slinki_r) const; - - //Return, in [lca_l, lca_r], the lower common ancestor between nodes [vl,vr] and [wl,wr] - virtual void LCA(size_t vl, size_t vr, size_t wl, size_t wr, size_t *lca_l, size_t *lca_r) const; - - //Return, in [child_l, child_r], the child of the node [vl,vr] which label path start with the char a - virtual void Child(size_t vl, size_t vr, uchar a, size_t *child_l, size_t *child_r) const; - - //Return the i-th letter of the label-path of the node [vl,vr] - virtual uchar Letter(size_t vl, size_t vr, int i) const; - - //Return the tree depth of the node [vl,vr] - virtual size_t TDepth(size_t vl, size_t vr) const; - - //Return, in [laq_s_l, laq_s_r], the highest ancestor of [vl,vr] with string-depth >=d - virtual void LAQs(size_t vl, size_t vr, size_t d, size_t *laq_s_l, size_t *laq_s_r) const; - - //Return, in [laq_t_l, laq_t_r], the highest ancestor of [vl,vr] with tree-depth >=d - virtual void LAQt(size_t vl, size_t vr, size_t d, size_t *laq_t_l, size_t *laq_t_r) const; - - //Memory use in bytes - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - - static SuffixTreeY * load(istream & fp); - - virtual ~SuffixTreeY(); - }; - -}; -#endif diff --git a/libcds/include/TableOffsetRRR.h b/libcds/include/TableOffsetRRR.h deleted file mode 100644 index 2f5833c4..00000000 --- a/libcds/include/TableOffsetRRR.h +++ /dev/null @@ -1,109 +0,0 @@ -/* table_offset.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Table for offsets definition. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _TABLE_OFFSET_H -#define _TABLE_OFFSET_H - -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - /** Universal table required for BitSequenceRRR, Raman, Raman and Rao's [1] - * proposal for rank/select capable data structures, it achieves space nH_0, - * O(sample_rate) time for rank and O(log len) for select. The practial implementation - * is based on [2] - * - * [1] R. Raman, V. Raman and S. Rao. Succinct indexable dictionaries with applications - * to encoding $k$-ary trees and multisets. SODA02. - * [2] F. Claude and G. Navarro. Practical Rank/Select over Arbitrary Sequences. SPIRE08. - * - * @author Francisco Claude - */ - class table_offset - { - - public: - /** builds a universal table, designed for u<=15 */ - table_offset(uint u); - ~table_offset(); - - /** Increments the counter of users for the table */ - inline void use() { - users_count++; - } - - /** Tells the object that the user is not going to need the table anymore. */ - inline table_offset * unuse() { - users_count--; - if(!users_count) { - delete this; - return NULL; - } - return this; - } - - /** Computes binomial(n,k) for n,k<=u */ - inline uint get_binomial(uint n, uint k) { - return binomial[n][k]; - } - - /** Computes ceil(log2(binomial(n,k))) for n,k<=u */ - inline ushort get_log2binomial(uint n, uint k) { - return log2binomial[n][k]; - } - - /** Returns the bitmap represented by the given class and inclass offsets */ - inline ushort short_bitmap(uint class_offset, uint inclass_offset) { - if(class_offset==0) return 0; - if(class_offset==u) return (ushort)(((uint)1< -using namespace cds_utils; -using namespace std; - -#ifndef uchar -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ulong -#define ulong unsigned long -#endif - -namespace cds_static -{ - - static const unsigned int CSA_HDR = 2; - - class TextIndex - { - public: - ~TextIndex(){}; - - /* Writes in numocc the number of occurrences of the substring - * pattern[0..length-1] found in the text indexed by index. */ - virtual size_t count (uchar *pattern, ulong length, ulong *numocc) const=0; - - /* Writes in numocc the number of occurrences of the substring - * pattern[0..length-1] in the text indexed by index. It also allocates - * occ (which must be freed by the caller) and writes the locations of - * the numocc occurrences in occ, in arbitrary order. */ - virtual size_t locate (uchar *pattern, ulong length, ulong **occ, ulong *numocc) const=0; - - /* Allocates snippet (which must be freed by the caller) and writes - * the substring text[from..to] into it. Returns in snippet_length the - * length of the text snippet actually extracted (that could be less - * than to-from+1 if to is larger than the text size). */ - virtual size_t extract (ulong from, ulong to, uchar **snippet, ulong *snippet_length) const=0; - - /* Displays the text (snippet) surrounding any occurrence of the - * substring pattern[0..length-1] within the text indexed by index. - * The snippet must include numc characters before and after the - * pattern occurrence, totalizing length+2*numc characters, or less if - * the text boundaries are reached. Writes in numocc the number of - * occurrences, and allocates the arrays snippet_text and - * snippet_lengths (which must be freed by the caller). The first is a - * character array of numocc*(length+2*numc) characters, with a new - * snippet starting at every multiple of length+2*numc. The second - * gives the real length of each of the numocc snippets. */ - - virtual size_t display (uchar *pattern, ulong length, ulong numc, ulong *numocc, uchar **snippet_text, ulong **snippet_lengths) const=0; - - /*Return the length of the Index*/ - virtual size_t index_length() const=0; - - /***The next four methods (getSA, getISA, and getPsi, getT) are - * only valid for text indexes that are base on Suffix - * Array*/ - - /*Get the suffix array at position i*/ - virtual size_t getSA(size_t i) const=0; - - /*Get the inverse of the suffix array at position i*/ - virtual size_t getISA(size_t i) const=0; - - /*Get Psi at position i*/ - virtual size_t getPsi(size_t i) const=0; - - /*Get the first letter of the i-th suffix in the suffix array*/ - virtual size_t getT(size_t i) const=0; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const=0; - - /** Stores the text index in the given a file pointer*/ - virtual void save(ostream & fp) const=0; - - /** Reads a text index determining the type */ - static TextIndex * load(istream & fp); - }; -}; - -#include -#endif diff --git a/libcds/include/TextIndexCSA.h b/libcds/include/TextIndexCSA.h deleted file mode 100644 index 64670875..00000000 --- a/libcds/include/TextIndexCSA.h +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _TEXTINDEXCSA_H_ -#define _TEXTINDEXCSA_H_ - -#include -#include -#include - -namespace cds_static -{ - - class TextIndexCSA: public TextIndex - { - private: - CSA *csa; - TextIndexCSA(); - - public: - - /*K. Sadakane's CSA (refactory by Rodrigo Cnovas) - * @param text The text. - * @param length Length of the text. - * @param build_options The options could be: - * free_text: The text will be freed immediately after using it. - * samplerate=: samplerate will be interval between two indices - * of the suffix array stored explicitly. That is, - * SA[i*samplerate] is stored explicitly. The default - * value is 16. - * samplepsi=: samplepsi will be interval between two indices of the - * psi function stored explicitly. That is, Psi[i*samplepsi] - * is stored explicitly. The default value is 128. - **/ - TextIndexCSA(uchar *text, ulong length, char *build_options); - - ~TextIndexCSA(); - - /* Writes in numocc the number of occurrences of the substring - * pattern[0..length-1] found in the text indexed by index. */ - virtual size_t count (uchar *pattern, ulong length, ulong *numocc) const; - - /* Writes in numocc the number of occurrences of the substring - * pattern[0..length-1] in the text indexed by index. It also allocates - * occ (which must be freed by the caller) and writes the locations of - * the numocc occurrences in occ, in arbitrary order. */ - virtual size_t locate (uchar *pattern, ulong length, ulong **occ, ulong *numocc) const; - - /* Allocates snippet (which must be freed by the caller) and writes - * the substring text[from..to] into it. Returns in snippet_length the - * length of the text snippet actually extracted (that could be less - * than to-from+1 if to is larger than the text size). */ - virtual size_t extract (ulong from, ulong to, uchar **snippet, ulong *snippet_length) const; - - /* Displays the text (snippet) surrounding any occurrence of the - * substring pattern[0..length-1] within the text indexed by index. - * The snippet must include numc characters before and after the - * pattern occurrence, totalizing length+2*numc characters, or less if - * the text boundaries are reached. Writes in numocc the number of - * occurrences, and allocates the arrays snippet_text and - * snippet_lengths (which must be freed by the caller). The first is a - * character array of numocc*(length+2*numc) characters, with a new - * snippet starting at every multiple of length+2*numc. The second - * gives the real length of each of the numocc snippets. */ - - virtual size_t display (uchar *pattern, ulong length, ulong numc, ulong *numocc, uchar **snippet_text, ulong **snippet_lengths) const; - - /*Return the length of the Index*/ - virtual size_t index_length() const; - - /*Get the suffix array at position i*/ - virtual size_t getSA(size_t i) const; - - /*Get the inverse of the suffix array at position i*/ - virtual size_t getISA(size_t i) const; - - /*Get Psi at position i*/ - virtual size_t getPsi(size_t i) const; - - /*Get the first letter of the i-th suffix in the suffix array*/ - virtual size_t getT(size_t i) const; - - /** Returns the size of the structure in bytes */ - virtual size_t getSize() const; - - /** Stores the text index in the given a file pointer*/ - virtual void save(ostream & fp) const; - - /** Reads a text index determining the type */ - static TextIndexCSA * load(istream & fp); - - }; -}; -#endif diff --git a/libcds/include/WaveletMatrix.h b/libcds/include/WaveletMatrix.h deleted file mode 100644 index f4ca88c6..00000000 --- a/libcds/include/WaveletMatrix.h +++ /dev/null @@ -1,95 +0,0 @@ -/* WaveletTreeNoptrs.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTreeNoptrs definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _WVTREE_MATRIX_H -#define _WVTREE_MATRIX_H - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_static -{ - - class WaveletMatrix : public Sequence - { - public: - - /** Builds a Wavelet Tree for the string - * pointed by symbols assuming its length - * equals n and uses bmb to build the bitsequence - * @param bmb builder for the bitmaps in each level. - * @param am alphabet mapper (we need all symbols to be used). - * */ - WaveletMatrix(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols = false); - WaveletMatrix(const Array &symbols2, BitSequenceBuilder * bmb, Mapper * am); - - // - /** Destroys the Wavelet Tree */ - virtual ~WaveletMatrix(); - - virtual size_t rank(uint symbol, size_t pos) const; - virtual size_t select(uint symbol, size_t j) const; - virtual uint access(size_t pos) const; - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - static WaveletMatrix * load(istream & fp); - - protected: - WaveletMatrix(); - - Mapper * am; - - BitSequence **bitstring; - - /** Length of the string. */ - size_t n; - - /** Height of the Wavelet Tree. */ - uint height, max_v; - uint *C, *OCC; - - /** Obtains the maximum value from the string - * symbols of length n */ - uint max_value(uint *symbols, size_t n); - - /** How many bits are needed to represent val */ - uint bits(uint val); - - /** Returns true if val has its ind-th bit set - * to one. */ - bool is_set(uint val, uint ind) const; - - /** Sets the ind-th bit in val */ - uint set(uint val, uint ind) const; - - /** Recursive function for building the Wavelet Tree. */ - void build_level(uint **bm, uint *symbols, uint length, uint *occs); - }; -}; -#endif diff --git a/libcds/include/WaveletTree.h b/libcds/include/WaveletTree.h deleted file mode 100644 index 7bf538ef..00000000 --- a/libcds/include/WaveletTree.h +++ /dev/null @@ -1,114 +0,0 @@ -/* WaveletTree.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTree definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef STATIC_SEQUENCE_WVTREE_H -#define STATIC_SEQUENCE_WVTREE_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_static -{ - - /** Wavelet tree implementation using pointers. - * - * @author Francisco Claude - */ - class WaveletTree : public Sequence - { - public: - - /** Builds a Wavelet Tree for the string stored in a - * - * @param coder corresponds to the coder used to give the shape to the tree. - * @param bmb builder for the bitmaps in each node. - * @param am mapper for the alphabet. - * */ - WaveletTree(const Array & a, wt_coder * coder, BitSequenceBuilder *bmb, Mapper *am); - /** Builds a Wavelet Tree for the string - * pointed by symbols assuming its length - * equals n - * @param coder corresponds to the coder used to give the shape to the tree. - * @param bmb builder for the bitmaps in each node. - * @param am mapper for the alphabet. - * */ - WaveletTree(uint * symbols, size_t n, wt_coder * coder, BitSequenceBuilder * bmb, Mapper * am, bool free=false); - - /** Builds a Wavelet Tree for the string - * pointed by symbols assuming its length - * equals n - * @param coder corresponds to the coder used to give the shape to the tree. - * @param bmb builder for the bitmaps in each node. - * @param am mapper for the alphabet. - * */ - WaveletTree(uchar * symbols, size_t n, wt_coder * coder, BitSequenceBuilder * bmb, Mapper * am, bool free=false); - - virtual ~WaveletTree(); - - virtual size_t rank(uint symbol, size_t pos) const; - - virtual size_t select(uint symbol, size_t j) const; - - virtual uint access(size_t pos) const; - virtual uint access(size_t pos, size_t &rank) const; - - /* find the q-th smallest element in T[l..r] */ - uint quantile(size_t left,size_t right,uint q) const; - /* find the q-th smallest element in T[l..r] and return it's freq */ - pair quantile_freq(size_t left,size_t right,uint q) const; - - virtual size_t count(uint s) const; - - virtual size_t getSize() const; - - virtual void save(ostream & fp) const; - static WaveletTree * load(istream & fp); - - protected: - - WaveletTree(); - - wt_node * root; - wt_coder * c; - Mapper * am; - - /** Length of the string. */ - size_t n; - - /** Height of the Wavelet Tree. */ - uint max_v; - - /** Flag for testing for correcteness. */ - bool test; - - }; - -}; -#endif /* _STATIC_SEQUENCE_WVTREE_H */ diff --git a/libcds/include/WaveletTreeNoptrs.h b/libcds/include/WaveletTreeNoptrs.h deleted file mode 100644 index 63da4752..00000000 --- a/libcds/include/WaveletTreeNoptrs.h +++ /dev/null @@ -1,115 +0,0 @@ -/* WaveletTreeNoptrs.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTreeNoptrs definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _WVTREE_NOPTRS_H -#define _WVTREE_NOPTRS_H - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_static -{ - - class WaveletTreeNoptrs : public Sequence - { - public: - - /** Builds a Wavelet Tree for the string stored in a. - * @param bmb builder for the bitmaps in each level. - * @param am alphabet mapper (we need all symbols to be used). - * */ - WaveletTreeNoptrs(const Array & a, BitSequenceBuilder * bmb, Mapper * am); - /** Builds a Wavelet Tree for the string - * pointed by symbols assuming its length - * equals n and uses bmb to build the bitsequence - * @param bmb builder for the bitmaps in each level. - * @param am alphabet mapper (we need all symbols to be used). - * */ - WaveletTreeNoptrs(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols = false); - - // - /** Builds a Wavelet Tree for the string - * pointed by symbols is an array of elements of "width" bits and length - * n. - * @param bmb builder for the bitmaps in each level. - * @param am alphabet mapper (we need all symbols to be used). - * */ - WaveletTreeNoptrs(uint * symbols, size_t n, uint width, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols = false); - - /** Destroys the Wavelet Tree */ - virtual ~WaveletTreeNoptrs(); - - virtual size_t rank(uint symbol, size_t pos) const; - virtual size_t select(uint symbol, size_t j) const; - virtual uint access(size_t pos) const; - virtual uint access(size_t pos, size_t &r) const; - virtual size_t getSize() const; - - /* find the q-th smallest element in T[l..r] */ - virtual uint quantile(size_t left,size_t right,uint q); - - /* find the q-th smallest element in T[l..r] and return the freq */ - pair quantile_freq(size_t left,size_t right,uint q); - - virtual size_t count(uint symbol) const; - - virtual void save(ostream & fp) const; - static WaveletTreeNoptrs * load(istream & fp); - - protected: - WaveletTreeNoptrs(); - - Mapper * am; - /** Only one bit-string for the Wavelet Tree. */ - BitSequence **bitstring; - uint *OCC; - - /** Length of the string. */ - size_t n; - - /** Height of the Wavelet Tree. */ - uint height, max_v; - - /** Obtains the maximum value from the string - * symbols of length n */ - uint max_value(uint * symbols, size_t n); - uint max_value(uint * symbols, unsigned width, size_t n); - - /** How many bits are needed to represent val */ - uint bits(uint val); - - /** Returns true if val has its ind-th bit set - * to one. */ - bool is_set(uint val, uint ind) const; - - /** Recursive function for building the Wavelet Tree. */ - void build_level(uint **bm, uint *symbols, uint level, uint length, uint offset); - void build_level(uint **bm, uint *symbols, unsigned width, uint level, uint length, uint offset); - }; -}; -#endif diff --git a/libcds/include/WaveletTreeNoptrsS.h b/libcds/include/WaveletTreeNoptrsS.h deleted file mode 100644 index 816bd67f..00000000 --- a/libcds/include/WaveletTreeNoptrsS.h +++ /dev/null @@ -1,95 +0,0 @@ -/* WaveletTreeNoptrs.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTreeNoptrs definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _WVTREE_NOPTRSS_H -#define _WVTREE_NOPTRSS_H - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_static -{ - - class WaveletTreeNoptrsS : public Sequence - { - public: - - /** Builds a Wavelet Tree for the string - * pointed by symbols assuming its length - * equals n and uses bmb to build the bitsequence - * @param bmb builder for the bitmaps in each level. - * @param am alphabet mapper (we need all symbols to be used). - * */ - WaveletTreeNoptrsS(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols = false); - WaveletTreeNoptrsS(const Array &symb, BitSequenceBuilder * bmb, Mapper * am); - // - /** Destroys the Wavelet Tree */ - virtual ~WaveletTreeNoptrsS(); - - virtual size_t rank(uint symbol, size_t pos) const; - virtual size_t select(uint symbol, size_t j) const; - virtual uint access(size_t pos) const; - virtual size_t getSize() const; - - size_t count(uint symbol) const; - - virtual void save(ostream & fp) const; - static WaveletTreeNoptrsS * load(istream & fp); - - protected: - WaveletTreeNoptrsS(); - - Mapper * am; - /** Only one bit-string for the Wavelet Tree. */ - BitSequence **bitstring, *occ; - - /** Length of the string. */ - size_t n; - - /** Height of the Wavelet Tree. */ - uint height, max_v; - - /** Obtains the maximum value from the string - * symbols of length n */ - uint max_value(uint *symbols, size_t n); - - /** How many bits are needed to represent val */ - uint bits(uint val); - - /** Returns true if val has its ind-th bit set - * to one. */ - bool is_set(uint val, uint ind) const; - - /** Sets the ind-th bit in val */ - uint set(uint val, uint ind) const; - - /** Recursive function for building the Wavelet Tree. */ - void build_level(uint **bm, uint *symbols, uint length, uint *occs); - }; -}; -#endif diff --git a/libcds/include/comparray4.h b/libcds/include/comparray4.h deleted file mode 100644 index b296e845..00000000 --- a/libcds/include/comparray4.h +++ /dev/null @@ -1,88 +0,0 @@ -/* comparray4.cpp - Copyright (C) 2005, K. Sadakane, all rights reserved. - - This file contains an implementation of CSA. - For more information, see - - K. Sadakane. Compressed text databases with efficient query - algorithms based on the compressed suffix array. - In Proceedings 11th Annual International Symposium on Algorithms - and Computation (ISAAC)}, LNCS v. 1969, pages 410--421, 2000. - - K. Sadakane. Succinct representations of lcp information and - improvements in the compressed suffix arrays. - In Proceedings 13th Annual ACM-SIAM Symposium on Discrete - Algorithms (SODA), 2002. - - K. Sadakane. New text indexing functionalities of the compressed - suffix arrays. Journal of Algorithms, 48(2):294--313, 2003. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef _COMPARRAY_H_ -#define _COMPARRAY_H_ - -#include -using namespace cds_utils; -#define USE_MMAP - -#ifdef USE_MMAP -#include -#endif - -#define SIGMA 256 - -namespace cds_static -{ - - using namespace std; - - typedef struct csa - { - int n,m; - int l,two,two2; - int K[SIGMA+2],C[SIGMA+1],C2[SIGMA+1]; - int *SA,*ISA,*R; - unsigned short *B; /* bit */ - #ifdef USE_MMAP - MMAP *mapp,*mapi; - int p_size, i_size, r_size, sa_size, isa_size; - #endif - } CSA; - - int csa_psi(CSA *SA,int i); - int csa_T(CSA *SA,int i); - int csa_inverse(CSA *SA, int suf); - void csa_decode(unsigned char *p,CSA *SA,int suf,int len); - void csa_decode2(unsigned char *p,CSA *SA,int pos,int len); - int csa_write(CSA *SA,char *fname1,char *fname2); - void csa_new(int n, int *p, unsigned char *s, char *fname1, char *fname2, int rankb_w,int rankb_w2); - int csa_read(CSA *SA,char *fname1,char *fname2); - int initranktables(void); - void mkdecodetable(void); - int csa_lookup(CSA *SA, int i); - int *csa_batchlookup(CSA *SA,int l, int r); - unsigned long *csa_batchlookup2(CSA *SA,int l, int r); - int csa_bsearch(unsigned char *key,int keylen,CSA *SA,int *li,int *ri); - void csa_decode1line(unsigned char *p,CSA *SA,int suf,int maxlen); - void csa_decodeall(unsigned char *p,CSA *SA); - void csa_save(CSA *csa, ostream & fp); - CSA *csa_load(istream & fp); - void csa_free(CSA *csa); - void csa_init(CSA *csa); -}; -#endif diff --git a/libcds/include/cppUtils.h b/libcds/include/cppUtils.h deleted file mode 100644 index 1750b6ac..00000000 --- a/libcds/include/cppUtils.h +++ /dev/null @@ -1,94 +0,0 @@ - -#ifndef _CPPUTILS -#define _CPPUTILS - -#include -#include - -#include -using namespace std; - -namespace cds_utils -{ - - uint transform(const string & s); - - template void saveValue(ostream & out, const T val) { - //assert(out.good()); - //cout << "saveValue: " << sizeof(T) << " " << val << endl; - if(!out.good()) { - throw "Output not ready"; - } - out.write((char*)&val,sizeof(T)); - } - - template T loadValue(istream & in) { - //assert(in.good()); - if(!in.good()) { - throw "Input not ready"; - } - T ret; - in.read((char*)&ret,sizeof(T)); - //cout << "loadValue: " << in.tellg() << " " << sizeof(T) << " " << ret << endl; - if((size_t)in.gcount()!=sizeof(T)) { - cout << "1Reading: " << sizeof(T) << " Read: " << in.gcount() << endl; - throw "Could not read the expected bytes from input"; - } - return ret; - } - - template void saveValue(ostream & out, const T * val, const size_t len) { - //assert(out.good()); - if(!out.good()) { - throw "Output not ready"; - } - //cout << "saveValueM: " << sizeof(T) << " " << len << endl; - out.write((char*)val,len*sizeof(T)); - } - - template T * loadValue(istream & in, const size_t len) { - //assert(in.good()); - if(!in.good()) { - throw "Input not ready"; - } - T * ret = new T[len]; - - //cout << "loadValueM: " << in.tellg() << " " << sizeof(T) << " " << len << endl; -#if 0 - unsigned int counter=0; - char *ptr = (char *)ret; - while(counter 1024 ? 1024 : len-counter); - ptr += fp.gcount(); - counter += fp.gcount(); - } - if(counter!=len*sizeof(T)) { - throw "Could not read the expected bytes from input"; - } -#else - in.read((char*)ret,len*sizeof(T)); - if((size_t)in.gcount()!=len*sizeof(T)) { - cout << "Reading: " << sizeof(T) << " Read: " << in.gcount() << endl; - throw "Could not read the expected bytes from input"; - } -#endif - return ret; - } - - template T * loadValue(const char * name, size_t & slen) { - ifstream in(name); - assert(in.good()); - in.seekg(0,ios_base::end); - size_t len = in.tellg(); - slen = len/sizeof(T); - if(len%sizeof(T)) slen--; - in.seekg(0,ios_base::beg); - T * ret = loadValue(in,slen); - in.close(); - return ret; - } - - void tokenize(string str, vector &tokens, char delim); - -}; -#endif diff --git a/libcds/include/factorization.h b/libcds/include/factorization.h deleted file mode 100644 index 4b79c4fb..00000000 --- a/libcds/include/factorization.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/*----------------------------------------------------------------------- - Factorizacion version - ------------------------------------------------------------------------*/ -#ifndef _FACTORIZATION -#define _FACTORIZATION - -#include -#include -#include -#include -#include -#include - -namespace cds_static -{ - class factorization - { - private: - factorization(); - public: - uint listLength; //longitud de la lista - unsigned char nLevels; //numero de niveles de arrays - uint * levelsIndex; //inicio de cada array - unsigned char * levels; //array con los bytes - BitSequence * bS; //bitmap para indicar fin de codigo - uint * rankLevels; //rank de 1s hasta el principio de cada array - - /*Susana implementation of Directly Addressable Variable-Length Codes with blocks of size 4 - * @param list Array with the values - * @param l_Length Size of the array - * */ - factorization(uint *list,uint l_Length); - virtual uint access(uint param); - virtual uint access_seq(uint param, size_t *next_pos, bool dir); - virtual void save(ostream & fp); - virtual uint getSize(); - static factorization* load(istream & fp); - virtual ~factorization(); - }; -}; -#endif diff --git a/libcds/include/factorization_var.h b/libcds/include/factorization_var.h deleted file mode 100644 index c9f4572b..00000000 --- a/libcds/include/factorization_var.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/*----------------------------------------------------------------------- - Factorizacion with Variable block size - ------------------------------------------------------------------------*/ -#ifndef _FACTORIZATION_VAR -#define _FACTORIZATION_VAR - -#include -#include -#include -#include -#include -#include - -namespace cds_static -{ - - class factorization_var - { - private: - factorization_var(); - public: - uint tamCode; - uint * iniLevel; - ushort * base; - ushort * base_bits; - uint * tablebase; - uint tamtablebase; - uint listLength; //list length - unsigned char nLevels; //number of levels - uint * levelsIndex; //start point of each array - uint * levels; //array with the bytes - BitSequence * bS; //bitmap para indicar fin de codigo - uint * rankLevels; //rank de 1s hasta el principio de cada array - - /*Susana implementation of Directly Addressable Variable-Length Codes with variable length blocks - * @param list Array with the values - * @param l_Length Size of the array - * @param kvalues Array with the block length for each level - * @param nkvalues Length of the array kvalues - * */ - factorization_var(uint *list, uint l_Length, ushort* kvalues, uint nkvalues); - virtual uint access(uint param); - virtual uint access_seq(uint param, size_t *next_pos, bool dir); - virtual uint getSize(); - virtual void save(ostream & fp); - static factorization_var* load(istream & fp); - virtual ~factorization_var(); - }; -}; -#endif diff --git a/libcds/include/huff.h b/libcds/include/huff.h deleted file mode 100644 index e138201d..00000000 --- a/libcds/include/huff.h +++ /dev/null @@ -1,94 +0,0 @@ -/* huff.h - Copyright (C) 2008, Gonzalo Navarro, all rights reserved. - - Canonical Huffman - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef HUFFINCLUDED -#define HUFFINCLUDED - -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - typedef struct - { // maximum symbol (0..max), same excluding zero freqs - uint max,lim; - uint depth; // max symbol length - union - { // symbol positions after sorting by decr freq (enc) - uint *spos; - uint *symb; // symbols sorted by freq (dec) - } s; - uint *num; // first pos of each length (dec), number of each length (enc) - uint *fst; // first code (numeric) of each length (dec) - unsigned long long total;// total length to achieve, in bits - } THuff; - - /** Creates Huffman encoder given symbols 0..lim with frequencies - * freq[i], ready for compression - * - * @author Gonzalo Navarro - */ - THuff createHuff (uint *freq, uint lim); - - /** Encodes symb using H, over stream[ptr...lim] (ptr and lim are - * bit positions of stream). Returns the new ptr. - * - * @author Gonzalo Navarro - */ - size_t encodeHuff (const THuff H, uint symb, uint *stream, size_t ptr); - - /** Decodes *symb using H, over stream[ptr...lim] (ptr and lim are - * bit positions of stream). Returns the new ptr. - * - * @author Gonzalo Navarro - */ - size_t decodeHuff (const THuff H, uint *symb, uint *stream, size_t ptr); - - /** Writes H in file f - * - * @author Gonzalo Navarro - */ - void saveHuff (const THuff H, ostream & f); - - /** Size of H written on file - * - * @author Gonzalo Navarro - */ - uint sizeHuff (const THuff H); - - /** Frees H - * - * @author Gonzalo Navarro - */ - void freeHuff (THuff H); - - /** Loads H from file f, prepared for encoding or decoding depending - * on enc - * - * @author Gonzalo Navarro - */ - THuff loadHuff (istream &f, int enc); - -}; -#endif diff --git a/libcds/include/interface.h b/libcds/include/interface.h deleted file mode 100644 index ffbcabbb..00000000 --- a/libcds/include/interface.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/* General interface for using the compressed index libraries */ - -#ifndef uchar -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ulong -#define ulong unsigned long -#endif - -namespace cds_static -{ - /* Error management */ - - /* Returns a string describing the error associated with error number - e. The string must not be freed, and it will be overwritten with - subsequent calls. */ - - char *error_index (int e); - - /* Building the index */ - - /* Creates index from text[0..length-1]. Note that the index is an - opaque data type. Any build option must be passed in string - build_options, whose syntax depends on the index. The index must - always work with some default parameters if build_options is NULL. - The returned index is ready to be queried. */ - - int build_index (uchar *text, ulong length, char *build_options, void **index); - - /* Saves index on disk by using single or multiple files, having - proper extensions. */ - - int save_index (void *index, char *filename); - - /* Loads index from one or more file(s) named filename, possibly - adding the proper extensions. */ - - int load_index (char *filename, void **index); - - /* Frees the memory occupied by index. */ - - int free_index (void *index); - - /* Gives the memory occupied by index in bytes. */ - - int index_size(void *index, ulong *size); - - /* Querying the index */ - - /* Writes in numocc the number of occurrences of the substring - pattern[0..length-1] found in the text indexed by index. */ - - int count (void *index, uchar *pattern, ulong length, ulong *numocc); - - /* Writes in numocc the number of occurrences of the substring - pattern[0..length-1] in the text indexed by index. It also allocates - occ (which must be freed by the caller) and writes the locations of - the numocc occurrences in occ, in arbitrary order. */ - - int locate (void *index, uchar *pattern, ulong length, ulong **occ, - ulong *numocc); - - /* Gives the length of the text indexed */ - - int get_length(void *index, ulong *length); - - /* Accessing the indexed text */ - - /* Allocates snippet (which must be freed by the caller) and writes - the substring text[from..to] into it. Returns in snippet_length the - length of the text snippet actually extracted (that could be less - than to-from+1 if to is larger than the text size). */ - - int extract (void *index, ulong from, ulong to, uchar **snippet, - ulong *snippet_length); - - /* Displays the text (snippet) surrounding any occurrence of the - substring pattern[0..length-1] within the text indexed by index. - The snippet must include numc characters before and after the - pattern occurrence, totalizing length+2*numc characters, or less if - the text boundaries are reached. Writes in numocc the number of - occurrences, and allocates the arrays snippet_text and - snippet_lengths (which must be freed by the caller). The first is a - character array of numocc*(length+2*numc) characters, with a new - snippet starting at every multiple of length+2*numc. The second - gives the real length of each of the numocc snippets. */ - - int display (void *index, uchar *pattern, ulong length, ulong numc, - ulong *numocc, uchar **snippet_text, ulong **snippet_lengths); - - /* Obtains the length of the text indexed by index. */ - - int length (void *index, ulong *length); - -}; diff --git a/libcds/include/libcdsBasics.h b/libcds/include/libcdsBasics.h deleted file mode 100644 index dea735ba..00000000 --- a/libcds/include/libcdsBasics.h +++ /dev/null @@ -1,253 +0,0 @@ -/* basics.h - * Copyright (C) 2005, Rodrigo Gonzalez, all rights reserved. - * - * Some preliminary stuff - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _BASICS_H -#define _BASICS_H - -#include -#ifndef WIN32 -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -typedef unsigned int uint; -typedef unsigned short ushort; -#endif - - -namespace cds_utils -{ - - using namespace std; - typedef unsigned char uchar; - - /** mask for obtaining the first 5 bits */ - const uint mask31 = 0x0000001F; - - /** number of bits in a uint */ - const uint W = 32; - - const uint LOGW = 5; - - /** W-1 */ - const uint Wminusone = 31; - - /** 2W*/ - const uint WW = 64; - - /** number of bits per uchar */ - const uint bitsM = 8; - - /** number of bytes per uint */ - const uint BW = 4; - - /** number of different uchar values 0..255 */ - const uint size_uchar = 256; - - /** popcount array for uchars */ - const unsigned char __popcount_tab[] = { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, - }; - - /** select array for uchars */ - const unsigned char select_tab[] = { - 0, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 8, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - 6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, - }; - - /** prev array for uchars */ - const unsigned char prev_tab[] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - }; - - /** bits needed to represent a number between 0 and n */ - inline uint bits(uint n) { - uint b = 0; - while (n) { b++; n >>= 1; } - return b; - } - - /** reads bit p from e */ - #define bitget(e,p) ((((e)[(p)/W] >> ((p)%W))) & 1) - - /** sets bit p in e */ - inline void bitset(uint * e, size_t p) { - e[p/W] |= (1<<(p%W)); - } - - /** cleans bit p in e */ - inline void bitclean(uint * e, size_t p) { - e[p/W] &= ~(1<<(p%W)); - } - - /** uints required to represent n integers of e bits each */ - inline uint uint_len(const uint e, const size_t n) { - //+((unsigned long long)e*n%W>0)); - return ((unsigned long long)e*n+W-1)/W; - } - - /** Retrieve a given index from array A where every value uses len bits - * @param A Array - * @param len Length in bits of each field - * @param index Position to be retrieved - */ - inline uint get_field(const uint *A, const size_t len, const size_t index) { - if(len==0) return 0; - size_t i=index*len/W, j=index*len-W*i; - uint result; - if (j+len <= W) - result = (A[i] << (W-j-len)) >> (W-len); - else { - result = A[i] >> j; - result = result | (A[i+1] << (WW-j-len)) >> (W-len); - } - return result; - } - - /** Store a given value in index into array A where every value uses len bits - * @param A Array - * @param len Length in bits of each field - * @param index Position to store in - * @param x Value to be stored - */ - inline void set_field(uint *A, const size_t len, const size_t index, const uint x) { - if(len==0) return; - size_t i=index*len/W, j=index*len-i*W; - uint mask = ((j+len) < W ? ~0u << (j+len) : 0) - | ((W-j) < W ? ~0u >> (W-j) : 0); - A[i] = (A[i] & mask) | x << j; - if (j+len>W) { - mask = ((~0u) << (len+j-W)); - A[i+1] = (A[i+1] & mask)| x >> (W-j); - } - } - - /** Retrieve a given bitsequence from array A - * @param A Array - * @param ini Starting position - * @param fin Retrieve until end-1 - */ - inline uint get_var_field(const uint *A, const size_t ini, const size_t fin) { - if(ini==fin+1) return 0; - size_t i=ini/W, j=ini-W*i; - uint result; - uint len = (uint)(fin-ini+1); - if (j+len <= W) - result = (A[i] << (W-j-len)) >> (W-len); - else { - result = A[i] >> j; - result = result | (A[i+1] << (WW-j-len)) >> (W-len); - } - return result; - } - - /** Stores a given bitsequence into array A - * @param A Array - * @param ini Starting position - * @param fin Store until end-1 - * @param x Value to be stored - */ - inline void set_var_field(uint *A, const size_t ini, const size_t fin, const uint x) { - if(ini==fin+1) return; - uint i=ini/W, j=ini-i*W; - uint len = (fin-ini+1); - uint mask = ((j+len) < W ? ~0u << (j+len) : 0) - | ((W-j) < W ? ~0u >> (W-j) : 0); - A[i] = (A[i] & mask) | x << j; - if (j+len>W) { - mask = ((~0u) << (len+j-W)); - A[i+1] = (A[i+1] & mask)| x >> (W-j); - } - } - - /** Retrieve a given index from array A where every value uses 4 bits - * @param A Array - * @param index Position to be retrieved - */ - inline uint get_field4(const uint *A, const size_t index) { - size_t i=index/8, j=(index&0x7)<<2; - return (A[i] << (28-j)) >> (28); - } - - /** Counts the number of 1s in x */ - inline uint popcount(const unsigned int x) { -#ifdef __SSE4_2__ - return __builtin_popcount(x); -#else - return __popcount_tab[(x >> 0) & 0xff] + __popcount_tab[(x >> 8) & 0xff] - + __popcount_tab[(x >> 16) & 0xff] + __popcount_tab[(x >> 24) & 0xff]; -#endif - } - - /** Counts the number of 1s in the first 16 bits of x */ - inline uint popcount16(const unsigned int x) { -#ifdef __SSE4_2__ - return __builtin_popcount(x & 0xffff); -#else - return __popcount_tab[x & 0xff] + __popcount_tab[(x >> 8) & 0xff]; -#endif - } - - /** Counts the number of 1s in the first 8 bits of x */ - inline uint popcount8(const unsigned int x) { -#ifdef __SSE4_2__ - return __builtin_popcount(x & 0xff); -#else - return __popcount_tab[x & 0xff]; -#endif - } -}; - -#include -#endif /* _BASICS_H */ diff --git a/libcds/include/libcdsSDArray.h b/libcds/include/libcdsSDArray.h deleted file mode 100644 index e3bfa0c7..00000000 --- a/libcds/include/libcdsSDArray.h +++ /dev/null @@ -1,187 +0,0 @@ -/* basics.h - * Copyright (C) 2010, Rodrigo Canovas, all rights reserved. - * - * Some preliminary stuff - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * */ - -#ifndef _BASICS_SDARRAY_H -#define _BASICS_SDARRAY_H -#include - -namespace cds_utils -{ - typedef unsigned long long qword; - static const unsigned int logD = 5; - static const unsigned int PBS = (sizeof(uint)*8); - static const unsigned int D = (1<0) { - x>>=1; - l++; - } - return l; - } - - inline int __setbit(uint *B, const int i, const int x) { - int j,l; - j = i / D; - l = i % D; - if (x==0) B[j] &= (~(1<<(D-1-l))); - else if (x==1) B[j] |= (1<<(D-1-l)); - else { - printf("error __setbit x=%d\n",x); - exit(1); - } - return x; - } - - inline int __setbit2(unsigned char *B, const int i, const int x) { - int j,l; - j = i / 8; - l = i % 8; - if (x==0) B[j] &= (~(1<<(8-1-l))); - else if (x==1) B[j] |= (1<<(8-1-l)); - else { - printf("error __setbit2 x=%d\n",x); - exit(1); - } - return x; - } - - inline int __setbits(uint *B, const int i, const int d, const int x) { - int j; - for (j=0; j>(d-j-1))&1); - } - return x; - } - - inline int __getbit(const uint *B, const int i) { - int j,l; - j = i >> logD; - l = i & (D-1); - return (B[j] >> (D-1-l)) & 1; - } - - inline int __getbit2(const unsigned char *B, const int i) { - int j,l; - j = i >> 3; - l = i & (8-1); - return (B[j] >> (8-1-l)) & 1; - } - - #if 1 - inline uint __getbits(const uint *B, const int i1, const int d) { - qword x,z; - int i = i1; - B += (i >> logD); - i &= (D-1); - if (i+d <= 2*(int)D) { - x = (((qword)B[0]) << D) + B[1]; - x <<= i; - x >>= (D*2-1-d); - x >>= 1; - } - else { - x = (((qword)B[0])<>= D; - x += z; - x >>= (2*D-d); - } - return x; - } - #endif - #if 0 - inline uint __getbits(uint *B, int i, int d) { - uint j,x; - x = 0; - for (j=0; j>1) + (r & 0x55555555); - r = ((r & 0xcccccccc)>>2) + (r & 0x33333333); - r = ((r>>4) + r) & 0x0f0f0f0f; - r = (r>>8) + r; - r = ((r>>16) + r) & 63; - return r; - } - - inline unsigned int __popCount8(const uint x) { - uint r; - #if 1 - r = x; - r = ((r & 0xaa)>>1) + (r & 0x55); - r = ((r & 0xcc)>>2) + (r & 0x33); - r = ((r>>4) + r) & 0x0f; - #else - r = _popCount[x & 0xff]; - #endif - return r; - } - -}; -#endif diff --git a/libcds/include/libcdsTrees.h b/libcds/include/libcdsTrees.h deleted file mode 100644 index f633a4ce..00000000 --- a/libcds/include/libcdsTrees.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef _BASICS_TREES_H -#define _BASICS_TREES_H - -#include -using namespace std; - -#define MAX(i,j) (((i) > (j)) ? (i) : (j)) - -namespace cds_utils -{ - static const unsigned int MAXINT=0x7fffffff; - static const unsigned int FACT_RANK = 20; - - /** Retrieve a given index from array A where every value uses len bits - * @param A Array - * @param len Length in bits of each field - * @param index Position to be retrieved - * */ - inline size_t get_field_64(uint *A, size_t len, size_t index) { - if(len==0) return 0; - uint result; - long long i=1, j=1; - i=i*index*len/W, j=j*index*len-W*i; - if (j+len <= W) - result = (A[i] << (W-j-len)) >> (W-len); - else { - result = A[i] >> j; - result = result | (A[i+1] << (WW-j-len)) >> (W-len); - } - return (size_t)result; - } - - inline void set_field_64(uint *A, size_t len, size_t index, size_t x) { - if(len==0) return; - long long i=1, j=1; - i= i*index*len/W, j= j*index*len-i*W; - uint mask = ((j+len) < W ? ~0u << (j+len) : 0) - | ((W-j) < W ? ~0u >> (W-j) : 0); - A[i] = (A[i] & mask) | x << j; - if (j+len>W) { - mask = ((~0u) << (len+j-W)); - A[i+1] = (A[i+1] & mask)| x >> (W-j); - } - } - - /*Compute the longest common prefix between the suffix (with max length = lim) that starts in t1 and t2 - * @param text The text - * @param t1 Position in the text where start the first suffix - * @param t2 Position in the text where start the second suffix - * @param lim Maximum value that can be returned - * */ - inline size_t lcp_length(char *text, size_t t1, size_t t2, size_t lim) { - size_t cont=0; - for(size_t i=0; i> p; - if (len == W) { - if (p) - answ |= (*(e+1)) << (W-p); - } - else { - if (p+len > W) - answ |= (*(e+1)) << (W-p); - answ &= (1<> (W-p)); - } - else { - if (p+len <= W) { - *e = (*e & ~(((1<> (W-p)); - } - } - - inline size_t loadText(char *filename, char **textt, size_t *length) { - char *text; - ifstream in(filename); - if(!in.good()) - return 1; - in.seekg(0,ios_base::end); - size_t len = in.tellg(); - text = new char[len+1]; - in.seekg(0,ios_base::beg); - in.read(text,len); - in.close(); - text[len] = '\0'; - *textt = text; - *length = len+1; - return 0; - } - -}; -#endif diff --git a/libcds/include/mmap.h b/libcds/include/mmap.h deleted file mode 100644 index 505dc63c..00000000 --- a/libcds/include/mmap.h +++ /dev/null @@ -1,62 +0,0 @@ - -/* mman.h - Copyright (C) 2005, K. Sadakane, all rights reserved. - - This file contains an implementation of memory manager - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifndef _MYMMAP_H_ -#define _MYMMAP_H_ - -#ifdef WIN32 -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif - -#ifdef WIN32 -#define PAGE_READONLY 0x02 -#define SECTION_MAP_READ 0x0004 -#define FILE_MAP_READ SECTION_MAP_READ -#endif - -namespace cds_static -{ - - typedef struct - { - void *addr; - int len; - #ifdef WIN32 - HANDLE h1,h2; - #else - int fd; - #endif - } MMAP; - - MMAP *mymmap (char *fname); - int mymunmap (MMAP *m); - -}; -#endif diff --git a/libcds/include/perm.h b/libcds/include/perm.h deleted file mode 100644 index a0003be7..00000000 --- a/libcds/include/perm.h +++ /dev/null @@ -1,95 +0,0 @@ -/* perm.h - * Copyright (C) 2005, Diego Arroyuelo, all rights reserved. - * Copyright (C) 2009, Francisco Claude - * - * Permutation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef PERMINCLUDED -#define PERMINCLUDED - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - typedef struct sperm - { - uint *elems; // elements of the permutation - uint nelems; // # of elements - BitSequence * bmap; // bitmap allowing rank() queries in O(1) time - uint *bwdptrs; // array of backward pointers - uint nbits; // log(nelems) - uint nbwdptrs; // # of backward pointers - uint t; - } *perm; - - typedef struct - { - uint key; - uint pointer; - } auxbwd; - - /** Creates a permutation - * - * @author Diego Arroyuelo - */ - perm createPerm(uint *elems, uint nelems, uint t, BitSequenceBuilder * bmb); - - /** Gets the i-th element of the permutation - * - * @author Diego Arroyuelo - */ - uint getelemPerm(const perm P, uint i); - - /** Destroys a permutation - * - * @author Diego Arroyuelo - */ - void destroyPerm(perm P); - - /** Get pi(i)^{-1} - * - * @author Diego Arroyuelo - */ - uint inversePerm(const perm P, uint i); - - /** Saves a permutation - * - * @author Diego Arroyuelo - */ - uint savePerm(const perm P, ostream & f); - - /** Loads a permutation - * - * @author Diego Arroyuelo - */ - perm loadPerm(istream & f); - - /** Returns the size of the data structure - * - * @author Diego Arroyuelo - */ - uint sizeofPerm(const perm P); - -}; -#endif diff --git a/libcds/include/sdarraySadakane.h b/libcds/include/sdarraySadakane.h deleted file mode 100644 index af40ec5c..00000000 --- a/libcds/include/sdarraySadakane.h +++ /dev/null @@ -1,80 +0,0 @@ -/* sdarraySadakane.h - * Copyright (C) 2009, K. Sadakane, all rights reserved. - * - * This is an adapatation of the original sdarray implementation - * by K. Sadakane. Modifications and probable bugs were introduced - * by Francisco Claude. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef SDARRAY_H -#define SDARRAY_H - -#include -#include -#include -#include - -#include -#include -#include - -namespace cds_static -{ - - using namespace cds_utils; - - typedef struct - { - int n,m; - int size; - unsigned char *buf; - uint *lp; - uint *sl; - ushort *ss; - uint ss_len, sl_len; - uint *p; - } selectd2; - - typedef struct - { - int n,m,d; - int size; - unsigned char *hi; - uint *low; - selectd2 *sd0,*sd1; - uint hi_len, low_len; - //uint lasti, lasts; - } selects3; - - int selects3_construct(selects3 *select, const int n, const uint *buf); - int selects3_select(const selects3 *select, const int i); - int selects3_rank(const selects3 *select, const int i); - int selects3_selectnext(const selects3 *select, const int i); - - void make___selecttbl(void); - void selectd2_save(const selectd2 * s, ostream & fp); - void selects3_save(const selects3 * s, ostream & fp); - - void selectd2_load(selectd2 * s, istream & fp); - void selects3_load(selects3 * s, istream & fp); - - void selectd2_free(selectd2 * s); - void selects3_free(selects3 * s); - -} -#endif diff --git a/libcds/include/timing.h b/libcds/include/timing.h deleted file mode 100644 index a302ce32..00000000 --- a/libcds/include/timing.h +++ /dev/null @@ -1,46 +0,0 @@ -/* timing.h - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_utils -{ - /** Resets the system timer (yes, we only have one) - */ - void start_timing(); - - /** Obtains the number of milliseconds since the last timer start - */ - double get_timing(); - -}; diff --git a/libcds/include/wt_coder.h b/libcds/include/wt_coder.h deleted file mode 100644 index 933b2bc7..00000000 --- a/libcds/include/wt_coder.h +++ /dev/null @@ -1,75 +0,0 @@ -/* wt_coder.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_coder_h -#define wt_coder_h - -#include -#include - -using namespace std; - -namespace cds_static -{ - - #define WT_CODER_HUFF_HDR 2 - #define WT_CODER_BINARY_HDR 3 - - class wt_coder_binary; - class wt_coder_huff; - - /** Coder that defines the shape of a wavelet tree - * - * @author Francisco Claude - */ - class wt_coder - { - public: - wt_coder(); - virtual void use(); - virtual void unuse(); - virtual ~wt_coder() {}; - /** Tells if at level l the symbol is represented by a one or a zero */ - virtual bool is_set(uint symbol, uint l) const=0; - virtual bool is_set(uint *symbol, uint l) const=0; - /** Tells if the path of symbol becomes unique at level l */ - virtual bool done(uint symbol, uint l) const =0; - virtual uint * get_symbol(uint symbol) const = 0; - /** Returns the size of the coder */ - virtual size_t getSize() const = 0; - /** Returns the depth of the tree */ - virtual uint depth() const - { - return -1; // Implemented in wt_coder_binary - } - /** Saves the coder to a file, returns 0 in case of success */ - virtual void save(ostream & fp) const = 0; - /** Loads a coder from a file, returns NULL in case of error */ - static wt_coder * load(istream & fp); - protected: - uint user_count; - }; - -}; - -#include -#include -#endif diff --git a/libcds/include/wt_coder_binary.h b/libcds/include/wt_coder_binary.h deleted file mode 100644 index 2d8e2447..00000000 --- a/libcds/include/wt_coder_binary.h +++ /dev/null @@ -1,61 +0,0 @@ -/* wt_coder_binary.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder_binary definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_coder_binary_h -#define wt_coder_binary_h - -#include -#include -#include - -using namespace std; - -namespace cds_static -{ - - /** Considers the binary representation of the symbols as the code - * - * @author Francisco Claude - */ - class wt_coder_binary: public wt_coder - { - public: - wt_coder_binary(const Array & a, Mapper *am); - /** Buils a wt_coder_binary using the sequence of length n and the alphabet_mapper - * to determine the length of the binary codes */ - wt_coder_binary(uint * seq, size_t n, Mapper * am); - wt_coder_binary(uchar * seq, size_t n, Mapper * am); - virtual ~wt_coder_binary(); - virtual bool is_set(uint symbol, uint l) const; - virtual bool is_set(uint *symbol, uint l) const; - virtual bool done(uint symbol, uint l) const; - virtual uint depth() const{ return h; } - virtual uint * get_symbol(uint symbol) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static wt_coder_binary * load(istream & fp); - - protected: - wt_coder_binary(); - uint h; - }; -}; -#endif diff --git a/libcds/include/wt_coder_huff.h b/libcds/include/wt_coder_huff.h deleted file mode 100644 index 6c8d773e..00000000 --- a/libcds/include/wt_coder_huff.h +++ /dev/null @@ -1,61 +0,0 @@ -/* wt_coder_huff.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder_huff definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_coder_huff_h -#define wt_coder_huff_h - -#include -#include -#include -#include - -namespace cds_static -{ - - /** Uses huffman codes to determine the shape of the wavelet tree - * - * @author Francisco Claude - */ - class wt_coder_huff: public wt_coder - { - public: - /** Buils a wt_coder_huff using the sequence of length n and the alphabet_mapper - * to determine the huffman codes */ - wt_coder_huff(const Array & a, Mapper *am); - wt_coder_huff(uint *symbs, size_t n, Mapper * am); - wt_coder_huff(uchar *symbs, size_t n, Mapper * am); - virtual ~wt_coder_huff(); - virtual bool is_set(uint symbol, uint l) const; - virtual bool is_set(uint *symbol, uint l) const; - virtual bool done(uint symbol, uint l) const; - virtual size_t getSize() const; - virtual uint * get_symbol(uint symbol) const; - virtual void save(ostream & fp) const; - static wt_coder_huff * load(istream & fp); - //uint * get_buffer(uint symbol, uint *n); - - protected: - wt_coder_huff(); - HuffmanCoder * hc; - uint maxBuffer; - }; -}; -#endif diff --git a/libcds/include/wt_node.h b/libcds/include/wt_node.h deleted file mode 100644 index b9668d96..00000000 --- a/libcds/include/wt_node.h +++ /dev/null @@ -1,60 +0,0 @@ -/* wt_node.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_node_h -#define wt_node_h - -#include -#include -#include - -using namespace cds_utils; - -namespace cds_static -{ - - #define WT_NODE_NULL_HDR 0 - #define WT_NODE_INTERNAL_HDR 2 - #define WT_NODE_LEAF_HDR 3 - - /** Base clase for nodes in the wavelet tree - * - * @author Francisco Claude - */ - class wt_node - { - public: - virtual ~wt_node() {} - virtual size_t rank(uint *symbol, size_t pos, uint l, wt_coder *c) const = 0; - virtual size_t select(uint *symbol, size_t pos, uint l, wt_coder *c) const = 0; - virtual pair quantile_freq(size_t left,size_t right,uint q) const = 0; - virtual uint access(size_t pos) const = 0; - virtual uint access(size_t pos, size_t & rankp) const = 0; - virtual size_t getSize() const = 0; - virtual void save(ostream & fp) const = 0; - static wt_node * load(istream & fp); - }; - -}; - -#include -#include -#endif diff --git a/libcds/include/wt_node_internal.h b/libcds/include/wt_node_internal.h deleted file mode 100644 index 1ff414c6..00000000 --- a/libcds/include/wt_node_internal.h +++ /dev/null @@ -1,61 +0,0 @@ -/* wt_node_internal.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node_internal - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_node_internal_h -#define wt_node_internal_h - -#include -#include -#include -#include -#include - -namespace cds_static -{ - - /** Class for representing internal nodes - * - * @author Francisco Claude - */ - class wt_node_internal: public wt_node - { - public: - wt_node_internal(uint * seq, size_t n, uint l, wt_coder * c, BitSequenceBuilder * bmb); - wt_node_internal(uchar * seq, size_t n, uint l, wt_coder * c, BitSequenceBuilder * bmb, size_t left, uint * done); - virtual ~wt_node_internal(); - virtual size_t rank(uint *symbol, size_t pos, uint level, wt_coder *c) const; - //virtual size_t rankLessThan(uint &symbol, size_t pos) const; - virtual size_t select(uint *symbol, size_t pos, uint level, wt_coder *c) const; - virtual pair quantile_freq(size_t left,size_t right,uint q) const; - virtual uint access(size_t pos) const; - virtual uint access(size_t pos, size_t & rankp) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static wt_node_internal * load(istream & fp); - - protected: - wt_node_internal(); - wt_node *left_child, *right_child; - BitSequence * bitmap; - //uint length; - }; -}; -#endif diff --git a/libcds/include/wt_node_leaf.h b/libcds/include/wt_node_leaf.h deleted file mode 100644 index 91eb4dd3..00000000 --- a/libcds/include/wt_node_leaf.h +++ /dev/null @@ -1,58 +0,0 @@ -/* wt_node_leaf.h - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node_leaf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef wt_node_leaf_h -#define wt_node_leaf_h - -#include -#include -#include -#include -#include - -namespace cds_static -{ - - /** Class for representing leaves of the wavelet tree. - * - * @author Francisco Claude - */ - class wt_node_leaf: public wt_node - { - public: - wt_node_leaf(uint symbol, size_t count); - virtual ~wt_node_leaf(); - virtual size_t rank(uint *symbol, size_t pos, uint l, wt_coder *c) const; - virtual size_t select(uint *symbol, size_t pos, uint l, wt_coder *c) const; - virtual pair quantile_freq(size_t left,size_t right,uint q) const; - virtual uint access(size_t pos) const; - virtual uint access(size_t pos, size_t &rank) const; - virtual size_t getSize() const; - virtual void save(ostream & fp) const; - static wt_node_leaf * load(istream & fp); - - protected: - wt_node_leaf(); - uint symbol; - size_t count; - }; -}; -#endif diff --git a/libcds/src/static/bitsequence/BitSequence.cpp b/libcds/src/static/bitsequence/BitSequence.cpp deleted file mode 100644 index a16b320b..00000000 --- a/libcds/src/static/bitsequence/BitSequence.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* BitSequence.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * BitSequence definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - size_t BitSequence::rank0(const size_t i) const - { - return i+1-rank1(i); - } - - size_t BitSequence::rank1(const size_t i) const - { - if(i>=length) return (size_t)-1; - if(ones==0) return 0; - if(ones==length) return i+1; - size_t ini = 1; - size_t fin = ones; - while(inii) return ini-1; - return ini; - } - - size_t BitSequence::select0(const size_t i) const - { - if(i>length-ones) return -1; - if(i==0) return -1; - if(ones==0) return i-1; - size_t ini = 0; - size_t fin = length-1; - while(iniones) return -1; - if(i==0) return -1; - if(ones==length) return i-1; - size_t ini = 0; - size_t fin = length-1; - while(ini0; - } - - bool BitSequence::access(const size_t i, size_t &r) const - { - r = rank1(i); - if(!access(i)) { - r = i-r+1; - return false; - } - else { - return true; - } - } - - size_t BitSequence::getLength() const - { - return length; - } - - size_t BitSequence::countOnes() const - { - return ones; - } - - size_t BitSequence::countZeros() const - { - return length-ones; - } - - BitSequence * BitSequence::load(istream & fp) { - uchar r = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(uchar)); - switch(r) { - case RRR02_HDR: return BitSequenceRRR::load(fp); - case BRW32_HDR: return BitSequenceRG::load(fp); - //case RRR02_LIGHT_HDR: return BitSequence_rrr02_light::load(fp); - case SDARRAY_HDR: return BitSequenceSDArray::load(fp); - case DARRAY_HDR: return BitSequenceDArray::load(fp); - } - return NULL; - } -}; diff --git a/libcds/src/static/bitsequence/BitSequenceBuilderDArray.cpp b/libcds/src/static/bitsequence/BitSequenceBuilderDArray.cpp deleted file mode 100644 index be820c6b..00000000 --- a/libcds/src/static/bitsequence/BitSequenceBuilderDArray.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* BitSequenceBuilderDArray.cpp - * Copyright (C) 2010, Rodrigo Canovas, all rights reserved. - * - * Rodrigo Canovas - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "BitSequenceBuilderDArray.h" - -namespace cds_static -{ - - BitSequenceBuilderDArray::BitSequenceBuilderDArray() { - } - - BitSequenceBuilderDArray::~BitSequenceBuilderDArray() { - } - - BitSequence * BitSequenceBuilderDArray::build(uint * bitseq, size_t len) const - { - return new BitSequenceDArray(bitseq,len); - } - - BitSequence * BitSequenceBuilderDArray::build(const BitString & bs) const - { - return new BitSequenceDArray(bs); - } - -}; diff --git a/libcds/src/static/bitsequence/BitSequenceBuilderRG.cpp b/libcds/src/static/bitsequence/BitSequenceBuilderRG.cpp deleted file mode 100644 index 80247aed..00000000 --- a/libcds/src/static/bitsequence/BitSequenceBuilderRG.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* BitSequenceBuilderRG.cpp - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - BitSequenceBuilderRG::BitSequenceBuilderRG(uint factor) { - this->factor = factor; - } - - BitSequence * BitSequenceBuilderRG::build(uint * bitseq, size_t len) const - { - return new BitSequenceRG(bitseq,len,factor); - } - - BitSequence * BitSequenceBuilderRG::build(const BitString & bs) const - { - return new BitSequenceRG(bs,factor); - } - -}; diff --git a/libcds/src/static/bitsequence/BitSequenceBuilderRRR.cpp b/libcds/src/static/bitsequence/BitSequenceBuilderRRR.cpp deleted file mode 100644 index 3b973613..00000000 --- a/libcds/src/static/bitsequence/BitSequenceBuilderRRR.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* BitSequenceBuilderRRR.cpp - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - BitSequenceBuilderRRR::BitSequenceBuilderRRR(uint sample_rate) { - this->sample_rate = sample_rate; - } - - BitSequence * BitSequenceBuilderRRR::build(uint * bitseq, size_t len) const - { - return new BitSequenceRRR(bitseq,len,sample_rate); - } - - BitSequence * BitSequenceBuilderRRR::build(const BitString & bs) const - { - return new BitSequenceRRR(bs,sample_rate); - } - -}; diff --git a/libcds/src/static/bitsequence/BitSequenceBuilderSDArray.cpp b/libcds/src/static/bitsequence/BitSequenceBuilderSDArray.cpp deleted file mode 100644 index 679f4170..00000000 --- a/libcds/src/static/bitsequence/BitSequenceBuilderSDArray.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* BitSequenceBuilderSDArray.cpp - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - BitSequenceBuilderSDArray::BitSequenceBuilderSDArray() { - } - - BitSequenceBuilderSDArray::~BitSequenceBuilderSDArray() { - } - - BitSequence * BitSequenceBuilderSDArray::build(uint * bitseq, size_t len) const - { - return new BitSequenceSDArray(bitseq,len); - } - - BitSequence * BitSequenceBuilderSDArray::build(const BitString & bs) const - { - return new BitSequenceSDArray(bs); - } - -}; diff --git a/libcds/src/static/bitsequence/BitSequenceDArray.cpp b/libcds/src/static/bitsequence/BitSequenceDArray.cpp deleted file mode 100644 index 7827cb95..00000000 --- a/libcds/src/static/bitsequence/BitSequenceDArray.cpp +++ /dev/null @@ -1,337 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - static unsigned int __selecttbl_D[8*256]; - static int built_D = 0; - - void make___selecttbl_D(void) { - if(built_D) return; - built_D = 1; - int i,x,r; - uint buf[1]; - buf[0] = 0; - for (x = 0; x < 256; x++) { - __setbits(buf,0,8,x); - for (r=0; r<8; r++) __selecttbl_D[(r<<8)+x] = -1; - r = 0; - for (i=0; i<8; i++) { - if (__getbit(buf,i)) { - __selecttbl_D[(r<<8)+x] = i; - r++; - } - } - } - } - - BitSequenceDArray::BitSequenceDArray() { - length = m = nl = 0; - a = NULL; - lp = NULL; - sl = NULL; - ss = NULL; - p = NULL; - rl = NULL; - rs = NULL; - } - - BitSequenceDArray::BitSequenceDArray(const BitString & bs) { - uint * tmp_seq = new uint[uint_len(bs.getLength(),1)+1]; - ones = 0; - for(uint i=0;iowner = true; - this->n=_n; - uint lgn=bits(n-1); - this->factor=_factor; - if (_factor==0) this->factor=lgn; - else this->factor=_factor; - b=32; - s=b*this->factor; - integers = n/W+1; - BuildRank(); - this->length = n; - this->ones = rank1(n-1); - } - - BitSequenceRG::BitSequenceRG( uint *bitarray, size_t _n, uint _factor) { - /*cout << "*****" << endl; - cout << bitarray << endl; - cout << _n << endl; - cout << _factor << endl; */ - if(_factor==0) exit(-1); - data=new uint[_n/W+1]; - for(size_t i=0;iowner = true; - this->n=_n; - uint lgn=bits(n-1); - this->factor=_factor; - if (_factor==0) this->factor=lgn; - else this->factor=_factor; - b=32; - s=b*this->factor; - integers = n/W+1; - BuildRank(); - this->length = n; - this->ones = rank1(n-1); - } - - BitSequenceRG::~BitSequenceRG() { - delete [] Rs; - delete [] data; - } - - //Metodo que realiza la busqueda d - void BitSequenceRG::BuildRank() { - size_t num_sblock = n/s; - // +1 pues sumo la pos cero - Rs = new uint[num_sblock+5]; - for(uint i=0;i(f,n); - saveValue(f,factor); - saveValue(f,data,integers); - saveValue(f,Rs,n/s+1); - } - - BitSequenceRG * BitSequenceRG::load(istream & f) { - assert(f.good()); - uchar type = loadValue(f); - if(type!=BRW32_HDR) { // throw exception - abort(); - } - BitSequenceRG * ret = new BitSequenceRG(); - ret->n = loadValue(f); - ret->b = 32; - ret->factor = loadValue(f); - ret->s = ret->b*ret->factor; - ret->integers = (ret->n+1)/W+((ret->n+1)%W!=0?1:0); - ret->data = loadValue(f,ret->integers); - ret->Rs = loadValue(f,ret->n/ret->s+1); - ret->length = ret->n; - ret->ones = ret->rank1(ret->n-1); - return ret; - } - - size_t BitSequenceRG::SpaceRequirementInBits() const - { - return uint_len(n,1)*sizeof(uint)*8+(n/s)*sizeof(uint)*8 +sizeof(this)*8; - } - - size_t BitSequenceRG::getSize() const - { - //cout << "n=" << n << " size=" << SpaceRequirementInBits() << endl; - return /*sizeof(BitSequenceRG)+*/SpaceRequirementInBits()/8; - } - - size_t BitSequenceRG::SpaceRequirement() const - { - return n/8+(n/s)*sizeof(uint)+sizeof(BitSequenceRG); - } - - size_t BitSequenceRG::selectPrev1(const size_t start) const - { - // returns the position of the previous 1 bit before and including start. - // tuned to 32 bit machine - - uint i = start >> 5; - int offset = (start % W); - uint aux2 = data[i] & (-1u >> (31-offset)); - - if (aux2 > 0) { - if ((aux2&0xFF000000) > 0) return i*W+23+prev_tab[(aux2>>24)&0xFF]; - else if ((aux2&0xFF0000) > 0) return i*W+15+prev_tab[(aux2>>16)&0xFF]; - else if ((aux2&0xFF00) > 0) return i*W+7+prev_tab[(aux2>>8)&0xFF]; - else return i*W+prev_tab[aux2&0xFF]-1; - } - for (uint k=i-1;;k--) { - aux2=data[k]; - if (aux2 > 0) { - if ((aux2&0xFF000000) > 0) return k*W+23+prev_tab[(aux2>>24)&0xFF]; - else if ((aux2&0xFF0000) > 0) return k*W+15+prev_tab[(aux2>>16)&0xFF]; - else if ((aux2&0xFF00) > 0) return k*W+7+prev_tab[(aux2>>8)&0xFF]; - else return k*W+prev_tab[aux2&0xFF]-1; - } - } - return 0; - } - - size_t BitSequenceRG::selectNext1(const size_t k1) const - { - uint k = (uint)k1; - uint count = k; - uint des,aux2; - des=count%W; - aux2= data[count/W] >> des; - if (aux2 > 0) { - if ((aux2&0xff) > 0) return count+select_tab[aux2&0xff]-1; - else if ((aux2&0xff00) > 0) return count+8+select_tab[(aux2>>8)&0xff]-1; - else if ((aux2&0xff0000) > 0) return count+16+select_tab[(aux2>>16)&0xff]-1; - else {return count+24+select_tab[(aux2>>24)&0xff]-1;} - } - - for (uint i=count/W+1;i 0) { - if ((aux2&0xff) > 0) return i*W+select_tab[aux2&0xff]-1; - else if ((aux2&0xff00) > 0) return i*W+8+select_tab[(aux2>>8)&0xff]-1; - else if ((aux2&0xff0000) > 0) return i*W+16+select_tab[(aux2>>16)&0xff]-1; - else {return i*W+24+select_tab[(aux2>>24)&0xff]-1;} - } - } - return n; - } - - size_t BitSequenceRG::select1(const size_t x1) const - { - uint x=x1; - // returns i such that x=rank(i) && rank(i-1)ones) return (uint)(-1); - - //binary search over first level rank structure - uint l=0, r=n/s; - uint mid=(l+r)/2; - uint rankmid = Rs[mid]; - while (l<=r) { - if (rankmid integers) return n; - j = data[left]; - ones = popcount(j); - } - //sequential search using popcount over a char - left=left*b; - rankmid = popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - rankmid = popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - rankmid = popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - } - } - } - - // then sequential search bit a bit - while (x>0) { - if (j&1) x--; - j=j>>1; - left++; - } - return left-1; - } - - size_t BitSequenceRG::select0(const size_t x1) const - { - uint x = (uint)x1; - // returns i such that x=rank_0(i) && rank_0(i-1)n-ones) return (uint)(-1); - - //binary search over first level rank structure - if(x==0) return 0; - uint l=0, r=n/s; - uint mid=(l+r)/2; - uint rankmid = mid*factor*W-Rs[mid]; - while (l<=r) { - if (rankmid integers) return n; - j = data[left]; - zeros = W-popcount(j); - } - //sequential search using popcount over a char - left=left*b; - rankmid = 8-popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - rankmid = 8-popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - rankmid = 8-popcount8(j); - if (rankmid < x) { - j=j>>8; - x-=rankmid; - left+=8; - } - } - } - - // then sequential search bit a bit - while (x>0) { - if (j%2 == 0 ) x--; - j=j>>1; - left++; - } - left--; - if (left > n) return n; - else return left; - } -}; diff --git a/libcds/src/static/bitsequence/BitSequenceRRR.cpp b/libcds/src/static/bitsequence/BitSequenceRRR.cpp deleted file mode 100644 index de16e66f..00000000 --- a/libcds/src/static/bitsequence/BitSequenceRRR.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* BitSequenceRRR.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * BitSequenceRRR definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - table_offset * BitSequenceRRR::E = NULL; - - BitSequenceRRR::BitSequenceRRR() { - ones=0; - length=0; - if(E==NULL) E = new table_offset(BLOCK_SIZE); - E->use(); - C = NULL; - O = NULL; - C_sampling = NULL; - O_pos = NULL; - sample_rate = DEFAULT_SAMPLING; - C_len = O_len = C_sampling_len = O_pos_len = 0; - O_bits_len = C_sampling_field_bits = O_pos_field_bits = 0; - } - - BitSequenceRRR::BitSequenceRRR(uint * bitseq, size_t len, uint sample_rate) { - build(bitseq,len,sample_rate); - } - - BitSequenceRRR::BitSequenceRRR(const BitString & bs, uint sample_rate) { - build(bs.getData(),bs.getLength(),sample_rate); - } - - void BitSequenceRRR::build(const uint * bitseq, size_t len, uint sample_rate) { - ones = 0; - this->length = len; - if(E==NULL) E = new table_offset(BLOCK_SIZE); - E->use(); - - // Table C - C_len = len/BLOCK_SIZE + (len%BLOCK_SIZE!=0); - C_field_bits = bits(BLOCK_SIZE); - C = new uint[uint_len(C_len,C_field_bits)]; - for(uint i=0;iget_log2binomial(BLOCK_SIZE,value); - } - - // Table O - O_len = uint_len(1,O_bits_len); - O = new uint[O_len]; - for(uint i=0;iget_log2binomial(BLOCK_SIZE,popcount(value))-1,E->compute_offset((ushort)value)); - O_pos += E->get_log2binomial(BLOCK_SIZE,popcount(value)); - } - C_sampling = NULL; - this->O_pos = NULL; - - create_sampling(sample_rate); - } - - void BitSequenceRRR::create_sampling(uint sample_rate) { - this->sample_rate = sample_rate; - /*cout << "===================" << endl; - cout << "length = " << length << endl; - cout << "ones = " << ones << endl; - cout << "C_len = " << C_len << endl; - cout << "C_field_bits = " << C_field_bits << endl; - cout << "O_len = " << O_len << endl; - cout << "O_bits_len = " << O_bits_len << endl; - cout << "sample_rate = " << sample_rate << endl; - cout << "C_alen = " << uint_len(C_len,C_field_bits) << endl; - cout << "O_alen = " << O_len << endl;*/ - - // Sampling for C - C_sampling_len = C_len/sample_rate+2; - C_sampling_field_bits = bits(ones); - if(C_sampling!=NULL) delete [] C_sampling; - C_sampling = new uint[max((uint)1,uint_len(C_sampling_len,C_sampling_field_bits))]; - for(uint i=0;iget_log2binomial(BLOCK_SIZE,get_field(C,C_field_bits,i)); - } - } - - bool BitSequenceRRR::access(const size_t i) const - { - size_t nearest_sampled_value = i/BLOCK_SIZE/sample_rate; - size_t pos_O = get_field(O_pos,O_pos_field_bits,nearest_sampled_value); - size_t pos = i/BLOCK_SIZE; - assert(pos<=C_len); - for(size_t k=nearest_sampled_value*sample_rate;kget_log2binomial(BLOCK_SIZE,aux); - } - size_t c = get_field(C,C_field_bits,pos); - return ((1<<(i%BLOCK_SIZE))&E->short_bitmap(c,get_var_field(O,pos_O,pos_O+E->get_log2binomial(BLOCK_SIZE,c)-1)))!=0; - } - - bool BitSequenceRRR::access(const size_t i, size_t &r) const - { - if(i+1==0) return 0; - // patch for 32-64 bits bad coding, to be removed in the future - if((uint)(i+1)==0) return 0; - uint nearest_sampled_value = i/BLOCK_SIZE/sample_rate; - uint sum = get_field(C_sampling,C_sampling_field_bits,nearest_sampled_value); - uint pos_O = get_field(O_pos,O_pos_field_bits,nearest_sampled_value); - uint pos = i/BLOCK_SIZE; - uint k=nearest_sampled_value*sample_rate; - if(k%2==1 && kget_log2binomial(BLOCK_SIZE,aux); - k++; - } - unsigned char * a = (unsigned char *)C; - size_t mask = 0x0F; - a += k/2; - while(k<(uint)max(0,(int)pos-1)) { - assert(((*a)&mask)==get_field(C,C_field_bits,k)); - assert((*a)/16==get_field(C,C_field_bits,k+1)); - sum += ((*a)&mask)+(*a)/16; - pos_O += E->get_log2binomial(BLOCK_SIZE,((*a)&mask))+E->get_log2binomial(BLOCK_SIZE,((*a)/16)); - a++; - k+=2; - } - if(kget_log2binomial(BLOCK_SIZE,aux); - k++; - } - size_t c = get_field(C,C_field_bits,pos); - short v = E->short_bitmap(c,get_var_field(O,pos_O,pos_O+E->get_log2binomial(BLOCK_SIZE,c)-1)); - sum += popcount(((2<<(i%BLOCK_SIZE))-1) & v); - r = sum; - if( ((1<<(i%BLOCK_SIZE)) & v) != 0 ) { - return true; - } - else { - r = i-r+1; - return false; - } - } - - size_t BitSequenceRRR::rank0(size_t i) const - { - if(i+1==0) return 0; - return 1+i-rank1(i); - } - - size_t BitSequenceRRR::rank1(size_t i) const - { - if(i+1==0) return 0; - // patch for 32-64 bits bad coding, to be removed in the future - if((uint)(i+1)==0) return 0; - uint nearest_sampled_value = i/BLOCK_SIZE/sample_rate; - uint sum = get_field(C_sampling,C_sampling_field_bits,nearest_sampled_value); - uint pos_O = get_field(O_pos,O_pos_field_bits,nearest_sampled_value); - uint pos = i/BLOCK_SIZE; - uint k=nearest_sampled_value*sample_rate; - if(k%2==1 && kget_log2binomial(BLOCK_SIZE,aux); - k++; - } - unsigned char * a = (unsigned char *)C; - size_t mask = 0x0F; - a += k/2; - while(k<(uint)max(0,(int)pos-1)) { - assert(((*a)&mask)==get_field(C,C_field_bits,k)); - assert((*a)/16==get_field(C,C_field_bits,k+1)); - sum += ((*a)&mask)+(*a)/16; - pos_O += E->get_log2binomial(BLOCK_SIZE,((*a)&mask))+E->get_log2binomial(BLOCK_SIZE,((*a)/16)); - a++; - k+=2; - } - if(kget_log2binomial(BLOCK_SIZE,aux); - k++; - } - size_t c = get_field(C,C_field_bits,pos); - sum += popcount(((2<<(i%BLOCK_SIZE))-1) & E->short_bitmap(c,get_var_field(O,pos_O,pos_O+E->get_log2binomial(BLOCK_SIZE,c)-1))); - return sum; - } - - size_t BitSequenceRRR::select0(size_t i) const - { - if(i==0) return (uint)-1; - if(i>length-ones) return (uint)-1; - - // Search over partial sums - size_t start=0; - size_t end=C_sampling_len-1; - size_t med, acc=0, pos; - while(start=i) break; - pos_O += E->get_log2binomial(BLOCK_SIZE,s); - acc += BLOCK_SIZE-s; - } - pos = (pos)*BLOCK_SIZE; - - // Search inside the block - while(accget_log2binomial(BLOCK_SIZE,s); - size_t block = E->short_bitmap(s,get_var_field(O,pos_O,new_posO-1)); - pos_O = new_posO; - new_posO = 0; - while(accones) return -1; - // Search over partial sums - size_t start=0; - size_t end=C_sampling_len-1; - size_t med, acc=0, pos; - while(start=i) break; - pos_O += E->get_log2binomial(BLOCK_SIZE,s); - acc += s; - } - pos = (pos)*BLOCK_SIZE; - - // Search inside the block - while(accget_log2binomial(BLOCK_SIZE,s); - size_t block = E->short_bitmap(s,get_var_field(O,pos_O,new_posO-1)); - pos_O = new_posO; - new_posO = 0; - while(accunuse(); - } - - void BitSequenceRRR::save(ostream & f) const - { - /*cout << "===================" << endl; - cout << "length = " << length << endl; - cout << "ones = " << ones << endl; - cout << "C_len = " << C_len << endl; - cout << "C_field_bits = " << C_field_bits << endl; - cout << "O_len = " << O_len << endl; - cout << "O_bits_len = " << O_bits_len << endl; - cout << "sample_rate = " << sample_rate << endl; - cout << "C_alen = " << uint_len(C_len,C_field_bits) << endl; - cout << "O_alen = " << O_len << endl;*/ - uchar wr = RRR02_HDR; - saveValue(f,wr); - saveValue(f,length); - saveValue(f,ones); - saveValue(f,C_len); - saveValue(f,C_field_bits); - saveValue(f,O_len); - saveValue(f,O_bits_len); - saveValue(f,sample_rate); - saveValue(f,C,uint_len(C_len,C_field_bits)); - saveValue(f,O,O_len); - } - - BitSequenceRRR * BitSequenceRRR::load(istream & f) { - BitSequenceRRR * ret = NULL; - try - { - ret = new BitSequenceRRR(); - uchar type = loadValue(f); - // TODO:throw an exception! - if(type!=RRR02_HDR) { - abort(); - } - ret->length = loadValue(f); - //cout << ret->length << endl; - ret->ones = loadValue(f); - //cout << ret->ones << endl; - ret->C_len = loadValue(f); - //cout << ret->C_len << endl; - ret->C_field_bits = loadValue(f); - //cout << ret->C_field_bits << endl; - ret->O_len = loadValue(f); - //cout << ret->O_len << endl; - ret->O_bits_len = loadValue(f); - //cout << ret->O_bits_len << endl; - ret->sample_rate = loadValue(f); - //cout << ret->sample_rate << endl; - //ret->length = loadValue(f); - ret->C = loadValue(f,uint_len(ret->C_len,ret->C_field_bits)); - ret->O = loadValue(f,ret->O_len); - ret->create_sampling(ret->sample_rate); - return ret; - } - catch(exception e) { - delete ret; - } - return NULL; - } -} diff --git a/libcds/src/static/bitsequence/BitSequenceSDArray.cpp b/libcds/src/static/bitsequence/BitSequenceSDArray.cpp deleted file mode 100644 index 3b16d05c..00000000 --- a/libcds/src/static/bitsequence/BitSequenceSDArray.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* BitSequenceSDArray.cpp - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This class is a wrapper for sdarraySadakane.cpp, which was implemented - * by K. Sadakane. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - BitSequenceSDArray::BitSequenceSDArray(const BitString & bs) { - uint * tmp_seq = new uint[uint_len(bs.getLength(),1)+1]; - ones = 0; - for(uint i=0;ilength = bs.getLength(); - delete [] tmp_seq; - } - - BitSequenceSDArray::BitSequenceSDArray(uint * buff, size_t len) { - uint * tmp_seq = new uint[uint_len(len,1)+1]; - ones = 0; - for(uint i=0;ilength = len; - delete [] tmp_seq; - } - - BitSequenceSDArray::BitSequenceSDArray() { - make___selecttbl(); - } - - BitSequenceSDArray::~BitSequenceSDArray() { - if(ones) - selects3_free(&sd); - } - - size_t BitSequenceSDArray::rank1(size_t i) const - { - if(i>=length) return -1; - if(ones) - return selects3_rank(&sd,i); - else - return 0; - } - - size_t BitSequenceSDArray::select1(size_t i) const - { - if(i>ones || i==0) return -1; - if(ones) - return selects3_select(&sd,(uint)i); - else - return (uint)-1; - } - - size_t BitSequenceSDArray::selectNext1(size_t i) const - { - return selects3_selectnext(&sd,(uint)i); - } - - size_t BitSequenceSDArray::getSize() const - { - return sizeof(BitSequenceSDArray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0); - } - - void BitSequenceSDArray::save(ostream & fp) const - { - uchar wr = SDARRAY_HDR; - saveValue(fp,wr); - saveValue(fp,length); - saveValue(fp,ones); - if(ones) - selects3_save(&sd,fp); - } - - BitSequenceSDArray * BitSequenceSDArray::load(istream & fp) { - uchar id = loadValue(fp); - if(id!=SDARRAY_HDR) return NULL; - BitSequenceSDArray * ret = new BitSequenceSDArray(); - ret->length = loadValue(fp); - ret->ones = loadValue(fp); - if(ret->ones) - selects3_load(&ret->sd,fp); - return ret; - } - -}; diff --git a/libcds/src/static/bitsequence/TableOffsetRRR.cpp b/libcds/src/static/bitsequence/TableOffsetRRR.cpp deleted file mode 100644 index bd8cb148..00000000 --- a/libcds/src/static/bitsequence/TableOffsetRRR.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* table_offset.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Table for offsets. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "TableOffsetRRR.h" - -namespace cds_static -{ - // Interface for old implementation - void genera(ushort * bch, uint u, ushort * F, uint lF); - uint generaClase(ushort * bch, uint u, uint clase, uint puestos, uint pos_ini, uint generado); - uint offset_func(uint u, uint busca); - uint offsetRecursivo(uint u, uint busca, uint clase, uint puestos, uint pos_ini, uint generado); - uint __indiceFunc; - uint __indAcumulado; - ushort * __Lis; - // End interface old implementation - - table_offset::table_offset(uint u) { - this->u = u; - users_count = 0; - short_bitmaps = new ushort[((1< - -namespace cds_static -{ - static unsigned int __selecttbl[8*256]; - static int built = 0; - - void make___selecttbl(void) { - if(built) return; - built = 1; - int i,x,r; - uint buf[1]; - buf[0] = 0; - - for (x = 0; x < 256; x++) { - __setbits(buf,0,8,x); - for (r=0; r<8; r++) __selecttbl[(r<<8)+x] = -1; - r = 0; - for (i=0; i<8; i++) { - if (__getbit(buf,i)) { - __selecttbl[(r<<8)+x] = i; - r++; - } - } - } - } - - void selectd2_save(const selectd2 * s, ostream & fp) { - assert(fp.good()); - saveValue(fp,s->n); - saveValue(fp,s->m); - saveValue(fp,s->size); - saveValue(fp,s->ss_len); - saveValue(fp,s->sl_len); - saveValue(fp,s->buf,(s->n+7)/8+1); - uint nl = (s->m-1) / L + 1; - saveValue(fp,s->lp,nl+1); - saveValue(fp,s->p,nl+1); - saveValue(fp,s->ss,s->ss_len); - saveValue(fp,s->sl,s->sl_len); - } - - void selectd2_load(selectd2 * s, istream & fp) { - s->n = loadValue(fp); - s->m = loadValue(fp); - s->size = loadValue(fp); - s->ss_len = loadValue(fp); - s->sl_len = loadValue(fp); - s->buf = loadValue(fp,(s->n+7)/8+1); - uint nl = (s->m-1) / L + 1; - s->lp = loadValue(fp, nl+1); - s->p = loadValue(fp, nl+1); - s->ss = loadValue(fp, s->ss_len); - s->sl = loadValue(fp, s->sl_len); - } - - void selectd2_free(selectd2 * s) { - //delete [] s->buf; - delete [] s->lp; - delete [] s->p; - delete [] s->ss; - delete [] s->sl; - } - - int selectd2_construct(selectd2 *select, const int n, const unsigned char *buf) { - int i,m; - int nl; - int p,pp; - int il,is,ml,ms; - int r; - uint *s; - - make___selecttbl(); - - if (L/LLL == 0) { - printf("ERROR: L=%d LLL=%d\n",L,LLL); - exit(1); - } - - m = 0; - for (i=0; in = n; - select->m = m; - //printf("n=%d m=%d\n",n,m); - - select->buf = (unsigned char*)buf; - - s = new uint[m]; - m = 0; - for (i=0; isize = 0; //ignoring buf, shared with selects3 - select->lp = new uint[nl+1]; - for(int k=0;klp[k]=0; - select->size += (nl+1)*sizeof(uint); - select->p = new uint[nl+1]; - for(int k=0;kp[k]=0; - select->size += (nl+1)*sizeof(uint); - - for (r = 0; r < 2; r++) { - ml = ms = 0; - for (il = 0; il < nl; il++) { - pp = s[il*L]; - select->lp[il] = pp; - i = min((il+1)*(int)L-1,m-1); - p = s[i]; - //printf("%d ",p-pp); - if (p - pp >= (int)LL) { - if (r == 1) { - for (is = 0; is < (int)L; is++) { - if (il*(int)L+is >= m) break; - select->sl[ml*L+is] = s[il*L+is]; - } - } - select->p[il] = -((ml<= m) break; - select->ss[ms*(L/LLL)+is] = s[il*L+is*LLL] - pp; - } - } - select->p[il] = ms << (logL-logLLL); - ms++; - } - } - if (r == 0) { - select->sl = new uint[ml*L+1]; - for(int k=0;ksl[k]=0; - select->size += sizeof(uint)*(ml*L+1); - select->sl_len = ml*L+1; - select->ss = new ushort[ms*(L/LLL)+1]; - for(int k=0;kss[k]=0; - select->ss_len = ms*(L/LLL)+1; - select->size += sizeof(ushort)*(ms*(L/LLL)+1); - } - } - delete [] s; - return 0; - } - - int selectd2_select(const selectd2 *select, const int i1, const int f) { - int i = i1; - int p,r; - int il; - int rr; - unsigned char *q; - - if (i == 0) return -1; - - #if 0 - if (i > select->m) { - printf("ERROR: m=%d i=%d\n",select->m,i); - exit(1); - } - #endif - - i--; - - il = select->p[i>>logL]; - if (il < 0) { - il = -il-1; - //p = select->sl[(il<sl[il+(i & (L-1))]; - } - else { - p = select->lp[i>>logL]; - //p += select->ss[(il<<(logL-logLLL))+(i & (L-1))/LLL]; - p += select->ss[il+((i & (L-1))>>logLLL)]; - r = i - (i & (LLL-1)); - - q = &(select->buf[p>>3]); - - if (f == 1) { - rr = p & (8-1); - r -= _popCount[*q >> (8-1-rr)]; - //p = p - rr; - - while (1) { - rr = _popCount[*q]; - if (r + rr >= i) break; - r += rr; - //p += 8; - q++; - } - p = (q - select->buf) << 3; - p += __selecttbl[((i-r-1)<<8)+(*q)]; - } - else { - rr = p & (8-1); - r -= _popCount[(*q ^ 0xff) >> (8-1-rr)]; - //p = p - rr; - - while (1) { - rr = _popCount[*q ^ 0xff]; - if (r + rr >= i) break; - r += rr; - //p += 8; - q++; - } - p = (q - select->buf) << 3; - p += __selecttbl[((i-r-1)<<8)+(*q ^ 0xff)]; - } - } - return p; - } - - int selectd2_select2(const selectd2 *select, const int i1, const int f, int *st, int *en) { - int i = i1; - int p,r,p2; - int il; - int rr; - unsigned char *q; - - if (i == 0) { - *st = -1; - return -1; - } - - #if 0 - if (i > select->m) { - printf("ERROR: m=%d i=%d\n",select->m,i); - exit(1); - } - #endif - - i--; - - il = select->p[i>>logL]; - if (il < 0) { - il = -il-1; - //p = select->sl[(il<sl[il+(i & (L-1))]; - - if ((i>>logL) == ((i+1)>>logL)) { - p2 = select->sl[il+((i+1) & (L-1))]; - } - else { - p2 = selectd2_select(select,i+2,f); - } - } - else { - p = select->lp[i>>logL]; - //p += select->ss[(il<<(logL-logLLL))+(i & (L-1))/LLL]; - p += select->ss[il+((i & (L-1))>>logLLL)]; - r = i - (i & (LLL-1)); - - q = &(select->buf[p>>3]); - - if (f == 1) { - rr = p & (8-1); - r -= _popCount[*q >> (8-1-rr)]; - //p = p - rr; - - while (1) { - rr = _popCount[*q]; - if (r + rr >= i) break; - r += rr; - //p += 8; - q++; - } - p = (q - select->buf) << 3; - p += __selecttbl[((i-r-1)<<8)+(*q)]; - - if ((i>>logL) == ((i+1)>>logL)) { - i++; - while (1) { - rr = _popCount[*q]; - if (r + rr >= i) break; - r += rr; - q++; - } - p2 = (q - select->buf) << 3; - p2 += __selecttbl[((i-r-1)<<8)+(*q)]; - } - else { - p2 = selectd2_select(select,i+2,f); - } - - } - else { - rr = p & (8-1); - r -= _popCount[(*q ^ 0xff) >> (8-1-rr)]; - //p = p - rr; - - while (1) { - rr = _popCount[*q ^ 0xff]; - if (r + rr >= i) break; - r += rr; - //p += 8; - q++; - } - p = (q - select->buf) << 3; - p += __selecttbl[((i-r-1)<<8)+(*q ^ 0xff)]; - - if ((i>>logL) == ((i+1)>>logL)) { - i++; - while (1) { - rr = _popCount[*q ^ 0xff]; - if (r + rr >= i) break; - r += rr; - q++; - } - p2 = (q - select->buf) << 3; - p2 += __selecttbl[((i-r-1)<<8)+(*q ^ 0xff)]; - } - else { - p2 = selectd2_select(select,i+2,f); - } - } - } - *st = p; - *en = p2; - return p; - } - - void selects3_save(const selects3 * s, ostream & fp) { - saveValue(fp,s->n); - saveValue(fp,s->m); - saveValue(fp,s->size); - saveValue(fp,s->d); - saveValue(fp,s->hi_len); - saveValue(fp,s->low_len); - saveValue(fp,s->hi,s->hi_len); - saveValue(fp,s->low,s->low_len); - selectd2_save(s->sd0,fp); - selectd2_save(s->sd1,fp); - } - - void selects3_load(selects3 * s, istream & fp) { - s->n = loadValue(fp); - s->m = loadValue(fp); - s->size = loadValue(fp); - s->d = loadValue(fp); - s->hi_len = loadValue(fp); - s->low_len = loadValue(fp); - s->hi = loadValue(fp,s->hi_len); - s->low = loadValue(fp, s->low_len); - s->sd0 = new selectd2; - selectd2_load(s->sd0,fp); - s->sd1 = new selectd2; - selectd2_load(s->sd1,fp); - delete [] s->sd0->buf; - delete [] s->sd1->buf; - s->sd0->buf = s->hi; - s->sd1->buf = s->hi; - } - - void selects3_free(selects3 * s) { - delete [] s->hi; - delete [] s->low; - //delete [] s->sd0->buf; - selectd2_free(s->sd0); - delete s->sd0; - selectd2_free(s->sd1); - delete s->sd1; - } - - int selects3_construct(selects3 *select, const int n, const uint *buf) { - int i,m; - int d,mm; - uint *low; - unsigned char *buf2; - selectd2 *sd0,*sd1; - - m = 0; - for (i=0; in = n; - select->m = m; - - if (m == 0) return 0; - - mm = m; - d = 0; - while (mm < n) { - mm <<= 1; - d++; - } - - select->d = d; - - buf2 = new unsigned char[(2*m+8-1)/8+1]; - for(int k=0;k<(2*m+8-1)/8+1;k++) buf2[k]=0; - select->hi_len = (2*m+8-1)/8+1; - low = new uint[(d*m+PBS-1)/PBS+1]; - for(uint k=0;k<(d*m+PBS-1)/PBS+1;k++) low[k]=0; - select->low_len = (d*m+PBS-1)/PBS+1; - - select->hi = buf2; - select->low = low; - select->size = sizeof(unsigned char)*((2*m+8-1)/8+1) + sizeof(uint)*((d*m+PBS-1)/PBS+1); - - for (i=0; i>d)+m,1); - __setbits(low,m*d,d,i & ((1<size += 2*sizeof(selectd2); - - selectd2_construct(sd1,m*2,buf2); - select->sd1 = sd1; - - for (i=0; isd0 = sd0; - - for (i=0; i select->m) { - printf("ERROR: m=%d i=%d\n",select->m,i); - exit(1); - } - #endif - - if (i == 0) return -1; - - d = select->d; - /*if(select->lasti==(uint)i-1) { - while(!__getbit2(select->sd1->buf,++select->lasts)); - } - else { - select->lasts = selectd2_select(select->sd1,i,1); - } - select->lasti = i; - //lasts3 = select; */ - x = selectd2_select(select->sd1,i,1) - (i-1); - //x = (select->lasts-(i-1)) << d; - x <<= d; - x += __getbits(select->low,(i-1)*d,d); - return x; - } - - int selects3_selectnext(const selects3 *select, const int i) { - //return selects3_select(select,selects3_rank(select,i)+1); - int i2; - if(i>0) i2=i-1; - else i2=i; - int d,x,w,y; - int r,j; - int z,ii; - uint *q; - d = select->d; - q = select->low; - ii = i2>>d; - y = selectd2_select(select->sd0,ii,0)+1; - int k2=y-ii; - x = y - ii; - int x_orig = x; - j = i2 - (ii<>= 3; - z = select->hi[y]; - while (1) { - if (((z << r) & 0x80) == 0) { - if(x!=x_orig) k2++; - break; - } - w = __getbits(q,x*d,d); - if (w >= j) { - if (w == j) { - if(__getbit2(select->hi,(8*y+r))) k2++; - x++; - r++; - } - break; - } - x++; - r++; - if(__getbit2(select->hi,(8*y+r))) k2++; - if (r == 8) { - r = 0; - y++; - z = select->hi[y]; - } - } - if(x==select->m) - return (uint)-1; - int c=8*y+r; - int fin=0; - for(int kk=0;kk<8-r;kk++) { - if(__getbit2(select->hi,c)) { - fin=1; - break; - } - c++; - } - if(!fin) { - int pp = c/8; - while(select->hi[pp]==0) { - pp++; - c+=8; - } - while(!__getbit2(select->hi,c)) c++; - } - c -= (k2); - return __getbits(q,x*d,d)+((c)<d; - q = select->low; - - ii = i>>d; - - y = selectd2_select(select->sd0,ii,0)+1; - // selectd2_select2(select->sd0,ii,0,&y1,&y2); - //y1++; y2++; - //printf("y %d y1 %d %d\n",y,y1,y2-y1); - - x = y - ii; - - j = i - (ii<>= 3; - z = select->hi[y]; - while (1) { - if (((z << r) & 0x80) == 0) break; - w = __getbits(q,x*d,d); - if (w >= j) { - if (w == j) x++; - break; - } - x++; - r++; - if (r == 8) { - r = 0; - y++; - z = select->hi[y]; - } - } - - return x; - } -} diff --git a/libcds/src/static/coders/HuffmanCoder.cpp b/libcds/src/static/coders/HuffmanCoder.cpp deleted file mode 100644 index 88e331b6..00000000 --- a/libcds/src/static/coders/HuffmanCoder.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* HuffmanCoder.cpp - Copyright (C) 2008, Francisco Claude, all rights reserved. - - Wrapper for huff written by Gonzalo Navarro - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#include - -namespace cds_static -{ - using namespace cds_utils; - - HuffmanCoder::HuffmanCoder(uint * symb, size_t n) { - uint max_v = 0; - for(size_t i=0;i(fp,HUFF_HDR); - saveHuff(huff_table,fp); - } - - HuffmanCoder * HuffmanCoder::load(istream & fp) { - uint type = loadValue(fp); - if(type != HUFF_HDR) { //throw exception - return NULL; - } - HuffmanCoder * ret = new HuffmanCoder(); - ret->huff_table = loadHuff(fp,1); - return ret; - } - -}; diff --git a/libcds/src/static/coders/huff.cpp b/libcds/src/static/coders/huff.cpp deleted file mode 100644 index 07396857..00000000 --- a/libcds/src/static/coders/huff.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* huff.cpp - Copyright (C) 2008, Gonzalo Navarro, all rights reserved. - - Canonical Huffman - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ -// implements canonical Huffman - -#include -using namespace cds_utils; - -namespace cds_static -{ - - typedef struct - { - uint freq; - uint symb; - union - { - int prev; - uint depth; - } h; - int ch1,ch2; - } Ttree; - - static void sort (Ttree *tree, int lo, int up) { - uint i, j; - Ttree temp; - while (up>lo) { - i = lo; - j = up; - temp = tree[lo]; - while (i temp.freq) j--; - tree[i] = tree[j]; - while (i0) { - tree[j].freq = freq[i]; - tree[j].symb = i; - j++; - } - } - H.lim = lim = j-1; - // now run Huffman algorithm - sort (tree,0,lim); - for (i=0;i<=(int)lim;i++) { - tree[i].h.prev = i+1; - tree[i].ch1 = tree[i].ch2 = -1; - } - tree[lim].h.prev = -1; - // last = next node to process, ptr = search point, fre = next free cell - // leaves are in 0..lim in decreasing freq order - // internal nodes are in lim+1.. 2*lim, created in incr. fre order - last=0; ptr = 0; fre = lim+1; - for (i=0;i<(int)lim;i++) { - tree[fre].ch1 = last; - last = tree[last].h.prev; - tree[fre].ch2 = last; - tree[fre].freq = tree[tree[fre].ch1].freq+tree[tree[fre].ch2].freq; - while ((tree[ptr].h.prev != -1) && - (tree[tree[ptr].h.prev].freq <= tree[fre].freq)) - ptr = tree[ptr].h.prev; - tree[fre].h.prev = tree[ptr].h.prev; - tree[ptr].h.prev = fre; - last = tree[last].h.prev; - fre++; - } - // now assign depths recursively - setdepths (tree,2*lim,0); - H.s.spos = new uint[H.max+1]; - for (i=0;i<=(int)H.max;i++) H.s.spos[i] = ~0; - //H.num = (uint*)malloc(sizeof(uint)*(lim+1)); // - H.num = new uint[lim+1]; // max possible depth - d=0; - for (i=lim;i>=0;i--) { - H.s.spos[tree[i].symb] = i; - while ((int)tree[i].h.depth > d) - { H.num[d] = i+1; d++; } - } - H.num[d] = 0; - H.depth = d; - for (d=H.depth;d>0;d--) H.num[d] = H.num[d-1] - H.num[d]; - H.num[0] = (lim == 0); - //H.num = (uint*)realloc(H.num,(H.depth+1)*sizeof(uint)); - uint * Htmp = new uint[H.depth+1]; - for(uint i=0;i= W) { - *e &= ~((1<= W) { - *e++ = 0; - len -= W; - } - if (len > 0) - *e &= ~(((1<= H.num[d]) { - code = (code + H.num[d]) >> 1; - pos -= H.num[d--]; - } - code += pos; - if (d > W) { bitzero(stream,ptr,d-W); ptr += d-W; d = W; } - while (d--) { - if ((code >> d) & 1) cds_utils::bitset(stream,ptr); - else bitclean(stream,ptr); - ptr++; - } - return ptr; - } - - size_t decodeHuff (const THuff H, uint *symb, uint *stream, size_t ptr) { - uint pos; - uint d; - pos = 0; - d = 0; - while (pos < H.fst[d]) { - pos = (pos << 1) | bitget(stream,ptr); - ptr++; d++; - } - *symb = H.s.symb[H.num[d]+pos-H.fst[d]]; - return ptr; - } - - void saveHuff (const THuff H, ostream & f) { - uint *symb = new uint[H.lim+1]; - uint i; - for(i=0;i<(H.lim+1);i++) symb[i] = 0; - for (i=0;i<=H.max;i++) - if (H.s.spos[i] != (uint)~0) symb[H.s.spos[i]] = i; - saveValue(f,H.max); - saveValue(f,H.lim); - saveValue(f,H.depth); - saveValue(f,symb,H.lim+1); - saveValue(f,H.num,H.depth+1); - delete [] (symb); - } - - uint sizeHuff (const THuff H) { - return (4+(H.lim+1)+(H.depth+1))*sizeof(uint); - } - - void freeHuff (THuff H) { - delete [] H.s.spos; - //free(H.num); - delete [] H.num; - } - - THuff loadHuff (istream & f, int enc) { - THuff H; - uint *symb; - //uint *num; - uint i,d,dold,dact; - H.max = loadValue(f); - H.lim = loadValue(f); - H.depth = loadValue(f); - symb = loadValue(f,H.lim+1); - if (enc) { - H.s.spos = new uint[H.max+1]; - for (i=0;i<=H.max;i++) H.s.spos[i] = (uint)~0; - for (i=0;i<=H.lim;i++) H.s.spos[symb[i]] = i; - delete [] symb; - } - else H.s.symb = symb; - H.num = new uint[H.depth+1]; - H.num = loadValue(f,H.depth+1); - if (!enc) { - H.fst = new uint[H.depth+1]; - H.fst[H.depth] = 0; dold = 0; - for (d=H.depth-1;d!=(uint)-1;d--) { - dact = H.num[d+1]; - H.fst[d] = (H.fst[d+1]+dact) >> 1; - H.num[d+1] = dold; - dold += dact; - } - H.num[0] = dold; - } - return H; - } - -}; diff --git a/libcds/src/static/mapper/Makefile b/libcds/src/static/mapper/Makefile deleted file mode 100644 index 149d50b8..00000000 --- a/libcds/src/static/mapper/Makefile +++ /dev/null @@ -1,3 +0,0 @@ - -all: - @cp -f *.h ../../../includes/ diff --git a/libcds/src/static/mapper/Mapper.cpp b/libcds/src/static/mapper/Mapper.cpp deleted file mode 100644 index 45f3c565..00000000 --- a/libcds/src/static/mapper/Mapper.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* mapper.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * static_bitsequence definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - Mapper::Mapper() { - userCount=0; - } - - void Mapper::use() { - userCount++; - } - - void Mapper::unuse() { - userCount--; - assert(userCount>=0); - if(userCount==0) - delete this; - } - - Mapper * Mapper::load(istream & input) { - uint rd; - input.read((char*)&rd,sizeof(uint)); - size_t pos = input.tellg(); - input.seekg(pos-sizeof(uint)); - switch(rd) { - case MAPPER_NONE_HDR: return MapperNone::load(input); - case MAPPER_CONT_HDR: return MapperCont::load(input); - case MAPPER_REV_HDR: return MapperRev::load(input); - } - return NULL; - } -}; diff --git a/libcds/src/static/mapper/MapperCont.cpp b/libcds/src/static/mapper/MapperCont.cpp deleted file mode 100644 index 9f9aff7b..00000000 --- a/libcds/src/static/mapper/MapperCont.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* alphabet_mapper_cont.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * alphabet_mapper_cont definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - MapperCont::MapperCont(const Array & seq, const BitSequenceBuilder & bmb) { - BitString bs(seq.getMax()+1); - for(size_t i=0;irank1(s); - } - - uint MapperCont::unmap(uint s) const - { - return m->select1(s); - } - - size_t MapperCont::getSize() const - { - return sizeof(MapperCont)+m->getSize(); - } - - void MapperCont::save(ostream & out) const - { - assert(out.good()); - uint wr = MAPPER_CONT_HDR; - saveValue(out,wr); - m->save(out); - } - - MapperCont * MapperCont::load(istream & input) { - assert(input.good()); - uint rd = loadValue(input); - if(rd!=MAPPER_CONT_HDR) return NULL; - MapperCont * ret = new MapperCont(); - ret->m = BitSequence::load(input); - if(ret->m==NULL) { - delete ret; - return NULL; - } - return ret; - } -}; diff --git a/libcds/src/static/mapper/MapperNone.cpp b/libcds/src/static/mapper/MapperNone.cpp deleted file mode 100644 index 6dd75365..00000000 --- a/libcds/src/static/mapper/MapperNone.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* MapperNone.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * mapper definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - MapperNone::MapperNone() { } - - uint MapperNone::map(const uint s) const {return s;} - - uint MapperNone::unmap(const uint s) const {return s;} - - size_t MapperNone::getSize() const { return sizeof(MapperNone); } - - void MapperNone::save(ostream & out) const - { - uint wr = MAPPER_NONE_HDR; - out.write((char*)&wr,sizeof(uint)); - } - - MapperNone * MapperNone::load(istream & input) { - uint rd; - input.read((char*)&rd,sizeof(uint)); - if(rd!=MAPPER_NONE_HDR) return NULL; - return new MapperNone(); - } -}; diff --git a/libcds/src/static/mapper/MapperRev.cpp b/libcds/src/static/mapper/MapperRev.cpp deleted file mode 100644 index 2137cff0..00000000 --- a/libcds/src/static/mapper/MapperRev.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* MapperRev.cpp - * Copyright (C) 2012, Francisco Claude, all rights reserved. - * - * MapperRev definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include - - using namespace cds_utils; - -namespace cds_static -{ - - // based on http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv - uint reverse(const uint v) { - uint res = v; - const uchar *c = (const uchar*)&v; - uchar *c2 = (uchar*)&res; - c2[0] = (c[3] * 0x0202020202ULL & 0x010884422010ULL) % 1023; - c2[1] = (c[2] * 0x0202020202ULL & 0x010884422010ULL) % 1023; - c2[2] = (c[1] * 0x0202020202ULL & 0x010884422010ULL) % 1023; - c2[3] = (c[0] * 0x0202020202ULL & 0x010884422010ULL) % 1023; - return res; - } - - MapperRev::MapperRev() { } - MapperRev::MapperRev(const Array &a) { - uint maxv = 0; - for(uint i=0; i < a.getLength(); i++) - maxv = max(maxv, a.getField(i)); - this->bits = cds_utils::bits(maxv); - } - - MapperRev::MapperRev(const uint *A, const size_t len) { - uint maxv = 0; - for(uint i=0; i < len; i++) - maxv = max(maxv, A[i]); - this->bits = cds_utils::bits(maxv); - } - - uint MapperRev::map(const uint s) const { - uint rev = reverse(s); - return rev >> (31 - this->bits); - } - - uint MapperRev::unmap(const uint s) const {return map(s);} - - size_t MapperRev::getSize() const { return sizeof(MapperNone); } - - void MapperRev::save(ostream & out) const - { - uint wr = MAPPER_REV_HDR; - out.write((char*)&wr,sizeof(uint)); - out.write((char*)&this->bits,sizeof(uint)); - } - - MapperRev * MapperRev::load(istream & input) { - uint rd; - input.read((char*)&rd,sizeof(uint)); - if(rd!=MAPPER_REV_HDR) return NULL; - MapperRev * ret = new MapperRev(); - input.read((char*)&ret->bits, sizeof(uint)); - return ret; - } -}; diff --git a/libcds/src/static/permutation/Permutation.cpp b/libcds/src/static/permutation/Permutation.cpp deleted file mode 100644 index 8fc712b3..00000000 --- a/libcds/src/static/permutation/Permutation.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* Permutation.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - Permutation::Permutation() { length = 0; } - - Permutation::~Permutation() {} - - uint Permutation::pi(uint i) const - { - return pi(i,1); - } - - uint Permutation::revpi(uint i) const - { - return revpi(i,1); - } - - uint Permutation::pi(uint i, uint k) const - { - uint ret = i; - while(k-->0) - ret = pi(ret); - return ret; - } - - uint Permutation::revpi(uint i, uint k) const - { - uint ret = i; - while(k-->0) - ret = revpi(ret); - return ret; - } - - size_t Permutation::getLength() const - { - return length; - } - - void Permutation::save(ostream & fp) const - { - saveValue(fp,length); - } - - Permutation * Permutation::load(istream & fp) { - uint rd = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos - sizeof(uint),ios::beg); - switch(rd) { - case MRRRPERM: return PermutationMRRR::load(fp); - break; - case WTPERM: return PermutationWT::load(fp); - break; - } - return NULL; - } - -}; diff --git a/libcds/src/static/permutation/PermutationBuilderMRRR.cpp b/libcds/src/static/permutation/PermutationBuilderMRRR.cpp deleted file mode 100644 index 9124c0c6..00000000 --- a/libcds/src/static/permutation/PermutationBuilderMRRR.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* PermutationBuilderMRRR.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include - -namespace cds_static -{ - PermutationBuilderMRRR::PermutationBuilderMRRR(uint sample, BitSequenceBuilder * bmb) { - this->sample = sample; - this->bmb = bmb; - bmb->use(); - } - - PermutationBuilderMRRR::~PermutationBuilderMRRR() { - bmb->unuse(); - } - - Permutation * PermutationBuilderMRRR::build(uint * perm, uint len) const - { - return new PermutationMRRR(perm,len,sample,bmb); - } - -}; diff --git a/libcds/src/static/permutation/PermutationBuilderWT.cpp b/libcds/src/static/permutation/PermutationBuilderWT.cpp deleted file mode 100644 index b57cc02b..00000000 --- a/libcds/src/static/permutation/PermutationBuilderWT.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/** - * PermutationBuilderWT.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -namespace cds_static -{ - Permutation * PermutationBuilderWT::build(uint * perm, uint len) const - { - return new PermutationWT(perm,len); - } -} diff --git a/libcds/src/static/permutation/PermutationMRRR.cpp b/libcds/src/static/permutation/PermutationMRRR.cpp deleted file mode 100644 index 935072aa..00000000 --- a/libcds/src/static/permutation/PermutationMRRR.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* PermutationMRRR.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * Permutation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - PermutationMRRR::PermutationMRRR(uint * elems, uint nelems, uint t, BitSequenceBuilder * bmb) { - permutation = createPerm(elems, nelems, t, bmb); - } - - PermutationMRRR::PermutationMRRR() { - } - - PermutationMRRR::~PermutationMRRR() { - destroyPerm(permutation); - } - - size_t PermutationMRRR::getSize() const - { - return sizeof(PermutationMRRR)+sizeofPerm(permutation); - } - - uint PermutationMRRR::pi(uint i) const - { - return getelemPerm(permutation,i); - } - - uint PermutationMRRR::revpi(uint i) const - { - return inversePerm(permutation,i); - } - - void PermutationMRRR::save(ostream & fp) const - { - uint wr = MRRRPERM; - saveValue(fp,wr); - savePerm(permutation,fp); - } - - PermutationMRRR * PermutationMRRR::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=MRRRPERM) return NULL; - PermutationMRRR * ret = new PermutationMRRR(); - ret->permutation = loadPerm(fp); - return ret; - } - -}; diff --git a/libcds/src/static/permutation/PermutationWT.cpp b/libcds/src/static/permutation/PermutationWT.cpp deleted file mode 100644 index 34c862e7..00000000 --- a/libcds/src/static/permutation/PermutationWT.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * PermutationWT.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -namespace cds_static -{ - - PermutationWT::PermutationWT(uint *perm, size_t len) { - uint b = bits(len-1); - uint * seq = new uint[len]; - uint * marker = new uint[uint_len(len,1)]; - for(size_t i=0;i get_field(perm,b,i)) { - runs++; - cds_utils::bitset(marker,i); - } - seq[get_field(perm,b,i)] = runs; - last = get_field(perm,b,i); - } - - wt = new WaveletTreeNoptrs(seq, len, new BitSequenceBuilderRRR(40), new MapperNone()); - marks = new BitSequenceRG(marker, len, 20); - delete [] seq; - } - - PermutationWT::~PermutationWT() { - delete wt; - } - - uint PermutationWT::pi(uint k) const - { - uint v = (uint)marks->rank1(k); - return (uint)wt->select(v-1, k - marks->select1(v) + 1); - } - - uint PermutationWT::revpi(uint k) const - { - size_t val = 0; - uint s = wt->access(k, val); - return marks->select1(s+1) + val - 1; - } - - size_t PermutationWT::getSize() const - { - return marks->getSize()+wt->getSize()+sizeof(PermutationWT); - } - - void PermutationWT::save(ostream & out) const - { - saveValue(out,WTPERM); - saveValue(out, length); - wt->save(out); - marks->save(out); - } - - PermutationWT * PermutationWT::load(istream &in) { - uint rd = loadValue(in); - if(rd!=WTPERM) return NULL; - PermutationWT * ret = new PermutationWT(); - ret->length = loadValue(in); - ret->wt = Sequence::load(in); - ret->marks = BitSequence::load(in); - return ret; - } -}; diff --git a/libcds/src/static/permutation/perm.cpp b/libcds/src/static/permutation/perm.cpp deleted file mode 100644 index dbbf1719..00000000 --- a/libcds/src/static/permutation/perm.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* perm.cpp - * Copyright (C) 2005, Diego Arroyuelo, all rights reserved. - * Copyright (C) 2009, Francisco Claude - * - * Permutation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - int compare(const void *p1, const void *p2) { - return ((auxbwd *)p1)->key - ((auxbwd *)p2)->key; - } - - perm createPerm(uint *elems, uint nelems, uint t, BitSequenceBuilder * bmb) { - perm P; - uint *b, *baux, nextelem, i, j, bptr, - aux, antbptr,nbwdptrs, elem,nbits, cyclesize; - auxbwd *auxbwdptr; - P = new struct sperm; - P->elems = elems; - P->nelems = nelems; - P->nbits = bits(nelems-1); - nbits = bits(nelems-1); - P->t = t; - if (t==1) { - P->bwdptrs = new uint[uint_len(nelems,nbits)]; - assert(P->bwdptrs!=NULL); - P->nbwdptrs = nelems; - for (i=0; ibwdptrs, nbits, bg, i); - } - P->bmap = NULL; - } - else { - b = new uint[uint_len(nelems,1)]; - for(i=0;i= t) { - nbwdptrs++; - antbptr = bptr; - bptr = j; - aux = 0; - cds_utils::bitset(b, j); - } - cyclesize++; - } - if (cyclesize >= t) { - nbwdptrs++; - cds_utils::bitset(b, nextelem); - } - } - } - auxbwdptr = new auxbwd[nbwdptrs]; - assert(auxbwdptr!=NULL); - for(i=0;i= t) { - auxbwdptr[nbwdptrs].key = j; - auxbwdptr[nbwdptrs++].pointer = bptr; - antbptr = bptr; - bptr = j; - aux = 0; - cds_utils::bitset(b, j); - } - cyclesize++; - } - if (cyclesize >= t) { - auxbwdptr[nbwdptrs].key = nextelem; - auxbwdptr[nbwdptrs++].pointer = bptr; - cds_utils::bitset(b, nextelem); - } - } - } - qsort(auxbwdptr, nbwdptrs, sizeof(auxbwd), &compare); - aux = uint_len(nbwdptrs,P->nbits); - P->bwdptrs = new uint[aux]; - assert(P->bwdptrs!=NULL); - for(i=0;ibwdptrs[i] = 0; - P->nbwdptrs = nbwdptrs; - for (i = 0; i < nbwdptrs; i++) { - set_field(P->bwdptrs, nbits, i, auxbwdptr[i].pointer); - //if(i<5) - // printf(" %d ",get_field(P->bwdptrs,nbits,i)); - } - //printf("\n"); - P->bmap = bmb->build(b, nelems); - //delete [] P->bmap; - delete [] b; - delete [] (baux); - delete [] (auxbwdptr); - } - return P; - } - - void destroyPerm(perm P) { - delete [] P->elems; - if (P->bmap) delete P->bmap; - delete [] P->bwdptrs; - delete P; - } - - // Computes P-1[i] - uint inversePerm(const perm P, uint i) { - uint j, elem; - if (P->t==1) { - j = get_field(P->bwdptrs,P->nbits,i); - } - else { - j = i; - while (((elem=get_field(P->elems,P->nbits,j)) != i)&&(!P->bmap->access(j))) - j = elem; - - if (elem != i) { - // follows the backward pointer - j = get_field(P->bwdptrs, P->nbits, P->bmap->rank1(j-1)); - while ((elem = get_field(P->elems,P->nbits,j))!= i) - j = elem; - } - } - return j; - } - - // gets the ith element of a perm P - - uint getelemPerm(const perm P, uint i) { - return get_field(P->elems, P->nbits, i); - } - - uint savePerm(const perm P, ostream & f) { - uint aux; - uint v; - - saveValue(f,P->nelems); - saveValue(f,P->elems,uint_len(P->nelems,P->nbits)); - - aux = ((P->nelems+W-1)/W); - - if (P->bmap) { - v=1; - saveValue(f,v); - P->bmap->save(f); - } - else { - v=0; - saveValue(f,v); - } - - saveValue(f,P->nbwdptrs); - aux = uint_len(P->nbwdptrs,P->nbits); - saveValue(f,P->bwdptrs,aux); - saveValue(f,P->t); - return 0; - } - - perm loadPerm(istream & f) { - uint aux; - perm P; - uint v; - - P = new struct sperm; //(struct sperm*) malloc(sizeof(struct sperm)); - - P->nelems = loadValue(f); - - P->nbits = bits(P->nelems-1); - aux = uint_len(P->nelems,P->nbits); - P->elems = loadValue(f,aux); - - v = loadValue(f); - - if (v) { - P->bmap = BitSequence::load(f); - } - else P->bmap = NULL; - - P->nbwdptrs = loadValue(f); - - aux = uint_len(P->nbwdptrs,P->nbits); - P->bwdptrs = loadValue(f,aux); - - P->t = loadValue(f); - - return P; - } - - uint sizeofPerm(perm P) { - return sizeof(struct sperm) + - ((uint_len(P->nelems,P->nbits))*sizeof(uint)) + - ((P->bmap)?(P->bmap->getSize()):0) + - ((uint_len(P->nbwdptrs,P->nbits))*sizeof(uint)); - } - -}; diff --git a/libcds/src/static/sequence/BitmapsSequence.cpp b/libcds/src/static/sequence/BitmapsSequence.cpp deleted file mode 100644 index 7cf3d508..00000000 --- a/libcds/src/static/sequence/BitmapsSequence.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* BitmapsSequence.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - BitmapsSequence::BitmapsSequence(uint * seq, size_t n, Mapper * am, BitSequenceBuilder * bsb) : Sequence(n) { - bsb->use(); - sigma = 0; - //length = n; - this->am = am; - am->use(); - for(uint i=0;imap(seq[i])); - sigma++; - uint * occ = new uint[sigma+1]; - for(uint i=0;i<=sigma;i++) occ[i] = 0; - for(uint i=0;imap(seq[i])+1]++; - for(uint i=1;imap(seq[i])]++]=i; - bitmaps = new BitSequence*[sigma]; - uint * bm = new uint[uint_len(n,1)]; - uint pp=0; - for(uint i=0;ibuild(bm,length); - } - delete [] bm; - delete [] occ; - delete [] pos; - bsb->unuse(); - } - - BitmapsSequence::BitmapsSequence() : Sequence(0) { - length = 0; - sigma = 0; - bitmaps = NULL; - am = NULL; - } - - BitmapsSequence::BitmapsSequence(const Array &a, Mapper * am, BitSequenceBuilder * bsb) : Sequence(0) { - bsb->use(); - length = a.getLength(); - //cout << "length=" << length << endl; - sigma = a.getMax()+1; - //cout << "sigma=" << sigma << endl; - this->am = am; - am->use(); - uint * occ = new uint[sigma+1]; - for(uint i=0;i<=sigma;i++) occ[i] = 0; - for(uint i=0;imap(a[i])+1]++; - for(uint i=1;imap(a[i])]++]=i; - bitmaps = new BitSequence*[sigma]; - uint * bm = new uint[uint_len(length,1)]; - uint pp=0; - for(uint i=0;igetSize()=" << groupsIndex->getSize() << endl; - ret += sizeof(SequenceAlphPart); - return ret; - } - - void SequenceAlphPart::save(ostream & fp) const - { - uint type = ALPHPART_HDR; - saveValue(fp,type); - saveValue(fp,length); - saveValue(fp,sigma); - saveValue(fp,origsigma); - saveValue(fp,maxLen); - saveValue(fp,cut); - saveValue(fp,revPermFreq,sigma+1); - saveValue(fp,alphSortedByFreq,sigma+1); - groupsIndex->save(fp); - for(uint i=0;maxLen>cut && isave(fp); - } - - SequenceAlphPart * SequenceAlphPart::load(istream & fp) { - uint type = loadValue(fp); - if(type!=ALPHPART_HDR) - return NULL; - SequenceAlphPart * ret = new SequenceAlphPart(); - ret->length = loadValue(fp); - ret->sigma = loadValue(fp); - ret->origsigma = loadValue(fp); - ret->maxLen = loadValue(fp); - ret->cut = loadValue(fp); - ret->revPermFreq = loadValue(fp,ret->sigma+1); - ret->alphSortedByFreq = loadValue(fp,ret->sigma+1); - ret->groupsIndex = Sequence::load(fp); - ret->indexesByLength = new Sequence*[(ret->maxLen<=ret->cut)?0:(ret->maxLen-ret->cut)]; - for(uint i=0;ret->maxLen>ret->cut && imaxLen-ret->cut;i++) - ret->indexesByLength[i] = Sequence::load(fp); - return ret; - } - -}; diff --git a/libcds/src/static/sequence/SequenceBuilderAlphPart.cpp b/libcds/src/static/sequence/SequenceBuilderAlphPart.cpp deleted file mode 100644 index c3adb2a3..00000000 --- a/libcds/src/static/sequence/SequenceBuilderAlphPart.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* SequenceBuilderAlphPart.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderAlphPart::SequenceBuilderAlphPart(SequenceBuilder * groupIndexBuilder, SequenceBuilder * indexBuilder, uint cut) { - this->groupIndexBuilder = groupIndexBuilder; - this->indexBuilder = indexBuilder; - this->cut = cut; - groupIndexBuilder->use(); - indexBuilder->use(); - } - - SequenceBuilderAlphPart::~SequenceBuilderAlphPart() { - groupIndexBuilder->unuse(); - indexBuilder->unuse(); - } - - Sequence * SequenceBuilderAlphPart::build(uint * sequence, size_t len) { - return new SequenceAlphPart(sequence,len,cut,groupIndexBuilder,indexBuilder); - } - - Sequence * SequenceBuilderAlphPart::build(const Array & seq) { - return new SequenceAlphPart(seq,cut,groupIndexBuilder,indexBuilder); - } -}; diff --git a/libcds/src/static/sequence/SequenceBuilderGMR.cpp b/libcds/src/static/sequence/SequenceBuilderGMR.cpp deleted file mode 100644 index 4bd203ba..00000000 --- a/libcds/src/static/sequence/SequenceBuilderGMR.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* SequenceBuilderGMR.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderGMR::SequenceBuilderGMR(BitSequenceBuilder * bsb, SequenceBuilder * sqb, uint chunk_len) { - this->bsb = bsb; - this->sqb = sqb; - this->chunk_len = chunk_len; - bsb->use(); - sqb->use(); - } - - SequenceBuilderGMR::~SequenceBuilderGMR() { - bsb->unuse(); - sqb->unuse(); - } - - Sequence * SequenceBuilderGMR::build(uint * sequence, size_t len) { - uint cl = chunk_len; - if(chunk_len==0) { - uint s=0; - for(size_t i=0;i - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderGMRChunk::SequenceBuilderGMRChunk(BitSequenceBuilder * bsb, PermutationBuilder * pmb) { - this->bsb = bsb; - this->pmb = pmb; - bsb->use(); - pmb->use(); - } - - SequenceBuilderGMRChunk::~SequenceBuilderGMRChunk() { - bsb->unuse(); - pmb->unuse(); - } - - Sequence * SequenceBuilderGMRChunk::build(uint * sequence, size_t len) { - return new SequenceGMRChunk(sequence, len, bsb, pmb); - } - - Sequence * SequenceBuilderGMRChunk::build(const Array & seq) { - return new SequenceGMRChunk(seq, bsb, pmb); - } - -}; diff --git a/libcds/src/static/sequence/SequenceBuilderStr.cpp b/libcds/src/static/sequence/SequenceBuilderStr.cpp deleted file mode 100644 index ad83e72c..00000000 --- a/libcds/src/static/sequence/SequenceBuilderStr.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/* SequenceBuilderStr.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -#include -#include - -namespace cds_static -{ - SequenceBuilderStr::SequenceBuilderStr(const string & str) { - this->str = str; - } - - SequenceBuilderStr::~SequenceBuilderStr() { } - - Sequence * SequenceBuilderStr::build(uint *seq, size_t len) { - /*SequenceBuilder * b = getBuilder(seq,len); - Sequence * ret = b->build(seq,len); - delete b; - return ret; - */ - return NULL; - } - - Sequence * SequenceBuilderStr::build(const Array & seq) { - SequenceBuilder * b = getBuilder(seq); - Sequence * ret = b->build(seq); - delete b; - return ret; - } - - SequenceBuilder * SequenceBuilderStr::getBuilder(const Array & seq) { - vector params; - tokenize(str,params,';'); - map values; - for(uint i=1;i res; - tokenize(params[i],res,'='); - if(res.size()==2) - values[res[0]]=res[1]; - else - values[params[i]]=""; - } - #ifdef VERBOSE - cout << "params[0]=" << params[0] << endl; - #endif - if(params[0]=="WaveletTree") { - BitSequenceBuilder * bsb = NULL; - if(values.find("bitseq")==values.end()) return NULL; - if(values.find("bitsamp")==values.end()) return NULL; - uint samp = transform(values["bitsamp"]); - if(values["bitseq"]=="BitSequenceRG") { - bsb = new BitSequenceBuilderRG(samp); - #ifdef VERBOSE - cout << "bitseq=BitSequenceRG" << endl; - #endif - } - else if(values["bitseq"]=="BitSequenceRRR") { - bsb = new BitSequenceBuilderRRR(samp); - #ifdef VERBOSE - cout << "bitseq=BitSequenceRRR" << endl; - #endif - } - else if(values["bitseq"]=="BitSequenceSDArray") { - bsb = new BitSequenceBuilderSDArray(); - #ifdef VERBOSE - cout << "bitseq=BitSequenceSDArray" << endl; - #endif - } - else if(values["bitseq"]=="BitSequenceDArray") { - bsb = new BitSequenceBuilderDArray(); - #ifdef VERBOSE - cout << "bitseq=BitSequenceDArray" << endl; - #endif - } - else { - return NULL; - } - #ifdef VERBOSE - cout << "samp=" << samp << endl; - #endif - if(values.find("mapper")==values.end()) return NULL; - Mapper * am = NULL; - if(values["mapper"]=="MapperCont") { - am = new MapperCont(seq, *bsb); - #ifdef VERBOSE - cout << "mapper=MapperCont" << endl; - #endif - } - else if(values["mapper"]=="MapperNone") { - am = new MapperNone(); - #ifdef VERBOSE - cout << "mapper=MapperNone" << endl; - #endif - } - else { - delete bsb; - return NULL; - } - if(values.find("shape")==values.end()) return NULL; - wt_coder * wc = NULL; - if(values["shape"]=="Huffman") { - wc = new wt_coder_huff(seq, am); - #ifdef VERBOSE - cout << "shape=Huffman" << endl; - #endif - } - else if(values["shape"]=="Plain") { - wc = new wt_coder_binary(seq, am); - #ifdef VERBOSE - cout << "shape=Plain" << endl; - #endif - } - else { - delete bsb; - delete am; - return NULL; - } - return new SequenceBuilderWaveletTree(bsb, am, wc); - } - else if(params[0]=="WaveletTreeNoptrs") { - BitSequenceBuilder * bsb = NULL; - if(values.find("bitseq")==values.end()) return NULL; - if(values.find("bitsamp")==values.end()) return NULL; - uint samp = transform(values["bitsamp"]); - if(values["bitseq"]=="BitSequenceRG") { - bsb = new BitSequenceBuilderRG(samp); - } - else if(values["bitseq"]=="BitSequenceRRR") { - bsb = new BitSequenceBuilderRRR(samp); - } - else if(values["bitseq"]=="BitSequenceSDArray") { - bsb = new BitSequenceBuilderSDArray(); - } - else if(values["bitseq"]=="BitSequenceDArray") { - bsb = new BitSequenceBuilderDArray(); - } - else { - return NULL; - } - if(values.find("mapper")==values.end()) return NULL; - Mapper * am = NULL; - if(values["mapper"]=="MapperCont") { - am = new MapperCont(seq,*bsb); - } - else if(values["mapper"]=="MapperNone") { - am = new MapperNone(); - } - else { - delete bsb; - return NULL; - } - return new SequenceBuilderWaveletTreeNoptrs(bsb,am); - } - else if(params[0]=="WaveletMatrix") { - BitSequenceBuilder * bsb = NULL; - if(values.find("bitseq")==values.end()) return NULL; - if(values.find("bitsamp")==values.end()) return NULL; - uint samp = transform(values["bitsamp"]); - if(values["bitseq"]=="BitSequenceRG") { - bsb = new BitSequenceBuilderRG(samp); - } - else if(values["bitseq"]=="BitSequenceRRR") { - bsb = new BitSequenceBuilderRRR(samp); - } - else if(values["bitseq"]=="BitSequenceSDArray") { - bsb = new BitSequenceBuilderSDArray(); - } - else if(values["bitseq"]=="BitSequenceDArray") { - bsb = new BitSequenceBuilderDArray(); - } - else { - return NULL; - } - if(values.find("mapper")==values.end()) return NULL; - Mapper * am = NULL; - if(values["mapper"]=="MapperCont") { - am = new MapperCont(seq,*bsb); - } - else if(values["mapper"]=="MapperNone") { - am = new MapperNone(); - } - else if(values["mapper"]=="MapperRev") { - am = new MapperRev(seq); - } - else { - delete bsb; - return NULL; - } - return new SequenceBuilderWaveletMatrix(bsb,am); - } - else if(params[0]=="SequenceGMR") { - BitSequenceBuilder * bsb = NULL; - if(values.find("bitseq")==values.end()) return NULL; - if(values.find("bitsamp")==values.end()) return NULL; - uint samp = transform(values["bitsamp"]); - if(values.find("chunklen")==values.end()) return NULL; - uint chunklen = transform(values["chunklen"]); - if(values.find("permsamp")==values.end()) return NULL; - uint permsamp = transform(values["permsamp"]); - if(values["bitseq"]=="BitSequenceRG") { - bsb = new BitSequenceBuilderRG(samp); - } - else if(values["bitseq"]=="BitSequenceRRR") { - bsb = new BitSequenceBuilderRRR(samp); - } - else if(values["bitseq"]=="BitSequenceSDArray") { - bsb = new BitSequenceBuilderSDArray(); - } - else if(values["bitseq"]=="BitSequenceDArray") { - bsb = new BitSequenceBuilderDArray(); - } - else { - return NULL; - } - if(values.find("mapper")==values.end()) return NULL; - Mapper * am = NULL; - if(values["mapper"]=="MapperCont") { - am = new MapperCont(seq,*bsb); - } - else if(values["mapper"]=="MapperNone") { - am = new MapperNone(); - } - else { - delete bsb; - return NULL; - } - PermutationBuilder * pb = new PermutationBuilderMRRR(permsamp,bsb); - SequenceBuilder * sb1 = new SequenceBuilderGMRChunk(bsb,pb); - return new SequenceBuilderGMR(bsb,sb1,chunklen); - } - else if(params[0]=="SequenceAlphPart") { - BitSequenceBuilder * bsb = NULL; - if(values.find("bitseq")==values.end()) return NULL; - if(values.find("bitsamp")==values.end()) return NULL; - uint samp = transform(values["bitsamp"]); - if(values["bitseq"]=="BitSequenceRG") { - bsb = new BitSequenceBuilderRG(samp); - } - else if(values["bitseq"]=="BitSequenceRRR") { - bsb = new BitSequenceBuilderRRR(samp); - } - else if(values["bitseq"]=="BitSequenceSDArray") { - bsb = new BitSequenceBuilderSDArray(); - } - else if(values["bitseq"]=="BitSequenceDArray") { - bsb = new BitSequenceBuilderDArray(); - } - else { - return NULL; - } - if(values.find("mapper")==values.end()) return NULL; - Mapper * am = NULL; - if(values["mapper"]=="MapperCont") { - am = new MapperCont(seq,*bsb); - } - else if(values["mapper"]=="MapperNone") { - am = new MapperNone(); - } - else { - delete bsb; - return NULL; - } - if(values.find("shape")==values.end()) return NULL; - wt_coder * wc = NULL; - if(values["shape"]=="Huffman") { - wc = NULL; // new wt_coder_huff(seq,am); - } - else if(values["shape"]=="Plain") { - wc = new wt_coder_binary(seq,am); - } - else { - delete bsb; - delete am; - return NULL; - } - SequenceBuilder * fstin = new SequenceBuilderWaveletTree(bsb,am,wc); - if(values.find("cut")==values.end()) return NULL; - uint cut = transform(values["cut"]); - if(values.find("permsamp")==values.end()) return NULL; - uint permsamp = transform(values["permsamp"]); - PermutationBuilder * pb = new PermutationBuilderMRRR(permsamp,bsb); - SequenceBuilder * scb = new SequenceBuilderGMRChunk(bsb,pb); - SequenceBuilder * sec = new SequenceBuilderGMR(bsb,scb); - return new SequenceBuilderAlphPart(fstin,sec,cut); - //return new SequenceBuilderAlphPart(fstin,fstin,cut); - } - return NULL; - } -}; diff --git a/libcds/src/static/sequence/SequenceBuilderWaveletMatrix.cpp b/libcds/src/static/sequence/SequenceBuilderWaveletMatrix.cpp deleted file mode 100644 index 9cf719b8..00000000 --- a/libcds/src/static/sequence/SequenceBuilderWaveletMatrix.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderWaveletMatrix.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderWaveletMatrix::SequenceBuilderWaveletMatrix(BitSequenceBuilder * bsb, Mapper * am) { - this->bsb = bsb; - this->am = am; - bsb->use(); - am->use(); - } - - SequenceBuilderWaveletMatrix::~SequenceBuilderWaveletMatrix() { - bsb->unuse(); - am->unuse(); - } - - Sequence * SequenceBuilderWaveletMatrix::build(uint * sequence, size_t len) { - return new WaveletMatrix(sequence, len, bsb, am); - } - - Sequence * SequenceBuilderWaveletMatrix::build(const Array & seq) { - return new WaveletMatrix(seq, bsb, am); - } -}; diff --git a/libcds/src/static/sequence/SequenceBuilderWaveletTree.cpp b/libcds/src/static/sequence/SequenceBuilderWaveletTree.cpp deleted file mode 100644 index d927600b..00000000 --- a/libcds/src/static/sequence/SequenceBuilderWaveletTree.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* SequenceBuilderWaveletTree.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderWaveletTree::SequenceBuilderWaveletTree(BitSequenceBuilder * bsb, Mapper * am, wt_coder * wc) { - this->bsb = bsb; - this->am = am; - this->wc = wc; - bsb->use(); - am->use(); - if(wc!=NULL) - wc->use(); - } - - SequenceBuilderWaveletTree::~SequenceBuilderWaveletTree() { - bsb->unuse(); - am->unuse(); - if(wc!=NULL) - wc->unuse(); - } - - Sequence * SequenceBuilderWaveletTree::build(uint * sequence, size_t len) { - Sequence * ret; - if(wc==NULL) { - wt_coder * wcaux = new wt_coder_huff(sequence,len,am); - wcaux->use(); - ret = new WaveletTree(sequence, len, wcaux, bsb, am); - wcaux->unuse(); - } - else { - ret = new WaveletTree(sequence, len, wc, bsb, am); - } - return ret; - } - - Sequence * SequenceBuilderWaveletTree::build(const Array & seq) { - Sequence * ret; - if(wc==NULL) { - wt_coder * wcaux = new wt_coder_huff(seq,am); - wcaux->use(); - ret = new WaveletTree(seq, wcaux, bsb, am); - wcaux->unuse(); - } - else { - ret = new WaveletTree(seq, wc, bsb, am); - } - return ret; - } -}; diff --git a/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrs.cpp b/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrs.cpp deleted file mode 100644 index a4253d18..00000000 --- a/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrs.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* SequenceBuilderWaveletTreeNoptrs.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static -{ - - SequenceBuilderWaveletTreeNoptrs::SequenceBuilderWaveletTreeNoptrs(BitSequenceBuilder * bsb, Mapper * am) { - this->bsb = bsb; - this->am = am; - bsb->use(); - am->use(); - } - - SequenceBuilderWaveletTreeNoptrs::~SequenceBuilderWaveletTreeNoptrs() { - bsb->unuse(); - am->unuse(); - } - - Sequence * SequenceBuilderWaveletTreeNoptrs::build(uint * sequence, size_t len) { - return new WaveletTreeNoptrs(sequence, len, bsb, am); - } - - Sequence * SequenceBuilderWaveletTreeNoptrs::build(const Array & seq) { - return new WaveletTreeNoptrs(seq, bsb, am); - } -}; diff --git a/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrsS.cpp b/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrsS.cpp deleted file mode 100644 index 70bae4c1..00000000 --- a/libcds/src/static/sequence/SequenceBuilderWaveletTreeNoptrsS.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* SequenceBuilderWaveletTreeNoptrsS.cpp - * Copyright (C) 2012, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include - -namespace cds_static { - - SequenceBuilderWaveletTreeNoptrsS::SequenceBuilderWaveletTreeNoptrsS(BitSequenceBuilder * bsb, Mapper * am) { - this->bsb = bsb; - this->am = am; - bsb->use(); - am->use(); - } - - SequenceBuilderWaveletTreeNoptrsS::~SequenceBuilderWaveletTreeNoptrsS() { - bsb->unuse(); - am->unuse(); - } - - Sequence * SequenceBuilderWaveletTreeNoptrsS::build(uint * sequence, size_t len) { - return new WaveletTreeNoptrsS(sequence, len, bsb, am); - } - - Sequence * SequenceBuilderWaveletTreeNoptrsS::build(const Array & seq) { - return new WaveletTreeNoptrsS(seq, bsb, am); - } -}; - - diff --git a/libcds/src/static/sequence/SequenceGMR.cpp b/libcds/src/static/sequence/SequenceGMR.cpp deleted file mode 100644 index 28ec50b8..00000000 --- a/libcds/src/static/sequence/SequenceGMR.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* SequenceGMR.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * GMR - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -namespace cds_static -{ - -#ifndef WIN32 - using std::max; -#endif - SequenceGMR::SequenceGMR(uint * sequence, size_t n, uint chunk_length, BitSequenceBuilder * bmb, SequenceBuilder * ssb) : Sequence(n) { - bmb->use(); - ssb->use(); - length = n; - - //cout << "length1=" << length << endl; - if(length%chunk_length) length+=chunk_length-length%chunk_length; - //cout << "length2=" << length << endl; - uint * new_seq = new uint[length]; - sigma = 0; - for(uint i=0;iuse(); - bmb->use(); - sigma = 0; - for(uint i=0;iX = bmb->build(X_bitmap,X_pos); - assert(X!=NULL); - delete [] X_bitmap; - this->permutation = pmb->build(pi,chunk_length); - assert(permutation!=NULL); - delete [] counter; - pmb->unuse(); - bmb->unuse(); - } - - SequenceGMRChunk::SequenceGMRChunk(const Array & sequence, BitSequenceBuilder *bmb, PermutationBuilder *pmb) : Sequence(0) { - pmb->use(); - bmb->use(); - uint chunk_length = sequence.getLength(); - length = chunk_length; - sigma = 0; - for(uint i=0;iX = bmb->build(X_bitmap,X_pos); - assert(X!=NULL); - delete [] X_bitmap; - this->permutation = pmb->build(pi,chunk_length); - assert(permutation!=NULL); - delete [] counter; - pmb->unuse(); - bmb->unuse(); - } - SequenceGMRChunk::SequenceGMRChunk() : Sequence(0) { - } - - SequenceGMRChunk::~SequenceGMRChunk() { - delete X; - delete permutation; - } - - uint SequenceGMRChunk::access(size_t j2) const - { - uint j = (uint)j2; - uint invPerm = permutation->revpi(j); - uint rank_pos = X->select1(invPerm+1); - uint ret = rank_pos - X->rank1(rank_pos); - return ret; - } - - size_t SequenceGMRChunk::select(uint i, size_t j2) const - { - uint j = (uint)j2; - uint pos = X->select0(i+1) + j - i -1; - return permutation->pi(pos); - } - - size_t SequenceGMRChunk::rank(uint i, size_t j2) const - { - uint j = (uint)j2; - uint ini = X->select0(i+1)-i; - uint ini_o = ini; - uint fin = X->select0(i+2); - if(fin+1==0) return 0; - if(finpi(ini) > j) return 0; - if(permutation->pi(ini) == j) return 1; - if(ini==fin) return 1; - if(ini>fin) return 0; - while(ini < fin-1) { - uint med = (ini+fin)/2; - uint elem = permutation->pi(med); - if(elem >= j) fin = med; - else ini = med; - } - while(fin>ini_o && permutation->pi(fin)>j) fin--; - return fin-ini_o+1; - } - - size_t SequenceGMRChunk::getSize() const - { - return sizeof(SequenceGMRChunk)+permutation->getSize()+X->getSize(); - } - - void SequenceGMRChunk::save(ostream & fp) const - { - uint wr = GMR_CHUNK_HDR; - saveValue(fp,wr); - saveValue(fp,length); - saveValue(fp,sigma); - X->save(fp); - permutation->save(fp); - } - - SequenceGMRChunk * SequenceGMRChunk::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=GMR_CHUNK_HDR) return NULL; - SequenceGMRChunk * ret = new SequenceGMRChunk(); - ret->length = loadValue(fp); - ret->sigma = loadValue(fp); - ret->X = BitSequence::load(fp); - ret->permutation = Permutation::load(fp); - return ret; - } - -}; diff --git a/libcds/src/static/sequence/WaveletMatrix.cpp b/libcds/src/static/sequence/WaveletMatrix.cpp deleted file mode 100644 index c92a156d..00000000 --- a/libcds/src/static/sequence/WaveletMatrix.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* WaveletMatrix.cpp - * Copyright (C) 2012, Francisco Claude & Gonzalo Navarro, all rights reserved. - * - * WaveletMatrix definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - WaveletMatrix::WaveletMatrix(const Array &symbols2, BitSequenceBuilder * bmb, Mapper * am) : Sequence(n) { - bmb->use(); - n = symbols2.getLength(); - uint *symbols = new uint[n]; - this->am = am; - am->use(); - for(uint i = 0; i < n; i++) - symbols[i] = am->map(symbols2.getField(i)); - max_v = max_value(symbols, n); - height = bits(max_v); - - OCC = new uint[max_v + 2]; - for (uint i = 0; i <= max_v + 1; i++) - OCC[i] = 0; - for (uint i = 0; i < n; i++) - OCC[symbols[i] + 1]++; - - uint to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) to_add++; - - uint * new_symb = new uint[n + to_add]; - for (uint i = 0; i < n; i++) - new_symb[i] = symbols[i]; - delete [] symbols; - - to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) { - OCC[i]++; - new_symb[n + to_add] = i - 1; - to_add++; - } - - uint new_n = n + to_add; - for(uint i = 1;i <= max_v + 1; i++) - OCC[i] += OCC[i - 1]; - this->n = new_n; - - uint **_bm=new uint*[height]; - for(uint i = 0; i < height; i++) { - _bm[i] = new uint[new_n / W + 1]; - for(uint j = 0;j < new_n / W + 1; j++) - _bm[i][j] = 0; - } - - build_level(_bm, new_symb, new_n, NULL); - bitstring = new BitSequence*[height]; - C = new uint[height]; - for(uint i = 0; i < height; i++) { - bitstring[i] = bmb->build(_bm[i], new_n); - C[i] = bitstring[i]->rank0(new_n - 1); - delete [] _bm[i]; - } - delete [] _bm; - // delete [] oc; - bmb->unuse(); - - this->length = n; - } - - WaveletMatrix::WaveletMatrix(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols) : Sequence(n) { - bmb->use(); - this->n=n; - this->am=am; - am->use(); - for(uint i=0;imap(symbols[i]); - max_v=max_value(symbols,n); - height=bits(max_v); - - OCC = new uint[max_v + 2]; - for (uint i = 0; i <= max_v + 1; i++) - OCC[i] = 0; - for (uint i = 0; i < n; i++) - OCC[symbols[i] + 1]++; - - uint to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) to_add++; - - uint * new_symb = new uint[n + to_add]; - for (uint i = 0; i < n; i++) - new_symb[i] = symbols[i]; - - if (deleteSymbols) { - delete [] symbols; - symbols = 0; - } - - to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) { - OCC[i]++; - new_symb[n + to_add] = i - 1; - to_add++; - } - - uint new_n = n + to_add; - for(uint i = 1;i <= max_v + 1; i++) - OCC[i] += OCC[i - 1]; - this->n = new_n; - - uint ** _bm=new uint*[height]; - for(uint i=0;ibuild(_bm[i],new_n); - C[i] = bitstring[i]->rank0(new_n - 1); - // cout << "C=" << C[i] << endl; - delete [] _bm[i]; - } - delete [] _bm; - - if (!deleteSymbols) - for(uint i=0;iunmap(symbols[i]); - - // delete [] new_symb; // already deleted in build_level()! - // delete [] oc; - bmb->unuse(); - // for(uint i=0;iheight << endl; - delete ret; - return NULL; - } - } - ret->OCC = loadValue(fp, ret->max_v + 2); - // ret->occ = BitSequence::load(fp); - // if(ret->occ==NULL) { - // delete ret; - // return NULL; - // } - return ret; - } - - inline uint get_start(uint symbol, uint mask) { - return symbol&mask; - } - - inline uint get_end(uint symbol, uint mask) { - return get_start(symbol,mask)+!mask+1; - } - - bool WaveletMatrix::is_set(uint val, uint ind) const - { - assert(indaccess(pos, optR)) { - pos = C[level] + optR - 1; - ret = ret | (1 << level); - } - else { - pos = optR - 1; - } - } - return am->unmap(ret); - } - - size_t WaveletMatrix::rank(uint symbol, size_t pos) const - { - symbol = am->map(symbol); - size_t start = 0; - for (uint level = 0; level < height; level++) { - if(is_set(symbol, height - level - 1)) { - if (start > 0) - start = bitstring[level]->rank1(start - 1); - start += C[level]; - pos = bitstring[level]->rank1(pos) + C[level] - 1; - } - else { - if (start > 0) - start = start - bitstring[level]->rank1(start - 1); - pos = pos - bitstring[level]->rank1(pos); - } - if (pos + 1 - start == 0) return 0; - } - return pos + 1 - start;; - } - - size_t WaveletMatrix::select(uint symbol, size_t j) const - { - symbol = am->map(symbol); - size_t pos = OCC[symbol] + j - 1; //(symbol == 0? -1 : occ->select1(symbol)) + j; - for (int level = height - 1; level >= 0; level--) { - // left - if (pos < C[level]) { - pos = bitstring[level]->select0(pos + 1); - } // right - else { - pos = bitstring[level]->select1(pos - C[level] + 1); - } - } - return pos; - } - - size_t WaveletMatrix::getSize() const - { - size_t ptrs = sizeof(WaveletMatrix)+height*sizeof(Sequence*); - size_t bytesBitstrings = 0; - for(uint i=0;igetSize(); - return bytesBitstrings /* + occ->getSize() */ + ptrs - + height * sizeof(uint) + sizeof(uint) * (max_v + 2); - } - - void WaveletMatrix::build_level(uint **bm, uint *symbols, uint length, uint *occs) { - uint sigma = max_value(symbols, length); - uint *new_order = new uint[sigma + 1]; - for (uint level = 0; level < height; level++) { - uint zeroes = 0; - for (uint i = 0; i < sigma + 1; i++) - if (!is_set(i, height - level - 1)) { - new_order[i] = 0; - } - else { - new_order[i] = 1; - } - for (uint i = 0; i < length; i++) - if (!new_order[symbols[i]]) - zeroes++; - uint *new_symbols = new uint[length]; - uint new_pos0 = 0, new_pos1 = zeroes; - for (uint i = 0; i < length; i++) { - if (!new_order[symbols[i]]) { - new_symbols[new_pos0++] = symbols[i]; - bitclean(bm[level], i); - } - else { - new_symbols[new_pos1++] = symbols[i]; - cds_utils::bitset(bm[level], i); - } - } - delete [] symbols; - symbols = new_symbols; - } - delete [] symbols; - delete [] new_order; - } - - uint WaveletMatrix::max_value(uint *symbols, size_t n) { - uint max_v = 0; - for(size_t i=0;i>= 1; - } - return ret; - } - -}; diff --git a/libcds/src/static/sequence/WaveletTree.cpp b/libcds/src/static/sequence/WaveletTree.cpp deleted file mode 100644 index f715b26e..00000000 --- a/libcds/src/static/sequence/WaveletTree.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* WaveletTree.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTree definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - WaveletTree::WaveletTree(const Array & a, wt_coder * coder, BitSequenceBuilder *bmb, Mapper *am) : Sequence(0) { - bmb->use(); - this->n = a.getLength(); - this->length = n; - this->am = am; - am->use(); - this->c=coder; - c->use(); - uint * symbols = new uint[n]; - for(size_t i=0;imap(a[i]); - } - root = new wt_node_internal(symbols, n, 0, c, bmb); - delete [] symbols; - bmb->unuse(); - } - - WaveletTree::WaveletTree(uint * symbols, size_t n, wt_coder * c, BitSequenceBuilder * bmb, Mapper * am, bool free) : Sequence(n) { - bmb->use(); - this->n = n; - for(size_t i=0;imap(symbols[i]); - this->am = am; - am->use(); - this->c=c; - c->use(); - root = new wt_node_internal(symbols, n, 0, c, bmb); - if(free) { - delete [] symbols; - } - else { - for(size_t i=0;iunmap(symbols[i]); - } - bmb->unuse(); - } - - WaveletTree::WaveletTree(uchar * symbols, size_t n, wt_coder * c, BitSequenceBuilder * bmb, Mapper * am, bool free) : Sequence(n) { - bmb->use(); - this->n = n; - for(size_t i=0;imap((uint)symbols[i]); - this->am = am; - am->use(); - this->c=c; - c->use(); - uint *done = new uint[n/W+1]; - for (uint i = 0; i < n/W+1; i++) - done[i] = 0; - root = new wt_node_internal(symbols, n, 0, c, bmb, 0, done); - delete [] done; - if(free) { - delete [] symbols; - } - else { - for(uint i=0;iunmap((uint)symbols[i]); - } - bmb->unuse(); - } - - WaveletTree::WaveletTree():Sequence(0) {} - - WaveletTree::~WaveletTree() { - delete root; - am->unuse(); - c->unuse(); - } - - size_t WaveletTree::rank(uint symbol, size_t pos) const - { - uint * s = c->get_symbol(am->map(symbol)); - size_t ret = root->rank(s, pos, 0, c); - delete [] s; - return ret; - } - - size_t WaveletTree::count(uint s) const - { - uint * s2 = c->get_symbol(am->map(s)); - size_t ret = root->rank(s2, length-1, 0, c); - delete [] s2; - return ret; - } - - size_t WaveletTree::select(uint symbol, size_t pos) const - { - uint * s = c->get_symbol(am->map(symbol)); - uint ret = root->select(s, pos, 0, c); - if(ret==((uint)-1)) { delete [] s; return (uint)-1;} - delete [] s; - return ret-1; - } - - uint WaveletTree::access(size_t pos) const - { - return am->unmap(root->access(pos)); - } - - uint WaveletTree::quantile(size_t left,size_t right,uint q) const - { - return quantile_freq(left,right,q).first; - } - - pair WaveletTree::quantile_freq(size_t left,size_t right,uint q) const - { - /* q=1 -> q=0 */ - q--; - - pair res = root->quantile_freq(left,right,q); - return std::make_pair( am->unmap(res.first) , res.second ); - } - - uint WaveletTree::access(size_t pos, size_t &rank) const - { - return am->unmap(root->access(pos, rank)); - } - - size_t WaveletTree::getSize() const - { - // cout << "sizeof(WT): " << sizeof(WaveletTree) << endl; - // cout << "root: " << root->getSize() << endl; - // cout << "am: " << am->getSize() << endl; - // cout << "cdr: " << c->getSize() << endl; - return sizeof(WaveletTree)+root->getSize()+am->getSize()+c->getSize(); - } - - void WaveletTree::save(ostream & fp) const - { - uint wr = WVTREE_HDR; - saveValue(fp, wr); - saveValue(fp, n); - c->save(fp); - am->save(fp); - root->save(fp); - } - - WaveletTree * WaveletTree::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WVTREE_HDR) return NULL; - WaveletTree * ret = new WaveletTree(); - ret->n = loadValue(fp); - ret->length = ret->n; - ret->c = wt_coder::load(fp); - ret->c->use(); - assert(ret->c!=NULL); - ret->am = Mapper::load(fp); - ret->am->use(); - assert(ret->am!=NULL); - ret->root = wt_node::load(fp); - assert(ret->root!=NULL); - return ret; - } - -}; diff --git a/libcds/src/static/sequence/WaveletTreeNoptrs.cpp b/libcds/src/static/sequence/WaveletTreeNoptrs.cpp deleted file mode 100644 index 5937b425..00000000 --- a/libcds/src/static/sequence/WaveletTreeNoptrs.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* WaveletTreeNoptrs.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * WaveletTreeNoptrs definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - WaveletTreeNoptrs::WaveletTreeNoptrs(const Array & a, BitSequenceBuilder * bmb, Mapper * am) : Sequence(0) { - bmb->use(); - this->n = a.getLength(); - this->length = n; - this->am = am; - am->use(); - uint * symbols = new uint[n]; - for(size_t i = 0; i < n; i++) - symbols[i] = am->map(a[i]); - max_v = am->map(a.getMax()); - height = bits(max_v); - - OCC = new uint[max_v + 2]; - for (uint i = 0; i <= max_v + 1; i++) - OCC[i] = 0; - for (uint i = 0; i < n; i++) - OCC[symbols[i] + 1]++; - - uint to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) to_add++; - - uint * new_symb = new uint[n + to_add]; - for (uint i = 0; i < n; i++) - new_symb[i] = symbols[i]; - delete [] symbols; - - to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) { - OCC[i]++; - new_symb[n + to_add] = i - 1; - to_add++; - } - - uint new_n = n + to_add; - for(uint i = 1;i <= max_v + 1; i++) - OCC[i] += OCC[i - 1]; - this->n = new_n; - - uint **_bm = new uint*[height]; - for(uint i = 0; i < height; i++) { - _bm[i] = new uint[new_n / W + 1]; - for(uint j = 0; j < new_n / W + 1; j++) - _bm[i][j] = 0; - } - build_level(_bm, new_symb, 0, new_n, 0); - bitstring = new BitSequence*[height]; - for(uint i = 0; i < height; i++) { - bitstring[i] = bmb->build(_bm[i], new_n); - delete [] _bm[i]; - } - delete [] _bm; - - bmb->unuse(); - } - - WaveletTreeNoptrs::WaveletTreeNoptrs(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols) : Sequence(n) { - bmb->use(); - this->n = n; - this->am = am; - am->use(); - for(uint i = 0; i < n; i++) - symbols[i] = am->map(symbols[i]); - max_v = max_value(symbols, n); - height = bits(max_v); - - OCC = new uint[max_v + 2]; - for (uint i = 0; i <= max_v + 1; i++) - OCC[i] = 0; - for (uint i = 0; i < n; i++) - OCC[symbols[i] + 1]++; - - uint to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) to_add++; - - uint * new_symb = new uint[n + to_add]; - for (uint i = 0; i < n; i++) - new_symb[i] = symbols[i]; - - if (deleteSymbols) { - delete [] symbols; - symbols = 0; - } - - to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) { - OCC[i]++; - new_symb[n + to_add] = i - 1; - to_add++; - } - - uint new_n = n + to_add; - for(uint i = 1;i <= max_v + 1; i++) - OCC[i] += OCC[i - 1]; - this->n = new_n; - - uint **_bm = new uint*[height]; - for(uint i = 0; i < height; i++) { - _bm[i] = new uint[new_n / W + 1]; - for(uint j = 0; j < new_n / W + 1; j++) - _bm[i][j] = 0; - } - build_level(_bm, new_symb, 0, new_n, 0); - bitstring = new BitSequence*[height]; - for (uint i = 0; i < height; i++) { - bitstring[i] = bmb->build(_bm[i], new_n); - delete [] _bm[i]; - } - delete [] _bm; - - if (!deleteSymbols) - for(uint i = 0; i < n; i++) - symbols[i] = am->unmap(symbols[i]); - - bmb->unuse(); - } - - // symbols is an array of elements of "width" bits - WaveletTreeNoptrs::WaveletTreeNoptrs(uint * symbols, size_t n, uint width, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols) : Sequence(n) { - bmb->use(); - this->n = n; - this->am = am; - am->use(); - for(uint i = 0; i < n; i++) - set_field(symbols, width, i, am->map(get_field(symbols, width, i))); - max_v = max_value(symbols, width, n); - height = bits(max_v); - - OCC = new uint[max_v + 2]; - for (uint i = 0; i <= max_v + 1; i++) - OCC[i] = 0; - for (uint i = 0; i < n; i++) - OCC[symbols[i] + 1]++; - - uint to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) to_add++; - - uint * new_symb = new uint[n + to_add]; - for (uint i = 0; i < n; i++) - new_symb[i] = symbols[i]; - - if (deleteSymbols) { - delete [] symbols; - symbols = 0; - } - - to_add = 0; - for (uint i = 1; i <= max_v + 1; i++) - if (OCC[i] == 0) { - OCC[i]++; - new_symb[n + to_add] = i - 1; - to_add++; - } - - uint new_n = n + to_add; - for(uint i = 1; i <= max_v + 1; i++) - OCC[i] += OCC[i - 1]; - this->n = new_n; - - uint **_bm = new uint*[height]; - for(uint i = 0; i < height; i++) { - _bm[i] = new uint[new_n / W + 1]; - for(uint j = 0; j < new_n / W + 1; j++) - _bm[i][j] = 0; - } - - build_level(_bm, new_symb, width, 0, new_n, 0); - bitstring = new BitSequence*[height]; - for(uint i=0;i< height; i++) { - bitstring[i] = bmb->build(_bm[i], new_n); - delete [] _bm[i]; - } - delete [] _bm; - - if (!deleteSymbols) - for (uint i = 0; i < n; i++) - set_field(symbols, width, i, am->unmap(get_field(symbols, width, i))); - - bmb->unuse(); - } - - WaveletTreeNoptrs::WaveletTreeNoptrs():Sequence(0) { - bitstring = NULL; - OCC = NULL; - am = NULL; - } - - WaveletTreeNoptrs::~WaveletTreeNoptrs() { - if (bitstring) { - for (uint i = 0; i < height; i++) - if (bitstring[i]) - delete bitstring[i]; - delete [] bitstring; - } - delete [] OCC; - if (am) - am->unuse(); - } - - void WaveletTreeNoptrs::save(ostream & fp) const - { - uint wr = WVTREE_NOPTRS_HDR; - saveValue(fp, wr); - saveValue(fp,n); - saveValue(fp,length); - saveValue(fp, max_v); - saveValue(fp, height); - am->save(fp); - for (uint i = 0; i < height; i++) - bitstring[i]->save(fp); - saveValue(fp, OCC, max_v + 2); - } - - WaveletTreeNoptrs * WaveletTreeNoptrs::load(istream & fp) { - uint rd = loadValue(fp); - if (rd != WVTREE_NOPTRS_HDR) return NULL; - WaveletTreeNoptrs * ret = new WaveletTreeNoptrs(); - ret->n = loadValue(fp); - ret->length = loadValue(fp); - ret->max_v = loadValue(fp); - ret->height = loadValue(fp); - ret->am = Mapper::load(fp); - if (ret->am == NULL) { - delete ret; - return NULL; - } - ret->am->use(); - ret->bitstring = new BitSequence*[ret->height]; - for(uint i = 0; i < ret->height; i++) - ret->bitstring[i] = NULL; - for(uint i = 0; i < ret->height; i++) { - ret->bitstring[i] = BitSequence::load(fp); - if (ret->bitstring[i] == NULL) { - delete ret; - return NULL; - } - } - ret->OCC = loadValue(fp, ret->max_v + 2); - return ret; - } - - inline uint get_start(uint symbol, uint mask) { - return symbol & mask; - } - - inline uint get_end(uint symbol, uint mask) { - return get_start(symbol, mask) + ~mask + 1; - } - - bool WaveletTreeNoptrs::is_set(uint val, uint ind) const - { - assert (ind < height); - return (val & (1 << (height - ind - 1))) != 0; - } - - uint WaveletTreeNoptrs::access(size_t pos) const - { - uint ret = 0; - - size_t start = 0; - for (uint level = 0; level < height; level++) { - size_t optR, before = 0; - if (start > 0) - before = bitstring[level]->rank1(start - 1); - - if (bitstring[level]->access(pos, optR)) { - ret |= (1 << (height - level - 1)); - pos = optR - 1 - before; - start = OCC[ret]; - pos += start; - } else { - pos = optR - 1 + before; - } - } - - return am->unmap(ret); - } - - uint WaveletTreeNoptrs::access(size_t pos, size_t &r) const - { - uint ret = 0; - - size_t start = 0; - for (uint level = 0; level < height; level++) { - size_t optR, before=0; - if (start > 0) - before = bitstring[level]->rank1(start-1); - - if(bitstring[level]->access(pos, optR)) { - ret |= (1 << (height - level - 1)); - r = optR - before; - start = OCC[ret]; - pos = r - 1 + start; - } - else { - pos = optR - 1 + before; - r = pos + 1 - start; - } - } - - return am->unmap(ret); - } - - size_t WaveletTreeNoptrs::rank(uint symbol, size_t pos) const - { - symbol = am->map(symbol);; - - size_t start = 0; - size_t count = 0; - - for(uint level = 0; level < height; level++) { - - uint masked = (symbol >> (height - level - 1)) << (height - level - 1); - - size_t before = 0; - if (start > 0) - before = bitstring[level]->rank1(start - 1); - - if (is_set(symbol, level)) { - count = bitstring[level]->rank1(pos) - before; - start = OCC[masked]; - pos = count + start - 1; - } else { - count = pos - start + before - bitstring[level]->rank1(pos) + 1; - masked += (1 << (height - level - 1)); - pos = count + start - 1; - } - - if (count == 0) return 0; - } - return count; - } - - size_t WaveletTreeNoptrs::select(uint symbol, size_t j) const - { - symbol = am->map(symbol); - - uint mask = (1 << height) - 2; - uint sum = 2; - - size_t pos = j; - - for (int level = height - 1; level >= 0; level--) { - - size_t start = get_start(symbol, mask); - size_t end = min(static_cast(max_v), start + sum); - start = OCC[start]; - end = OCC[end + 1] - 1; - - uint ones_start = 0; - if (start > 0) - ones_start = bitstring[level]->rank1(start - 1); - - if (is_set(symbol,level)) { - pos = bitstring[level]->select1(ones_start + pos) - start + 1; - } else { - pos = bitstring[level]->select0(start - ones_start + pos) - start + 1; - } - - mask <<= 1; - sum <<= 1; - } - - return pos - 1; - } - - size_t WaveletTreeNoptrs::getSize() const - { - size_t ptrs = sizeof(WaveletTreeNoptrs) + height * sizeof(Sequence*); - size_t bytesBitstrings = 0; - for(uint i = 0; i < height; i++) - bytesBitstrings += bitstring[i]->getSize(); - return bytesBitstrings + sizeof(uint) * (max_v + 2) + ptrs; - } - - void WaveletTreeNoptrs::build_level(uint **bm, uint *symbols, uint level, uint length, uint offset) { - if (level == height) { - delete [] symbols; - return; - } - - uint cleft = 0; - for (size_t i = 0; i < length; i++) - if (!is_set(symbols[i],level)) - cleft++; - - uint cright = length - cleft; - - uint *left = new uint[cleft]; - uint *right = new uint[cright]; - cleft = cright = 0; - for (size_t i = 0; i < length; i++) { - if (!is_set(symbols[i], level)) { - left[cleft++] = symbols[i]; - bitclean(bm[level], offset + i); - } else { - right[cright++] = symbols[i]; - cds_utils::bitset(bm[level], offset + i); - } - } - - delete [] symbols; - symbols = NULL; - - build_level(bm, left, level + 1, cleft, offset); - left = NULL; // Gets deleted in recursion. - build_level(bm, right, level + 1, cright, offset + cleft); - right = NULL; // Gets deleted in recursion. - } - - // symbols is an array of elements of "width" bits. - void WaveletTreeNoptrs::build_level(uint **bm, uint *symbols, unsigned width, uint level, uint length, uint offset) { - if (level == height) { - delete [] symbols; - return; - } - - uint cleft = 0; - for (size_t i = 0; i < length; i++) - if (!is_set(get_field(symbols, width, i), level)) - cleft++; - - uint cright = length - cleft; - - uint *left = new uint[(cleft * width) / W + 1]; - uint *right = new uint[(cright * width) / W + 1]; - cleft = cright = 0; - for (size_t i = 0; i < length; i++) { - if (!is_set(get_field(symbols, width, i), level)) { - set_field(left, width, cleft++, get_field(symbols, width, i)); - bitclean(bm[level], offset + i); - } - else { - set_field(right, width, cright++, get_field(symbols, width, i)); - cds_utils::bitset(bm[level], offset + i); - } - } - - delete [] symbols; - symbols = NULL; - - build_level(bm, left, width, level + 1, cleft, offset); - left = NULL; // Gets deleted in recursion. - build_level(bm, right, width, level + 1, cright, offset + cleft); - right = NULL; // Gets deleted in recursion. - } - - uint WaveletTreeNoptrs::max_value(uint *symbols, size_t n) { - uint max_v = 0; - for (size_t i = 0; i < n; i++) - max_v = max(symbols[i], max_v); - return max_v; - } - - uint WaveletTreeNoptrs::max_value(uint *symbols, unsigned width, size_t n) { - uint max_v = 0; - for (size_t i = 0; i < n; i++) - max_v = max(get_field(symbols, width, i), max_v); - return max_v; - } - - uint WaveletTreeNoptrs::bits(uint val) { - uint ret = 0; - while (val!=0) { - ret++; - val >>= 1; - } - return ret; - } - - size_t WaveletTreeNoptrs::count(uint symbol) const - { - uint mapped = am->map(symbol); - return OCC[mapped + 1] - OCC[mapped] + 1; - } - - uint WaveletTreeNoptrs::quantile(size_t left,size_t right,uint q) { - pair res = quantile_freq(left,right,q); - return res.first; - } - - pair WaveletTreeNoptrs::quantile_freq(size_t left,size_t right,uint q) { - /* decrease q as the smallest element q=1 is - * found by searching for 0 */ - q--; - - assert( right >= left ); - assert( (right-left+1) >= q ); - assert( right < length ); - - uint sym = 0; - uint freq = 0; - uint level = 0; - size_t start = 0, end = n-1; - size_t before; - BitSequence* bs; - - while(levelrank1(start-1); - - /* number of 1s before T[l..r] */ - size_t rank_before_left = bs->rank1(start+left-1); - /* number of 1s before T[r] */ - size_t rank_before_right = bs->rank1(start+right); - /* number of 1s in T[l..r] */ - size_t num_ones = rank_before_right - rank_before_left; - /* number of 0s in T[l..r] */ - size_t num_zeros = (right-left+1) - num_ones; - - /* if there are more than q 0s we go right. left otherwise */ - if(q >= num_zeros) { /* go right */ - freq = num_ones; /* calc freq */ - /* set bit to 1 in sym */ - sym = 1 << (height - level - 1); //set(sym,level); - /* number of 1s before T[l..r] within the current node */ - left = rank_before_left - before; - /* number of 1s in T[l..r] */ - right = rank_before_right - before - 1; - q = q - num_zeros; - /* calc starting pos of right childnode */ - start = end - (bs->rank1(end)-before) + 1; - } /* go left q = q // sym == sym */ - else { - freq = num_zeros;/* calc freq */ - /* number of zeros before T[l..r] within the current node */ - left = left - (rank_before_left - before); - /* number of zeros in T[l..r] + left bound */ - right = right - (rank_before_right - before); - /* calc end pos of left childnode */ - end = end - (bs->rank1(end) - before); - } - level++; - } - - /* unmap symbol */ - return pair(am->unmap(sym),static_cast(freq)); - } - -}; diff --git a/libcds/src/static/sequence/WaveletTreeNoptrsS.cpp b/libcds/src/static/sequence/WaveletTreeNoptrsS.cpp deleted file mode 100644 index 8c41b0cc..00000000 --- a/libcds/src/static/sequence/WaveletTreeNoptrsS.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* WaveletTreeNoptrsSS.cpp - * Copyright (C) 2012, Francisco Claude, all rights reserved. - * - * WaveletTreeNoptrsS definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - WaveletTreeNoptrsS::WaveletTreeNoptrsS(const Array &symb, BitSequenceBuilder * bmb, Mapper * am) : Sequence(n) { - bmb->use(); - this->n=symb.getLength(); - this->am=am; - bool deleteSymbols = true; - am->use(); - // This is terrible - uint *symbols = new uint[n]; - for(uint i=0;imap(symbols[i]); - max_v=max_value(symbols,n); - height=bits(max_v); - uint *occurrences=new uint[max_v+1]; - for(uint i=0;i<=max_v;i++) occurrences[i]=0; - for(uint i=0;ibuild(oc,new_n+1); - delete [] occurrences; - this->n = new_n; - uint ** _bm=new uint*[height]; - for(uint i=0;ibuild(_bm[i],new_n); - delete [] _bm[i]; - } - delete [] _bm; - - if (!deleteSymbols) - for(uint i=0;iunmap(symbols[i]); - - // delete [] new_symb; // already deleted in build_level()! - delete [] oc; - bmb->unuse(); - } - - WaveletTreeNoptrsS::WaveletTreeNoptrsS(uint * symbols, size_t n, BitSequenceBuilder * bmb, Mapper * am, bool deleteSymbols) : Sequence(n) { - bmb->use(); - this->n=n; - this->am=am; - am->use(); - for(uint i=0;imap(symbols[i]); - max_v=max_value(symbols,n); - height=bits(max_v); - uint *occurrences=new uint[max_v+1]; - for(uint i=0;i<=max_v;i++) occurrences[i]=0; - for(uint i=0;ibuild(oc,new_n+1); - delete [] occurrences; - this->n = new_n; - uint ** _bm=new uint*[height]; - for(uint i=0;ibuild(_bm[i],new_n); - delete [] _bm[i]; - } - delete [] _bm; - - if (!deleteSymbols) - for(uint i=0;iunmap(symbols[i]); - - // delete [] new_symb; // already deleted in build_level()! - delete [] oc; - bmb->unuse(); - } - - - - WaveletTreeNoptrsS::WaveletTreeNoptrsS():Sequence(0) { - bitstring = NULL; - occ = NULL; - am = NULL; - } - - WaveletTreeNoptrsS::~WaveletTreeNoptrsS() { - if(bitstring) { - for(uint i=0;iunuse(); - } - - void WaveletTreeNoptrsS::save(ostream & fp) const - { - uint wr = WVTREE_NOPTRSS_HDR; - saveValue(fp,wr); - saveValue(fp,n); - saveValue(fp,max_v); - saveValue(fp,height); - am->save(fp); - for(uint i=0;isave(fp); - occ->save(fp); - } - - WaveletTreeNoptrsS * WaveletTreeNoptrsS::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WVTREE_NOPTRSS_HDR) return NULL; - WaveletTreeNoptrsS * ret = new WaveletTreeNoptrsS(); - ret->n = loadValue(fp); - ret->length = ret->n; - ret->max_v = loadValue(fp); - ret->height = loadValue(fp); - ret->am = Mapper::load(fp); - if(ret->am==NULL) { - delete ret; - return NULL; - } - ret->am->use(); - ret->bitstring = new BitSequence*[ret->height]; - for(uint i=0;iheight;i++) - ret->bitstring[i] = NULL; - for(uint i=0;iheight;i++) { - ret->bitstring[i] = BitSequence::load(fp); - if(ret->bitstring[i]==NULL) { - cout << "damn" << i << " " << ret->height << endl; - delete ret; - return NULL; - } - } - ret->occ = BitSequence::load(fp); - if(ret->occ==NULL) { - delete ret; - return NULL; - } - return ret; - } - - inline uint get_start(uint symbol, uint mask) { - return symbol&mask; - } - - inline uint get_end(uint symbol, uint mask) { - return get_start(symbol,mask)+!mask+1; - } - - bool WaveletTreeNoptrsS::is_set(uint val, uint ind) const - { - assert(indrank0(end); - size_t optR = 0; - if (bitstring[level]->access(pos, optR)) { - pos = C + optR - 1; - ret = (ret << 1) | 1; - } else { - pos = optR - 1; - ret = ret << 1; - } - level++; - } - uint ret2 = 0; - for (uint i = 0; i < height; i++) { - ret2 = (ret2 << 1) | (ret & 1); - ret /= 2; - } - return am->unmap(ret2); - } - - size_t WaveletTreeNoptrsS::rank(uint symbol, size_t pos) const - { - symbol = am->map(symbol); - uint level = 0; - size_t end = n - 1; - // size_t count = 0; - size_t start = 0; - while (level < height) { - size_t C = bitstring[level]->rank0(end); - if(is_set(symbol, height - level - 1)) { - start = C + (start == 0? 0 : bitstring[level]->rank1(start - 1)); - pos = bitstring[level]->rank1(pos) + C - 1; - // count = pos + 1 - start; - } - else { - start = (start == 0? 0 : bitstring[level]->rank0(start - 1)); - pos = bitstring[level]->rank0(pos) - 1; - // count = pos + 1 - start; - } - level++; - // cout << "pos=" << pos << " start=" << start << endl; - // if(count==0) return 0; - } - return pos + 1 - start;; - } - - size_t WaveletTreeNoptrsS::select(uint symbol, size_t j) const - { - size_t end = n - 1; - symbol = am->map(symbol); - size_t pos = (symbol == 0? -1 : occ->select1(symbol)) + j; - for (int level = height - 1; level >= 0; level--) { - size_t C = bitstring[level]->rank0(end); - if (pos < C) { // left - pos = bitstring[level]->select0(pos + 1); - } else { // right - pos = bitstring[level]->select1(pos - C + 1); - } - } - return pos; - } - - size_t WaveletTreeNoptrsS::getSize() const - { - size_t ptrs = sizeof(WaveletTreeNoptrsS)+height*sizeof(Sequence*); - size_t bytesBitstrings = 0; - for(uint i=0;igetSize(); - return bytesBitstrings+occ->getSize()+ptrs; - } - - void WaveletTreeNoptrsS::build_level(uint **bm, uint *symbols, uint length, uint *occs) { - // for (uint i = 0; i < length; i++) - // cout << " " << symbols[i]; - // cout << endl; - uint sigma = max_value(symbols, length); - uint *new_order = new uint[sigma + 1]; - for (uint level = 0; level < height; level++) { - uint zeroes = 0; - for (uint i = 0; i < sigma + 1; i++) - if (!is_set(i, height - level - 1)) { - new_order[i] = 0; - } else { - new_order[i] = 1; - } - for (uint i = 0; i < length; i++) - if (!new_order[symbols[i]]) - zeroes++; - uint *new_symbols = new uint[length]; - uint new_pos0 = 0, new_pos1 = zeroes; - for (uint i = 0; i < length; i++) { - if (!new_order[symbols[i]]) { - //cout << "[" << new_pos0 << "]=" << symbols[i] << endl; - new_symbols[new_pos0++] = symbols[i]; - bitclean(bm[level], i); - } else { - //cout << "[" << new_pos1 << "]=" << symbols[i] << endl; - new_symbols[new_pos1++] = symbols[i]; - cds_utils::bitset(bm[level], i); - } - } - delete [] symbols; - symbols = new_symbols; - // for (uint i = 0; i < length; i++) - // cout << " " << symbols[i]; - // cout << endl; - } - delete [] symbols; - delete [] new_order; - } - - uint WaveletTreeNoptrsS::max_value(uint *symbols, size_t n) { - uint max_v = 0; - for(size_t i=0;i>= 1; - } - return ret; - } - - size_t WaveletTreeNoptrsS::count(uint symbol) const - { - return occ->select1(am->map(symbol))-occ->select1(am->map(symbol)-1)+1; - } - - -}; diff --git a/libcds/src/static/sequence/wt_coder.cpp b/libcds/src/static/sequence/wt_coder.cpp deleted file mode 100644 index f751aa86..00000000 --- a/libcds/src/static/sequence/wt_coder.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* wt_coder.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_coder::wt_coder() { - user_count=0; - } - - void wt_coder::use() { - user_count++; - } - - void wt_coder::unuse() { - user_count--; - if(user_count==0) delete this; - } - - wt_coder * wt_coder::load(istream & fp) { - uint rd = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(uint)); - switch(rd) { - case WT_CODER_HUFF_HDR: return wt_coder_huff::load(fp); - case WT_CODER_BINARY_HDR: return wt_coder_binary::load(fp); - } - return NULL; - } -}; diff --git a/libcds/src/static/sequence/wt_coder_binary.cpp b/libcds/src/static/sequence/wt_coder_binary.cpp deleted file mode 100644 index 5f55b2f1..00000000 --- a/libcds/src/static/sequence/wt_coder_binary.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* wt_coder_binary.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder_binary definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_coder_binary::wt_coder_binary(const Array & a, Mapper *am) { - //am->use(); - uint maxv = 0; - for(size_t i=0;iunuse(); - } - - wt_coder_binary::wt_coder_binary(uint * seq, size_t n, Mapper * am) { - uint max_v = 0; - for(uint i=0;imap(seq[i]),max_v); - h=bits(max_v); - } - - wt_coder_binary::wt_coder_binary(uchar * seq, size_t n, Mapper * am) { - uint max_v = 0; - for(uint i=0;imap((uint)seq[i]),max_v); - h=bits(max_v); - } - - wt_coder_binary::wt_coder_binary() {} - - wt_coder_binary::~wt_coder_binary() {} - - bool wt_coder_binary::is_set(uint symbol, uint l) const - { - if((1<<(h-l-1))&symbol) return true; - return false; - } - - bool wt_coder_binary::is_set(uint *symbol, uint l) const { - if(bitget(symbol, h - l - 1)) return true; - return false; - } - - uint * wt_coder_binary::get_symbol(uint symbol) const { - uint * ret = new uint[1]; - *ret = symbol; - return ret; - } - - bool wt_coder_binary::done(uint symbol, uint l) const - { - if(l==h) return true; - return false; - } - - size_t wt_coder_binary::getSize() const - { - return sizeof(wt_coder_binary); - } - - void wt_coder_binary::save(ostream & fp) const - { - uint wr = WT_CODER_BINARY_HDR; - saveValue(fp,wr); - saveValue(fp,h); - } - - wt_coder_binary * wt_coder_binary::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WT_CODER_BINARY_HDR) return NULL; - wt_coder_binary * ret = new wt_coder_binary(); - ret->h = loadValue(fp); - return ret; - } -}; diff --git a/libcds/src/static/sequence/wt_coder_huff.cpp b/libcds/src/static/sequence/wt_coder_huff.cpp deleted file mode 100644 index a9aabce3..00000000 --- a/libcds/src/static/sequence/wt_coder_huff.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* wt_coder_huff.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_coder_huff definition - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_coder_huff::wt_coder_huff(const Array & a, Mapper * am) { - am->use(); - size_t n = a.getLength(); - uint * symbs = new uint[n]; - for(uint i=0;imap(a[i]); - hc = new HuffmanCoder(symbs, n); - maxBuffer = hc->maxLength()/W+1; - delete [] symbs; - am->unuse(); - } - - wt_coder_huff::wt_coder_huff(uint * symbs, size_t n, Mapper * am) { - am->use(); - for(uint i=0;imap(symbs[i]); - hc = new HuffmanCoder(symbs, n); - maxBuffer = hc->maxLength()/W+1; - for(uint i=0;iunmap(symbs[i]); - am->unuse(); - } - - wt_coder_huff::wt_coder_huff(uchar * symbs, size_t n, Mapper * am) { - am->use(); - for(uint i=0;imap((uint)symbs[i]); - hc = new HuffmanCoder(symbs, n); - maxBuffer = hc->maxLength()/W+1; - for(uint i=0;iunmap((uint)symbs[i]); - am->unuse(); - } - - wt_coder_huff::wt_coder_huff() {} - - wt_coder_huff::~wt_coder_huff() { - delete hc; - } - - uint * wt_coder_huff::get_symbol(uint symbol) const { - uint * ret = new uint[maxBuffer]; - hc->encode(symbol, ret, (size_t)0); - return ret; - } - - // TODO: it could be implemented in a more efficient (low level) way - bool wt_coder_huff::is_set(uint symbol, uint l) const - { - uint *buffer = new uint[maxBuffer]; - hc->encode(symbol, buffer, (size_t)0); - bool ret = bitget(buffer,l); - delete[] buffer; - return ret; - } - - bool wt_coder_huff::is_set(uint *symbol, uint l) const { - return bitget(symbol,l); - } - - bool wt_coder_huff::done(uint symbol, uint l) const - { - uint *buffer = new uint[maxBuffer]; - uint s_len = (uint)hc->encode(symbol, buffer, (size_t)0); - bool ret = l==s_len; - delete[] buffer; - return ret; - } - - size_t wt_coder_huff::getSize() const - { - return 2*sizeof(uint)+sizeof(wt_coder_huff)+hc->getSize()+(hc->maxLength()/W+1)*sizeof(uint); - } - - void wt_coder_huff::save(ostream & fp) const - { - uint wr = WT_CODER_HUFF_HDR; - saveValue(fp,wr); - hc->save(fp); - } - - wt_coder_huff * wt_coder_huff::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WT_CODER_HUFF_HDR) return NULL; - wt_coder_huff * ret = new wt_coder_huff(); - ret->hc = HuffmanCoder::load(fp); - assert(ret->hc!=NULL); - ret->maxBuffer = ret->hc->maxLength()/W+1; - return ret; - } -}; diff --git a/libcds/src/static/sequence/wt_node.cpp b/libcds/src/static/sequence/wt_node.cpp deleted file mode 100644 index 5e09e225..00000000 --- a/libcds/src/static/sequence/wt_node.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* wt_node.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_node * wt_node::load(istream & fp) { - uint rd = loadValue(fp); - if(rd==WT_NODE_NULL_HDR) return NULL; - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(uint)); - switch(rd) { - case WT_NODE_INTERNAL_HDR: return wt_node_internal::load(fp); - case WT_NODE_LEAF_HDR: return wt_node_leaf::load(fp); - } - return NULL; - } -}; diff --git a/libcds/src/static/sequence/wt_node_internal.cpp b/libcds/src/static/sequence/wt_node_internal.cpp deleted file mode 100644 index ef402342..00000000 --- a/libcds/src/static/sequence/wt_node_internal.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/* wt_node_internal.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node_internal - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_node_internal::wt_node_internal(uint * symbols, size_t n, uint l, wt_coder * c, BitSequenceBuilder * bmb) { - uint * ibitmap = new uint[n/W+1]; - for(uint i=0;iis_set(symbols[i],l)) - cds_utils::bitset(ibitmap,i); - } - bitmap = bmb->build(ibitmap, n); - delete [] ibitmap; - size_t count_right = bitmap->rank1(n-1); - size_t count_left = n-count_right+1; - uint * left = new uint[count_left+1]; - uint * right = new uint[count_right+1]; - count_right = count_left = 0; - bool match_left = true, match_right = true; - for(uint i=0;iaccess(i)) { - right[count_right++]=symbols[i]; - if(count_right>1) - if(right[count_right-1]!=right[count_right-2]) - match_right = false; - } - else { - left[count_left++]=symbols[i]; - if(count_left>1) - if(left[count_left-1]!=left[count_left-2]) - match_left = false; - } - } - if(count_left>0) { - if(match_left/* && c->done(left[0],l+1)*/) - left_child = new wt_node_leaf(left[0], count_left); - else - left_child = new wt_node_internal(left, count_left, l+1, c, bmb); - } - else { - left_child = NULL; - } - delete [] left; - - if(count_right>0) { - if(match_right/* && c->done(right[0],l+1)*/) - right_child = new wt_node_leaf(right[0], count_right); - else - right_child = new wt_node_internal(right, count_right, l+1, c, bmb); - } - else { - right_child = NULL; - } - delete [] right; - } - - wt_node_internal::wt_node_internal(uchar * symbols, size_t n, uint l, wt_coder * c, BitSequenceBuilder * bmb, size_t left, uint *done) { - uint * ibitmap = new uint[n/W+1]; - for(size_t i=0;iis_set((uint)symbols[i + left],l)) - cds_utils::bitset(ibitmap,i); - bitmap = bmb->build(ibitmap, n); - delete [] ibitmap; - - size_t count_right = bitmap->rank1(n-1); - size_t count_left = n-count_right; - - for (size_t i=0;iis_set(swap,l)) - j = bitmap->rank0(k)-1; - else - j = count_left + bitmap->rank1(k)-1; - uchar temp = symbols[j+left]; - symbols[j+left] = swap; - swap = temp; - set_field(done,1,k+left,1); - } - - while (get_field(done,1,i+left)) - ++i; - } - - bool match_left = true, match_right = true; - for (size_t i=1; i < count_left; i++) - if (symbols[i+left] != symbols[i+left-1]) - match_left = false; - for (size_t i=count_left + 1; i < n; i++) - if (symbols[i+left] != symbols[i+left-1]) - match_right = false; - - if(count_left>0) { - if(match_left/* && c->done(left[0],l+1)*/) - left_child = new wt_node_leaf((uint)symbols[left], count_left); - else - left_child = new wt_node_internal(symbols, count_left, l+1, c, bmb, left, done); - } - else { - left_child = NULL; - } - if(count_right>0) { - if(match_right/* && c->done(right[0],l+1)*/) - right_child = new wt_node_leaf((uint)symbols[left+count_left], count_right); - else - right_child = new wt_node_internal(symbols, count_right, l+1, c, bmb, left+count_left, done); - } - else { - right_child = NULL; - } - } - - wt_node_internal::wt_node_internal() { } - - wt_node_internal::~wt_node_internal() { - delete bitmap; - if(right_child!=NULL) delete right_child; - if(left_child!=NULL) delete left_child; - } - - size_t wt_node_internal::rank(uint * symbol, size_t pos, uint l, wt_coder *c) const - { - bool is_set = c->is_set(symbol,l); - if(!is_set) { - /*if(left_child==NULL) { - cout << "symbol1=" << symbol << endl; - return 0; - }*/ - return left_child->rank(symbol, bitmap->rank0(pos)-1,l+1, c); - } - else { - /*if(right_child==NULL) { - cout << "symbol2=" << symbol << endl; - return 0; - }*/ - return right_child->rank(symbol, bitmap->rank1(pos)-1,l+1, c); - } - } - - size_t wt_node_internal::select(uint * symbol, size_t pos, uint l, wt_coder *c) const - { - bool is_set = c->is_set(symbol,l); //c->is_set(symbol, l); - size_t ret = 0; - if(!is_set) { - /*if(left_child==NULL) - return (size_t)(-1);*/ - size_t new_pos = left_child->select(symbol, pos, l+1, c); - if(new_pos+1==0) return (uint)(-1); - ret = bitmap->select0(new_pos)+1; - } - else { - /*if(right_child==NULL) - return (size_t)(-1);*/ - size_t new_pos = right_child->select(symbol, pos, l+1, c); - if(new_pos+1==0) return (uint)(-1); - ret = bitmap->select1(new_pos)+1; - } - if(ret==0) return (size_t)-1; - return ret; - } - - uint wt_node_internal::access(size_t pos) const - { - size_t rOpt = 0; - bool is_set = bitmap->access(pos,rOpt); - if(!is_set) { - assert(left_child!=NULL); - return left_child->access(rOpt-1); - } - else { - assert(right_child!=NULL); - return right_child->access(rOpt-1); - } - } - - // Returns the value at given position and its rank - uint wt_node_internal::access(size_t pos, size_t &rankp) const - { - size_t rOpt = 0; - bool is_set = bitmap->access(pos,rOpt); - if(!is_set) { - // recurse left - return left_child->access(rOpt-1, rankp); - } - else { - // recurse right - return right_child->access(rOpt-1, rankp); - } - } - - pair wt_node_internal::quantile_freq(size_t left,size_t right,uint q) const - { - /* number of 1s before T[l..r] */ - size_t rank_before_left = bitmap->rank1(left-1); - /* number of 1s before T[r] */ - size_t rank_before_right = bitmap->rank1(right); - /* number of 1s in T[l..r] */ - size_t num_ones = rank_before_right - rank_before_left; - /* number of 0s in T[l..r] */ - size_t num_zeros = (right-left+1) - num_ones; - - if(q >= num_zeros) { - return right_child->quantile_freq(rank_before_left,rank_before_left+num_ones-1,q-num_zeros); - } else { - return left_child->quantile_freq((left-rank_before_left),(left-rank_before_left)+num_zeros-1,q); - } - } - - size_t wt_node_internal::getSize() const - { - uint s = bitmap->getSize()+sizeof(wt_node_internal); - if(left_child!=NULL) - s += left_child->getSize(); - if(right_child!=NULL) - s += right_child->getSize(); - return s; - } - - void wt_node_internal::save(ostream & fp) const - { - uint wr = WT_NODE_INTERNAL_HDR; - saveValue(fp,wr); - bitmap->save(fp); - if(left_child!=NULL) { - left_child->save(fp); - } - else { - wr = WT_NODE_NULL_HDR; - saveValue(fp,wr); - } - if(right_child!=NULL) { - right_child->save(fp); - } - else { - wr = WT_NODE_NULL_HDR; - saveValue(fp,wr); - } - } - - wt_node_internal * wt_node_internal::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WT_NODE_INTERNAL_HDR) return NULL; - wt_node_internal * ret = new wt_node_internal(); - ret->bitmap = BitSequence::load(fp); - ret->left_child = wt_node::load(fp); - ret->right_child = wt_node::load(fp); - return ret; - } - -}; diff --git a/libcds/src/static/sequence/wt_node_leaf.cpp b/libcds/src/static/sequence/wt_node_leaf.cpp deleted file mode 100644 index 7c28497e..00000000 --- a/libcds/src/static/sequence/wt_node_leaf.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* wt_node_leaf.cpp - * Copyright (C) 2008, Francisco Claude, all rights reserved. - * - * wt_node_leaf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - wt_node_leaf::wt_node_leaf(uint symbol, size_t count) { - this->symbol = symbol; - this->count = count; - } - - wt_node_leaf::wt_node_leaf() {} - - wt_node_leaf::~wt_node_leaf() {} - - size_t wt_node_leaf::rank(uint *symbol, size_t pos, uint l, wt_coder *c) const - { - /*if(symbol!=this->symbol) { - return 0; - }*/ - //pos++; - return pos+1; - } - - size_t wt_node_leaf::select(uint *symbol, size_t pos, uint l, wt_coder *c) const - { - //if(symbol!=this->symbol) return (size_t)-1; - if(pos==0 || pos>count) return (size_t)-1; - return pos; - } - - uint wt_node_leaf::access(size_t pos) const - { - return symbol; - } - - uint wt_node_leaf::access(size_t pos, size_t &rank) const - { - rank = pos+1; - return symbol; - } - - pair wt_node_leaf::quantile_freq(size_t left,size_t right,uint q) const - { - return std::make_pair(symbol,right-left+1); - } - - size_t wt_node_leaf::getSize() const - { - return sizeof(wt_node_leaf); - } - - void wt_node_leaf::save(ostream & fp) const - { - uint wr = WT_NODE_LEAF_HDR; - saveValue(fp,wr); - saveValue(fp,count); - saveValue(fp,symbol); - } - - wt_node_leaf * wt_node_leaf::load(istream & fp) { - uint rd = loadValue(fp); - if(rd!=WT_NODE_LEAF_HDR) return NULL; - wt_node_leaf * ret = new wt_node_leaf(); - ret->count = loadValue(fp); - ret->symbol = loadValue(fp); - return ret; - } -}; diff --git a/libcds/src/static/suffixtree/LCP.cpp b/libcds/src/static/suffixtree/LCP.cpp deleted file mode 100644 index 8ea9eb01..00000000 --- a/libcds/src/static/suffixtree/LCP.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - uint * LCP::create_lcp(TextIndex *csa, char *text, uint n, int q) const - { - if(q > (int)n) { - cout << "Specified q (" << q << ") greater than string length (" << n << ")" << endl; - return NULL; - } - int i,h,j,k, m; - int *sa = NULL; - int *plcp = NULL; - /*q==-1 its mean that for any position we just use psi for calculate each LCP*/ - if(q!=-1) { - m = 1+(n-1)/q; - plcp = new int[m]; //space for sampled lcps - if(plcp==NULL) { - cerr << "Failed to allocate memory for plcp." << endl; - return NULL; - } - /*initialize samples to -1*/ - for(i=0; i < m; i++) - plcp[i] = -1; - sa = new int[n]; - /*calculate SA*/ - for(k=0; k < (int)n; k++) - sa[k] = csa->getSA(k); - /*compute the sparse phi array (in plcp)*/ - for(k=1; k < (int)n-1; k++) { - if(sa[k] % q == 0) - plcp[sa[k]/q] = sa[k-1]; - } - /*most of sparse phi computed make a special case of the last one*/ - if(sa[n-1]%q == 0) - plcp[sa[n-1]/q] = n; - /*all of sparse phi computed*/ - - /*compute lcp''*/ - h = 0; - for(i=0; i < m; i++) { - j = plcp[i]; //here plcp[i] = phi'[i] - k = i*q; - while(k+h < (int)n && j+h < (int)n && text[k+h] == text[j+h]) - h++; - plcp[i] = h; //now plcp[i] = h - if(h > 0) - h -= q; - if(h < 0) - h = 0; - } - } - - /*compute lcp*/ - uint *lcp = new uint[n]; - lcp[0]=0; - uint sa_k, sa_ant; - int iq; - sa_k = sa[0]; - for(k=1; k<(int)n;k++) { - sa_ant = sa_k; - sa_k = sa[k]; - if(sa_k % q == 0) - lcp[k] = plcp[sa_k/q]; - else { - //smallest multiple of q less than i - iq = (sa_k/q) * q; - h = plcp[sa_k/q] - (sa_k-iq); - if(h<0) - h=0; - /*the total cost of this loop should be O(qn)*/ - while(sa_k+h < n && sa_ant+h < n && text[sa_k+h]==text[sa_ant+h]) - h++; - lcp[k] = h; - } - } - delete [] plcp; - delete [] sa; - return lcp; - } - - LCP * LCP::load(istream & fp) { - size_t r = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(size_t)); - cout << "Loading "<< r << endl; - switch(r) { - case NAIVE: return LCP_naive::load(fp); - case SAD_GON_OS: return LCP_Sad::load(fp); - case FMN_RRR_OS: return LCP_FMN::load(fp); - case PT: return LCP_PT::load(fp); - case PHI: return LCP_PhiSpare::load(fp); - case DAC: return LCP_DAC::load(fp); - case DAC_VAR: return LCP_DAC_VAR::load(fp); - } - return NULL; - } -}; diff --git a/libcds/src/static/suffixtree/LCP_DAC.cpp b/libcds/src/static/suffixtree/LCP_DAC.cpp deleted file mode 100644 index 7dabf11f..00000000 --- a/libcds/src/static/suffixtree/LCP_DAC.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - /*global variable for do sequential access*/ - - /*LCP using Directly Addressable Variable-Length Codes */ - LCP_DAC::LCP_DAC() { - lcp_type = DAC; - rep = NULL; - n = 0; - next_p = NULL; - } - - LCP_DAC::LCP_DAC(TextIndex *csa, char *text, size_t length) { - lcp_type = DAC; - n = length; - uint *lcp = create_lcp(csa,text,n,32); - rep = new factorization(lcp, n); - next_p = new size_t[(uint)rep->nLevels -1]; - delete [] lcp; - } - - size_t LCP_DAC::get_LCP(size_t i, TextIndex *csa) const - { - return (size_t)rep->access(i+1); - } - - size_t LCP_DAC::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - if(*n_next==0) { - *n_next = (size_t)rep->nLevels -1; - for(size_t j=0; j< *n_next; j++) - next_p[j] =0; - *next_pos = next_p; - } - return (size_t)rep->access_seq(i+1, *next_pos, dir); - } - - size_t LCP_DAC::getSize() const - { - size_t mem = 0; - mem += sizeof(LCP_DAC); - mem += sizeof(size_t)*((uint)rep->nLevels -1); - mem += rep->getSize(); - return mem; - } - - void LCP_DAC::save(ostream & fp) const - { - saveValue(fp, lcp_type); - saveValue(fp, n); - rep->save(fp); - } - - LCP_DAC* LCP_DAC::load(istream & fp) { - LCP_DAC *lcp = new LCP_DAC(); - size_t type = loadValue(fp); - if(type!=DAC) { - abort(); - } - lcp->n = loadValue(fp); - lcp->rep = factorization::load(fp); - lcp->next_p = new size_t[(uint)((lcp->rep)->nLevels) -1]; - return lcp; - } - - LCP_DAC::~LCP_DAC() { - if(rep!=NULL) - delete (factorization *)rep; - if(next_p!=NULL) - delete [] next_p; - } - -}; diff --git a/libcds/src/static/suffixtree/LCP_DAC_VAR.cpp b/libcds/src/static/suffixtree/LCP_DAC_VAR.cpp deleted file mode 100644 index 6b7edf7a..00000000 --- a/libcds/src/static/suffixtree/LCP_DAC_VAR.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - /*LCP using Directly Addressable Variable-Length Codes variable******************************************/ - LCP_DAC_VAR::LCP_DAC_VAR() { - lcp_type = DAC_VAR; - next_p_var = NULL; - rep = NULL; - n = 0; - } - - LCP_DAC_VAR::LCP_DAC_VAR(TextIndex *csa, char *text, size_t length) { - lcp_type = DAC_VAR; - n = length; - uint *lcp; - uint *frec_acu = new uint[n]; - uint max_lcp = 0; - ushort *kvalues; - uint nkvalues; - /*create the LCP array and frec_acu array*/ - lcp = create_lcp(csa,text,n,32); - for(uint i=0; inLevels -1]; - delete [] kvalues; - delete [] frec_acu; - delete [] lcp; - } - - void LCP_DAC_VAR::calc_kvalues(uint max_lcp, uint *frec_acu, ushort **kvalues, uint *nkvalues) const - { - uint list_length=0; - uint nBits; - - /*calculate the kvalues*/ - list_length = frec_acu[max_lcp]; - nBits = bits(max_lcp); - //This table will contain the size of the best option for store the firts x bits - long * tableSize = new long[nBits+1]; - uint * tableNLevels = new uint[nBits+1]; - uint ** tableKvalues = new uint*[nBits+1]; - uint j; - ulong maxSize=0, maxPos=0; - uint posVocInf, posVocSup; - ulong currentSize; - tableSize[0]=0; - tableNLevels[0]=0; - tableKvalues[0]=NULL; - - for(uint i=1;i<=nBits;i++) { - maxSize=-1; - maxPos=0; - for(j=0;j= max_lcp) - posVocSup= max_lcp; - if(j==0) - currentSize = tableSize[j]+ ((ulong)(frec_acu[max_lcp]-frec_acu[posVocInf]))*((i-j)); - else - currentSize = tableSize[j]+ ((ulong)(frec_acu[max_lcp]-frec_acu[posVocInf]))*((i-j)+1)+(frec_acu[max_lcp]-frec_acu[posVocInf])/FACT_RANK; - if(maxSize>currentSize) { - maxSize=currentSize; - maxPos=j; - } - } - tableSize[i]=maxSize; - tableNLevels[i]=tableNLevels[maxPos]+1; - tableKvalues[i]=new uint[tableNLevels[i]]; - for(j=0;j=max_lcp) - posVocSup=max_lcp; - if(j==tableNLevels[nBits]) - sumaTotal += ((ulong)(frec_acu[max_lcp]-frec_acu[posVocInf]))*bitsCount; - else - sumaTotal += ((ulong)(frec_acu[max_lcp]-frec_acu[posVocInf]))*(bitsCount+1)+(frec_acu[max_lcp]-frec_acu[posVocInf])/FACT_RANK; - bitCountInf+=bitsCount; - } - - *nkvalues = tableNLevels[nBits]; - ushort *_kvalues = new ushort[*nkvalues]; - cout << endl; - for(j=0;jaccess(i+1); - } - - size_t LCP_DAC_VAR::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - if(*n_next==0) { - *n_next = (uint)rep->nLevels -1; - for(uint j=0; j< *n_next; j++) - next_p_var[j] =0; - *next_pos = next_p_var; - } - return (size_t)rep->access_seq(i+1, *next_pos, dir); - } - - size_t LCP_DAC_VAR::getSize() const - { - size_t mem = 0; - mem += sizeof(LCP_DAC_VAR); - mem += sizeof(size_t)*((uint)rep->nLevels -1); - mem += rep->getSize(); - return mem; - } - - void LCP_DAC_VAR::save(ostream & fp) const - { - saveValue(fp, lcp_type); - saveValue(fp, n); - rep->save(fp); - } - - LCP_DAC_VAR* LCP_DAC_VAR::load(istream & fp) { - LCP_DAC_VAR *lcp = new LCP_DAC_VAR(); - size_t type = loadValue(fp); - if(type!=DAC_VAR) { - abort(); - } - lcp->n = loadValue(fp); - lcp->rep = factorization_var::load(fp); - lcp->next_p_var = new size_t[(size_t)((lcp->rep)->nLevels) -1]; - return lcp; - } - - LCP_DAC_VAR::~LCP_DAC_VAR() { - if(rep != NULL) - delete (factorization_var *)rep; - if(next_p_var != NULL) - delete [] next_p_var; - } - -}; diff --git a/libcds/src/static/suffixtree/LCP_FMN.cpp b/libcds/src/static/suffixtree/LCP_FMN.cpp deleted file mode 100644 index fa01e5e9..00000000 --- a/libcds/src/static/suffixtree/LCP_FMN.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - LCP_FMN::LCP_FMN() { - lcp_type = FMN_RRR_OS; - O = NULL; - Z = NULL; - b_length = OZ_type = 0; - } - - void LCP_FMN::generate_OZ(BitSequence *U, uint **O, uint **Z, uint length) { - uint *o, *z; - bool bit_1 = true; //tell if we are counting 1 bits or 0 bits - uint cont_1 = 0; - uint cont_0 = 0; - long long nb = 1; - nb = (nb*length+W-1)/W; - if(nb > MAXINT) { - cerr << "Memory limit excess (in LCP)" << endl; - exit(1); - } - o = new uint[(uint)nb]; - z = new uint[(uint)nb]; - - for(uint i=0; i< (uint)nb; i++) { - o[i]=0; - z[i]=0; - } - - for(uint i=0; iaccess(i)) { - if(bit_1) - cont_1++; - else { - bit_1 = true; - cont_1++; - cds_utils::bitset(z,cont_0-1); - } - } - else { - if(bit_1) { - bit_1 = false; - cont_0++; - cds_utils::bitset(o,cont_1-1); - } - else - cont_0++; - } - } - if(bit_1) - cds_utils::bitset(o,cont_1-1); - else - cds_utils::bitset(z,cont_0-1); - *O = o; - *Z = z; - } - - LCP_FMN::LCP_FMN(TextIndex *csa, char *text, size_t n, size_t op_rs) { - if(op_rs!=RRR02_HDR && op_rs!=SDARRAY_HDR) { - cerr << "Error: op_rs must be RRR02_HDR or SDARRAY_HDR\n" << endl; - exit(1); - } - lcp_type = FMN_RRR_OS; - OZ_type = op_rs; - LCP_Sad *sa_lcp = new LCP_Sad(csa, text, n); - uint *O_aux, *Z_aux; - b_length = sa_lcp->U_length; - generate_OZ(sa_lcp->U, &O_aux, &Z_aux, b_length); - if(op_rs==RRR02_HDR) { - O = new BitSequenceRRR(O_aux, b_length); - Z = new BitSequenceRRR(Z_aux, b_length); - } - else { - O = new BitSequenceSDArray(O_aux, b_length); - Z = new BitSequenceSDArray(Z_aux, b_length); - } - delete (LCP_Sad *)sa_lcp; - delete [] O_aux; - delete [] Z_aux; - } - - LCP_FMN::LCP_FMN(LCP *lcp, TextIndex *csa, size_t n, size_t op_rs) { - uint *O_aux, *Z_aux; - if(op_rs!=RRR02_HDR && op_rs!=SDARRAY_HDR) { - cerr << "Error: op_rs must be RRR02_HDR or SDARRAY_HDR\n" << endl; - exit(1); - } - lcp_type = FMN_RRR_OS; - OZ_type = op_rs; - LCP_Sad *sa_lcp = new LCP_Sad(lcp, csa, n); - b_length = sa_lcp->U_length; - generate_OZ(sa_lcp->U, &O_aux, &Z_aux, b_length); - if(op_rs==RRR02_HDR) { - O = new BitSequenceRRR(O_aux, b_length); - Z = new BitSequenceRRR(Z_aux, b_length); - } - else { - O = new BitSequenceSDArray(O_aux, b_length); - Z = new BitSequenceSDArray(Z_aux, b_length); - } - delete (LCP_Sad *)sa_lcp; - delete [] O_aux; - delete [] Z_aux; - } - - size_t LCP_FMN::get_LCP(size_t i, TextIndex *csa) const - { - size_t val = csa->getSA(i); - size_t rank_0 = O->rank1(val); - if(rank_0 > 0) { - size_t r = Z->select1(rank_0) - val +1; - return r; - } - else - return 0; - } - - size_t LCP_FMN::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - return get_LCP(i,csa); - } - - size_t LCP_FMN::getSize() const - { - return O->getSize() + Z->getSize() + sizeof(LCP_FMN); - } - - void LCP_FMN::save(ostream & fp) const - { - saveValue(fp,lcp_type); - saveValue(fp,b_length); - saveValue(fp,OZ_type); - O->save(fp); - Z->save(fp); - } - - LCP_FMN* LCP_FMN::load(istream & fp) { - LCP_FMN *lcp = new LCP_FMN(); - size_t type = loadValue(fp); - if(type!=FMN_RRR_OS) { - abort(); - } - lcp->b_length = loadValue(fp); - lcp->OZ_type = loadValue(fp); - lcp->O = BitSequence::load(fp); - lcp->Z = BitSequence::load(fp); - return lcp; - } - - LCP_FMN::~LCP_FMN() { - if(O!= NULL) { - if(OZ_type == RRR02_HDR) - delete (BitSequenceRRR *)O; - else - delete (BitSequenceSDArray *)O; - } - if(Z!=NULL) { - if(OZ_type == RRR02_HDR) - delete (BitSequenceRRR *)Z; - else - delete (BitSequenceSDArray *)Z; - } - } - -}; diff --git a/libcds/src/static/suffixtree/LCP_PT.cpp b/libcds/src/static/suffixtree/LCP_PT.cpp deleted file mode 100644 index 329452d9..00000000 --- a/libcds/src/static/suffixtree/LCP_PT.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -const int max_precomputed_cover = 8; -const unsigned cover0[] = {0}; -const unsigned cover1[] = {0,1}; -const unsigned cover2[] = {0,1,2}; -const unsigned cover3[] = {0,1,2,4}; -const unsigned cover4[] = {0,1,2,5,8}; -const unsigned cover5[] = { //{0,7,8,10,14,19,23}; - 0,1,2,3,7,11,19 -}; -const unsigned cover6[] = {0,1,2,5,14,16,34,42,59}; -const unsigned cover7[] = {0,1,3,7,17,40,55,64,75,85,104,109,117}; -const unsigned cover8[] = { - 0,1,3,7,12,20,30,44,65,80,89,96,114,122, - 128,150,196,197,201,219 -}; -const unsigned * _covers[] = { - cover0, cover1, cover2, cover3, cover4, - cover5, cover6, cover7, cover8 -}; - -const int _cover_sizes[] = {1,2,3,4,5,7,9,13,20}; - -namespace cds_static -{ - - LCP_PT::LCP_PT() { - lcp_type = PT; - logv = 0; - length = 0; - mask = v = m = cover_size = 0; - rev_cover = NULL; - delta = NULL; - rev_ess = NULL; - rmq = NULL; - } - - LCP_PT::LCP_PT(TextIndex *csa, char *text, size_t n, int _logv) { - if(_logv > max_precomputed_cover) { - fprintf(stderr,"Specified DC (%d) greater than max (%d)\n",_logv,max_precomputed_cover); - exit(1); - } - lcp_type = PT; - logv = _logv; - v = (1 << _logv); - mask = v - 1; - length = n; - unsigned *_cover = (unsigned *)(_covers[logv]); - cover_size = _cover_sizes[logv]; - int _m = length/v; - _m = _m * cover_size; - //compute rev_cover - rev_cover = new int[v]; - int j = 0; - for(int i = 0; i < v; i++) { - rev_cover[i] = -1; - if((int)_cover[j] == i) { - rev_cover[i] = j; - if(j < (int)(length & mask)) - _m++; - j++; - } - } - - //compute delta - delta = new int[v]; - for (int i = cover_size-1; i >= 0; i--) { - for (j = 0; j < cover_size; j++) - delta[(_cover[j]-_cover[i])%v] = _cover[i]; - } - - m = _m; - //compute arrays _ess, rev_ess - int *_ess = (int *)malloc(sizeof(int) * _m); - rev_ess = new int[_m]; - for(int i=0; i<_m; i++) - rev_ess[i]=0; - j = 0; - for(int i = 0; i < (int)length; i++) { - //_sa[i] - int si = csa->getSA(i); - if(rev_cover[si&mask] != -1) { - //this is a sample suffix - _ess[j] = si; - rev_ess[(cover_size*(si>>logv)) + rev_cover[si&mask]] = j; - j++; - } - } - - //compute _ell using _ess, _rev_ess, _rev_cover - int *ell = new int[_m]; - for(int i=0; i<_m;i++) - ell[i]=0; - ell[0] = 0; - int len = 0; - int computed = 0; - int *lengths = (int *)malloc(sizeof(int) * cover_size); - for(int i = 0; i < cover_size; i++) { - lengths[i] = 0; - } - int compares_saved = 0; - int ihat = 0; - for(int i = 0; i < _m; i++) { - ihat = rev_ess[i]; - len = lengths[i%cover_size]; - if(len < 0) len = 0; - compares_saved += len; - if(ihat > 0) { - int j = _ess[ihat-1]; - while(_ess[ihat]+len < (int)length && j+len < (int)length) { - if(text[_ess[ihat]+len] != text[j+len]) { - break; - } - len++; - } - } - ell[ihat] = len; - int a = rev_cover[(_ess[ihat])&mask]; - lengths[a] = len - v; - computed++; - } - //we no longer need _ess and lengths. - free(_ess); - free(lengths); - //preprocess _ell for RMQs - rmq = new RMQ_succinct(ell,_m); - } - - int LCP_PT::calc_delta(unsigned int i, unsigned int j) const - { - return ((delta[(j-i)%v]-i)%v); - } - - size_t LCP_PT::get_LCP(size_t i, TextIndex *csa) const - { - if(i==0) - return 0; - int p0 = i-1; - int p1 = i; - int j=0; - while( csa->getT(p0) == csa->getT(p1) && j < v && p0!=-1 && p1!=-1) { - j++; - p0 = csa->getPsi(p0); - p1 = csa->getPsi(p1); - } - if(jgetSA(i-1); - //SA[i] - int s1 = (int)csa->getSA(i); - int ds0s1 = calc_delta((unsigned int)s0,(unsigned int)s1); - int a0 = s0 + ds0s1; - int a1 = s1 + ds0s1; - int r0 = rev_ess[(cover_size*(a0>>logv)) + rev_cover[a0&mask]]; - int r1 = rev_ess[(cover_size*(a1>>logv)) + rev_cover[a1&mask]]; - int rmin_auto = rmq->a[(rmq->query(r0+1,r1))]; - return (size_t)(ds0s1 + rmin_auto); - } - } - - size_t LCP_PT::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - return get_LCP(i,csa); - } - - size_t LCP_PT::getSize() const - { - size_t mem =0; - mem += sizeof(LCP_PT); - mem += rmq->getSize(); - //rev_cover - mem += sizeof(int) * v; - //delta - mem += sizeof(int) * v; - //rev_ess; - mem += sizeof(int) * m; - return mem; - } - - void LCP_PT::save(ostream & fp) const - { - saveValue(fp, lcp_type); - saveValue(fp, logv); - saveValue(fp, length); - saveValue(fp, m); - saveValue(fp, rev_cover, v); - saveValue(fp, delta, v); - saveValue(fp, rev_ess, m); - rmq->save(fp); - } - - LCP_PT * LCP_PT::load(istream & fp) { - LCP_PT *lcp = new LCP_PT(); - size_t type = loadValue(fp); - if(type!=PT) { - abort(); - } - lcp->logv = loadValue(fp); - lcp->length = loadValue(fp); - lcp->m = loadValue(fp); - lcp->v = (1 << lcp->logv); - lcp->mask = lcp->v - 1; - lcp->cover_size = _cover_sizes[lcp->logv]; - lcp->rev_cover = loadValue(fp, lcp->v); - lcp->delta = loadValue(fp, lcp->v); - lcp->rev_ess = loadValue(fp, lcp->m); - lcp->rmq = lcp->rmq->load(fp); - return lcp; - } - - LCP_PT::~LCP_PT() { - delete[] rev_cover; - delete[] delta; - delete[] rev_ess; - delete (RMQ_succinct *)rmq; - } -}; diff --git a/libcds/src/static/suffixtree/LCP_PhiSpare.cpp b/libcds/src/static/suffixtree/LCP_PhiSpare.cpp deleted file mode 100644 index 6a6aaa3d..00000000 --- a/libcds/src/static/suffixtree/LCP_PhiSpare.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - LCP_PhiSpare::LCP_PhiSpare() { - lcp_type = PHI; - q = n = 0; - plcp = NULL; - } - - LCP_PhiSpare::LCP_PhiSpare(TextIndex *csa, char *text, size_t _n, int _q) { - if(_q > (int)_n) { - cerr << "Specified q (" << _q << ") greater than string length (" << _n << ")" << endl; - exit(1); - } - lcp_type = PHI; - - int i,h,j,k, m; - int *sa; - q = _q; - n = _n; - - /*q==-1 its mean that for any position we just use psi for calculate each LCP*/ - if(q!=-1) { - m = 1+(_n-1)/_q; - plcp = new int[m]; //space for sampled lcps - if(plcp==NULL) { - cerr << "Failed to allocate memory for plcp." << endl; - exit(1); - } - // initialize samples to -1 - for(i=0; i < m; i++) - plcp[i] = -1; - sa = new int[n]; - //calculate SA - for(k=0; k < (int)n; k++) - sa[k] = csa->getSA(k); - //compute the sparse phi array (in plcp) - for(k=1; k < (int)n-1; k++) { - if(sa[k] % q == 0) { - plcp[sa[k]/q] = sa[k-1]; - } - } - //most of sparse phi computed - - //make a special case of the last one - if(sa[n-1]%q == 0) - plcp[sa[n-1]/q] = sa[n-2]; - //all of sparse phi computed - - delete [] sa; - - //compute lcp'' - h = 0; - for(i=0; i < m; i++) { - j = plcp[i]; //here plcp[i] = phi'[i] - k = i*q; - while(k+h < (int)n && j+h < (int)n && text[k+h] == text[j+h]) - h++; - plcp[i] = h; //now plcp[i] = h - if(h > 0) - h -= q; - if(h < 0) - h = 0; - } - } - } - - size_t LCP_PhiSpare::get_LCP(size_t i, TextIndex *csa) const - { - if(i==0) - return 0; - int iq, h, y; - int sa_i = csa->getSA(i);// SA[i] - int p0, p1; - p0 = i-1; - p1 = i; - - if(q==-1) - h = 0; - else { - //if we've already worked this one out - if(sa_i % q == 0) - return plcp[sa_i/q]; - iq = (sa_i/q)*q; //smallest multiple of q less than sa_i - h = plcp[sa_i/q] - (sa_i-iq); - if(h < 0) - h = 0; - if(h != 0) { - //SA[i-1] - y = csa->getSA(i-1); - if(y < sa_i) - h=0; - else { - //this must be p1=SA_inverse[SA[i]+h] y p0=SA_inverse[SA[i-1]+h] - p1 = csa->getISA(sa_i+h); - p0 = csa->getISA(y+h); - } - } - } - //the total cost of this loop should be O(qn) - //while(sa_i+h < n && j+h < n && text[i+h] == text[j+h]) - while(csa->getT(p0) == csa->getT(p1) && p0!=-1 && p1!=-1) { - h++; - p0 = csa->getPsi(p0); - p1 = csa->getPsi(p1); - } - return h; - } - - size_t LCP_PhiSpare::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - return get_LCP(i,csa); - } - - size_t LCP_PhiSpare::getSize() const - { - size_t mem =0; - if(q==-1) - return 0; - mem += sizeof(LCP_PhiSpare); - mem += (1+(n-1)/q)*sizeof(int); - return mem; - } - - void LCP_PhiSpare::save(ostream & fp) const - { - saveValue(fp, lcp_type); - saveValue(fp, q); - saveValue(fp, n); - if(q!=-1) - saveValue(fp, plcp, (1+(n-1)/q)); - } - - LCP_PhiSpare * LCP_PhiSpare::load(istream & fp) { - LCP_PhiSpare *lcp = new LCP_PhiSpare(); - size_t type = loadValue(fp); - if(type!=PHI) { - abort(); - } - lcp->q = loadValue(fp); - lcp->n = loadValue(fp); - if(lcp->q!=-1) { - int size = 1+ (lcp->n-1/lcp->q); - lcp->plcp = loadValue(fp, size); - } - return lcp; - } - - LCP_PhiSpare::~LCP_PhiSpare() { - if(q!=-1) - delete [] plcp; - } - -}; diff --git a/libcds/src/static/suffixtree/LCP_Sad.cpp b/libcds/src/static/suffixtree/LCP_Sad.cpp deleted file mode 100644 index fdc2f626..00000000 --- a/libcds/src/static/suffixtree/LCP_Sad.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "LCP_Sad.h" - -namespace cds_static -{ - - LCP_Sad::LCP_Sad() { - lcp_type = SAD_GON_OS; - U = NULL; - U_length = U_type = 0; - } - - LCP_Sad::LCP_Sad(TextIndex *csa, char *text, size_t n, size_t op_rs) { - if(op_rs!=BRW32_HDR && op_rs!=DARRAY_HDR) { - cout << "Error: op_rs must be BRW32_HDR or DARRAY_HDR\n" << endl; - exit(1); - } - lcp_type = SAD_GON_OS; - U_type = op_rs; - uint *lcp = create_lcp(csa,text,n,32); - uint pos =0; - uint lcp_prev, lcp_act; - long long nb = 1; - nb = (nb*2*n+W-1)/W; - if(nb > MAXINT) { - cout << "Memory limit excess (in LCP)" << endl; - exit(1); - } - uint *S = new uint[(uint)nb]; - for(uint i=0; i < (uint)nb; i++) - S[i]=0; - cds_utils::bitset(S,0); - - lcp_prev = lcp[csa->getISA(0)]; - pos += lcp_prev +1; - //calculate S and create U - for(uint i=1; igetISA(i)]; - pos+= lcp_act - lcp_prev + 2; - lcp_prev = lcp_act; - } - cds_utils::bitset(S,pos); - if(op_rs==BRW32_HDR) - //(bitarray, length, factor) - U = new BitSequenceRG(S, pos+1, 4); - else - U = new BitSequenceDArray(S, pos+1); - U_length = (size_t)(pos+1); - delete [] S; - delete [] lcp; - } - - LCP_Sad::LCP_Sad(LCP *lcp, TextIndex *csa, size_t n, size_t op_rs) { - if(op_rs!= BRW32_HDR && op_rs!= DARRAY_HDR) { - cout << "Error: op_rs must be BRW32_HDR or DARRAY_HDR\n" << endl; - exit(1); - } - lcp_type = SAD_GON_OS; - U_type = op_rs; - uint pos =0; - uint lcp_prev, lcp_act; - long long nb = 1; - nb = (nb*2*n+W-1)/W; - if(nb > MAXINT) { - cout << "Memory limit excess (in LCP)" << endl; - exit(1); - } - uint *S = new uint[(uint)nb]; - for(uint i=0; i < (uint)nb; i++) - S[i]=0; - cds_utils::bitset(S,0); - lcp_prev = lcp->get_LCP(csa->getISA(0), csa); - pos += lcp_prev +1; - //calculate S and create U - for(uint i=1; iget_LCP(csa->getISA(i), csa); - pos+= lcp_act - lcp_prev + 2; - lcp_prev = lcp_act; - } - cds_utils::bitset(S,pos); - if(op_rs==BRW32_HDR) - //(bitarray, length, factor) - U = new BitSequenceRG(S, pos+1, 4); - else - U = new BitSequenceDArray(S, pos+1); - U_length = (size_t)(pos+1); - delete [] S; - } - - size_t LCP_Sad::get_LCP(size_t i, TextIndex *csa) const - { - size_t val = csa->getSA(i); - if(val > 0) - return U->select1(val+2)-2*val-1; - else - return U->select1(2)-1; - } - - size_t LCP_Sad::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - return get_LCP(i,csa); - } - - size_t LCP_Sad::getSize() const - { - return U->getSize()+sizeof(LCP_Sad); - } - - void LCP_Sad::save(ostream & fp) const - { - saveValue(fp, lcp_type); - saveValue(fp,U_type); - saveValue(fp,U_length); - U->save(fp); - } - - LCP_Sad* LCP_Sad::load(istream & fp) { - LCP_Sad *lcp = new LCP_Sad(); - size_t type = loadValue(fp); - if(type!=SAD_GON_OS) { - abort(); - } - lcp->U_type = loadValue(fp); - lcp->U_length = loadValue(fp); - lcp->U = BitSequence::load(fp); - return lcp; - } - - LCP_Sad::~LCP_Sad() { - if(U!=NULL) { - if(U_type==BRW32_HDR) - delete (BitSequenceRG *)U; - else - delete (BitSequenceDArray *)U; - } - } -}; diff --git a/libcds/src/static/suffixtree/LCP_naive.cpp b/libcds/src/static/suffixtree/LCP_naive.cpp deleted file mode 100644 index 3e64a421..00000000 --- a/libcds/src/static/suffixtree/LCP_naive.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - LCP_naive::LCP_naive() { - lcp_array = NULL; - length = b = 0; - } - - /*Compute LCP by brute force using nlog(n) bits */ - - LCP_naive::LCP_naive(TextIndex *csa, char *text, size_t n) { - length =n; - size_t prev, act, val; - b = bits(length-1); - long long nb = 1; - nb = (nb*b*n+W-1)/W; - if(nb > MAXINT) { - cerr << "Memory limit excess (in LCP)" << endl; - exit(1); - } - lcp_array = new uint[(size_t)nb]; - for(size_t i=0; i<(size_t)nb; i++) - lcp_array[i]=0; - set_field_64(lcp_array, b, 0, 0); - val = csa->getSA(0); - prev = n - val; - for(size_t i=1; i < length; i++) { - val = csa->getSA(i); - act = n - val; - set_field_64(lcp_array, b, i, lcp_length(text, n-prev, val, min(prev,act))); - prev = act; - } - } - - size_t LCP_naive::get_LCP(size_t i, TextIndex *csa) const - { - return get_field_64(lcp_array, b, i); - } - - size_t LCP_naive::get_seq_LCP(size_t i, TextIndex *csa, size_t **next_pos, size_t *n_next, bool dir) const - { - return get_LCP(i,csa); - } - - size_t LCP_naive::getSize() const - { - size_t result = ((b*length+W-1)/W)*sizeof(size_t); - return result + sizeof(LCP_naive); - } - - void LCP_naive::save(ostream & fp) const - { - size_t wr = NAIVE; - saveValue(fp,wr); - saveValue(fp,length); - saveValue(fp,b); - saveValue(fp, lcp_array, ((b*length+W-1)/W)); - } - - LCP_naive* LCP_naive::load(istream & fp) { - LCP_naive *lcp = new LCP_naive(); - size_t type = loadValue(fp); - if(type!=NAIVE) { - abort(); - } - lcp->length = loadValue(fp); - lcp->b = loadValue(fp); - lcp->lcp_array = loadValue(fp, ((lcp->b*lcp->length+W-1)/W)); - return lcp; - } - - LCP_naive::~LCP_naive() { - if(lcp_array!=NULL) { - delete [] lcp_array; - } - } -}; diff --git a/libcds/src/static/suffixtree/NPR.cpp b/libcds/src/static/suffixtree/NPR.cpp deleted file mode 100644 index a5679a11..00000000 --- a/libcds/src/static/suffixtree/NPR.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - NPR * NPR::load(istream & fp) { - size_t r = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(size_t)); - cout << "Loading NPR "<< r << endl; - switch(r) { - case FMN_NPR: return NPR_FMN::load(fp); - case CN_NPR: return NPR_CN::load(fp); - } - return NULL; - } - -}; diff --git a/libcds/src/static/suffixtree/NPR_CN.cpp b/libcds/src/static/suffixtree/NPR_CN.cpp deleted file mode 100644 index e59d2014..00000000 --- a/libcds/src/static/suffixtree/NPR_CN.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - NPR_CN::NPR_CN() { - npr_type = CN_NPR; - n = 0; - b = 0; - bits_b = 0; - l = 0; - min_level = NULL; - level_size = NULL; - min_pos = NULL; - } - - NPR_CN::NPR_CN(LCP *lcp, size_t block_Size, TextIndex *csa) { - npr_type = CN_NPR; - n = csa->index_length(); - b = block_Size; - bits_b = bits(b); - l =(size_t)(log(n)/log(b)); - level_size = new uint[l]; - for(size_t i=0; iget_LCP(ini+j, csa); - if(min_aux < min) { - min = min_aux; - pos = j; - } - } - min_level[0][i] = min; - set_field_64(min_pos[0], bits_b, i, pos); - } - - /*calculate min for the last block*/ - min = n; - pos = 0; - ini = (level_size[0]-1)*b; - for(size_t j=ini; j < n; j++) { - min_aux = lcp->get_LCP(j, csa); - if(min_aux < min) { - min = min_aux; - pos = j - ini; - } - } - min_level[0][level_size[0]-1] = min; - set_field_64(min_pos[0], bits_b, level_size[0]-1, pos); - } - - void NPR_CN::create_next_level(size_t r) { - level_size[r] = (level_size[r-1]+b-1)/b; - min_level[r] = new uint[level_size[r]]; - for(size_t i=0; i< level_size[r]; i++) - min_level[r][i] = 0; - min_pos[r] = new uint[((level_size[r]*bits_b+W-1)/W)]; - for(size_t i=0; i<((level_size[r]*bits_b+W-1)/W); i++) - min_pos[r][i] = 0; - size_t min, min_aux; - size_t ini; - size_t pos; - - /*calculate the min for each block except the last one*/ - for(size_t i=0; iget_LCP(v, csa); - return fwd_NSV(v, csa, lcp, value_v); - } - - size_t NPR_CN::find_NSV_level_r(size_t value_v, size_t next_pos, size_t r) const - { - size_t lim; - size_t end_block = b*((next_pos+b)/b); - if(end_block > level_size[r]) - end_block = level_size[r]; - /*search in the same block*/ - for(size_t i=next_pos+1; i < end_block; i++) { - if(min_level[r][i] < value_v) - return i; - } - if(end_block==level_size[r]) - return level_size[r]; - /*search in the next levels*/ - lim = find_NSV_level_r(value_v, next_pos/b, r+1); - /*search in the same block than lim*/ - if(lim==level_size[r+1]) - return level_size[r]; - /*this must return something*/ - for(size_t i= b*lim; i< b*(lim+1); i++) { - if(min_level[r][i] < value_v) - return i; - } - /*if here not exist a return yet -> error!!*/ - return (size_t)-1; - } - - size_t NPR_CN::fwd_NSV(size_t v, TextIndex *csa, LCP *lcp, size_t d) const - { - size_t aux_nsv; - size_t lim; - if(d == 0) - return n; - size_t *next; - size_t n_next = 0; - /*search in the same block*/ - size_t end_block = b*((v+b)/b); - if(end_block>n) - end_block = n; - for(size_t i=v+1; i < end_block; i++) { - aux_nsv = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_nsv < d) - return i; - } - if(end_block==n) - return n; - /*search in the next levels*/ - lim = find_NSV_level_r(d, v/b, 0); - /*search in the same block than lim*/ - if(lim==level_size[0]) { - return n; - } - /*this must return something*/ - n_next = 0; - for(size_t i= b*lim; i< b*(lim+1); i++) { - aux_nsv = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_nsv < d) { - return i; - } - } - /*this never happen*/ - return (size_t)-1; - } - - size_t NPR_CN::find_PSV(size_t v, TextIndex *csa, LCP *lcp) const - { - size_t value_v = lcp->get_LCP(v, csa); - return bwd_PSV(v, csa, lcp, value_v); - } - - size_t NPR_CN::find_PSV_level_r(size_t value_v, size_t next_pos, size_t r) const - { - size_t lim; - size_t ini_block = b*((next_pos)/b); - if(next_pos == 0) - return 0; - /*search in the same block*/ - for(size_t i=next_pos-1; i > ini_block; i--) { - if(min_level[r][i] < value_v) - return i+1; - } - /*last one is a special case so we do it separate*/ - if(next_pos != ini_block) { - if(value_v > min_level[r][ini_block]) - return ini_block+1; - } - if(ini_block==0) - return 0; - /*search in the next levels*/ - lim = find_PSV_level_r(value_v, next_pos/b, r+1); - /*search in the same block than lim*/ - if(lim==0) - return 0; - /*this must return something*/ - for(size_t i= (b*lim-1); i >= b*(lim-1); i--) { - if(min_level[r][i] < value_v) - return i+1; - } - /*if here not exist a return yet -> error!!*/ - return (size_t)-1; - } - - size_t NPR_CN::bwd_PSV(size_t v, TextIndex *csa, LCP *lcp, size_t d) const - { - size_t aux_psv; - size_t lim; - if(d == 0) - return 0; - size_t *next; - size_t n_next = 0; - /*search in the same block*/ - size_t ini_block = b*(v/b); - for(size_t i=v-1; i > ini_block; i--) { - aux_psv = lcp->get_seq_LCP(i,csa, &next, &n_next, 0); - if(aux_psv < d) - return i+1; - } - /*last one is a special case so we do it separeted*/ - if(ini_block < v) { - if(d > lcp->get_LCP(ini_block,csa)) - return ini_block+1; - } - - if(ini_block==0) - return 0; - - /*search in the next levels*/ - lim = find_PSV_level_r(d, v/b, 0); - /*search in the same block than lim*/ - if(lim==0) - return 0; - - /*this must return something*/ - n_next = 0; - for(size_t i= b*lim-1; i >= b*(lim-1); i--) { - aux_psv = lcp->get_seq_LCP(i,csa, &next, &n_next, 0); - if(aux_psv < d) - return i+1; - } - return (size_t)-1; - } - - size_t NPR_CN::find_RMQ(size_t x, size_t y, TextIndex *csa, LCP *lcp) const - { - if(x>y){ size_t z = y; y = x; x = z;} - size_t ret = x; - size_t next_ret, min_r; - if(x==y) - return ret; - size_t *next; - size_t n_next = 0; - size_t min_val = lcp->get_seq_LCP(x,csa, &next, &n_next, 1); - size_t aux_min; - size_t x_r, y_r; - /*if x and y are in the same block O(b)*/ - if(x/b == y/b) { - for(size_t i=x+1; i<=y; i++) { - aux_min = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_min < min_val) { - min_val = aux_min; - ret = i; - } - } - return ret; - } - /*if x is the begin of the block*/ - if(x%b == 0) - x_r = x/b; - else { - /*view in the same block*/ - for(size_t i=x+1; i < b*((x+b-1)/b) ; i++) { - aux_min = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_min < min_val) { - min_val = aux_min; - ret = i; - } - } - x_r = (x+b-1)/b; - } - /*if y is the end of a block*/ - if(y%b == b-1) - y_r = y/b; - else { - /*view in the same block*/ - n_next = 0; - for(size_t i= b*(y/b); i <= y ; i++) { - aux_min = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_min < min_val) { - min_val = aux_min; - ret = i; - } - } - y_r = (y/b) - 1; - } - if(x_r > y_r) { - return ret; - } - next_ret = find_RMQ(x_r, y_r, 0, &min_r); - if( (min_val < min_r) || (min_val == min_r && ret < b*next_ret)) - return ret; - else - return next_ret*b + get_field_64(min_pos[0], bits_b, next_ret); - - /*this never happen*/ - cerr << "Error" << endl; - return 0; - } - - size_t NPR_CN::find_RMQ(size_t x, size_t y, size_t r, size_t *min_r) const - { - size_t ret = x; - size_t next_ret, next_min; - *min_r = min_level[r][x]; - size_t aux_min; - size_t x_r, y_r; - if(x==y) - return ret; - /*if x and y are in the same block O(b)*/ - if(x/b == y/b) { - for(size_t i=x+1; i<=y; i++) { - aux_min = min_level[r][i]; - if(aux_min < *min_r) { - *min_r = aux_min; - ret = i; - } - } - return ret; - } - /*if x is the begin of the block*/ - if(x%b == 0) - x_r = x/b; - else { - /*view in the same block*/ - for(size_t i=x+1; i < b*((x+b-1)/b) ; i++) { - aux_min = min_level[r][i]; - if(aux_min < *min_r) { - *min_r = aux_min; - ret = i; - } - } - x_r = (x+b-1)/b; - } - /*if y is the end of a block*/ - if(y%b == b-1) - y_r = y/b; - else { - /*view in the same block*/ - for(size_t i=b*(y/b); i <= y ; i++) { - aux_min = min_level[r][i]; - if(aux_min < *min_r) { - *min_r = aux_min; - ret = i; - } - } - y_r = y/b - 1; - } - if(x_r > y_r) - return ret; - next_ret = find_RMQ(x_r, y_r, r+1, &next_min); - if( (*min_r < next_min) || (*min_r == next_min && ret < next_ret*b)) - return ret; - else { - *min_r = next_min; - return next_ret*b + get_field_64(min_pos[r+1], bits_b, next_ret); - } - /*Error if the code reach this return*/ - //cerr << "Error" << endl; - return (size_t)-1; - } - - size_t NPR_CN::getSize() const - { - size_t mem = sizeof(NPR_CN); - mem += sizeof(uint)*l; //level size - for(size_t i=0; i(fp); - if(type!=CN_NPR) { - abort(); - } - npr->n = loadValue(fp); - npr->b = loadValue(fp); - npr->bits_b = loadValue(fp); - npr->l = loadValue(fp); - npr->level_size = loadValue(fp, npr->l); - npr->min_level = new uint*[npr->l]; - for(size_t i=0; il; i++) - npr->min_level[i] = loadValue(fp, npr->level_size[i]); - npr->min_pos = new uint*[npr->l]; - for(size_t i=0; il; i++) - npr->min_pos[i] = loadValue(fp, (npr->level_size[i]*npr->bits_b+W-1)/W); - return npr; - } - -}; diff --git a/libcds/src/static/suffixtree/NPR_FMN.cpp b/libcds/src/static/suffixtree/NPR_FMN.cpp deleted file mode 100644 index b0783ae3..00000000 --- a/libcds/src/static/suffixtree/NPR_FMN.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - NPR_FMN::NPR_FMN() { - npr_type = FMN_NPR; - nsv = NULL; - psv = NULL; - rmq = NULL; - } - - NPR_FMN::NPR_FMN(LCP *lcp, size_t block_Size, TextIndex *csa, size_t levels) { - npr_type = FMN_NPR; - nsv = new NSV(lcp,levels, block_Size, csa); - psv = new PSV(lcp,levels, block_Size, csa); - rmq = new RMQ_succinct_lcp(lcp, csa); - } - - NPR_FMN::~NPR_FMN() { - delete (NSV *)nsv; - delete (PSV *)psv; - delete (RMQ_succinct_lcp *)rmq; - } - - size_t NPR_FMN::find_NSV(size_t i, TextIndex *csa, LCP *lcp) const - { - return nsv->find_NSV(i, csa, lcp); - } - - size_t NPR_FMN::find_PSV(size_t i, TextIndex *csa, LCP *lcp) const - { - return psv->find_PSV(i,csa,lcp); - } - - size_t NPR_FMN::bwd_PSV(size_t i, TextIndex *csa, LCP *lcp, size_t d) const - { - if(d==0) - return 0; - size_t pos = i; - size_t val_lcp; - while(pos!=0) { - val_lcp = lcp->get_LCP(pos, csa); - if(val_lcpindex_length();; - size_t pos = i; - size_t val_lcp; - while(pos!=csa->index_length()) { - val_lcp = lcp->get_LCP(pos, csa); - if(val_lcpquery(x, y, csa, lcp); - } - - size_t NPR_FMN::getSize() const - { - size_t mem = sizeof(NPR_FMN); - mem += nsv->getSize(); - mem += psv->getSize(); - mem += rmq->getSize(); - return mem; - } - - void NPR_FMN::save(ostream & fp) const - { - saveValue(fp, npr_type); - nsv->save(fp); - psv->save(fp); - rmq->save(fp); - } - - NPR_FMN * NPR_FMN::load(istream & fp) { - NPR_FMN *npr = new NPR_FMN(); - size_t type = loadValue(fp); - if(type!=FMN_NPR) { - abort(); - } - npr->nsv = NSV::load(fp); - npr->psv = PSV::load(fp); - npr->rmq = RMQ_succinct_lcp::load(fp); - return npr; - } - -}; diff --git a/libcds/src/static/suffixtree/NSV.cpp b/libcds/src/static/suffixtree/NSV.cpp deleted file mode 100644 index 21223c4b..00000000 --- a/libcds/src/static/suffixtree/NSV.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - NSV::NSV() { - r=b=n=b_A=0; - P=NULL; - R=NULL; - A=NULL; - } - - void NSV::create_first_level(LCP *lcp, TextIndex *csa) { - uint *P_aux; - uint *R_aux; - uint size = (n+W-1)/W; - uint last_nsv = 0; - uint j; - uint lcp_value, nsv_aux; - P_aux = new uint[size]; - R_aux = new uint[size]; - - for(uint i=0; iget_LCP(i, csa); - nsv_aux = 0; - for(j=i+1; jget_LCP(j, csa); - if(lcp_value > nsv_aux) { - /*if is not near*/ - if( i/b < j/b ) { - if( j/b != last_nsv/b) { - /*mark the pioneer in P*/ - cds_utils::bitset(P_aux,i); - /*mark the pioneer and the NSV of the pioneer in R*/ - cds_utils::bitset(R_aux,i); - cds_utils::bitset(R_aux,j); - } - last_nsv=j; - } - break; - } - } /*close for j*/ - if(j==n) { - if(i/b < j/b) { - if(j/b != last_nsv/b) { - /*mark the pioneer in P*/ - cds_utils::bitset(P_aux,i); - /*mark the pioneer and the NSV of the pioneer in R*/ - cds_utils::bitset(R_aux,i); - cds_utils::bitset(R_aux,j); - } - last_nsv=j; - } - } - } /*close for i*/ - P[0] = new BitSequenceRRR(P_aux, n+1); - R[0] = new BitSequenceRRR(R_aux, n+1); - delete [] P_aux; - delete [] R_aux; - } - - void NSV::create_level_r(LCP *lcp, size_t level, TextIndex *csa) { - uint *P_aux; - uint *R_aux; - uint size = (n+W-1)/W; - uint last_nsv = 0; - uint j, far_aux, lcp_value, nsv_aux; - P_aux = new uint[size]; - R_aux = new uint[size]; - - for(uint i=0; i < size; i++) { - P_aux[i]=0; - R_aux[i]=0; - } - - uint num_elements = R[level-1]->rank1(n-1); - uint *lcp_r = new uint[num_elements]; - for(uint i=0; iget_LCP(R[level-1]->select1(i+1), csa); - } - - /*for each i find his NSV position*/ - for(uint i=0; i nsv_aux) { - /*if is not near*/ - if( i/b < j/b ) { - if( j/b != last_nsv/b) { - /*mark the pioneer in P*/ - far_aux = R[level-1]->select1(i+1); - cds_utils::bitset(P_aux,far_aux); - /*mark the pioneer and the NSV of the pioneer in R*/ - cds_utils::bitset(R_aux, far_aux); - cds_utils::bitset(R_aux, R[level-1]->select1(j+1)); - } - last_nsv=j; - } - break; - } - } /*close for j*/ - - if(j==num_elements) { - if( i/b < j/b ) { - if( j/b != last_nsv/b) { - /*mark the pioneer in P*/ - far_aux = R[level-1]->select1(i+1); - cds_utils::bitset(P_aux,far_aux); - /*mark the pioneer and the NSV of the pioneer in R*/ - cds_utils::bitset(R_aux,far_aux); - cds_utils::bitset(R_aux, n); - } - last_nsv=j; - } - } - } /*close for i*/ - delete [] lcp_r; - P[level] = new BitSequenceRRR(P_aux, n); - R[level] = new BitSequenceRRR(R_aux, n); - delete[] P_aux; - delete[] R_aux; - } - - void NSV::create_last_level(LCP *lcp, TextIndex *csa) { - uint *lcp_r; - uint lcp_value, nsv_aux, j; - - /*store the results for the last level*/ - uint num_elements = R[r-1]->rank1(n-1); - - b_A = bits(num_elements); - A = new uint[(num_elements*b_A + W -1)/W]; - for(size_t i=0; i<((num_elements*b_A + W -1)/W); i++) - A[i]=0; - - lcp_r = new uint[num_elements]; - for(uint i=0; iget_LCP(R[r-1]->select1(i+1), csa); - } - - for(uint i=0; i nsv_aux) { - set_field_64(A, b_A, i, j); - break; - } - } /*close for j*/ - if(j==num_elements) - set_field_64(A, b_A, i, j); - } /*close for i*/ - delete [] lcp_r; - } - - size_t NSV::find_NSV_r(size_t v, size_t level, TextIndex *csa, LCP *lcp) const - { - if(level == r) { - return get_field_64(A, b_A, v); - } - - /*look in the same block*/ - size_t num_elements = R[level-1]->rank1(n-1); - size_t pos_v = R[level-1]->select1(v+1); - size_t value_v = lcp->get_LCP(pos_v, csa); - size_t aux_nsv; - size_t pioneer, nsv_pioneer; - size_t end_block = b*((v+b)/b); - - if(end_block > num_elements) - end_block = num_elements; - - for(size_t i=v+1; i < end_block; i++) { - aux_nsv = lcp->get_LCP(R[level-1]->select1(i+1),csa); - if(aux_nsv < value_v) - return i; - } - - if(end_block==num_elements) { - return num_elements; - } - - /*find the pioneer*/ - pioneer = P[level]->select1(P[level]->rank1(pos_v)); - pioneer = R[level]->rank1(pioneer)-1; - /*resolve the pioneer recursive*/ - nsv_pioneer = find_NSV_r(pioneer, level+1, csa, lcp); - nsv_pioneer = R[level]->select1(nsv_pioneer+1); - if(nsv_pioneer==(size_t)-1) - nsv_pioneer = n; - nsv_pioneer = R[level-1]->rank1(nsv_pioneer)-1; - /*seek the answer in the same block of the nsv(las_pioneer)*/ - for(size_t i=(nsv_pioneer/b)*b ; i<=nsv_pioneer; i++) { - aux_nsv = lcp->get_LCP(R[level-1]->select1(i+1),csa); - if(aux_nsv < value_v) - return i; - } - return num_elements; - } - - NSV::NSV(LCP *lcp, size_t levels, size_t block, TextIndex *csa) { - /*levels>=1*/ - n = csa->index_length(); - r = levels; - b = block; - P = new BitSequence*[r]; - R = new BitSequence*[r]; - create_first_level(lcp, csa); - /*create the rest of the levels */ - for(size_t i=1; i < r; i++) { - create_level_r(lcp, i, csa); - } - /*create the last level*/ - create_last_level(lcp, csa); - } - - size_t NSV::find_NSV(size_t v, TextIndex *csa, LCP *lcp) const - { - /*look in the same block*/ - size_t n_next = 0; - size_t *next; - size_t value_v = lcp->get_seq_LCP(v, csa, &next, &n_next, 1); - size_t aux_nsv; - size_t pioneer, nsv_pioneer; - size_t end_block = b*((v+b)/b); - if(end_block>n) - end_block = n; - - for(size_t i=v+1; i < end_block; i++) { - aux_nsv = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_nsv < value_v) - return i; - } - if(end_block==n) - return n; - /*find the pioneer*/ - pioneer = P[0]->select1(P[0]->rank1(v)); - pioneer = R[0]->rank1(pioneer)-1; - /*resolve the pioneer recursive*/ - nsv_pioneer = find_NSV_r(pioneer, 1, csa, lcp); - nsv_pioneer = R[0]->select1(nsv_pioneer+1); - if(nsv_pioneer==(size_t)-1) - nsv_pioneer = n; - /*seek the answer in the same block of the nsv(las_pioneer)*/ - n_next = 0; - for(uint i=(nsv_pioneer/b)*b ; i<=nsv_pioneer; i++) { - aux_nsv = lcp->get_seq_LCP(i,csa, &next, &n_next, 1); - if(aux_nsv < value_v) - return i; - } - return n; - } - - void NSV::save(ostream & fp) const - { - saveValue(fp, r); - saveValue(fp, b); - saveValue(fp, n); - saveValue(fp, b_A); - - for(size_t i=0; isave(fp); - R[i]->save(fp); - } - size_t num_elements = R[r-1]->rank1(n-1); - saveValue(fp, A, (num_elements*b_A + W -1)/W); - } - - NSV* NSV::load(istream & fp) { - NSV *nsv = new NSV(); - nsv->r = loadValue(fp); - nsv->b = loadValue(fp); - nsv->n = loadValue(fp); - nsv->b_A = loadValue(fp); - nsv->P = new BitSequence*[nsv->r]; - nsv->R = new BitSequence*[nsv->r]; - for(size_t i=0; ir; i++) { - nsv->P[i] = BitSequence::load(fp); - nsv->R[i] = BitSequence::load(fp); - } - size_t tam_A = nsv->R[nsv->r-1]->rank1(nsv->n-1); - tam_A = (tam_A*nsv->b_A + W -1)/W; - nsv->A = loadValue(fp, tam_A); - return nsv; - } - - size_t NSV::getSize() const - { - /*sum of all the levels*/ - size_t size =0; - size += sizeof(NSV); - for(size_t i=0; igetSize() + P[i]->getSize(); - } - size += ((b_A*R[r-1]->rank1(n-1) + W -1)/W)*sizeof(uint); - return size; - } - - NSV::~NSV() { - delete [] A; - for(uint i=0; i - -namespace cds_static -{ - PSV::PSV() { - r=b=n=b_A=0; - P=NULL; - R=NULL; - A=NULL; - } - - void PSV::create_first_level(LCP *lcp, TextIndex *csa) { - uint *P_aux; - uint *R_aux; - /*we move all the result 1 space to de rigth*/ - uint size = (n+W-1)/W; - uint last_psv = n; - uint j, lcp_value, psv_aux; - P_aux = new uint[size]; - R_aux = new uint[size]; - - for(uint i=0; i0; i--) { - lcp_value = lcp->get_LCP(i-1,csa); - psv_aux = 0; - for(j=i-1; j>0; j--) { - psv_aux = lcp->get_LCP(j-1,csa); - if(lcp_value > psv_aux) { - /*if is not near*/ - if( i/b != j/b ) { - if( j/b != last_psv/b) { - /*mark the pioneer in P*/ - cds_utils::bitset(P_aux,i); - /*mark the pioneer and the PSV of the pioneer in R*/ - cds_utils::bitset(R_aux,i); - cds_utils::bitset(R_aux,j); - } - last_psv=j; - } - break; - } - } /*close for j*/ - if(j==0) { - if( i/b != j/b ) { - if( j/b != last_psv/b) { - /*mark the pioneer in P*/ - cds_utils::bitset(P_aux,i); - /*mark the pioneer and the NSV of the pioneer in R*/ - cds_utils::bitset(R_aux,i); - cds_utils::bitset(R_aux,j); - } - last_psv=j; - } - } - } /*close for i*/ - P[0] = new BitSequenceRRR(P_aux, n+1); - R[0] = new BitSequenceRRR(R_aux, n+1); - delete[] P_aux; - delete[] R_aux; - } - - void PSV::create_level_r(LCP *lcp, size_t level, TextIndex *csa) { - uint *P_aux, *R_aux; - uint size = (n+W-1)/W; - uint last_psv=n, ini=0; - uint far_aux, lcp_value, psv_aux; - int j; - P_aux = new uint[size]; - R_aux = new uint[size]; - for(uint i=0; i < size; i++) { - P_aux[i]=0; - R_aux[i]=0; - } - uint num_elements = R[level-1]->rank1(n); - uint *lcp_r = new uint[num_elements]; - if(R[level-1]->access(0)) - ini = 1; - - for(uint i=ini; iget_LCP(R[level-1]->select1(i+1)-1, csa); - } - - /*for each i find his PSV position*/ - for(uint i= num_elements-1; i>0; i--) { - lcp_value = lcp_r[i]; - for(j=i-1; j>0; j--) { - psv_aux = lcp_r[j]; - if(lcp_value > psv_aux) { - /*if is not near*/ - if( i/b != j/b ) { - if( j/b != last_psv/b) { - /*mark the pioneer in P*/ - far_aux = R[level-1]->select1(i+1); - cds_utils::bitset(P_aux,far_aux); - /*mark the pioneer and the PSV of the pioneer in R*/ - cds_utils::bitset(R_aux, far_aux); - cds_utils::bitset(R_aux, R[level-1]->select1(j+1)); - } - last_psv=j; - } - break; - } - } /*close for j*/ - - if(j==0) { - if(ini==1) { - /*if is not near*/ - if( i/b != j/b ) { - if( j/b != last_psv/b) { - /*mark the pioneer in P*/ - far_aux = R[level-1]->select1(i+1); - cds_utils::bitset(P_aux,far_aux); - /*mark the pioneer and the PSV of the pioneer in R*/ - cds_utils::bitset(R_aux, far_aux); - cds_utils::bitset(R_aux, 0); - } - last_psv=j; - } - } - else { - psv_aux = lcp_r[j]; - if(lcp_value > psv_aux) { - /*if is not near*/ - if( i/b != j/b ) { - if( j/b != last_psv/b) { - /*mark the pioneer in P*/ - far_aux = R[level-1]->select1(i+1); - cds_utils::bitset(P_aux,far_aux); - /*mark the pioneer and the PSV of the pioneer in R*/ - cds_utils::bitset(R_aux, far_aux); - cds_utils::bitset(R_aux, R[level-1]->select1(j+1)); - } - last_psv=j; - } - } - } - } - } /*close for i*/ - - delete [] lcp_r; - P[level] = new BitSequenceRRR(P_aux, n); - R[level] = new BitSequenceRRR(R_aux, n); - delete[] P_aux; - delete[] R_aux; - } - - void PSV::create_last_level(LCP *lcp, TextIndex *csa) { - size_t *lcp_r; - uint lcp_value, psv_aux; - int j, ini=0; - - /*store the results for the last level*/ - uint num_elements = R[r-1]->rank1(n); - b_A = bits(num_elements); - A = new uint[(num_elements*b_A + W -1)/W]; - for(size_t i=0; i<((num_elements*b_A + W -1)/W); i++) - A[i]=0; - lcp_r = new size_t[num_elements]; - - if(R[r-1]->access(0)) - ini = 1; - - for(uint i=ini; iget_LCP(R[r-1]->select1(i+1)-1, csa); - } - - for(int i=num_elements-1; i>0; i--) { - lcp_value = lcp_r[i]; - for(j=i-1; j>0; j--) { - psv_aux = lcp_r[j]; - if(lcp_value > psv_aux) { - set_field_64(A, b_A, i, j); - break; - } - } /*close for j*/ - if(j==0) { - if(ini) - set_field_64(A, b_A, i, 0); - else { - psv_aux = lcp_r[j]; - if(lcp_value > psv_aux) - set_field_64(A, b_A, i, j); - else - set_field_64(A, b_A, i, 0); - } - } - } /*close for i*/ - set_field_64(A, b_A, 0, 0); - delete [] lcp_r; - } - - PSV::PSV(LCP *lcp, size_t levels, size_t block, TextIndex *csa) { - /*levels>=1*/ - n = csa->index_length(); - r = levels; - b = block; - P = new BitSequence*[r]; - R = new BitSequence*[r]; - create_first_level(lcp, csa); - /*create the rest of the levels */ - for(size_t i=1; i < r; i++) { - create_level_r(lcp, i, csa); - } - /*create the last level*/ - create_last_level(lcp, csa); - } - - size_t PSV::find_PSV_r(size_t v, size_t level, TextIndex *csa, LCP *lcp) const - { - if(level == r) { - return get_field_64(A, b_A, v); - } - /*look in the same block*/ - size_t pos_v = R[level-1]->select1(v+1); - size_t value_v = lcp->get_LCP(pos_v-1, csa); - size_t aux_psv; - size_t pioneer, psv_pioneer; - size_t ini_block = b*(v/b); - size_t ini_search; - - if(ini_block==0) - ini_block = 1; - - for(size_t i=v; i >= ini_block; i--) { - aux_psv = lcp->get_LCP( R[level-1]->select1(i+1)-1,csa); - if(aux_psv < value_v) - return i; - } - - if(ini_block==1) - return 0; - - /*find the pioneer*/ - if(P[level]->access(pos_v)) - pioneer = pos_v; - else - pioneer = P[level]->select1(P[level]->rank1(pos_v)+1); - - pioneer = R[level]->rank1(pioneer)-1; - /*resolve the pioneer recursive*/ - psv_pioneer = find_PSV_r(pioneer, level+1, csa, lcp); - psv_pioneer = R[level-1]->rank1(R[level]->select1(psv_pioneer+1))-1; - if(psv_pioneer==0) - psv_pioneer = 1; - - ini_search = b*((psv_pioneer+b)/b)-1; - - /*seek the answer in the same block of the nsv(las_pioneer)*/ - for(size_t i= ini_search; i >= psv_pioneer; i--) { - aux_psv = lcp->get_LCP(R[level-1]->select1(i+1)-1,csa); - if(aux_psv < value_v) - return i; - } - return 0; - } - - size_t PSV::find_PSV(size_t v, TextIndex *csa, LCP *lcp) const - { - /*look in the same block*/ - size_t n_next = 0; - size_t *next; - size_t value_v = lcp->get_seq_LCP(v, csa, &next, &n_next, 0); - size_t aux_psv; - size_t pioneer, psv_pioneer; - size_t ini_block = b*((v+1)/b); - size_t ini_search; - if(ini_block==0) - ini_block = 1; - - for(size_t i=v; i >= ini_block; i--) { - aux_psv = lcp->get_seq_LCP(i-1,csa, &next, &n_next, 0); - if(aux_psv < value_v) - return i; - } - - if(ini_block==1) - return 0; - - /*find the pioneer*/ - if(P[0]->access(v+1)) - pioneer = v+1; - else - pioneer = P[0]->select1(P[0]->rank1(v+1)+1); - /*imaginary position in R[0]*/ - pioneer = R[0]->rank1(pioneer)-1; - /*resolve the pioneer recursive*/ - psv_pioneer = find_PSV_r(pioneer, 1, csa, lcp); - psv_pioneer = R[0]->select1(psv_pioneer+1); - if(psv_pioneer==0) - psv_pioneer = 1; - - /*seek the answer in the same block of the psv(las_pioneer)*/ - ini_search = b*((psv_pioneer+b)/b) -1; - n_next = 0; - for(size_t i=ini_search; i>=psv_pioneer; i--) { - aux_psv = lcp->get_seq_LCP(i-1,csa, &next, &n_next, 0); - if(aux_psv < value_v) - return i; - } - return 0; - } - - void PSV::save(ostream & fp) const - { - saveValue(fp, r); - saveValue(fp, b); - saveValue(fp, n); - saveValue(fp, b_A); - - for(size_t i=0; isave(fp); - R[i]->save(fp); - } - size_t num_elements = R[r-1]->rank1(n-1); - saveValue(fp, A, (num_elements*b_A + W -1)/W); - } - - PSV* PSV::load(istream & fp) { - PSV *psv = new PSV(); - psv->r = loadValue(fp); - psv->b = loadValue(fp); - psv->n = loadValue(fp); - psv->b_A = loadValue(fp); - psv->P = new BitSequence*[psv->r]; - psv->R = new BitSequence*[psv->r]; - for(size_t i=0; ir; i++) { - psv->P[i] = BitSequence::load(fp); - psv->R[i] = BitSequence::load(fp); - } - size_t tam_A = psv->R[psv->r-1]->rank1(psv->n-1); - tam_A = (tam_A*psv->b_A + W -1)/W; - psv->A = loadValue(fp, tam_A); - return psv; - } - - size_t PSV::getSize() const - { - size_t size = 0; - size += sizeof(PSV); - for(size_t i=0; igetSize() + P[i]->getSize(); - } - size += ((b_A*R[r-1]->rank1(n-1) + W -1)/W)*sizeof(uint); - return size; - } - - PSV::~PSV() { - delete [] A; - for(uint i=0; i - -namespace cds_static -{ - const unsigned int RMQ_succinct::Catalan[17][17] = { - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}, - {0,0,2,5,9,14,20,27,35,44,54,65,77,90,104,119,135}, - {0,0,0,5,14,28,48,75,110,154,208,273,350,440,544,663,798}, - {0,0,0,0,14,42,90,165,275,429,637,910,1260,1700,2244,2907,3705}, - {0,0,0,0,0,42,132,297,572,1001,1638,2548,3808,5508,7752,10659,14364}, - {0,0,0,0,0,0,132,429,1001,2002,3640,6188,9996,15504,23256,33915,48279}, - {0,0,0,0,0,0,0,429,1430,3432,7072,13260,23256,38760,62016,95931,144210}, - {0,0,0,0,0,0,0,0,1430,4862,11934,25194,48450,87210,149226,245157,389367}, - {0,0,0,0,0,0,0,0,0,4862,16796,41990,90440,177650,326876,572033,961400}, - {0,0,0,0,0,0,0,0,0,0,16796,58786,149226,326876,653752,1225785,2187185}, - {0,0,0,0,0,0,0,0,0,0,0,58786,208012,534888,1188640,2414425,4601610}, - {0,0,0,0,0,0,0,0,0,0,0,0,208012,742900,1931540,4345965,8947575}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,742900,2674440,7020405,15967980}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,2674440,9694845,25662825}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9694845,35357670}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35357670} - }; - - const int RMQ_succinct::minus_infinity = INT_MIN; - - const char RMQ_succinct::LSBTable256[256] = { - 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - }; - - unsigned int RMQ_succinct::lsb(DTsucc v) { - return LSBTable256[v]; - } - - const char RMQ_succinct::LogTable256[256] = { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - - RMQ_succinct::RMQ_succinct() { - a = NULL; - n = 0; - M = NULL; - M_depth = 0; - Mprime = NULL; - Mprime_depth = 0; - type = NULL; - Prec = NULL; - s = 0; - sprime = 0; - sprimeprime = 0; - nb = 0; - nsb = 0; - nmb = 0; - } - - unsigned int RMQ_succinct::log2fast(unsigned int v) { - unsigned int c = 0; // c will be lg(v) - // temporaries - unsigned int t, tt; - - if ((tt = v >> 16)) - c = (t = v >> 24) ? 24 + LogTable256[t] : 16 + LogTable256[tt & 0xFF]; - else - c = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v]; - return c; - } - - const DTsucc RMQ_succinct::HighestBitsSet[8] = { - static_cast(~0), static_cast(~1), - static_cast(~3), static_cast(~7), - static_cast(~15), static_cast(~31), - static_cast(~63), static_cast(~127)}; - - DTsucc RMQ_succinct::clearbits(DTsucc n, unsigned int x) { - return n & HighestBitsSet[x]; - } - - unsigned int RMQ_succinct::query(unsigned int i, unsigned int j) { - // i's microblock - unsigned int mb_i = microblock(i); - // j's microblock - unsigned int mb_j = microblock(j); - // min: to be returned - unsigned int min, min_i, min_j; - // start of i's microblock - unsigned int s_mi = mb_i * s; - // pos. of i in its microblock - unsigned int i_pos = i - s_mi; - - if (mb_i == mb_j) { // only one microblock-query - min_i = clearbits(Prec[type[mb_i]][j-s_mi], i_pos); - min = min_i == 0 ? j : s_mi + lsb(min_i); - } - else { - // i's block - unsigned int b_i = block(i); - // j's block - unsigned int b_j = block(j); - // start of j's microblock - unsigned int s_mj = mb_j * s; - // position of j in its microblock - unsigned int j_pos = j - s_mj; - min_i = clearbits(Prec[type[mb_i]][s-1], i_pos); - // left in-microblock-query - min = min_i == 0 ? s_mi + s - 1 : s_mi + lsb(min_i); - min_j = Prec[type[mb_j]][j_pos] == 0 ? - // right in-microblock-query - j : s_mj + lsb(Prec[type[mb_j]][j_pos]); - if (a[min_j] < a[min]) min = min_j; - - // otherwise we're done! - if (mb_j > mb_i + 1) { - // start of block i - unsigned int s_bi = b_i * sprime; - // start of block j - unsigned int s_bj = b_j * sprime; - // do another microblock-query! - if (s_bi+s > i) { - mb_i++; // go one microblock to the right - min_i = Prec[type[mb_i]][s-1] == 0 ? - // right in-block-query - s_bi + sprime - 1 : s_mi + s + lsb(Prec[type[mb_i]][s-1]); - if (a[min_i] < a[min]) min = min_i; - } - // and yet another microblock-query! - if (j >= s_bj+s) { - mb_j--; // go one microblock to the left - min_j = Prec[type[mb_j]][s-1] == 0 ? - // right in-block-query - s_mj - 1 : s_bj + lsb(Prec[type[mb_j]][s-1]); - if (a[min_j] < a[min]) min = min_j; - } - - unsigned int block_difference = b_j - b_i; - // otherwise we're done! - if (block_difference > 1) { - // for index calculations in M and M' - unsigned int k, twotothek, block_tmp; - b_i++; // block where out-of-block-query starts - // just one out-of-block-query - if (s_bj - s_bi - sprime <= sprimeprime) { - k = log2fast(block_difference - 2); - // 2^k - twotothek = 1 << k; - i = m(k, b_i); j = m(k, b_j-twotothek); - min_i = a[i] <= a[j] ? i : j; - } - else { // here we have to answer a superblock-query: - // i's superblock - unsigned int sb_i = superblock(i); - // j's superblock - unsigned int sb_j = superblock(j); - - // end of left out-of-block-query - block_tmp = block((sb_i+1)*sprimeprime); - k = log2fast(block_tmp - b_i); - // 2^k - twotothek = 1 << k; - i = m(k, b_i); j = m(k, block_tmp+1-twotothek); - min_i = a[i] <= a[j] ? i : j; - - // start of right out-of-block-query - block_tmp = block(sb_j*sprimeprime); - k = log2fast(b_j - block_tmp); - // 2^k - twotothek = 1 << k; - // going one block to the left doesn't harm and saves some tests - block_tmp--; - i = m(k, block_tmp); j = m(k, b_j-twotothek); - min_j = a[i] <= a[j] ? i : j; - - if (a[min_j] < a[min_i]) min_i = min_j; - - // finally, the superblock-query: - if (sb_j > sb_i + 1) { - k = log2fast(sb_j - sb_i - 2); - twotothek = 1 << k; - i = Mprime[k][sb_i+1]; j = Mprime[k][sb_j-twotothek]; - min_j = a[i] <= a[j] ? i : j; - // does NOT always return leftmost min!!! - if (a[min_j] < a[min_i]) min_i = min_j; - } - } - // does NOT always return leftmost min!!! - if (a[min_i] < a[min]) min = min_i; - } - } - } - return min; - } - - /** - * Standard Constructor. a is the array to be prepared for RMQ. - * n is the size of the array. - * */ - RMQ_succinct::RMQ_succinct(int* a, unsigned int n) { - this->a = a; - this->n = n; - s = 1 << 3; // microblock-size - sprime = 1 << 4; // block-size - sprimeprime = 1 << 8; // superblock-size - nb = block(n-1)+1; // number of blocks - nsb = superblock(n-1)+1; // number of superblocks - nmb = microblock(n-1)+1; // number of microblocks - - // The following is necessary because we've fixed s, s' and s'' according to the computer's - // word size and NOT according to the input size. This may cause the (super-)block-size - // to be too big, or, in other words, the array too small. If this code is compiled on - // a 32-bit computer, this happens iff n < 113. For such small instances it isn't - // advisable anyway to use this data structure, because simpler methods are faster and - // less space consuming. - if (nb n) end = n;// last block could be smaller than s! - // compute block type as in Fischer/Heun CPM'06: - q = s; // init q - p = s-1; // init p - type[i] = 0; // init type (will be increased!) - rp[1] = a[z]; // init rightmost path - - while (++z < end) { // step through current block: - p--; - while (rp[q-p-1] > a[z]) { - // update type - type[i] += Catalan[p][q]; - q--; - } - rp[q-p] = a[z]; // add last element to rightmost path - } - - // precompute in-block-queries for this microblock (if necessary) - // as in Alstrup et al. SPAA'02: - if (Prec[type[i]][0] == 1) { - Prec[type[i]][0] = 0; - gstacksize = 0; - for (unsigned int j = start; j < end; j++) { - while(gstacksize > 0 && (a[j] < a[gstack[gstacksize-1]])) { - gstacksize--; - } - if(gstacksize > 0) { - g = gstack[gstacksize-1]; - Prec[type[i]][j-start] = Prec[type[i]][g-start] | (1 << (g % s)); - } - else Prec[type[i]][j-start] = 0; - gstack[gstacksize++] = j; - } - } - } - delete[] rp; - delete[] gstack; - - // space for out-of-block- and out-of-superblock-queries: - M_depth = (unsigned int) floor(log2(((double) sprimeprime / (double) sprime))); - M = new DTsucc*[M_depth]; - M[0] = new DTsucc[nb]; - Mprime_depth = (unsigned int) floor(log2(nsb)) + 1; - Mprime = new unsigned int*[Mprime_depth]; - Mprime[0] = new unsigned int[nsb]; - - // fill 0'th rows of M and Mprime: - z = 0; // minimum in current block - q = 0; // pos. of min in current superblock - g = 0; // number of current superblock - // step through blocks - for (unsigned int i = 0; i < nb; i++) { - start = z; // init start - p = start; // init minimum - end = start + sprime;// end of block (not inclusive!) - if (end > n) end = n;// last block could be smaller than sprime! - // update minimum in superblock - if (a[z] < a[q]) q = z; - - while (++z < end) { // step through current block: - // update minimum in block - if (a[z] < a[p]) p = z; - // update minimum in superblock - if (a[z] < a[q]) q = z; - } - M[0][i] = p-start; // store index of block-minimum (offset!) - // reached end of superblock? - if (z % sprimeprime == 0 || z == n) { - // store index of superblock-minimum - Mprime[0][g++] = q; - q = z; - } - } - - // fill M - unsigned int dist = 1; // always 2^(j-1) - for (unsigned int j = 1; j < M_depth; j++) { - M[j] = new DTsucc[nb]; - // be careful: loop may go too far - for (unsigned int i = 0; i < nb - dist; i++) { - M[j][i] = a[m(j-1, i)] <= a[m(j-1,i+dist)] ? - // add 'skipped' elements in a - M[j-1][i] : M[j-1][i+dist] + (dist*sprime); - } - // fill overhang - for (unsigned int i = nb - dist; i < nb; i++) M[j][i] = M[j-1][i]; - dist *= 2; - } - - // fill M': - dist = 1; // always 2^(j-1) - for (unsigned int j = 1; j < Mprime_depth; j++) { - Mprime[j] = new unsigned int[nsb]; - for (unsigned int i = 0; i < nsb - dist; i++) { - Mprime[j][i] = a[Mprime[j-1][i]] <= a[Mprime[j-1][i+dist]] ? - Mprime[j-1][i] : Mprime[j-1][i+dist]; - } - // overhang - for (unsigned int i = nsb - dist; i < nsb; i++) Mprime[j][i] = Mprime[j-1][i]; - dist *= 2; - } - } - - uint RMQ_succinct::getSize() { - uint mem = 0; - mem += sizeof(RMQ_succinct); - mem += sizeof(int)*n; - mem += sizeof(DTsucc2)*nmb; - mem += sizeof(DTsucc)*s; - mem += sizeof(DTsucc)*nb; - mem += sizeof(unsigned int)*nsb; - mem += sizeof(DTsucc)*nb; - mem += sizeof(unsigned int)*nsb; - return mem; - } - - void RMQ_succinct::save(ostream & fp) { - saveValue(fp,n); - saveValue(fp, a, n); - saveValue(fp, type, nmb); - for(uint i=0; i < M_depth; i++) - saveValue(fp, M[i], nb); - for(uint i=0; i < Mprime_depth; i++) - saveValue(fp, Mprime[i], nsb); - for(uint i=0; i < Catalan[s][s]; i++) - saveValue(fp, Prec[i], s); - } - - RMQ_succinct * RMQ_succinct::load(istream & fp) { - RMQ_succinct *rmq = new RMQ_succinct(); - rmq->s = 1<<3; - rmq->sprime = 1<<4; - rmq->sprimeprime = 1<<8; - rmq->n = loadValue(fp); - rmq->nb = rmq->block(rmq->n-1)+1; - rmq->nsb = rmq->superblock(rmq->n-1)+1; - rmq->nmb = rmq->microblock(rmq->n-1)+1; - rmq->M_depth = (uint) floor(log2(((double) rmq->sprimeprime / (double) rmq->sprime))); - rmq->Mprime_depth = (uint) floor(log2(rmq->nsb)) + 1; - rmq->a = loadValue(fp, rmq->n); - rmq->type = loadValue(fp, rmq->nmb); - rmq->M = new DTsucc*[rmq->M_depth]; - for(uint i=0; i < rmq->M_depth; i++) - rmq->M[i] = loadValue(fp, rmq->nb); - rmq->Mprime = new uint*[rmq->Mprime_depth]; - for(uint i=0; i < rmq->Mprime_depth; i++) - rmq->Mprime[i] = loadValue(fp, rmq->nsb); - rmq->Prec = new DTsucc*[Catalan[rmq->s][rmq->s]]; - for(uint i=0; i < Catalan[rmq->s][rmq->s]; i++) - rmq->Prec[i] = loadValue(fp, rmq->s); - return rmq; - } - - /** - * Destructor. Deletes allocated space. - **/ - RMQ_succinct::~RMQ_succinct() { - delete[] type; - for (unsigned int i = 0; i < Catalan[s][s]; i++) - delete[] Prec[i]; - delete[] Prec; - for (unsigned int i = 0; i < M_depth; i++) - delete[] M[i]; - delete[] M; - for (unsigned int i = 0; i < Mprime_depth; i++) - delete[] Mprime[i]; - delete[] Mprime; - delete[] a; - } - -}; diff --git a/libcds/src/static/suffixtree/RMQ_succinct_lcp.cpp b/libcds/src/static/suffixtree/RMQ_succinct_lcp.cpp deleted file mode 100644 index 999a6d40..00000000 --- a/libcds/src/static/suffixtree/RMQ_succinct_lcp.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "RMQ_succinct_lcp.h" - -namespace cds_static -{ - - const uint RMQ_succinct_lcp::Catalan[17][17] = { - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}, - {0,0,2,5,9,14,20,27,35,44,54,65,77,90,104,119,135}, - {0,0,0,5,14,28,48,75,110,154,208,273,350,440,544,663,798}, - {0,0,0,0,14,42,90,165,275,429,637,910,1260,1700,2244,2907,3705}, - {0,0,0,0,0,42,132,297,572,1001,1638,2548,3808,5508,7752,10659,14364}, - {0,0,0,0,0,0,132,429,1001,2002,3640,6188,9996,15504,23256,33915,48279}, - {0,0,0,0,0,0,0,429,1430,3432,7072,13260,23256,38760,62016,95931,144210}, - {0,0,0,0,0,0,0,0,1430,4862,11934,25194,48450,87210,149226,245157,389367}, - {0,0,0,0,0,0,0,0,0,4862,16796,41990,90440,177650,326876,572033,961400}, - {0,0,0,0,0,0,0,0,0,0,16796,58786,149226,326876,653752,1225785,2187185}, - {0,0,0,0,0,0,0,0,0,0,0,58786,208012,534888,1188640,2414425,4601610}, - {0,0,0,0,0,0,0,0,0,0,0,0,208012,742900,1931540,4345965,8947575}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,742900,2674440,7020405,15967980}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,2674440,9694845,25662825}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9694845,35357670}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35357670} - }; - - const int RMQ_succinct_lcp::minus_infinity = INT_MIN; - - const char RMQ_succinct_lcp::LSBTable256[256] = { - 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, - 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - }; - - uint RMQ_succinct_lcp::lsb(DTsucc v) { - return LSBTable256[v]; - } - - const char RMQ_succinct_lcp::LogTable256[256] = { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - - RMQ_succinct_lcp::RMQ_succinct_lcp() { - n = 0; - M = NULL; - M_depth = 0; - Mprime = NULL; - Mprime_depth = 0; - type = NULL; - Prec = NULL; - s = 0; - sprime = 0; - sprimeprime = 0; - nb = 0; - nsb = 0; - nmb = 0; - } - - uint RMQ_succinct_lcp::log2fast(uint v) { - uint c = 0; // c will be lg(v) - uint t, tt; // temporaries - - if ((tt = v >> 16)) - c = (t = v >> 24) ? 24 + LogTable256[t] : 16 + LogTable256[tt & 0xFF]; - else - c = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v]; - return c; - } - - const DTsucc RMQ_succinct_lcp::HighestBitsSet[8] = { - static_cast(~0), static_cast(~1), - static_cast(~3), static_cast(~7), - static_cast(~15), static_cast(~31), - static_cast(~63), static_cast(~127)}; - - DTsucc RMQ_succinct_lcp::clearbits(DTsucc n, uint x) { - return n & HighestBitsSet[x]; - } - - /* - * Standard Constructor. lcp is the array to be prepared for RMQ. - * n is the size of the array. - */ - RMQ_succinct_lcp::RMQ_succinct_lcp(LCP *lcp, TextIndex *csa) { - this->n = csa->index_length(); - s = 1 << 3; // microblock-size - sprime = 1 << 4; // block-size - sprimeprime = 1 << 8; // superblock-size - nb = block(n-1)+1; // number of blocks - nsb = superblock(n-1)+1; // number of superblocks - nmb = microblock(n-1)+1; // number of microblocks - - // The following is necessary because we've fixed s, s' and s'' according to the computer's - // word size and NOT according to the input size. This may cause the (super-)block-size - // to be too big, or, in other words, the array too small. If this code is compiled on - // a 32-bit computer, this happens iff n < 113. For such small instances it isn't - // advisable anyway to use this data structure, because simpler methods are faster and - // less space consuming. - if (nb n) end = n;// last block could be smaller than s! - - // compute block type as in Fischer/Heun CPM'06: - q = s; // init q - p = s-1; // init p - type[i] = 0; // init type (will be increased!) - // init rightmost path - rp[1] = lcp->get_LCP(z, csa); - while (++z < end) { // step through current block: - p--; - while(rp[q-p-1] > (int)lcp->get_LCP(z, csa)) { - // update type - type[i] += Catalan[p][q]; - q--; - } - // add last element to rightmost path - rp[q-p] = lcp->get_LCP(z, csa); - } - // precompute in-block-queries for this microblock (if necessary) - // as in Alstrup et al. SPAA'02: - if (Prec[type[i]][0] == 1) { - Prec[type[i]][0] = 0; - gstacksize = 0; - for (uint j = start; j < end; j++) { - while(gstacksize > 0 && (lcp->get_LCP(j,csa) < lcp->get_LCP(gstack[gstacksize-1], csa))) { - gstacksize--; - } - if(gstacksize > 0) { - g = gstack[gstacksize-1]; - Prec[type[i]][j-start] = Prec[type[i]][g-start] | (1 << (g % s)); - } - else - Prec[type[i]][j-start] = 0; - gstack[gstacksize++] = j; - } //close for j - } - } - delete[] rp; - delete[] gstack; - - // space for out-of-block- and out-of-superblock-queries: - M_depth = (uint) floor(log2(((double) sprimeprime / (double) sprime))); - M = new DTsucc*[M_depth]; - M[0] = new DTsucc[nb]; - Mprime_depth = (uint) floor(log2(nsb)) + 1; - Mprime = new uint*[Mprime_depth]; - Mprime[0] = new uint[nsb]; - - // fill 0'th rows of M and Mprime: - z = 0; // minimum in current block - q = 0; // pos. of min in current superblock - g = 0; // number of current superblock - // step through blocks - for (uint i = 0; i < nb; i++) { - start = z; // init start - p = start; // init minimum - end = start + sprime;// end of block (not inclusive!) - if (end > n) end = n;// last block could be smaller than sprime! - // update minimum in superblock - if (lcp->get_LCP(z,csa) < lcp->get_LCP(q,csa)) q = z; - - while (++z < end) { // step through current block: - // update minimum in block - if (lcp->get_LCP(z,csa) < lcp->get_LCP(p,csa)) p = z; - // update minimum in superblock - if (lcp->get_LCP(z,csa) < lcp->get_LCP(q,csa)) q = z; - } - M[0][i] = p-start; // store index of block-minimum (offset!) - // reached end of superblock? - if (z % sprimeprime == 0 || z == n) { - // store index of superblock-minimum - Mprime[0][g++] = q; - q = z; - } - } - - // fill M: - uint dist = 1; // always 2^(j-1) - for (uint j = 1; j < M_depth; j++) { - M[j] = new DTsucc[nb]; - // be careful: loop may go too far - for (uint i = 0; i < nb - dist; i++) { - M[j][i] = lcp->get_LCP(m(j-1, i),csa) <= lcp->get_LCP(m(j-1,i+dist),csa) ? - // add 'skipped' elements in a - M[j-1][i] : M[j-1][i+dist] + (dist*sprime); - } - // fill overhang - for (uint i = nb - dist; i < nb; i++) M[j][i] = M[j-1][i]; - dist *= 2; - } - - // fill M': - dist = 1; // always 2^(j-1) - for (uint j = 1; j < Mprime_depth; j++) { - Mprime[j] = new uint[nsb]; - for (uint i = 0; i < nsb - dist; i++) { - Mprime[j][i] = lcp->get_LCP(Mprime[j-1][i],csa) <= lcp->get_LCP(Mprime[j-1][i+dist],csa) ? - Mprime[j-1][i] : Mprime[j-1][i+dist]; - } - // overhang - for (uint i = nsb - dist; i < nsb; i++) Mprime[j][i] = Mprime[j-1][i]; - dist *= 2; - } - } - - RMQ_succinct_lcp::~RMQ_succinct_lcp() { - delete[] type; - for (uint i = 0; i < Catalan[s][s]; i++) delete[] Prec[i]; - delete[] Prec; - for (uint i = 0; i < M_depth; i++) delete[] M[i]; - delete[] M; - for (uint i = 0; i < Mprime_depth; i++) delete[] Mprime[i]; - delete[] Mprime; - } - - uint RMQ_succinct_lcp::query(uint i, uint j, TextIndex *csa, LCP *lcp) { - // i's microblock - uint mb_i = microblock(i); - // j's microblock - uint mb_j = microblock(j); - uint min, min_tmp; // min: to be returned - uint s_mi = mb_i * s; // start of i's microblock - uint i_pos = i - s_mi; // pos. of i in its microblock - - if (mb_i == mb_j) { // only one microblock-query - min_tmp = clearbits(Prec[type[mb_i]][j-s_mi], i_pos); - min = min_tmp == 0 ? j : s_mi + lsb(min_tmp); - } - - else { - uint b_i = block(i); // i's block - uint b_j = block(j); // j's block - uint s_mj = mb_j * s;// start of j's microblock - // position of j in its microblock - uint j_pos = j - s_mj; - min_tmp = clearbits(Prec[type[mb_i]][s-1], i_pos); - // left in-microblock-query - min = min_tmp == 0 ? s_mi + s - 1 : s_mi + lsb(min_tmp); - - // otherwise we're done! - if (mb_j > mb_i + 1) { - // start of block i - uint s_bi = b_i * sprime; - // start of block j - uint s_bj = b_j * sprime; - // do another microblock-query! - if (s_bi+s > i) { - mb_i++; // go one microblock to the right - min_tmp = Prec[type[mb_i]][s-1] == 0 ? - // right in-block-query - s_bi + sprime - 1 : s_mi + s + lsb(Prec[type[mb_i]][s-1]); - if (lcp->get_LCP(min_tmp, csa) < lcp->get_LCP(min, csa)) min = min_tmp; - } - - // otherwise no out-of-block-queries - if (b_j > b_i + 1) { - uint k, t, b;// temporary variables - b_i++; // block where out-of-block-query starts - // just one out-of-block-query - if (s_bj - s_bi - sprime <= sprimeprime) { - k = log2fast(b_j - b_i - 1); - // 2^k - t = 1 << k; - // i can be overwritten! - i = m(k, b_i); b = m(k, b_j-t); - min_tmp = lcp->get_LCP(i,csa) <= lcp->get_LCP(b,csa) ? i : b; - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - } - else { // here we have two out-of-block-queries: - // i's superblock - uint sb_i = superblock(i); - // j's superblock - uint sb_j = superblock(j); - // end of left out-of-block-query - b = block((sb_i+1)*sprimeprime); - k = log2fast(b - b_i); - // 2^k - t = 1 << k; - // i & i_pos can be overwritten! - i = m(k, b_i); i_pos = m(k, b+1-t); - min_tmp = lcp->get_LCP(i,csa) <= lcp->get_LCP(i_pos,csa) ? i : i_pos; - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - // the superblock-query - if (sb_j > sb_i + 1) { - k = log2fast(sb_j - sb_i - 2); - t = 1 << k; - i = Mprime[k][sb_i+1]; i_pos = Mprime[k][sb_j-t]; - min_tmp = lcp->get_LCP(i,csa) <= lcp->get_LCP(i_pos,csa) ? i : i_pos; - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - } - // start of right out-of-block-query - b = block(sb_j*sprimeprime); - k = log2fast(b_j - b); - // 2^k - t = 1 << k; - b--; // going one block to the left doesn't harm and saves some tests - i = m(k, b); i_pos = m(k, b_j-t); - min_tmp = lcp->get_LCP(i,csa) <= lcp->get_LCP(i_pos,csa) ? i : i_pos; - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - } - } - // another microblock-query to compensate for missing block-layer - if (j >= s_bj+s) { - min_tmp = Prec[type[mb_j-1]][s-1] == 0 ? - s_mj - 1 : s_bj + lsb(Prec[type[mb_j-1]][s-1]); - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - } - } - min_tmp = Prec[type[mb_j]][j_pos] == 0 ? - // right in-microblock-query - j : s_mj + lsb(Prec[type[mb_j]][j_pos]); - if (lcp->get_LCP(min_tmp,csa) < lcp->get_LCP(min,csa)) min = min_tmp; - } - return min; - } - - uint RMQ_succinct_lcp::getSize() { - unsigned long mem = sizeof(DTsucc2)*nmb; - mem += sizeof(DTsucc)*s; - mem += sizeof(DTsucc)*nb; - mem += sizeof(uint)*nsb; - mem += sizeof(DTsucc)*nb; - mem += sizeof(uint)*nsb; - return (uint)mem; - } - - void RMQ_succinct_lcp::save(ostream & fp) { - saveValue(fp,n); - saveValue(fp, type, nmb); - for(uint i=0; i < M_depth; i++) - saveValue(fp, M[i], nb); - for(uint i=0; i < Mprime_depth; i++) - saveValue(fp, Mprime[i], nsb); - for(uint i=0; i < Catalan[s][s]; i++) - saveValue(fp, Prec[i], s); - } - - RMQ_succinct_lcp * RMQ_succinct_lcp::load(istream & fp) { - RMQ_succinct_lcp *rmq = new RMQ_succinct_lcp(); - rmq->s = 1<<3; - rmq->sprime = 1<<4; - rmq->sprimeprime = 1<<8; - rmq->n = loadValue(fp); - rmq->nb = rmq->block(rmq->n-1)+1; - rmq->nsb = rmq->superblock(rmq->n-1)+1; - rmq->nmb = rmq->microblock(rmq->n-1)+1; - rmq->M_depth = (uint) floor(log2(((double) rmq->sprimeprime / (double) rmq->sprime))); - rmq->Mprime_depth = (uint) floor(log2(rmq->nsb)) + 1; - rmq->type = loadValue(fp, rmq->nmb); - rmq->M = new DTsucc*[rmq->M_depth]; - for(uint i=0; i < rmq->M_depth; i++) - rmq->M[i] = loadValue(fp, rmq->nb); - rmq->Mprime = new uint*[rmq->Mprime_depth]; - for(uint i=0; i < rmq->Mprime_depth; i++) - rmq->Mprime[i] = loadValue(fp, rmq->nsb); - rmq->Prec = new DTsucc*[Catalan[rmq->s][rmq->s]]; - for(uint i=0; i < Catalan[rmq->s][rmq->s]; i++) - rmq->Prec[i] = loadValue(fp, rmq->s); - return rmq; - } - -}; diff --git a/libcds/src/static/suffixtree/SuffixTree.cpp b/libcds/src/static/suffixtree/SuffixTree.cpp deleted file mode 100644 index 9461225a..00000000 --- a/libcds/src/static/suffixtree/SuffixTree.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - SuffixTree * SuffixTree::load(istream & fp) { - size_t r = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(size_t)); - cout << "Loading "<< r << endl; - switch(r) { - case CSTY: return SuffixTreeY::load(fp); - } - return NULL; - } - -}; diff --git a/libcds/src/static/suffixtree/SuffixTreeY.cpp b/libcds/src/static/suffixtree/SuffixTreeY.cpp deleted file mode 100644 index bbd41d78..00000000 --- a/libcds/src/static/suffixtree/SuffixTreeY.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include - -namespace cds_static -{ - - SuffixTreeY::SuffixTreeY() { - length = 0; - csa = NULL; - lcp = NULL; - npr = NULL; - } - - SuffixTreeY::SuffixTreeY(char *text, size_t n, size_t lcp_type, size_t npr_type, size_t b) { - length = n; - cout << "Text length: " << n << endl; - /*create the index*/ - csa = new TextIndexCSA((uchar *)text, (ulong)length, NULL); - cout << "TextIndex bits/c: " << csa->getSize()*8.0/length << endl; - switch(lcp_type) { - case NAIVE: lcp = new LCP_naive(csa, text, length); break; - case SAD_GON_OS: lcp = new LCP_Sad(csa, text, length); break; - case FMN_RRR_OS: lcp = new LCP_FMN(csa, text, length); break; - case PT: lcp = new LCP_PT(csa, text, length); break; - case PHI: lcp = new LCP_PhiSpare(csa,text,length); break; - case DAC: lcp = new LCP_DAC(csa, text, length); break; - case DAC_VAR: lcp = new LCP_DAC_VAR(csa, text,length); break; - default: exit(0); - } - cout << "LCP bits/c: " << lcp->getSize()*8.0/length << endl; - switch(npr_type) { - case FMN_NPR: npr = new NPR_FMN(lcp, b, csa); break; - case CN_NPR: npr = new NPR_CN(lcp, b, csa); break; - default: exit(0); - } - cout << "NPR bits/c: " << npr->getSize()*8.0/length << endl; - /*here you can free the text*/ - } - - SuffixTreeY::SuffixTreeY(LCP *_lcp, NPR *_npr, TextIndex *_csa) { - csa = _csa; - cout << "TextIndex bits/c: " << csa->getSize()*8.0/length << endl; - lcp = _lcp; - cout << "LCP bits/c: " << lcp->getSize()*8.0/length << endl; - npr = _npr; - cout << "NPR bits/c: " << npr->getSize()*8.0/length << endl; - } - - bool SuffixTreeY::isRoot(size_t vl,size_t vr) const - { - if(vl==0 && vr==length-1) - return true; - return false; - } - - void SuffixTreeY::Root(size_t *vl, size_t *vr) const - { - *vl = 0; - *vr = length-1; - } - - size_t SuffixTreeY::Count(size_t vl, size_t vr) const - { - return vr - vl+1; - } - - bool SuffixTreeY::Ancestor(size_t wl, size_t wr, size_t vl, size_t vr) const - { - if((wl<=vl) && (wr >= vr)) - return true; - return false; - } - - size_t SuffixTreeY::SDepth(size_t vl, size_t vr) const - { - size_t h,k, val; - if(vl!=vr) { - k = npr->find_RMQ(vl+1, vr, csa, lcp); - h = lcp->get_LCP(k, csa); - } - else { /*for leaf (->v.left==v.right)*/ - val = csa->getSA(vl); - h = length - val +1; - } - return h; - } - - size_t SuffixTreeY::Locate(size_t vl, size_t vr) const - { - if(vl==vr) { - return csa->getSA(vl); - } - return (size_t)-1; - } - - void SuffixTreeY::Parent(size_t vl, size_t vr, size_t *parent_l, size_t *parent_r) const - { - if(isRoot(vl, vr)) { - *parent_l = (size_t)-1; - *parent_r = (size_t)-1; - return; - } - size_t k; - if(vr == length-1) - k = vl; - else { - if(lcp->get_LCP(vl, csa) > lcp->get_LCP(vr+1,csa)) - k = vl; - else - k = vr+1; - } - size_t p_l = npr->find_PSV(k,csa,lcp); - if(p_l > 0) - p_l--; - size_t p_r = npr->find_NSV(k,csa,lcp)-1; - *parent_l = p_l; - *parent_r = p_r; - } - - void SuffixTreeY::FChild(size_t vl, size_t vr, size_t *fchild_l, size_t *fchild_r) const - { - if(vl==vr) { - *fchild_l = (size_t)-1; - *fchild_r = (size_t)-1; - return; - } - *fchild_l = vl; - *fchild_r = npr->find_RMQ(vl+1,vr,csa,lcp)-1; - } - - void SuffixTreeY::NSibling(size_t vl, size_t vr, size_t *nsibling_l, size_t *nsibling_r) const - { - size_t wl, wr; - Parent(vl, vr, &wl, &wr); - if(wl==(size_t)-1) { /*v is the root*/ - *nsibling_l = (size_t)-1; - *nsibling_r = (size_t)-1; - return; - } - if(wr == vr) { /*v does not have a next sibling*/ - *nsibling_l = (size_t)-1; - *nsibling_r = (size_t)-1; - return; - } - if(vr+1 == wr) { /*v's next sibling is a leaf*/ - *nsibling_l = wr; - *nsibling_r = wr; - return; - } - else { - size_t left = vr+1; - size_t lcp_rm = lcp->get_LCP(vr+1, csa); - size_t rm = npr->fwd_NSV(vr+1, csa, lcp, lcp_rm+1); - *nsibling_l = left; - *nsibling_r = rm-1; - return; - } - } - - void SuffixTreeY::SLink(size_t vl, size_t vr, size_t *slink_l, size_t *slink_r) const - { - size_t x,y,k; - /*v is the root*/ - if(vl==0 && vr == length-1) { - *slink_l = (size_t)-1; - *slink_r = (size_t)-1; - return; - } - x = csa->getPsi(vl); - y = csa->getPsi(vr); - k = npr->find_RMQ(x+1, y, csa, lcp); - size_t p_l = npr->find_PSV(k, csa, lcp); - if(p_l > 0) - p_l--; - size_t p_r = npr->find_NSV(k,csa,lcp)-1; - *slink_l = p_l; - *slink_r = p_r; - } - - void SuffixTreeY::SLink_i(size_t vl, size_t vr, size_t i, size_t *slinki_l, size_t *slinki_r) const - { - size_t x,y,k; - size_t seq = 1; /*set seq = 0 if you dont want to do it sequentialy*/ - /*v is the root*/ - if(vl==0 && vr == length-1) { - *slinki_l = (size_t)-1; - *slinki_r = (size_t)-1; - return; - } - - if(seq) { - while(!isRoot(vl,vr) && i>0) { - SLink(vl, vr, &vl, &vr); - i--; - } - if(i==0) { - *slinki_l = vl; - *slinki_r = vr; - } - else { - *slinki_l = (uint)-1; - *slinki_r = (uint)-1; - } - } - else { - /*psi_i(v->left)*/ - x = csa->getSA(vl); - if(x+i >=length) { //then return the root - Root(slinki_l, slinki_r); - return; - } - x = csa->getISA(x); - /*psi_i(v->right)*/ - y = csa->getSA(vr); - if(y+i >=length) { //then return the root - Root(slinki_l, slinki_r); - return; - } - y = csa->getISA(y); - /*first letter of x and y are diff*/ - if(csa->getT(x)!= csa->getT(y)) { - Root(slinki_l, slinki_r); - return; - } - k = npr->find_RMQ(x+1, y, csa, lcp); - size_t p_l = npr->find_PSV(k, csa, lcp); - if(p_l > 0) - p_l--; - size_t p_r = npr->find_NSV(k,csa,lcp)-1; - *slinki_l = p_l; - *slinki_r = p_r; - } - } - - void SuffixTreeY::LCA(size_t vl, size_t vr, size_t wl, size_t wr, size_t *lca_l, size_t *lca_r) const - { - size_t k; - if(Ancestor(vl, vr, wl, wr)) { - *lca_l = vl; - *lca_r = vr; - return; - } - if(Ancestor(wl, wr, vl, vr)) { - *lca_l = wl; - *lca_r = wr; - return; - } - if(vr < wl) - k = npr->find_RMQ(vr+1, wl, csa, lcp); - else //wr < vl - k = npr->find_RMQ(wr+1, vl, csa, lcp); - /*there are no more possible case for calculate k*/ - uint p_l = npr->find_PSV(k, csa, lcp); - if(p_l > 0) - p_l--; - size_t p_r = npr->find_NSV(k,csa,lcp)-1; - *lca_l = p_l; - *lca_r = p_r; - } - - void SuffixTreeY::Child(size_t vl, size_t vr, uchar a, size_t *child_l, size_t *child_r) const - { - int x,y,m, pos_letter; - uchar first_letter; - size_t aux_l, aux_r; - size_t res_l = (size_t)-1; - size_t res_r = (size_t)-1; - vector children_l; - vector children_r; - if(vl==vr) { //is a leaf - *child_l = (size_t)-1; - *child_r = (size_t)-1; - return; - } - /*calculate the position where the letter must be*/ - pos_letter = SDepth(vl, vr)+1; - /*get all the childs of v*/ - FChild(vl, vr, &aux_l, &aux_r); - children_l.push_back(aux_l); - children_r.push_back(aux_r); - NSibling(aux_l, aux_r, &aux_l, &aux_r); - while(aux_l != (size_t)-1) { - children_l.push_back(aux_l); - children_r.push_back(aux_r); - NSibling(aux_l, aux_r, &aux_l, &aux_r); - } - x=0; - y=children_l.size()-1; - /*Binary search over children*/ - while(x<=y) { - m = (x+y)/2; - aux_l = children_l[m]; - aux_r = children_r[m]; - /*get letter*/ - first_letter = Letter(aux_l, aux_r, pos_letter); - if(first_letter == a) { - res_l = aux_l; - res_r = aux_r; - break; - } - else { - if (first_letter < a) - x=m+1; - else - y=m-1; - } - } - /*free the space used*/ - children_l.clear(); - children_r.clear(); - *child_l = res_l; - *child_r = res_r; - } - - uchar SuffixTreeY::Letter(size_t vl, size_t vr, int i) const - { - uchar l; - if(i==1) { - l = (uchar)csa->getT(vl); - return l; - } - /*else return Letter(psi_{i-1}(vl),1)*/ - size_t p1 = vl; - for(size_t j=0; j<(size_t)(i-1); j++) - p1 = csa->getPsi(p1); - /* - uint v_sa, v_i; - v_sa = csa_lookup(csa, v->left+1)-1; //SA[v->left] - v_i = csa_inverse(csa, v_sa + i)-1; // psi_{i-1} (v_sa); - */ - return Letter(p1, p1,1); //Letter(v_i,v_i, 1); - } - - size_t SuffixTreeY::TDepth(size_t vl, size_t vr) const - { - size_t depth = 0; - size_t aux_l = vl; - size_t aux_r = vr; - while(aux_l !=0 || aux_r != length-1) { - Parent(aux_l, aux_r, &aux_l, &aux_r); - depth++; - } - return depth; - } - - void SuffixTreeY::LAQs(size_t vl, size_t vr, size_t d, size_t *laq_s_l, size_t *laq_s_r) const - { - size_t u_l, u_r=0; - if(d==0) { - *laq_s_l = 0; - *laq_s_r = length-1; - return; - } - u_l = npr->bwd_PSV(vl+1, csa, lcp, d); - if(u_l>0) - u_l--; - if(vr==0) - u_r=0; - else { - u_r = npr->fwd_NSV(vr-1, csa, lcp, d); - if(u_r!=vr) - u_r--; - } - *laq_s_l = u_l; - *laq_s_r = u_r; - } - - void SuffixTreeY::LAQt(size_t vl, size_t vr, size_t d, size_t *laq_t_l, size_t *laq_t_r) const - { - size_t depth = 0; - size_t x; - size_t string_depth = d; - size_t res_l, res_r; - size_t next_l, next_r; - size_t aux_l, aux_r; - size_t acum =1; - if(d==0 || (vl==0 && vr==length-1)) { - *laq_t_l = 0; - *laq_t_r = length-1; - return; - } - LAQs(vl, vr, d, &res_l, &res_r); - depth = TDepth(res_l, res_r); - x = d-depth; - while(x!=0 && !(res_l==vl && res_r==vr) ) { - if(acum==1) - //this can be improve - string_depth = SDepth(res_l,res_r); - LAQs(vl, vr, string_depth+x, &next_l, &next_r); - aux_l = next_l; - aux_r = next_r; - - while(aux_l != res_l || aux_r != res_r) { - Parent(aux_l, aux_r, &aux_l, &aux_r); - depth++; - } - - if(res_l==next_l && res_r==next_r) { - string_depth++; - acum++; - } - else { - acum = 1; - res_l = next_l; - res_r = next_r; - x = d - depth; - } - } - *laq_t_l = res_l; - *laq_t_r = res_r; - } - - size_t SuffixTreeY::getSize() const - { - size_t mem = sizeof(SuffixTreeY); - mem += lcp->getSize(); - mem += npr->getSize(); - mem += csa->getSize(); - return mem; - } - - void SuffixTreeY::save(ostream & fp) const - { - size_t wr = CSTY; - saveValue(fp,wr); - saveValue(fp, length); - lcp->save(fp); - npr->save(fp); - csa->save(fp); - } - - SuffixTreeY * SuffixTreeY::load(istream & fp) { - SuffixTreeY *cst = new SuffixTreeY(); - size_t type = loadValue(fp); - if(type!=CSTY) { - abort(); - } - cst->length = loadValue(fp); - cst->lcp = LCP::load(fp); - cst->npr = NPR::load(fp); - cst->csa = TextIndex::load(fp); - return cst; - } - - SuffixTreeY::~SuffixTreeY() { - delete (TextIndexCSA *)csa; - size_t lcp_type = lcp->lcp_type; - switch(lcp_type) { - case NAIVE: delete (LCP_naive *)lcp; break; - case SAD_GON_OS: delete (LCP_Sad *)lcp; break; - case FMN_RRR_OS: delete (LCP_FMN *)lcp; break; - case PT: delete (LCP_PT *)lcp; break; - case PHI: delete (LCP_PhiSpare *)lcp; break; - case DAC: delete (LCP_DAC *)lcp; break; - case DAC_VAR: delete (LCP_DAC_VAR *)lcp; break; - default: break; - } - size_t npr_type = npr->npr_type; - switch(npr_type) { - case FMN_NPR: delete (NPR_FMN *)npr; break; - case CN_NPR: delete (NPR_CN *)npr; break; - default: break; - } - } - -}; diff --git a/libcds/src/static/suffixtree/factorization.cpp b/libcds/src/static/suffixtree/factorization.cpp deleted file mode 100644 index 37637b8c..00000000 --- a/libcds/src/static/suffixtree/factorization.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -#define BASE 16 -#define BASE_BITS 4 - -const unsigned int TABLEBASE[7] = {0,16,272,4368,69904,1118480,17895696}; - -namespace cds_static -{ - - factorization::factorization() { - listLength =0; - nLevels =0; - levelsIndex = NULL; - levels = NULL; - bS = NULL; - rankLevels = NULL; - } - - factorization::factorization(uint *list,uint l_Length) { - uint levelSizeAux[7]={0,0,0,0,0,0,0}; - uint cont[7]={0,0,0,0,0,0,0}; - listLength = l_Length; - uint i; - int j, k; - uint value, newvalue; - uint bits_BS_len = 0; - - //space needed for all the levels - for (i=0; i=TABLEBASE[j]) - levelSizeAux[j]++; - } - - j=0; - while((j<7)&&(levelSizeAux[j]!=0)) { - //fprintf(stderr,"levelSize[%d]=%d\n",j,levelSizeAux[j]); - if(levelSizeAux[j]%2) - levelSizeAux[j]++; - j++; - } - nLevels = j; - levelsIndex = new uint[nLevels+1]; - for(j=0; j<= nLevels; j++) - levelsIndex[j] = 0; - levelsIndex[0]=0; - for(j=0; j=0) { - if(value >= TABLEBASE[j]) { - newvalue = value - TABLEBASE[j]; - for(k=0; k overhead 50% - // factor=3 => overhead 33% - // factor=4 => overhead 25% - // factor=20=> overhead 5% - delete [] bits_BS; - //Contadores - rankLevels = new uint[nLevels]; - for(j=0; jrank1(levelsIndex[j]-1); - } - - uint factorization::access(uint param) { - uint mult=0; - uint j; - uint partialSum=0; - uint ini=param-1; - uint * bsData = ((BitSequenceRG *)bS)->data; - unsigned char * level; - unsigned char readByte; - uint pos, rankini, cont; - - j=0; - level= levels + (levelsIndex[j]>>1); - cont = ini + (levelsIndex[j]&0x1); - pos= levelsIndex[j]+ini; - mult=0; - readByte = ((*(level+(cont>>1)))>>(BASE_BITS*(cont&0x1)))&0xF; - while((!bitget(bsData,pos))) { - rankini = bS->rank1(levelsIndex[j]+ini-1) - rankLevels[j]; - ini = ini-rankini; - partialSum = partialSum + (readByte<>1); - cont=ini+(levelsIndex[j]&0x1); - pos= levelsIndex[j]+ini; - readByte = ((*(level+(cont>>1)))>>(BASE_BITS*(cont&0x1)))&0xF; - if( (int)j >= nLevels-1) { - break; - } - } - partialSum = partialSum + (readByte<data; - unsigned char * level; - unsigned char readByte; - uint pos, rankini, cont; - - j=0; - level= levels + (levelsIndex[j]>>1); - cont = ini + (levelsIndex[j]&0x1); - pos= levelsIndex[j]+ini; - mult=0; - readByte = ((*(level+(cont>>1)))>>(BASE_BITS*(cont&0x1)))&0xF; - while((!bitget(bsData,pos))) { - partialSum = partialSum + (readByte<rank1(levelsIndex[j]+ini-1) - rankLevels[j]; - ini = ini-rankini; - if(dir) - next_pos[j] = ini+1; - else - next_pos[j] = ini-1; - } - else { - ini = next_pos[j]; - if(dir) - next_pos[j] = next_pos[j]+1; - else - next_pos[j] = next_pos[j]-1; - } - - j++; - mult+=BASE_BITS; - level =levels + (levelsIndex[j]>>1); - cont=ini+(levelsIndex[j]&0x1); - pos= levelsIndex[j]+ini; - readByte = ((*(level+(cont>>1)))>>(BASE_BITS*(cont&0x1)))&0xF; - if( (int)j >= nLevels-1) { - break; - } - } - partialSum = partialSum + (readByte<save(fp); - } - - factorization* factorization::load(istream & fp) { - factorization *rep = new factorization(); - rep->listLength = loadValue(fp); - rep->nLevels = loadValue(fp); - rep->levelsIndex = loadValue(fp, rep->nLevels+1); - rep->rankLevels = loadValue(fp, rep->nLevels); - rep->levels = loadValue(fp, (rep->levelsIndex[rep->nLevels]/2)); - rep->bS = BitSequence::load(fp); - return rep; - } - - uint factorization::getSize() { - uint mem=0; - mem += sizeof(factorization); - mem += (nLevels+1)*sizeof(uint); - mem += sizeof(uint)*nLevels; - mem += sizeof(unsigned char)*(levelsIndex[nLevels]/2); - mem += bS->getSize(); - return mem; - } - - factorization:: ~factorization() { - delete[] levelsIndex; - delete[] levels; - delete[] rankLevels; - delete (BitSequenceRG *)bS; - } - -}; diff --git a/libcds/src/static/suffixtree/factorization_var.cpp b/libcds/src/static/suffixtree/factorization_var.cpp deleted file mode 100644 index 4dc3c0c7..00000000 --- a/libcds/src/static/suffixtree/factorization_var.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - factorization_var::factorization_var() { - tamCode = 0; - iniLevel = NULL; - base = NULL; - base_bits = NULL; - tablebase = NULL; - tamtablebase = 0; - listLength = 0; - nLevels = 0; - levelsIndex = NULL; - levels = NULL; - bS = NULL; - rankLevels = NULL; - } - - factorization_var::factorization_var(uint *list, uint l_Length, ushort* kvalues, uint nkvalues) { - uint *levelSizeAux; - uint *cont; - uint *contB; - listLength = l_Length; - uint i; - int j, k; - uint value, newvalue; - uint bits_BS_len = 0; - ushort kval; - uint oldval =0; - uint newval =0; - i=0; - uint multval=1; - do { - oldval=newval; - if(i>=nkvalues) - kval = 1<<(kvalues[nkvalues-1]); - else - kval=1<<(kvalues[i]); - multval*=kval; - newval = oldval+multval; - i++; - }while(oldval=nkvalues) - kval = 1<<(kvalues[nkvalues-1]); - else - kval=1<<(kvalues[i]); - multval*=kval; - newval = oldval+multval; - tablebase[i]=oldval; - } - for(i=0;i=tablebase[j]) - levelSizeAux[j]++; - } - j=0; - //Contadores - while((j<(int)tamtablebase)&&(levelSizeAux[j]!=0)) { - j++; - } - nLevels = j; - levelsIndex = new uint[nLevels+1]; - bits_BS_len =0; - base = new ushort[nLevels]; - base_bits = new ushort[nLevels]; - for(i=0;i=nkvalues) { - base[i]=1<<(kvalues[nkvalues-1]); - base_bits[i]=kvalues[nkvalues-1]; - } - else { - base[i]=1<<(kvalues[i]); - base_bits[i]=kvalues[i]; - } - } - uint tamLevels =0; - for(i=0;i=0) { - if(value >= tablebase[j]) { - newvalue = value- tablebase[j]; - for(k=0;krank1(levelsIndex[j]-1); - // for(i=0;idata,pos))) { - rankini = bS->rank1(levelsIndex[j]+ini-1) - rankLevels[j]; - ini = ini-rankini; - partialSum = partialSum+ (readByte<data,pos))) { - partialSum = partialSum+ (readByte<rank1(levelsIndex[j]+ini-1) - rankLevels[j]; - ini = ini-rankini; - if(dir) - next_pos[j] = ini+1; - else - next_pos[j] = ini-1; - } - else { - ini = next_pos[j]; - if(dir) - next_pos[j] = next_pos[j]+1; - else - next_pos[j] = next_pos[j]-1; - } - - mult+=base_bits[j]; - j++; - cont = iniLevel[j]+ini*base_bits[j]; - pos=levelsIndex[j]+ini; - readByte = bitread(levels,cont,base_bits[j]); - if(j==(uint)nLevels-1) - break; - } - partialSum = partialSum + (readByte<getSize(); - // rankLevels - mem += sizeof(uint)*nLevels; - return mem; - } - - void factorization_var::save(ostream & fp) { - saveValue(fp, tamCode); - saveValue(fp, tamtablebase); - saveValue(fp, listLength); - saveValue(fp, nLevels); - saveValue(fp, iniLevel, nLevels); - saveValue(fp, base, nLevels); - saveValue(fp, base_bits, nLevels); - saveValue(fp, tablebase, tamtablebase); - saveValue(fp, levelsIndex, nLevels+1); - saveValue(fp, levels, tamCode/W+1); - saveValue(fp, rankLevels, nLevels); - bS->save(fp); - } - - factorization_var* factorization_var::load(istream & fp) { - factorization_var *rep = new factorization_var(); - rep->tamCode = loadValue(fp); - rep->tamtablebase = loadValue(fp); - rep->listLength = loadValue(fp); - rep->nLevels = loadValue(fp); - rep->iniLevel = loadValue(fp, rep->nLevels); - rep->base = loadValue(fp,rep->nLevels); - rep->base_bits = loadValue(fp, rep->nLevels); - rep->tablebase = loadValue(fp, rep->tamtablebase); - rep->levelsIndex = loadValue(fp, rep->nLevels+1); - rep->levels = loadValue(fp, rep->tamCode/W+1); - rep->rankLevels = loadValue(fp, rep->nLevels); - rep->bS = BitSequence::load(fp); - return rep; - } - - factorization_var::~factorization_var() { - delete [] iniLevel; - delete [] base; - delete [] base_bits; - delete [] tablebase; - delete [] levelsIndex; - delete [] levels; - delete [] rankLevels; - delete (BitSequenceRG *)bS; - } - -}; diff --git a/libcds/src/static/textindex/TextIndex.cpp b/libcds/src/static/textindex/TextIndex.cpp deleted file mode 100644 index cf72c8e9..00000000 --- a/libcds/src/static/textindex/TextIndex.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/* General interface for using the compressed index libraries */ - -#include - -namespace cds_static -{ - - /** Reads a text index determining the type */ - TextIndex * TextIndex::load(istream & fp) { - uint r = loadValue(fp); - size_t pos = fp.tellg(); - fp.seekg(pos-sizeof(uint)); - switch(r) { - case CSA_HDR: return TextIndexCSA::load(fp); - } - return NULL; - } -}; diff --git a/libcds/src/static/textindex/TextIndexCSA.cpp b/libcds/src/static/textindex/TextIndexCSA.cpp deleted file mode 100644 index 40088aed..00000000 --- a/libcds/src/static/textindex/TextIndexCSA.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2010, Rodrigo Cnovas, all rights reserved. - * - *This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_static -{ - - TextIndexCSA::TextIndexCSA() { - csa = NULL; - } - - TextIndexCSA::TextIndexCSA(uchar *text, ulong length, char *build_options) { - void *index; - build_index(text, length, build_options, &index); - csa = (CSA *) index; - } - - TextIndexCSA::~TextIndexCSA() { - csa_free(csa); - /*remove files *.idx and *.psi*/ - /*system("rm -rf *.psi"); - * system("rm .rf *.idx");*/ - } - - size_t TextIndexCSA::count(uchar *pattern, ulong length, ulong *numocc) const - { - return (size_t)cds_static::count(csa, pattern, length, numocc); - } - - size_t TextIndexCSA::locate (uchar *pattern, ulong length, ulong **occ, ulong *numocc) const - { - return (size_t)cds_static::locate (csa, pattern, length, occ, numocc); - } - - size_t TextIndexCSA::extract (ulong from, ulong to, uchar **snippet, ulong *snippet_length) const - { - return (size_t)cds_static::extract (csa, from, to, snippet, snippet_length); - } - - size_t TextIndexCSA::display (uchar *pattern, ulong length, ulong numc, ulong *numocc, uchar **snippet_text, ulong **snippet_lengths) const - { - return (size_t)cds_static::display(csa, pattern, length, numc, numocc, snippet_text, snippet_lengths); - } - - size_t TextIndexCSA::index_length() const - { - return (size_t)(csa->n); - } - - size_t TextIndexCSA::getSA(size_t i) const - { - return csa_lookup(csa,i+1)-1; - } - - size_t TextIndexCSA::getISA(size_t i) const - { - return csa_inverse(csa,i+1)-1; - } - - size_t TextIndexCSA::getPsi(size_t i) const - { - return csa_psi(csa,i+1)-1; - } - - size_t TextIndexCSA::getT(size_t i) const - { - return csa_T(csa,i+1); - } - - size_t TextIndexCSA::getSize() const - { - ulong size; - index_size(csa, &size); - return (size_t)size; - } - - void TextIndexCSA::save(ostream & fp) const - { - uint wr = CSA_HDR; - saveValue(fp,wr); - if(csa!=NULL) - csa_save(csa,fp); - } - - TextIndexCSA * TextIndexCSA::load(istream & fp) { - uint type = loadValue(fp); - if(type!=CSA_HDR) { - abort(); - } - TextIndexCSA *ticsa= new TextIndexCSA(); - ticsa->csa = csa_load(fp); - return ticsa; - } - -}; diff --git a/libcds/src/static/textindex/comparray4.cpp b/libcds/src/static/textindex/comparray4.cpp deleted file mode 100644 index 466c6acd..00000000 --- a/libcds/src/static/textindex/comparray4.cpp +++ /dev/null @@ -1,1106 +0,0 @@ -/* comparray4.c - Copyright (C) 2005, K. Sadakane, all rights reserved. - - This file contains an implementation of CSA. - For more information, see - - K. Sadakane. Compressed text databases with efficient query - algorithms based on the compressed suffix array. - In Proceedings 11th Annual International Symposium on Algorithms - and Computation (ISAAC)}, LNCS v. 1969, pages 410--421, 2000. - - K. Sadakane. Succinct representations of lcp information and - improvements in the compressed suffix arrays. - In Proceedings 13th Annual ACM-SIAM Symposium on Discrete - Algorithms (SODA), 2002. - - K. Sadakane. New text indexing functionalities of the compressed - suffix arrays. Journal of Algorithms, 48(2):294--313, 2003. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#define USE_MMAP - -#include -#include -#include -#include -#include - -#define inline -#define ENCODENUM encodegamma -#define DECODENUM decodegamma - -#define DD 16 -#define TBLSIZE (1<> 4; - l = i & (DD-1); - x = (B[j]<> (DD-l)) & 0xffff; - } - - int getbit(unsigned short *B, int i) { - int j,l; - i--; - j = i >> 4; - l = i & (DD-1); - return (B[j] >> (DD-1-l)) & 1; - } - - int setbit(unsigned short *B, int i,int x) { - int j,l; - i--; - j = i / DD; - l = i % DD; - if (x==0) B[j] &= (~(1<<(DD-1-l))); - else if (x==1) B[j] |= (1<<(DD-1-l)); - else { - printf("error setbit x=%d\n",x); - exit(1); - } - return x; - } - - int initranktables(void) { - unsigned short B; - int i,j,m,r; - int b; - #if DD!=16 - error - #endif - /* DD==16 O */ - for (i = 0; i < TBLSIZE; i++) { - B = i; - r = 0; - for (m = 0; m < DD; m++) { - b = getbit(&B, m+1); - r += b; - R3[m][i] = r; - } - for (m = 1; m <= DD; m++) { - r = 0; - for (j = 1; j <= DD; j++) { - b = getbit(&B, j); - if (b == 1) { - r += b; - if (r == m) R5[m-1][i] = j-1; - } - } - } - } - for (i = 0; i < DD; i++) { - for (j = (1<0) { - x>>=1; - l++; - } - return l; - } - - /* x 1 */ - int encodegamma(unsigned short *B,int p,int x) { - int j,w; - if (x<=0) { - fprintf(stderr,"encodegamma %d\n",x); exit(1); - } - w = blog(x); - for (j=0;j=0;j--) setbit(B,1+p+(w-1)+(w-1)-j,(x >> j)&1); - return 2*w-1; - } - - #ifndef DEBUG - inline - #endif - int getzerorun(unsigned short *B,int p) { - int w,w2; - #if 0 - w = 0; - while (getbit(B,1+p+w)==0) w++; - #else - w = 0; - while (1) { - w2 = R4[getbitD(B,1+p)]; - w += w2; - if (w2 < DD) break; - p += DD; - } - #endif - return w; - } - - int decodegamma(unsigned short *B,int p,int *ans) { - int w,x; - int w2; - #if 0 - x = getbitD(B,1+p); - b = R6b[x]; - if (b>0) { - *ans = R6x[x]; - return b; - } - #endif - w = getzerorun(B,p); - #if 0 - x = 1; - for (i=0;i DD) { - x <<= DD; - x += getbitD(B,1+p); - p += DD; - w2 -= DD; /* w return value */ - } - x <<= w2; - x += (getbitD(B,1+p)>>(DD-w2)); - #endif - *ans = x; - return 2*w+1; - } - - void mkdecodetable(void) { - unsigned short B[256]; - int i,j,b,b2,d,x; - - for (i=0; i<256; i++) B[i] = 0xffff; - for (i = 0; i < TBLSIZE; i++) { - B[0] = i; - R6b[i] = 0; R6x[i] = 0; - b = 0; j = 0; x = 0; - while (1) { - b2 = DECODENUM(B,b,&d); - if (b+b2 > DD) break; - b += b2; - x += d; - j++; - if (j==1) {R6b[i] = b2; R6x[i] = d;} - } - R5n[i] = j; R5b[i] = b; R5x[i] = x; - } - } - - inline - int psi_list(CSA *SA,int i) { - int j,l,r,m; - #ifdef DEBUG - if (i > SA->n || i < 1) { - printf("error psi_get i=%d n=%d\n",i,SA->n); - exit(1); - } - #endif - l = 1; r = SA->m; - while (l < r) { - m = (l + r) / 2; - if (SA->K[m+1] <= i) { - l = m + 1; - } - else { - r = m; - } - } - j = r; - return j; - } - - void psisort2(int *p,int *I,unsigned char *s,int n) { - int i,sum; - int C[SIGMA]; - int x,c; - for (i = 0; i < SIGMA; i++) C[i] = 0; - for (i = 1; i <= n; i++) { - c = s[i]; - C[c]++; - } - sum = 0; - for (i = 0; i < SIGMA; i++) { - sum = sum + C[i]; - C[i] = sum - C[i]; - } - - for (i = 0; i <= n; i++) { - x = p[i]-1; - if (x==0) continue; - c = s[x]; - I[1+C[c]++] = i; - } - } - - void writeint(int x,FILE *f) { - int tmp; - tmp = x; - fwrite(&tmp,sizeof(int),1,f); - } - - void csa_new(int n, int *p, unsigned char *s, char *fname1, char *fname2, int rankb_w, int rankb_w2) { - int i,v,b,x,b2,d,w,m; - int *I,*J; - int K[SIGMA+2],C[SIGMA+1],C2[SIGMA+1]; - unsigned short Btmp[64]; - FILE *f1,*f2; - int psize,isize; - - f1 = fopen(fname1,"wb"); /* psi */ - f2 = fopen(fname2,"wb"); /* directory */ - if (f1 == NULL || f2 == NULL) { - perror("csa2_new1: "); - exit(1); - } - - for (i=0; i0) { - m++; - C2[m] = i; - K[m] = v; - v += C[i]; - } - } - K[m+1] = v; - - for (v=0,i=0; i */ - } - isize += SIGMA*sizeof(int); - for (i = 1; i <= m+1; i++) { - writeint(K[i],f2); /* px */ - } - isize += (m+1)*sizeof(int); - for (i = 1; i <= m; i++) { - writeint(C2[i],f2); /* ->R[h */ - } - isize += m*sizeof(int); - - I=(int *)malloc((n+2) * sizeof(*I)); - if (I==NULL) { - fprintf(stderr, "psi_new2 malloc I failed\n"); - exit(1); - } - - psisort2(p,I,s-1,n); - - writeint(-1,f2); /* R[0] */ - writeint(0,f2); /* P[0] */ - isize += 2*sizeof(int); - - x = -1; b = b2 = 0; - for (i=1; i<=n; i++) { - if (I[i] < x) { - d = (n+65536) - x; - } - else { - d = I[i] - x; - } - w = ENCODENUM(Btmp,b2,d); - b += w; b2 += w; - if (b2 >= 16) { - fwrite(Btmp,b2 / 16,sizeof(short),f1); - psize += (b2/16)*sizeof(short); - Btmp[0] = Btmp[b2 / 16]; - b2 = b2 % 16; - }; - if (I[i] < x) { - x = -1; - i--; - } - else { - x = I[i]; - if (i % rankb_w2 == 0) { - /* R[i / L] */ - writeint(I[i],f2); - /* P[i / L] */ - writeint(b,f2); - isize += 2*sizeof(int); - } - } - } - if (b2 > 0) { - fwrite(Btmp,(b2+15) / 16,sizeof(short),f1); - psize += ((b2+15)/16)*sizeof(short); - }; - - writeint(n+1,f2); /* SA[0] */ - isize += sizeof(int); - for (i=rankb_w; i<=n; i+=rankb_w) { - writeint(p[i],f2); - isize += sizeof(int); - } - J = (int *)malloc(((n-1)/(rankb_w*16)+1)*sizeof(*J)); - if (J==NULL) { - perror("csa2_new\n"); - exit(1); - } - for (i=1; i<=n; i++) { - if ((p[i]-1) % (rankb_w*16) == 0) { - J[(p[i]-1) / (rankb_w*16)] = i; - } - } - for (i = 0; i <= (n-1)/(rankb_w*16); i++) { - writeint(J[i],f2); - isize += sizeof(int); - } - fclose(f1); - fclose(f2); - - free(I); - free(J); - - } - - int readint(FILE *f) { - int s; - int tmp; - s=fread(&tmp,sizeof(int),1,f); - return tmp; - } - - int csa_read(CSA *SA,char *fname1,char *fname2) { - int i,n,m; - FILE *f; - int psize,isize; - unsigned char *ptr; - - #ifndef USE_MMAP - f = fopen(fname1,"rb"); - if (f == NULL) { - perror("csa2_read1: "); - exit(1); - } - fseek(f,0,SEEK_END); - psize = ftell(f); - fseek(f,0,0); - SA->B = malloc(psize+1); - if (SA->B == NULL) { - perror("csa2_read2: "); - exit(1); - } - fread(SA->B,psize+1,1,f); - fclose(f); - #else - SA->mapp = mymmap(fname1); - if (SA->mapp->addr==NULL) { - perror("mmap1\n"); - exit(1); - } - SA->B = (unsigned short *)SA->mapp->addr; - SA->p_size = SA->mapp->len; - psize = SA->mapp->len; - #endif - - f = fopen(fname2,"rb"); - if (f == NULL) { - perror("csa2_read3: "); - exit(1); - } - fseek(f,0,SEEK_END); - isize = ftell(f); - fseek(f,0,0); - SA->n = n = readint(f); /* eLXg */ - SA->l = readint(f); /* psii[ */ - SA->two = readint(f); /* SAi[ */ - SA->two2 = readint(f); /* ISAi[ */ - - /* At@xbgTCY */ - if ((m=readint(f)) != SIGMA) { - printf("error sigma=%d\n",m); - } - SA->m = m = readint(f); /* */ - isize = 6*sizeof(int); - - for (i = 0; i < SIGMA; i++) { - /* -> */ - SA->C[i] = readint(f); - } - isize += SIGMA*sizeof(int); - for (i = 1; i <= m+1; i++) { - /* px */ - SA->K[i] = readint(f); - } - isize += (m+1)*sizeof(int); - for (i = 1; i <= m; i++) { - /* ->R[h */ - SA->C2[i] = readint(f); - } - isize += m*sizeof(int); - - #ifndef USE_MMAP - SA->R = malloc((n / SA->l + 1)*2*sizeof(int)); - if (SA->R == NULL) { - perror("csa2_read4: "); - exit(1); - } - for (i = 0; i <= n / SA->l; i++) { - /* psil */ - SA->R[i*2] = readint(f); - /* psi|C^ */ - SA->R[i*2+1] = readint(f); - } - - SA->SA = malloc((n / SA->two + 1)*sizeof(int)); - if (SA->SA == NULL) { - perror("csa2_read6: "); - exit(1); - } - for (i = 0; i <= (n / SA->two); i++) { - SA->SA[i] = readint(f); - } - SA->ISA = malloc((n / SA->two2 + 1)*sizeof(int)); - if (SA->ISA == NULL) { - perror("csa2_read7: "); - exit(1); - } - for (i = 0; i <= (n-1) / SA->two2; i++) { - SA->ISA[i] = readint(f); - } - fclose(f); - #else - fclose(f); - - SA->mapi = mymmap(fname2); - if (SA->mapi->addr==NULL) { - perror("mmap2\n"); - exit(1); - } - SA->i_size = SA->mapi->len; - - ptr = (unsigned char *)SA->mapi->addr + isize; - SA->R = (int *)ptr; - isize += (n / SA->l+1)*2*sizeof(int); - SA->r_size = (n / SA->l+1)*2; - - ptr = (unsigned char *)SA->mapi->addr + isize; - SA->SA = (int *)ptr; - SA->sa_size = (n / SA->two+1); - isize += (n / SA->two+1)*sizeof(int); - - ptr = (unsigned char *)SA->mapi->addr + isize; - SA->ISA = (int *)ptr; - SA->isa_size =(n / SA->two2+1); - #endif - return 0; - } - - void csa_init(CSA *SA) { - for(int i=0; i< SIGMA+2; i++) - SA->K[i]=0; - for(int i=0; i< SIGMA+1; i++) { - SA->C[i]=0; - SA->C2[i]=0; - } - } - - void csa_save(CSA *SA, ostream & fp) { - saveValue(fp, SA->m); - saveValue(fp, SA->two); - saveValue(fp, SA->two2); - saveValue(fp, SA->l); - saveValue(fp, SA->n); - saveValue(fp, SA->K, (SIGMA+2)); - saveValue(fp, SA->C, (SIGMA+1)); - saveValue(fp, SA->C2, (SIGMA+1)); - #ifdef USE_MMAP - saveValue(fp, SA->p_size); - saveValue(fp, SA->B, SA->p_size); - saveValue(fp, SA->i_size); - saveValue(fp, SA->r_size); - saveValue(fp, SA->R, SA->r_size); - saveValue(fp, SA->sa_size); - saveValue(fp, SA->SA, SA->sa_size); - saveValue(fp, SA->isa_size); - saveValue(fp, SA->ISA, SA->isa_size); - #endif - } - - CSA *csa_load(istream & fp) { - CSA *SA; - SA = (CSA *) malloc(sizeof(CSA)); - csa_init(SA); - initranktables(); - mkdecodetable(); - SA->m = loadValue(fp); - SA->two = loadValue(fp); - SA->two2 = loadValue(fp); - SA->l = loadValue(fp); - SA->n = loadValue(fp); - for(int i=0; i<(SIGMA+2); i++) - SA->K[i] = loadValue(fp); - for(int i=0; i<(SIGMA+1); i++) - SA->C[i] = loadValue(fp); - for(int i=0; i<(SIGMA+1); i++) - SA->C2[i] = loadValue(fp); - #ifdef USE_MMAP - SA->p_size = loadValue(fp); - SA->B = loadValue(fp, SA->p_size); - SA->i_size = loadValue(fp); - SA->r_size = loadValue(fp); - SA->R = loadValue(fp, SA->r_size); - SA->sa_size = loadValue(fp); - SA->SA = loadValue(fp, SA->sa_size); - SA->isa_size = loadValue(fp); - SA->ISA = loadValue(fp, SA->isa_size); - SA->mapp = NULL; - SA->mapi = NULL; - #endif - return SA; - } - - void csa_free(CSA *csa) { - #ifdef USE_MMAP - if(csa->mapp!=NULL && csa->mapi!=NULL) { - free(csa->mapp); - free(csa->mapi); - } - else { - delete [] csa->B; - delete [] csa->ISA; - delete [] csa->R; - delete [] csa->SA; - } - #endif - free(csa); - } - - inline - int csa_psi(CSA *SA, int i) { - int j,k,b,d,x; - int k2,p,n; - int l; - unsigned short *B; - #ifdef DEBUG - if (i > SA->n || i < 1) { - printf("error csa2_psi i=%d n=%d\n",i,SA->n); - exit(1); - } - #endif - - l = SA->l; - x = SA->R[(i / l)*2]; - b = SA->R[(i / l)*2+1]; - j = i % l; - - n = SA->n; - B = SA->B; - - #if 0 - for (k=0; k n) { - //printf("i %d k %d d %d x %d n %d\n",i,k,d,x,n); - x = -1; - k--; - } - //printf("k %d j %d b %d \n",k,j,b); - } - #else - - k = 0; - while (k < j) { - p = getbitD(B,1+b); - k2 = R5n[p]; - if (k2 == 0) { - b += DECODENUM(B,b,&d); - x += d; - k++; - if (x > n) { - x = -1; - k--; - } - } - else { - if (k+k2 > j) break; - k += k2; - b += R5b[p]; - x += R5x[p]; - } - } - - for (; k n) { - x = -1; - k--; - } - } - #endif - #ifdef DEBUG - if (x < 0 || x > SA->n) { - printf("error csa2_psi(%d) %d\n",i,x); - } - #endif - return x; - } - - inline - int csa_T(CSA *SA,int i) { - int c; - c = psi_list(SA,i); - return SA->C2[c]; - } - - void csa_decode(unsigned char *p,CSA *SA,int suf,int len) { - int pos; - int i; - pos = csa_inverse(SA,suf); - i = 0; - while (i < len) { - *p++ = csa_T(SA,pos); - pos = csa_psi(SA,pos); - i++; - } - } - - void csa_decode2(unsigned char *p,CSA *SA,int pos,int len) { - int i; - i = 0; - while (i < len) { - *p++ = csa_T(SA,pos); - pos = csa_psi(SA,pos); - i++; - } - } - - void csa_decode1line(unsigned char *p,CSA *SA,int suf,int maxlen) { - int i,k,m,pos; - unsigned char *tmp; - - m = maxlen*2; - tmp = (unsigned char *)malloc(m+1); - if (tmp==NULL) {perror("csa_decode1line"); exit(1);} - - k = suf - maxlen; if (k <= 0) k = 1; - pos = csa_inverse(SA,k); - - i = 0; - while (i < m) { - tmp[i] = csa_T(SA,pos); - pos = csa_psi(SA,pos); - i++; - } - for (i = suf-k; i < m; i++) { - if (tmp[i] == 0x0a) {i--; break;} - } - m = i; - for (i = suf-k; i >= 0; i--) { - if (tmp[i] == 0x0a) {i++; break;} - } - if (m-i > maxlen) i = m-maxlen; - while (i < m) *p++ = tmp[i++]; - *p = 0; - free(tmp); - } - - void csa_decodeall(unsigned char *p,CSA *SA) { - int *I; - int i,n,pos; - int x,b,d; - unsigned short *B; - n = SA->n; - I =(int *)malloc((n+1)*sizeof(*I)); - if (I == NULL) {perror("decodeall"); exit(1);} - - B = SA->B; - x = -1; b = 0; - for (i=1; i<=n; i++) { - b += DECODENUM(B,b,&d); - x += d; - if (x > n) { - x = -1; i--; - } - else { - I[i] = x; - } - } - pos = csa_inverse(SA,1); - for (i=1; i<=n; i++) { - if (pos < 1 || pos > n) { - printf("i %d pos %d\n",i,pos); - } - *p++ = csa_T(SA,pos); - pos = I[pos]; - } - } - - int csa_lookup(CSA *SA, int i) { - int v,two; - v = 0; two = SA->two; - while (i % two !=0) { - i = csa_psi(SA,i); - v++; - } - i = i / two; - return SA->SA[i]-v; - } - - int np; - int csa_lookup2(CSA *SA, int i) { - int v,two; - v = 0; two = SA->two; - while (i % two !=0) { - i = csa_psi(SA,i); - np++; - v++; - } - i = i / two; - return SA->SA[i]-v; - } - - int csa_inverse(CSA *SA, int suf) { - int p,pos; - int two2; - - two2 = SA->two2; - - p = ((suf-1)/two2)*two2+1; - pos = SA->ISA[(suf-1)/two2]; - - while (p < suf) { - pos = csa_psi(SA,pos); - p++; - } - return pos; - } - - int intcompare(const void *i, const void *j) { - if (*(int *)i > * (int *)j) - return 1; - if (*(int *)i < *(int *)j) - return -1; - return 0; - } - - int *csa_batchlookup(CSA *SA,int l, int r) { - int *I; - int j; - I = (int *)malloc((r-l+1+1)*sizeof(*I)); - np = 0; - for (j=0; jtwo; - sa = SA->SA; - - I = (unsigned long *)malloc((r-l+1)*sizeof(*I)); - V = (int *)malloc((r-l+1+1)*sizeof(*V)); - J = (int *)malloc((r-l+1+1)*sizeof(*J)); - - for (j=l; j<=r; j++) J[j-l] = -1; - for (j=l; j<=r; j++) I[j-l] = 0; - for (m=0,j=l; j<=r; j++) { - f = 0; - i = j; v = 0; - while (i % two !=0) { - i = csa_psi(SA,i); - v++; - m++; - if (l <= i && i <= r) { - V[j-l] = v; - J[i-l] = j; - f = 1; - break; - } - } - if (f==0) { - i = i / two; - I[j-l] = sa[i]-v; - } - } - for (j=l; j<=r; j++) { - if (I[j-l] != 0) { - q = j; - while (J[q-l] != -1) { - s = I[q-l]; - i = J[q-l]; - v = V[i-l]; - I[i-l] = s - v; - J[q-l] = -1; - q = i; - } - } - } - - for (j=l; j<=r; j++) - I[j-l]--; - - free(V); free(J); - return I; - } - - int *csa_batchlookup3(CSA *SA,int l, int r,int len) { - int *I; /* z */ - int *P; /* r i z */ - int v; /* [ */ - int m; /* SA */ - int q; - int i,j; - int two; - int *sa; - int k,b,d,x,n,w; - unsigned short *B; - - n = SA->n; - B = SA->B; - two = SA->two; - sa = SA->SA; - w = SA->l; - - I =(int *) malloc((r-l+1+1)*sizeof(*I)); - P =(int *) malloc((r-l+1+1)*sizeof(*I)); - #if 1 - x = SA->R[(l / w)*2]; - b = SA->R[(l / w)*2+1]; - j = l % w; - for (k=0; k n) {x = -1; k--;} - } - for (m = 0, q = 0, i = l; i <= r; i++) { - if (i % two == 0) { - I[1+m] = sa[i / two]; - m++; - } - else { - P[q++] = x; - } - b += DECODENUM(B,b,&d); - x += d; - if (x > n) { - x = -1; - b += DECODENUM(B,b,&d); - x += d; - } - } - v = 1; - #else - for (q = 0, i = l; i <= r; i++) { - P[q++] = i; - } - v = 0; - m = 0; - #endif - while (q > 0 && v <= len) { - for (k = 0, j = 0; j < q; j++) { - i = P[j]; - if (i % two == 0) { - I[1+m] = sa[i / two] - v; - m++; - } - else { - P[k++] = csa_psi(SA,i); - } - } - q = k; - v++; - } - for (j = 0; j < q; j++) { - I[1+m] = csa_lookup(SA,P[j])-v; - m++; - } - qsort(I+1, r-l+1, sizeof(int), intcompare); - I[0] = r-l+1; - free(P); - return I; - } - - /* backward search */ - int csa_bsearch(unsigned char *key,int keylen,CSA *SA,int *li,int *ri) { - int c,h,l,r,m,ll,rr,pl,pr; - int x,b,w,d,n,*R; - unsigned short *B; - int len; - - c = key[keylen-1]; - r = SA->C[c]; if (c>0) l = SA->C[c-1]+1; else l = 1; - len = 0; - if (l > r) goto end; - len++; - for (h = keylen-2; h >= 0; h--) { - pl = l; pr = r; - c = key[h]; - r = SA->C[c]; if (c>0) l = SA->C[c-1]+1; else l = 1; - if (l > r) goto end; - #if 0 - while (1) { // find maximum r such that Psi[r] <= pr - j = csa_psi(SA,r); - if (j <= pr) break; - r--; - //if (l > r) goto end; - } - #else - #if 0 - ll = l; rr = r; - while (ll <= rr) { - m = (ll + rr) / 2; - if (csa_psi(SA,m) <= pr) ll = m+1; else rr = m-1; - } - r = ll-1; - #else - R = SA->R; B = SA->B; w = SA->l; n = SA->n; - ll = l / w + 1; - rr = r / w; - while (ll <= rr) { - m = (ll + rr) / 2; - if (R[m*2] <= pr) ll = m+1; else rr = m-1; - } - m = (ll-1)*w; - x = R[(m / w)*2]; - b = R[(m / w)*2+1]; - - #if 1 - while (m < l) { - b += DECODENUM(B,b,&d); - x += d; - //if (x > n) printf("??? \n"); - if (x > n) {x = -1; m--;} - m++; - } - #endif - while (x <= pr && m <= r) { - b += DECODENUM(B,b,&d); - x += d; - //if (x > n) printf("??? \n"); - m++; - } - r = m-1; - #endif - #endif - #if 0 - while (1) { // find minimum l such that Psi[l] >= pl - j = csa_psi(SA,l); - if (j >= pl) break; - l++; - //if (l > r) goto end; - } - #else - #if 0 - ll = l; rr = r; - while (ll <= rr) { - m = (ll + rr) / 2; - if (csa_psi(SA,m) >= pl) rr = m-1; else ll = m+1; - } - l = rr+1; - #else - //ll = l / w + 1; - ll = l / w; - rr = r / w; - while (ll <= rr) { - m = (ll + rr) / 2; - if (R[m*2] >= pl) rr = m-1; else ll = m+1; - } - m = rr*w; - x = R[(m / w)*2]; - b = R[(m / w)*2+1]; - - while (m < l) { - b += DECODENUM(B,b,&d); - x += d; - if (x > n) {x = -1; m--;} - m++; - } - while (x < pl && m <= r) { - b += DECODENUM(B,b,&d); - x += d; - m++; - } - l = m; - #endif - #endif - if (l > r) goto end; - len++; - } - end: - *li = l; *ri = r; - return len; - } - -}; diff --git a/libcds/src/static/textindex/mmap.cpp b/libcds/src/static/textindex/mmap.cpp deleted file mode 100644 index 01c65e58..00000000 --- a/libcds/src/static/textindex/mmap.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* mmap.c - Copyright (C) 2005, K. Sadakane, all rights reserved. - - This file contains an implementation of memory manager - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#ifdef __APPLE__ -#include -#endif - - -#include - -#ifndef WIN32 -#include -#endif - -#include - -namespace cds_static -{ - - #ifdef WIN32 - MMAP * mymmap (char *fname) { - void *base; - HANDLE fd,h; - int len; - MMAP *m; - m = (MMAP*) malloc(sizeof(*m)); - if (m==NULL) {perror("mymmap malloc"); exit(1);} - fd = CreateFile( (WCHAR*) fname,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); - if (fd==INVALID_HANDLE_VALUE) { - printf("createfile\n"); - exit(1); - } - m->h1 = fd; - len = GetFileSize(fd,0); - m->len = len; - h = CreateFileMapping (fd, NULL, PAGE_READONLY, 0, len, NULL); - if (h==NULL) { - printf("createfilemapping\n"); - exit(1); - } - m->h2 = h; - base = MapViewOfFile (h, FILE_MAP_READ, 0, 0, len); - if (base==NULL) { - printf("mapviewoffile\n"); - return NULL; - } - m->addr = base; - return m; - } - - int mymunmap (MMAP *m) { - UnmapViewOfFile (m->addr); - CloseHandle(m->h2); - CloseHandle(m->h1); - return 0; - } - - #else - - MMAP *mymmap (char *fname) { - int fd; - int len; - MMAP *m; - struct stat statbuf; - caddr_t base; - m =(MMAP *) malloc(sizeof(*m)); - if (m==NULL) {perror("mymmap malloc"); exit(1);} - - stat(fname,&statbuf); - len = statbuf.st_size; - fd = open(fname,O_RDONLY); - base = (caddr_t)mmap(0,len,PROT_READ,MAP_SHARED,fd,0); - if (base==(caddr_t)-1) { - perror("mmap1\n"); - exit(1); - } - m->addr = (void *)base; - m->fd = fd; - m->len = len; - return m; - } - - int mymunmap (MMAP *m) { - if (munmap(m->addr,m->len)==-1) { - perror("munmap 1:"); - } - close(m->fd); - return 0; - } - -#endif - -} diff --git a/libcds/src/static/textindex/qsufsort.cpp b/libcds/src/static/textindex/qsufsort.cpp deleted file mode 100644 index 0a76fc79..00000000 --- a/libcds/src/static/textindex/qsufsort.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* qsufsort.cpp - Copyright 1999, N. Jesper Larsson, all rights reserved. - - This file contains an implementation of the algorithm presented in "Faster - Suffix Sorting" by N. Jesper Larsson (jesper@cs.lth.se) and Kunihiko - Sadakane (sada@is.s.u-tokyo.ac.jp). - - This software may be used freely for any purpose. However, when distributed, - the original source must be clearly stated, and, when the source code is - distributed, the copiright notice must be retained and any alterations in - the code must be clearly marked. No warranty is given regarding the quality - of this software.*/ - -#include - -static int *I, /* group array, ultimately suffix array.*/ -*V, /* inverse array, ultimately inverse of I.*/ -r, /* number of symbols aggregated by transform.*/ -h; /* length of already-sorted prefixes.*/ - -#define KEY(p) (V[*(p)+(h)]) -#define SWAP(p, q) (tmp=*(p), *(p)=*(q), *(q)=tmp) -#define MED3(a, b, c) (KEY(a)KEY(c) ? (b) : KEY(a)>KEY(c) ? (c) : (a))) - -namespace cds_static -{ - /* Subroutine for select_sort_split and sort_split. Sets group numbers for a - group whose lowest position in I is pl and highest position is pm.*/ - - static void update_group(int *pl, int *pm) { - int g; - - g=pm-I; /* group number.*/ - V[*pl]=g; /* update group number of first position.*/ - if (pl==pm) - *pl=-1; /* one element, sorted group.*/ - else - do /* more than one element, unsorted group.*/ - V[*++pl]=g; /* update group numbers.*/ - while (pl>1); /* small arrays, middle element.*/ - if (n>7) { - pl=p; - pn=p+n-1; - if (n>40) { /* big arrays, pseudomedian of 9.*/ - s=n>>3; - pl=MED3(pl, pl+s, pl+s+s); - pm=MED3(pm-s, pm, pm+s); - pn=MED3(pn-s-s, pn-s, pn); - } - pm=MED3(pl, pm, pn); /* midsize arrays, median of 3.*/ - } - return KEY(pm); - } - - /* Sorting routine called for each unsorted group. Sorts the array of integers - (suffix numbers) of length n starting at p. The algorithm is a ternary-split - quicksort taken from Bentley & McIlroy, "Engineering a Sort Function", - Software -- Practice and Experience 23(11), 1249-1265 (November 1993). This - function is based on Program 7.*/ - - static void sort_split(int *p, int n) { - int *pa, *pb, *pc, *pd, *pl, *pm, *pn; - int f, v, s, t, tmp; - - if (n<7) { /* multi-selection sort smallest arrays.*/ - select_sort_split(p, n); - return; - } - - v=choose_pivot(p, n); - pa=pb=p; - pc=pd=p+n-1; - while (1) { /* split-end partition.*/ - while (pb<=pc && (f=KEY(pb))<=v) { - if (f==v) { - SWAP(pa, pb); - ++pa; - } - ++pb; - } - while (pc>=pb && (f=KEY(pc))>=v) { - if (f==v) { - SWAP(pc, pd); - --pd; - } - --pc; - } - if (pb>pc) - break; - SWAP(pb, pc); - ++pb; - --pc; - } - pn=p+n; - if ((s=pa-p)>(t=pb-pa)) - s=t; - for (pl=p, pm=pb-s; s; --s, ++pl, ++pm) - SWAP(pl, pm); - if ((s=pd-pc)>(t=pn-pd-1)) - s=t; - for (pl=pb, pm=pn-s; s; --s, ++pl, ++pm) - SWAP(pl, pm); - - s=pb-pa; - t=pd-pc; - if (s>0) - sort_split(p, s); - update_group(p+s, p+n-t-1); - if (t>0) - sort_split(p+n-t, t); - } - - /* Bucketsort for first iteration. - - Input: x[0...n-1] holds integers in the range 1...k-1, all of which appear - at least once. x[n] is 0. (This is the corresponding output of transform.) k - must be at most n+1. p is array of size n+1 whose contents are disregarded. - - Output: x is V and p is I after the initial sorting stage of the refined - suffix sorting algorithm.*/ - - static void bucketsort(int *x, int *p, int n, int k) { - int *pi, i, c, d, g; - - for (pi=p; pi=p; --pi) { - d=x[c=*pi]; /* c is position, d is next in list.*/ - x[c]=g=i; /* last position equals group number.*/ - if (d>=0) { /* if more than one element in group.*/ - p[i--]=c; /* p is permutation for the sorted x.*/ - do { - d=x[c=d]; /* next in linked list.*/ - x[c]=g; /* group number in x.*/ - p[i--]=c; /* permutation in p.*/ - } while (d>=0); - } else - p[i--]=-1; /* one element, sorted group.*/ - } - } - - /* Transforms the alphabet of x by attempting to aggregate several symbols into - one, while preserving the suffix order of x. The alphabet may also be - compacted, so that x on output comprises all integers of the new alphabet - with no skipped numbers. - - Input: x is an array of size n+1 whose first n elements are positive - integers in the range l...k-1. p is array of size n+1, used for temporary - storage. q controls aggregation and compaction by defining the maximum value - for any symbol during transformation: q must be at least k-l; if q<=n, - compaction is guaranteed; if k-l>n, compaction is never done; if q is - INT_MAX, the maximum number of symbols are aggregated into one. - - Output: Returns an integer j in the range 1...q representing the size of the - new alphabet. If j<=n+1, the alphabet is compacted. The global variable r is - set to the number of old symbols grouped into one. Only x[n] is 0.*/ - - static int transform(int *x, int *p, int n, int k, int l, int q) { - int b, c, d, e, i, j, m, s; - int *pi, *pj; - - for (s=0, i=k-l; i; i>>=1) - ++s; /* s is number of bits in old symbol.*/ - e=INT_MAX>>s; /* e is for overflow checking.*/ - for (b=d=r=0; r=k-l) { /* if bucketing possible,*/ - j=transform(V, I, n, k, l, n); - /* bucketsort on first r positions.*/ - bucketsort(V, I, n, j); - } - else { - transform(V, I, n, k, l, INT_MAX); - for (i=0; i<=n; ++i) - I[i]=i; /* initialize I with suffix numbers.*/ - h=0; - sort_split(I, n+1); /* quicksort on first r positions.*/ - } - h=r; /* number of symbols aggregated by transform.*/ - - while (*I>=-n) { - pi=I; /* pi is first position of group.*/ - sl=0; /* sl is negated length of sorted groups.*/ - do { - if ((s=*pi)<0) { - pi-=s; /* skip over sorted group.*/ - sl+=s; /* add negated length to sl.*/ - } - else { - if (sl) { - /* combine sorted groups before pi.*/ - *(pi+sl)=sl; - sl=0; - } - pk=I+V[s]+1; /* pk-1 is last position of unsorted group.*/ - sort_split(pi, pk-pi); - pi=pk; /* next group.*/ - } - } while (pi<=I+n); - if (sl) /* if the array ends with a sorted group.*/ - *(pi+sl)=sl; /* combine sorted groups at end of I.*/ - h=2*h; /* double sorted-depth.*/ - } - - for (i=0; i<=n; ++i) /* reconstruct suffix array from inverse.*/ - I[V[i]]=i; - } - -}; diff --git a/libcds/src/static/textindex/suftest3.test.cpp b/libcds/src/static/textindex/suftest3.test.cpp deleted file mode 100644 index aa7e7af8..00000000 --- a/libcds/src/static/textindex/suftest3.test.cpp +++ /dev/null @@ -1,412 +0,0 @@ -/* suftest3.test.c - Copyright (C) 2006, Rodrigo Gonzalez, all rights reserved. - - This file contains an implementation of the interface for CSA. - For more information, see - - K. Sadakane. Compressed text databases with efficient query - algorithms based on the compressed suffix array. - In Proceedings 11th Annual International Symposium on Algorithms - and Computation (ISAAC)}, LNCS v. 1969, pages 410--421, 2000. - - K. Sadakane. Succinct representations of lcp information and - improvements in the compressed suffix arrays. - In Proceedings 13th Annual ACM-SIAM Symposium on Discrete - Algorithms (SODA), 2002. - - K. Sadakane. New text indexing functionalities of the compressed - suffix arrays. Journal of Algorithms, 48(2):294--313, 2003. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef uchar -#define uchar unsigned char -#endif -#ifndef ulong -#define ulong unsigned long -#endif -#ifndef min -#define min(x,y) ((x)<(y)?(x):(y)) -#endif - -namespace cds_static -{ - typedef struct rusage mytimestruct; - void mygettime(mytimestruct *t) { - getrusage(RUSAGE_SELF,t); - } - double mylaptime(mytimestruct *before,mytimestruct *after) { - double t; - t = after->ru_utime.tv_sec - before->ru_utime.tv_sec; - t += (double)(after->ru_utime.tv_usec - - before->ru_utime.tv_usec)/1000000; - return t; - } - - /* Three function to variables to manage parameters */ - static bool is_delimeter(char *delimiters, char c) { - int i=0,len_delimiters=strlen(delimiters); - bool is=false; - for (i=0;imapp!=NULL) - free(SA->mapp); - if(SA->mapi!=NULL) - free(SA->mapi); - #else - free(SA->B) - free(SA->ISA); - free(SA->R); - free(SA->SA); - #endif - free(SA); - return 0; - } - int index_size(void *index, ulong *size) { - CSA *SA=(CSA *) index; - *size=0; - #ifdef USE_MMAP - *size+=sizeof(MMAP)*2; - *size+=(SA->p_size); //Size B - *size+=(SA->i_size); //Size ISA+R+SA - #endif - *size+=sizeof(CSA); - return 0; - } - - int index_size_count(void *index, ulong *size) { - CSA *SA=(CSA *) index; - *size=0; - #ifdef USE_MMAP - *size+=sizeof(MMAP)*2; - *size+=(SA->p_size); //Size B - *size+=(SA->i_size); //Size ISA+R+SA - #endif - *size+=sizeof(CSA); - return 0; - } - int index_size_locate(void *index, ulong *size) { - CSA *SA=(CSA *) index; - *size=0; - #ifdef USE_MMAP - *size+=sizeof(MMAP)*2; - *size+=(SA->p_size); //Size B - *size+=(SA->i_size); //Size ISA+R+SA - #endif - *size+=sizeof(CSA); - return 0; - } - - /*//////////////////// - //Querying the Index// - ////////////////////*/ - int count(void *index, uchar *pattern, ulong length, ulong *numocc) { - int l,r,len; - CSA *SA=(CSA *) index; - len = csa_bsearch(pattern,length,SA,&l,&r); - *numocc = r-l+1; - return 0; - } - - ulong locate_extract(void *index) { - CSA *SA=(CSA *) index; - ulong largo,*occ,lar,n=SA->n,l,r,lll=0; - ulong matches,locate; - ulong random,hh; - for ( hh=1; hh <= 1000000; hh*=10) - for (lar=1;lar<=9;lar++) { - largo=lar*hh; - occ=NULL; - random = (ulong) (((float) rand()/ (float) RAND_MAX)*(n-1)); - matches = largo+1; - locate=0; - occ = (ulong *) malloc(matches*sizeof(ulong)); - l=random; - r=min(random+largo,n-3); - occ = csa_batchlookup2(SA,l,r); - free(occ); - } - return lll; - } - - int locate(void *index, uchar *pattern, ulong length, ulong **occ, ulong *numocc) { - //*numocc=locate_extract(index); - //exit(0); - int l,r,len; - CSA *SA=(CSA *) index; - len = csa_bsearch(pattern,length,SA,&l,&r); - *numocc = r-l+1; - (*occ) = csa_batchlookup2(SA,l,r); - return 0; - } - - /*/////////////////////// - //Accessing the indexed// - ///////////////////////*/ - int display(void *index, uchar *pattern, ulong length, ulong numc, ulong *numocc, uchar **snippet_text, ulong **snippet_lengths) { - int l,r; - int pos; - ulong *occ, i, j, from, to, len, x; - uchar *text_aux; - CSA *SA=(CSA *) index; - csa_bsearch(pattern,length,SA,&l,&r); - *numocc = r-l+1; - occ = csa_batchlookup2(SA,l,r); - *snippet_lengths = (ulong *) malloc((*numocc)*sizeof(ulong)); - if (!(*snippet_lengths)) return 1; - *snippet_text = (uchar *) malloc((*numocc)*(length+2*numc)*sizeof(uchar)); - if (!(*snippet_text)) return 1; - text_aux=*snippet_text; - - for (i=0;i<(*numocc);i++) { - x=occ[i]; - if (x>numc) from = x-numc; - else from=0; - to= ((int)(x+length+numc-1)<(int)(SA->n-1)?(x+length+numc-1):(SA->n-1)); - len =to-from+1; - pos = csa_inverse(SA,from+1); - for (j=0; (int)j<(int)len;j++) { - text_aux[j] = csa_T(SA,pos); - pos= csa_psi(SA,pos); - } - text_aux+=length+2*numc; - (*snippet_lengths)[i] = len; - } - free(occ); - return 0; - } - - int extract(void *index, ulong from, ulong to, uchar **snippet, ulong *snippet_length) { - CSA *SA=(CSA *) index; - ulong n = SA->n; - int pos; - if (to >= n) to=n-1; - if (from > to) { - *snippet = NULL; - *snippet_length=0; - } - else { - ulong j; - ulong len =to-from+1; - *snippet = (uchar *) malloc((len)*sizeof(uchar)); - if (!(*snippet)) return 1; - pos = csa_inverse(SA,from+1); - for (j=0; jn; - return 0; - } - - /*//////////////// - //Error handling// - ////////////////*/ - char * error_index(int e) { - char *error = new char[50]; - switch(e) { - case 0: - printf(error, "No error"); - break; - case 1: - printf(error, "Out of memory"); - break; - case 2: - printf(error, "The text must end with a \\0"); - break; - case 5: - printf(error, "You can't free the text if you don't copy it"); - break; - case 20: - printf(error, "Cannot create files"); - break; - case 21: - printf(error, "Error writing the index"); - break; - case 22: - printf(error, "Error writing the index"); - break; - case 23: - printf(error, "Cannot open index"); - break; - case 24: - printf(error, "Cannot open text"); - break; - case 25: - printf(error, "Error reading the index"); - break; - case 26: - printf(error, "Error reading the index"); - break; - case 27: - printf(error, "Error reading the text"); - break; - case 28: - printf(error, "Error reading the text"); - break; - case 99: - printf(error, "Not implemented"); - break; - default: - printf(error, "Unknown error"); - } - return error; - } - -}; diff --git a/libcds/src/utils/Array.cpp b/libcds/src/utils/Array.cpp deleted file mode 100644 index bbe81088..00000000 --- a/libcds/src/utils/Array.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* Array.cpp - * Copyright (C) 2009, Francisco Claude, all rights reserved. - * - * Array interface - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -namespace cds_utils -{ - - Array::Array(istream & input) { - length = loadValue(input); - maxValue = loadValue(input); - bitsPerItem = loadValue(input); - uintLength = loadValue(input); - data = loadValue(input,uintLength); - } - - Array::Array(const vector & A, uint bpe) { - size_t n = A.size(); - maxValue = 0; - if(bpe==0) { - for(size_t k=0;k::iterator & ini, const set::iterator & fin, uint bpe) { - size_t n = 0; - maxValue = 0; - for(set::iterator it = ini; it!=fin ;++it) { - maxValue = max(maxValue,*it); - n++; - } - if(bpe!=0) { - maxValue = (1<<(bpe))-1; - } - length = n; - initData(); - assert(bpe==0 || bitsPerItem==bpe); - n = 0; - for(set::iterator it=ini;it!=fin;++it) { - assert(*it <= maxValue); - setField(n, *it); - n++; - } - } - - Array::Array(const vector::iterator & ini, const vector::iterator & fin, uint bpe) { - size_t n = 0; - maxValue = 0; - for(vector::iterator it = ini; it!=fin ;++it) { - maxValue = max(maxValue,*it); - n++; - } - if(bpe!=0) { - maxValue = (1<<(bpe))-1; - } - length = n; - initData(); - assert(bpe==0 || bitsPerItem==bpe); - n = 0; - for(vector::iterator it=ini;it!=fin;++it) { - assert(*it <= maxValue); - setField(n, *it); - n++; - } - } - - Array::Array(size_t n, uint _maxValue) { - length = n; - maxValue = _maxValue; - initData(); - } - - Array::Array(uint * A, size_t n, uint bpe) { - maxValue = 0; - if(bpe==0) { - for(size_t k=0;k -#include - -namespace cds_utils -{ - - BitString::BitString(istream & input) { - assert(input.good()); - input.read((char*)&length,sizeof(size_t)); - input.read((char*)&uintLength,sizeof(size_t)); - data = new uint[uintLength]; - input.read((char*)data,uintLength*sizeof(uint)); - } - - void BitString::initData(const size_t len) { - length = len; - uintLength = length/W+1; - data = new uint[uintLength]; - for(uint i=0;i fields, const size_t len) { - initData(len); - for(size_t i=0; i -#include - -namespace cds_utils -{ - - uint transform(const string & s) { - stringstream ss; - ss << s; - uint ret; - ss >> ret; - return ret; - } - - void tokenize(string str, vector &tokens, char delim) { - string::size_type last_pos = 0; - string::size_type pos = str.find_first_of(delim); - while(pos!=string::npos) { - tokens.push_back(str.substr(last_pos,pos-last_pos)); - last_pos = pos+1; - if(last_pos >= str.length()) break; - pos = str.find_first_of(delim,pos+1); - } - if(last_pos - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace cds_utils -{ -#ifndef WIN32 - clock_t init; - void start_timing() { - init = clock(); - } - - double get_timing() { - clock_t fin = clock(); - return (1000.*(fin-init)/CLOCKS_PER_SEC); - } -#else - void start_timing() { - } - - double get_timing() { - return 0.0; - } -#endif -} diff --git a/libcds/tests/Makefile.am b/libcds/tests/Makefile.am deleted file mode 100644 index 62a86682..00000000 --- a/libcds/tests/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -check_PROGRAMS = \ -testArray \ -testBitSequence \ -testHuffman \ -testLCP \ -testNPR \ -testSequence \ -testSuffixTree \ -testTextIndex \ -timeSequence \ -toArray2 \ -toArray -#testQuantile - -AM_DEFAULT_SOURCE_EXT = .cpp -AM_CPPFLAGS = -I@top_srcdir@/libcds/include $(WARN_CFLAGS) -LDADD = ../libcds.la - -TESTS = $(check_PROGRAMS) diff --git a/libcds/tests/testArray.cpp b/libcds/tests/testArray.cpp deleted file mode 100644 index 720b3f83..00000000 --- a/libcds/tests/testArray.cpp +++ /dev/null @@ -1,126 +0,0 @@ - -#include -#include -#include - -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -bool compare(Array * a1, Array * a2) { - if(a1==NULL || a2==NULL) - return a1==a2; - if(a1->getMax() != a2->getMax()) - return false; - if(a1->getLength() != a2->getLength()) - return false; - if(a1->getSize() != a2->getSize()) - return false; - for(size_t i=0;igetLength();i++) - if(a1->getField(i)!=(*a2)[i]) - return false; - return true; -} - -void test(const string & function, Array *a1, Array *a2) { - if(!compare(a1,a2)) { - cout << "Error in ()" << function << endl; - abort(); - } -} - -void testSaveLoad(Array * a) { - string dir = "/tmp/"; - string pfx = "lcds"; - char * fname = tempnam(dir.c_str(),pfx.c_str()); //tmpnam(NULL); - ofstream outfs(fname); - a->save(outfs); - outfs.close(); - ifstream infs(fname); - Array * a_copy = new Array(infs); - infs.close(); - remove(fname); - //delete [] fname; // C function uses malloc - free(fname); - test("testSaveLoad",a,a_copy); - delete a_copy; -} - -void testConstructors(Array * a) { - vector vals_vector; - uint * vals_array = new uint[a->getLength()]; - for(size_t i=0;igetLength();i++) { - vals_vector.push_back(a->getField(i)); - vals_array[i] = a->getField(i); - } - Array * a2 = new Array(vals_vector); - test("testConstructor",a,a2); - delete a2; - a2 = new Array(vals_vector.begin(),vals_vector.end()); - test("testConstructor",a,a2); - delete a2; - a2 = new Array(vals_array,a->getLength()); - test("testConstructor",a,a2); - delete a2; - if(a->getLength()>0) { - a2 = new Array(vals_array,(size_t)0,(size_t)a->getLength()-1,0); - test("testConstructor",a,a2); - delete a2; - } - a2 = new Array(a->getLength(),a->getMax()); - for(size_t i=0;igetLength();i++) - a2->setField(i,a->getField(i)); - test("testConstructor",a,a2); - delete a2; - delete [] vals_array; -} - -Array * buildArray(uint seed, size_t len, uint maxv) { - Array * a = new Array(len,maxv); - srand(seed); - for(size_t i=0;isetField(i,val); - } - return a; -} - -int main(int argc, char ** argv) { - - Array * a; - - // Test 1: empty array - cout << "Testing empty array" << endl; - a = buildArray(57921, 0, 0); - testSaveLoad(a); - testConstructors(a); - delete a; - - // Test 2: binary array - cout << "Testing binary array" << endl; - a = buildArray(57921, 100000, 1); - testSaveLoad(a); - testConstructors(a); - delete a; - - // Test 1: 7 bits array - cout << "Testing 7 bits array" << endl; - a = buildArray(8647, 100000, 126); - testSaveLoad(a); - testConstructors(a); - delete a; - - // Test 1: big array - cout << "Testing big array" << endl; - a = buildArray(8647, 10000000, (1<<23)); - testSaveLoad(a); - testConstructors(a); - delete a; - - cout << endl << "Tests passed!" << endl; - return 0; -} - diff --git a/libcds/tests/testBitSequence.cpp b/libcds/tests/testBitSequence.cpp deleted file mode 100644 index bff54f2d..00000000 --- a/libcds/tests/testBitSequence.cpp +++ /dev/null @@ -1,120 +0,0 @@ - -#include - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -BitSequence * saveLoad(BitSequence * bs) { - ofstream ofs("bitsequence.tmp"); - bs->save(ofs); - ofs.close(); - ifstream ifs("bitsequence.tmp"); - BitSequence * ret = BitSequence::load(ifs); - ifs.close(); - return ret; -} - -bool testBitSequence(BitString & a, BitSequence * bs) { - size_t rank0SoFar = 0; - size_t rank1SoFar = 0; - for(size_t i=0; iselect1(rank1SoFar)!=i) { - cerr << "SELECT1 ERROR " << i << endl; - return false; - } - if(i>0 && bs->selectNext1(i)!=i) { - cout << "i=" << i << "sn=" << bs->selectNext1(i) << endl; - cerr << "SELECTNEXT1 ERROR" << endl; - return false; - } - } else { - rank0SoFar++; - if(bs->select0(rank0SoFar)!=i) { - cerr << "SELECT0 ERROR" << endl; - return false; - } - if(i>0 && bs->selectNext0(i)!=i) { - cerr << "SELECTNEXT0 ERROR" << endl; - return false; - } - } - if(bs->rank1(i)!=rank1SoFar) - return false; - if(bs->rank0(i)!=rank0SoFar) - return false; - if(bs->access(i)!=a[i]) - return false; - } - return true; -} - -int main(int argc, char ** argv) { - - if(argc!=4) { - cout << "Checks the bitsequence classes generating bitmaps with density using as seed for the numbers generation" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - srand(transform(string(argv[1]))); - uint len = transform(string(argv[2])); - uint dens = transform(string(argv[3])); - - uint act_dens = 0; - BitString a(len); - while(act_dens < dens) { - size_t pos = rand()%len; - if(!a[pos]) { - act_dens++; - a.setBit(pos,true); - } - } - - BitSequenceRG bsRG(a,20); - BitSequence * s = saveLoad(&bsRG); - if(!testBitSequence(a,s)) { - cerr << "ERROR TESTING BitSequenceRG" << endl; - return -1; - } - cout << "RG OK\n" << endl; - delete (BitSequenceRG *)s; - - BitSequenceDArray bsDArray(a); - s = saveLoad(&bsDArray); - if(!testBitSequence(a,s)) { - cerr << "ERROR TESTING BitSequenceDArray" << endl; - return -1; - } - cout << "DArray OK\n" << endl; - delete (BitSequenceDArray *)s; - - BitSequenceSDArray bsSDArray(a); - s = saveLoad(&bsSDArray); - if(!testBitSequence(a,s)) { - cerr << "ERROR TESTING BitSequenceSDArray" << endl; - return -1; - } - cout << "SDArray OK\n" << endl; - delete (BitSequenceSDArray *)s; - - BitSequenceRRR bsRRR(a,33); - s = saveLoad(&bsRRR); - if(!testBitSequence(a,s)) { - cerr << "ERROR TESTING BitSequenceRRR" << endl; - return -1; - } - cout << "RRR OK\n" << endl; - delete (BitSequenceRRR *)s; - return 0; -} - diff --git a/libcds/tests/testHuffman.cpp b/libcds/tests/testHuffman.cpp deleted file mode 100644 index 9a734e1b..00000000 --- a/libcds/tests/testHuffman.cpp +++ /dev/null @@ -1,47 +0,0 @@ - -#include - -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - - -int main(int argc, char ** argv) { - - if(argc!=4) { - cout << "Checks the array class generating elements between 0 and using as seed for the numbers generation" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - srand(transform(string(argv[1]))); - uint len = transform(string(argv[2])); - uint maxv = transform(string(argv[3])); - - //cout << "maxv = " << maxv << endl; - //cout << "len = " << len << endl; - - Array a(len,maxv); - for(uint i=0;imaxLength() << endl; - - for(size_t i=0;iencode(a[i],stream,ptr); - for(size_t k=0;k -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -LCP * saveLoad(LCP * bs) { - ofstream ofs("lcp.tmp"); - bs->save(ofs); - ofs.close(); - ifstream ifs("lcp.tmp"); - LCP * ret = LCP::load(ifs); - ifs.close(); - return ret; -} - -bool testLCP(LCP *s1, LCP *s2, TextIndex *csa){ - for(size_t i=0; iindex_length(); i++){ - if(s1->get_LCP(i,csa)!=s2->get_LCP(i,csa)) - return false; - } - size_t *next; - size_t n_next = 0; - for(size_t i=0; iindex_length(); i++){ - if((i%100)==0) - n_next = 0; - if(s1->get_seq_LCP(i,csa, &next, &n_next, 1)!=s2->get_seq_LCP(i,csa, &next, &n_next, 1)) - return false; - } - - return true; -} - - -int main(int argc, char *argv[]){ - char *text; - size_t length; - LCP *lcp_naive=NULL; - LCP *lcp=NULL; - - if(argc!=2) { - cout << "Checks if the LCP of the file is save/load correctly" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - TextIndex *csa; - - if(loadText(argv[1], &text, &length)) - return 1; - - cout << "length: " << length << endl; - - /*create index*/ - csa = new TextIndexCSA((uchar *)text, (ulong)length, NULL); - - lcp_naive = new LCP_naive(csa,text,length); - - lcp = saveLoad(lcp_naive); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_naive" << endl; - return -1; - } - delete (LCP_naive *)lcp; - cout << "LCP_naive OK\n" << endl; - - LCP_Sad lcpSad(csa, text, length); - lcp = saveLoad(&lcpSad); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_Sad" << endl; - return -1; - } - delete (LCP_Sad *)lcp; - cout << "LCP_Sad OK\n" << endl; - - LCP_FMN lcpFMN(csa, text, length); - lcp = saveLoad(&lcpFMN); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_FMN" << endl; - return -1; - } - delete (LCP_FMN *)lcp; - cout << "LCP_FMN OK\n" << endl; - - LCP_PT lcpPT(csa, text, length, 6); //the last parameter can be 1,2,3,4,5,6,7,8 - lcp = saveLoad(&lcpPT); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_PT" << endl; - return -1; - } - delete (LCP_PT *)lcp; - cout << "LCP_PT OK\n" << endl; - - LCP_PhiSpare lcpPhi(csa, text, length, 8); //the last parameter can be -1, 0, ..., length-1 - lcp = saveLoad(&lcpPhi); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_PhiSpare" << endl; - return -1; - } - delete (LCP_PhiSpare *)lcp; - cout << "LCP_PhiSpare OK\n" << endl; - - - LCP_DAC lcpDAC(csa, text, length); - lcp = saveLoad(&lcpDAC); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_DAC" << endl; - return -1; - } - delete (LCP_DAC *)lcp; - cout << "LCP_DAC OK\n" << endl; - - LCP_DAC_VAR lcpDACVAR(csa, text, length); - lcp = saveLoad(&lcpDACVAR); - if(!testLCP(lcp_naive, lcp, csa)) { - cerr << "ERROR TESTING LCP_DAC_VAR" << endl; - return -1; - } - delete (LCP_DAC_VAR *)lcp; - cout << "LCP_DAC_VAR OK\n" << endl; - - delete (LCP_naive *)lcp_naive; - delete (TextIndexCSA *)csa; - delete [] text; - return 0; -} - diff --git a/libcds/tests/testNPR.cpp b/libcds/tests/testNPR.cpp deleted file mode 100644 index 8a4d9e01..00000000 --- a/libcds/tests/testNPR.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (C) 2010, Rodrigo CƔnovas, all rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -NPR * saveLoad(NPR * bs) { - ofstream ofs("npr.tmp"); - bs->save(ofs); - ofs.close(); - ifstream ifs("npr.tmp"); - NPR * ret = NPR::load(ifs); - ifs.close(); - return ret; -} - -bool testNPR(NPR *npr, LCP *lcp, TextIndex *csa, size_t *naive_nsv, size_t *naive_psv, size_t l){ - - for(size_t i=0; ifind_NSV(i, csa,lcp) != naive_nsv[i]){ - cout << "Error in NSV" << endl; - return false; - }*/ - if(npr->find_PSV(csa->index_length()-l+i, csa, lcp) != naive_psv[i]){ - cout << "Error in PSV" << endl; - return false; - } - } - - int x,y,z, j, rmq_naive; - size_t rmq_pos; - for(size_t i=0; iindex_length(); - y=(int)rand()%csa->index_length(); - if(yget_LCP(x,csa); - rmq_pos = x; - for(j=x+1; j<=y; j++){ - z = lcp->get_LCP(j,csa); - if(zfind_RMQ(x,y,csa,lcp)){ - cout << "Error in RMQ" << endl; - return false; - } - } - return true; -} - - -int main(int argc, char *argv[]){ - char *text; - size_t length; - LCP *lcp = NULL; - NPR *npr = NULL; - - size_t *naive_nsv=NULL; - size_t *naive_psv=NULL; - - if(argc!=2) { - cout << "Checks if the NPR of the file is save/load correctly" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - TextIndex *csa; - - if(loadText(argv[1], &text, &length)) - return 1; - - cout << "length: " << length << endl; - - /*create index*/ - csa = new TextIndexCSA((uchar *)text, (ulong)length, NULL); - - lcp = new LCP_DAC(csa,text,length); - - size_t l = 1000; - size_t aux_naive; - int j; - naive_nsv = new size_t[l]; - naive_psv = new size_t[l]; - - cout << "Creating first " << l << " NSV_naive" << endl; - for(size_t i=0; iget_LCP(i,csa); - for(j=i+1; (size_t)j < length; j++){ - if(aux_naive > lcp->get_LCP(j,csa)) - break; - } - naive_nsv[i] = j; - } - - cout << "Creating last " << l << " PSV_naive" << endl; - for(size_t i = (length -l); i < length; i++){ - aux_naive = lcp->get_LCP(i,csa); - for(j=i-1; j>=0; j--){ - if(aux_naive > lcp->get_LCP(j,csa)) - break; - } - naive_psv[i-(length-l)] = j+1; - } - - - NPR_FMN nprFMN(lcp, 32, csa, 2); //(LCP, block_size, TextIndex, levels of recursion levels of recursion (try 1,2,3 or 4)) - npr = saveLoad(&nprFMN); - if(!testNPR(npr, lcp, csa, naive_nsv, naive_psv, l)){ - cerr << "ERROR TESTING NPR_FMN" << endl; - return -1; - } - delete (NPR_FMN *)npr; - cout << "NPR_FMN OK\n" << endl; - - NPR_CN nprCN(lcp, 32, csa); //(LCP, block_size, TextIndex) - npr = saveLoad(&nprCN); - if(!testNPR(npr, lcp, csa, naive_nsv, naive_psv, l)){ - cerr << "ERROR TESTING NPR_CN" << endl; - return -1; - } - delete (NPR_CN *)npr; - cout << "NPR_CN OK\n" << endl; - - delete [] naive_nsv; - delete [] naive_psv; - delete (LCP_DAC *)lcp; - delete (TextIndexCSA *)csa; - delete [] text; - return 0; -} - diff --git a/libcds/tests/testQuantile.cpp b/libcds/tests/testQuantile.cpp deleted file mode 100644 index bd09e028..00000000 --- a/libcds/tests/testQuantile.cpp +++ /dev/null @@ -1,124 +0,0 @@ - -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; - - -int uintcmp(const void* a,const void* b) -{ - return (*(const uint32_t*)a - *(const uint32_t*)b); -} - -void testQuantileWT(Array& a,WaveletTree& wt) -{ - size_t N = 500; - /* select 500 rand ranges and perform quantile queries */ - while(N) { - size_t start = rand() % a.getLength(); - size_t len = (rand() % (a.getLength() - start)) % 10; - - /* copy and sort the array */ - uint32_t* A = new uint32_t[len+1]; - for(size_t i=0;i<=len;i++) { - A[i] = a[start+i]; - }; - qsort(A,len+1,sizeof(uint32_t),uintcmp); - - /* test */ - size_t accum = 0; - size_t quantile = 1; - while(accum <= len) { - pair qf = wt.quantile_freq(start,start+len,quantile); - for(size_t i=0;i qf = wt.quantile_freq(start,start+len,quantile); - for(size_t i=0;iuse(); - mapper2->use(); - cout << "Test 1 : Wavelet tree with pointers" << endl; - /*WaveletTree wt1(a,new wt_coder_huff(a, mapper),new BitSequenceBuilderDArray(), mapper);*/ - WaveletTree wt1(a,new wt_coder_binary(a, mapper),new BitSequenceBuilderRG(20), mapper); - cout << "bs.size() = " << wt1.getSize() << endl; - - testQuantileWT(a, wt1); - - cout << "Test 2 : Wavelet tree without pointers" << endl; - WaveletTreeNoptrs wt3(a, new BitSequenceBuilderRRR(32), mapper); - cout << "bs.size() = " << wt3.getSize() << endl; - testQuantileWTNPTR(a, wt3); - mapper->unuse(); - mapper2->unuse(); - - fprintf(stdout,"ALL OK\n"); - - return 0; -} - diff --git a/libcds/tests/testSequence.cpp b/libcds/tests/testSequence.cpp deleted file mode 100644 index f727b440..00000000 --- a/libcds/tests/testSequence.cpp +++ /dev/null @@ -1,96 +0,0 @@ - -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; - - -void testSequence(Array & a, Sequence & bs) { - ofstream outfs("sequence.tmp"); - bs.save(outfs); - outfs.close(); - ifstream infs("sequence.tmp"); - Sequence * seq = Sequence::load(infs); - infs.close(); - uint maxv = a.getMax(); - size_t count[maxv+1]; - for(size_t i=0;i<=maxv;i++) - count[i] = 0; - for(size_t i=0;iaccess(i)) { - cerr << "ERROR ACCESS" << endl; - cerr << "Got:" << seq->access(i) << " Expected:" << a[i] << endl; - exit(-3); - } - for(uint j=a[i];j<=a[i];j++) { - if(seq->rank(j,i)!=count[j]) { - cerr << "ERROR RANK " << endl; - cerr << " Rank result: " << bs.rank(j,i) << " count=" << count[j] << endl; - cerr << " symbol=" << j << " position=" << i << endl; - exit(-1); - } - } - if(seq->select(a[i],count[a[i]])!=i) { - cerr << "ERROR SELECT " << endl; - cerr << "a[i]=" << a[i] << " maxv=" << maxv << endl; - cerr << "bs.select=" << bs.select(a[i],count[a[i]]) << " i=" << i << endl; - exit(-2); - } - - } - delete seq; -} - -int main(int argc, char ** argv) { - - if(argc!=4) { - cout << "Checks the array class generating elements between 0 and using as seed for the numbers generation" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - srand(transform(string(argv[1]))); - uint len = transform(string(argv[2])); - uint maxv = transform(string(argv[3])); - - //cout << "maxv = " << maxv << endl; - //cout << "len = " << len << endl; - - Array a(len,maxv); - for(uint i=0;iuse(); - mapper2->use(); - cout << "Test 1 : Wavelet tree with pointers" << endl; - // WaveletTree wt1(a,new wt_coder_binary(a, mapper),new BitSequenceBuilderRRR(32), mapper); - WaveletTreeNoptrs wt1(a, new BitSequenceBuilderRRR(32), mapper); - cout << "bs.size() = " << wt1.getSize() << endl; - testSequence(a, wt1); - - cout << "Test 2 : Wavelet tree without pointers" << endl; - // uint *tmp = new uint[a.getLength()]; - // for (uint i=0; i < a.getLength(); i++) - // tmp[i] = a.getField(i); - // WaveletMatrix wt3(tmp, a.getLength(), new BitSequenceBuilderRRR(32), mapper); - WaveletMatrix wt3(a, new BitSequenceBuilderRRR(32), mapper); - // WaveletTreeNoptrs wt3(tmp, a.getLength(), new BitSequenceBuilderRRR(32), mapper); - cout << "bs.size() = " << wt3.getSize() << endl; - testSequence(a, wt3); - mapper->unuse(); - mapper2->unuse(); - return 0; -} - diff --git a/libcds/tests/testSuffixTree.cpp b/libcds/tests/testSuffixTree.cpp deleted file mode 100644 index 934b83bd..00000000 --- a/libcds/tests/testSuffixTree.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2010, Rodrigo CƔnovas, all rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -SuffixTree * saveLoad(SuffixTree * bs) { - ofstream ofs("cst.tmp"); - bs->save(ofs); - ofs.close(); - ifstream ifs("cst.tmp"); - SuffixTree * ret = SuffixTree::load(ifs); - ifs.close(); - return ret; -} - -bool testSuffixTree(SuffixTree *s1){ - /*add any test you want*/ - return true; -} - - -int main(int argc, char *argv[]){ - char *text; - size_t length; - - if(argc!=2) { - cout << "Checks if the SuffixTree of the file is save/load correctly" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - if(loadText(argv[1], &text, &length)) - return 1; - - /*create index*/ - - SuffixTree *cst; - - SuffixTreeY csty(text, length, DAC, CN_NPR, 32); - cst = saveLoad(&csty); - if(!testSuffixTree(cst)) { - cerr << "ERROR TESTING SuffixTreeY" << endl; - return -1; - } - delete (SuffixTreeY *)cst; - cout << "SuffixTree_Y OK\n" << endl; - - delete [] text; - return 0; -} - diff --git a/libcds/tests/testTextIndex.cpp b/libcds/tests/testTextIndex.cpp deleted file mode 100644 index 6e40351f..00000000 --- a/libcds/tests/testTextIndex.cpp +++ /dev/null @@ -1,63 +0,0 @@ - -#include - -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -TextIndex * saveLoad(TextIndex * bs) { - ofstream ofs("textindex.tmp"); - bs->save(ofs); - ofs.close(); - ifstream ifs("textindex.tmp"); - TextIndex * ret = TextIndex::load(ifs); - ifs.close(); - return ret; -} - -bool testTextIndex(TextIndex *s1, TextIndex *s2){ - for(size_t i=0; iindex_length(); i++){ - if(s1->getSA(i)!=s2->getSA(i)) - return false; - if(s1->getISA(i)!=s2->getISA(i)) - return false; - if(s1->getPsi(i)!=s2->getPsi(i)) - return false; - } - return true; -} - -int main(int argc, char ** argv) { - - if(argc!=2) { - cout << "Checks if the TextIndex of the file is save/load correctly" << endl << endl; - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - char *text=NULL; - size_t length; - TextIndex *ticsa, *load_ticsa; - - if(loadText(argv[1], &text, &length)) - return 1; - cout << "length: " << length << endl; - - ticsa = new TextIndexCSA((uchar *)text, (ulong)length, NULL); - - load_ticsa = saveLoad(ticsa); - - if(!testTextIndex(ticsa, load_ticsa)) { - cerr << "ERROR TESTING TextIndexCSA" << endl; - return -1; - } - - cout << "CSA OK\n" << endl; - delete (TextIndexCSA *)ticsa; - delete (TextIndexCSA *)load_ticsa; - if(text!=NULL) - delete text; -} - diff --git a/libcds/tests/timeSequence.cpp b/libcds/tests/timeSequence.cpp deleted file mode 100644 index 0da4f2c0..00000000 --- a/libcds/tests/timeSequence.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* timeSequence.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; -using namespace cds_utils; - -uint numqueries = 100000; -uint seed = 8647; - -Array extract_alphabet(const Array & values) { - set sigma; - for(size_t i=0;i *queries = new pair[numqueries]; - for(uint i=0;irank(queries[i].first,seq->getLength()-2); - } - size_t acc = 0; - start_timing(); - for(uint i=0;iselect(queries[i].first,queries[i].second+1); - } - double time = get_timing(); - cout << "*************************" << endl; - cout << " SELECT QUERIES" << endl; - cout << " time: " << time << "ms" << endl; - cout << " acc: " << acc << endl; -} - -void measure_access(const Array & sigma, Sequence * seq) { - size_t *queries = new size_t[numqueries]; - for(uint i=0;igetLength(); - } - size_t acc = 0; - start_timing(); - for(uint i=0;iaccess(queries[i]); - } - double time = get_timing(); - cout << "*************************" << endl; - cout << " ACCESS QUERIES" << endl; - cout << " time: " << time << "ms" << endl; - cout << " acc: " << acc << endl; -} - - -void measure_rank(const Array & sigma, Sequence * seq) { - pair *queries = new pair[numqueries]; - for(uint i=0;igetLength(); - } - size_t acc = 0; - start_timing(); - for(uint i=0;irank(queries[i].first,queries[i].second); - } - double time = get_timing(); - cout << "*************************" << endl; - cout << " RANK QUERIES" << endl; - cout << " time: " << time << "ms" << endl; - cout << " acc: " << acc << endl; -} - -int main(int argc, char **argv) { - int c; - char *fname=NULL, *builderopt=NULL; - SequenceBuilder * sb = NULL; - while((c=getopt(argc,argv,"f:b:q:"))!=-1) { - switch(c) { - case 'f': fname = optarg; break; - case 'b': builderopt = optarg; break; - case 'q': numqueries = atoi(optarg); break; - } - } - if(fname==NULL || builderopt==NULL) { - cout << "usage: " << argv[0] << " -f fname -b buildstr [-q numqueries]" << endl; - return 0; - } - ifstream input(fname); - if(!input.good()) { - cerr << "Error opening file: " << fname << endl; - } - Array values(input); - sb = new SequenceBuilderStr(builderopt); - Sequence * seq = sb->build(values); - cout << "builderopt=" << builderopt << endl; - cout << "size=" << seq->getSize() << endl; - cout << "plain size=" << values.getSize() << endl; - cout << "sigma=" << values.getMax() << endl; - Array sigma = extract_alphabet(values); - measure_access(sigma,seq); - measure_rank(sigma,seq); - measure_select(sigma,seq); - return 0; -} - diff --git a/libcds/tests/toArray.cpp b/libcds/tests/toArray.cpp deleted file mode 100644 index 4b482785..00000000 --- a/libcds/tests/toArray.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* toArray.cpp - * Copyright (C) 2010, Francisco Claude, all rights reserved. - * - * Francisco Claude - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -#include -#include - -using namespace cds_utils; - -int main(int argc, char ** argv) { - if(argc!=3) { - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - size_t len = 0; - uchar * content = loadValue(argv[1],len); - uint * content2 = new uint[len]; - for(size_t i=0;i - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -#include -#include - -using namespace cds_utils; - -int main(int argc, char ** argv) { - if(argc!=3) { - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - size_t len = 0; - int * content = loadValue(argv[1],len); - uint * content2 = new uint[len]; - size_t pos = 0; - for(size_t i=3;i0) content2[pos++]=content[i]; - - Array a(content2,pos); - ofstream out(argv[2]); - a.save(out); - out.close(); - - delete [] content; - delete [] content2; - return 0; -} - - - diff --git a/libcds/tutorial/src/ArrayExample.cpp b/libcds/tutorial/src/ArrayExample.cpp deleted file mode 100755 index 0df24290..00000000 --- a/libcds/tutorial/src/ArrayExample.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/** - * ArrayExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -#include -#include -#include - -using namespace std; -using namespace cds_utils; - -int main(int argc, char **argv) { - size_t N=0; - cout << "Enter array length: "; - cin >> N; - uint * A = new uint[N]; - for(size_t i=0;i> A[i]; - } - - Array * a = new Array(A,N); - delete [] A; - - cout << "Size: " << a->getSize() << " bytes" << endl; - for(uint i=0;i> N; - cout << "Enter the maximum value to be stored: "; - cin >> M; - Array *a = new Array(N,M); - for(size_t i=0;i> tmp; - a->setField(i,tmp); - } - - cout << "Size: " << a->getSize() << " bytes" << endl; - for(uint i=0;i> N; - uint * bs = new uint[uint_len(N,1)]; - for(uint i=0;i> b; - if(b==0) bitclean(bs,i); - else bitset(bs,i); - } - BitSequenceRG * bsrg = new BitSequenceRG(bs,N,20); - cout << "rank(" << N/2 << ")=" << bsrg->rank1(N/2) << endl; - cout << "select(1) = " << bsrg->select1(1) << endl; - cout << "size = " << bsrg->getSize() << endl; - delete bsrg; - delete [] bs; - return 0; -} diff --git a/libcds/tutorial/src/BitSequenceRRRExample.cpp b/libcds/tutorial/src/BitSequenceRRRExample.cpp deleted file mode 100755 index 06eefa25..00000000 --- a/libcds/tutorial/src/BitSequenceRRRExample.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * BitSequenceRRRExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -int main(int argc, char **argv) { - size_t N; - cout << "Length of the bitmap: "; - cin >> N; - uint * bs = new uint[uint_len(N,1)]; - for(uint i=0;i> b; - if(b==0) bitclean(bs,i); - else bitset(bs,i); - } - BitSequenceRRR * bsrrr = new BitSequenceRRR(bs,N,16); - cout << "rank(" << N/2 << ")=" << bsrrr->rank1(N/2) << endl; - cout << "select(1) = " << bsrrr->select1(1) << endl; - cout << "size = " << bsrrr->getSize() << endl; - delete bsrrr; - delete [] bs; - return 0; -} diff --git a/libcds/tutorial/src/BitSequenceSDArrayExample.cpp b/libcds/tutorial/src/BitSequenceSDArrayExample.cpp deleted file mode 100755 index 5636faf1..00000000 --- a/libcds/tutorial/src/BitSequenceSDArrayExample.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/** - * BitSequenceSDArrayExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace cds_utils; -using namespace cds_static; - -int main(int argc, char **argv) { - size_t N; - cout << "Length of the bitmap: "; - cin >> N; - uint * bs = new uint[uint_len(N,1)]; - for(uint i=0;i> b; - if(b==0) bitclean(bs,i); - else bitset(bs,i); - } - BitSequenceSDArray * bss = new BitSequenceSDArray(bs,N); - cout << "rank(" << N/2 << ")=" << bss->rank1(N/2) << endl; - cout << "select(1) = " << bss->select1(1) << endl; - cout << "size = " << bss->getSize() << endl; - delete bss; - delete [] bs; - return 0; -} diff --git a/libcds/tutorial/src/Makefile b/libcds/tutorial/src/Makefile deleted file mode 100755 index 334c8a08..00000000 --- a/libcds/tutorial/src/Makefile +++ /dev/null @@ -1,54 +0,0 @@ - -CPP=g++ - -CPPFLAGS=-g3 -O0 -I../includes/ -#CPPFLAGS=-O3 -Wall -DNDEBUG -I../includes/ -INCS=-I../../includes/ -LIB=../../lib/libcds.a - -OBJECTS= ArrayExample.o ArrayExample2.o BitSequenceRGExample.o BitSequenceRRRExample.o BitSequenceSDArrayExample.o SequenceWaveletTreeExample.o SequenceGMRExample.o SequenceAlphPartExample.o -BIN= ArrayExample ArrayExample2 BitSequenceRGExample BitSequenceRRRExample BitSequenceSDArrayExample SequenceWaveletTreeExample SequenceGMRExample SequenceAlphPartExample - -%.o: %.cpp - @echo " [C++] Compiling $<" - @$(CPP) $(CPPFLAGS) $(INCS) -c $< -o $@ - -all: clean $(OBJECTS) $(BIN) - @echo " [MSG] Done compiling tests" - @echo " [FLG] $(CPPFLAGS)" - -ArrayExample: - @echo " [LNK] Building ArrayExample" - @$(CPP) $(CPPFLAGS) -o ArrayExample ArrayExample.o $(LIB) - -ArrayExample2: - @echo " [LNK] Building ArrayExample2" - @$(CPP) $(CPPFLAGS) -o ArrayExample2 ArrayExample2.o $(LIB) - -BitSequenceRGExample: - @echo " [LNK] Building BitSequenceRGExample" - @$(CPP) $(CPPFLAGS) -o BitSequenceRGExample BitSequenceRGExample.o $(LIB) - -BitSequenceRRRExample: - @echo " [LNK] Building BitSequenceRRRExample" - @$(CPP) $(CPPFLAGS) -o BitSequenceRRRExample BitSequenceRRRExample.o $(LIB) - -BitSequenceSDArrayExample: - @echo " [LNK] Building BitSequenceSDArrayExample" - @$(CPP) $(CPPFLAGS) -o BitSequenceSDArrayExample BitSequenceSDArrayExample.o $(LIB) - -SequenceWaveletTreeExample: - @echo " [LNK] Building SequenceWaveletTreeExample" - @$(CPP) $(CPPFLAGS) -o SequenceWaveletTreeExample SequenceWaveletTreeExample.o $(LIB) - -SequenceGMRExample: - @echo " [LNK] Building SequenceGMRExample" - @$(CPP) $(CPPFLAGS) -o SequenceGMRExample SequenceGMRExample.o $(LIB) - -SequenceAlphPartExample: - @echo " [LNK] Building SequenceAlphPartExample" - @$(CPP) $(CPPFLAGS) -o SequenceAlphPartExample SequenceAlphPartExample.o $(LIB) - -clean: - @echo " [CLN] Cleaning object and binary files" - @rm -f $(OBJECTS) $(BIN) diff --git a/libcds/tutorial/src/SequenceAlphPartExample.cpp b/libcds/tutorial/src/SequenceAlphPartExample.cpp deleted file mode 100755 index cae1bc4a..00000000 --- a/libcds/tutorial/src/SequenceAlphPartExample.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * SequenceAlphPartExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; - -int main(int argc, char **argv) { - - size_t N; - uint s; - cout << "Length: "; - cin >> N; - uint * seq = new uint[N]; - for(size_t i=0;i> seq[i]; - } - - SequenceBuilder * sb1 = new SequenceBuilderWaveletTree( - new BitSequenceBuilderRG(20), - new MapperNone()); - SequenceBuilder * sb2 = new SequenceBuilderGMRChunk( - new BitSequenceBuilderRG(20), - new PermutationBuilderMRRR( - 20, new BitSequenceBuilderRG(20))); - SequenceBuilder * sb3 = new SequenceBuilderGMR( - new BitSequenceBuilderRG(20), - sb2); - - SequenceAlphPart * ap = new SequenceAlphPart(seq, N, 0u, - sb1, sb3); - cout << "size = " << ap->getSize() << " bytes" << endl; - - delete ap; - delete []seq; - return 0; -} - diff --git a/libcds/tutorial/src/SequenceGMRExample.cpp b/libcds/tutorial/src/SequenceGMRExample.cpp deleted file mode 100755 index e06bb114..00000000 --- a/libcds/tutorial/src/SequenceGMRExample.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/** - * SequenceGMRExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; - -int main(int argc, char **argv) { - - size_t N; - uint s; - cout << "Length: "; - cin >> N; - uint * seq = new uint[N]; - for(size_t i=0;i> seq[i]; - } - SequenceGMR * gmr = new SequenceGMR(seq, N, 5u, - new BitSequenceBuilderRG(20), - new SequenceBuilderGMRChunk( - new BitSequenceBuilderRG(20), - new PermutationBuilderMRRR( - 20, - new BitSequenceBuilderRG(20)))); - cout << "size = " << gmr->getSize() << " bytes" << endl; - - delete gmr; - delete []seq; - return 0; -} - diff --git a/libcds/tutorial/src/SequenceWaveletTreeExample.cpp b/libcds/tutorial/src/SequenceWaveletTreeExample.cpp deleted file mode 100755 index 9d1ee567..00000000 --- a/libcds/tutorial/src/SequenceWaveletTreeExample.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * SequenceWaveletTreeExample.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include -#include -#include -#include - -using namespace std; -using namespace cds_static; - -int main(int argc, char **argv) { - - size_t N; - uint s; - cout << "Length: "; - cin >> N; - uint * seq = new uint[N]; - for(size_t i=0;i> seq[i]; - } - WaveletTree * wt1 = new WaveletTree(seq, N, - new wt_coder_huff(seq, N, - new MapperNone()), - new BitSequenceBuilderRG(20), - new MapperNone()); - cout << "size = " << wt1->getSize() << " bytes" << endl; - - delete wt1; - delete []seq; - return 0; -} - diff --git a/libcds/tutorial/ssa/Makefile b/libcds/tutorial/ssa/Makefile deleted file mode 100755 index 6f707341..00000000 --- a/libcds/tutorial/ssa/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -CPP=g++ - - -#CPPFLAGS=-g3 -Wall -DVERBOSE -#CPPFLAGS=-O9 -Wall -DNDEBUG -CPPFLAGS=-O9 -Wall -DVERBOSE - -INCLUDES=-I../../includes/ -I. -LIB=../../lib/libcds.a -OBJECTS=ssa.o -BINS=test_count build_index dump_bwt - -%.o: %.cpp - @echo " [C++] Compiling $<" - @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< -o $@ - -all: clean stats $(OBJECTS) $(BINS) - -stats: - @echo - @echo " COMPILING SSA" - @echo " ###################" - @echo " * Compiler flags: $(CPPFLAGS)" - @echo " * Include dirs: $(INCLUDES)" - @echo - @echo - -clean: - @echo " [CLN] Removing object files" - @rm -f $(OBJECTS) $(BINS) - -test_count: - @echo " [BLD] Building test_count" - @$(CPP) $(CPPFLAGS) $(INCLUDES) -o test_count test_count.cpp $(OBJECTS) $(LIB) - -dump_bwt: - @echo " [BLD] Building dump_bwt" - @$(CPP) $(CPPFLAGS) $(INCLUDES) -o dump_bwt dump_bwt.cpp $(OBJECTS) $(LIB) - -build_index: - @echo " [BLD] Building build_index" - @$(CPP) $(CPPFLAGS) $(INCLUDES) -o build_index build_index.cpp $(OBJECTS) $(LIB) - diff --git a/libcds/tutorial/ssa/build_index.cpp b/libcds/tutorial/ssa/build_index.cpp deleted file mode 100755 index ef98b131..00000000 --- a/libcds/tutorial/ssa/build_index.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * build_index.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include "ssa.h" -#include -#include -#include - -using namespace std; - -int main(int argc, char ** argv) { - if(argc!=3) { - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - fstream input(argv[1],ios::in | ios::binary); - if(!input.is_open()) { - cerr << "Error opening file: " << argv[1] << endl; - return -1; - } - - input.seekg(0,ios::end); - uint n=input.tellg(); - uchar * text = new uchar[n+1]; - - input.seekg(0,ios::beg); - input.read((char*)text,sizeof(uchar)*n); - input.close(); - //for(uint i=0;iset_samplepos(32); - _ssa->set_samplesuff(32); - _ssa->build_index(); - _ssa->print_stats(); - - cerr << "Index size: " << _ssa->size() << endl; - - ofstream fp(argv[2]); - _ssa->save(fp); - fp.close(); - - //delete sbb; - delete _ssa; - delete [] text; - - return 0; -} diff --git a/libcds/tutorial/ssa/dump_bwt.cpp b/libcds/tutorial/ssa/dump_bwt.cpp deleted file mode 100755 index b5a434c5..00000000 --- a/libcds/tutorial/ssa/dump_bwt.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * dump_bwt.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include "ssa.h" -#include -#include -#include - -using namespace std; - -int main(int argc, char ** argv) { - if(argc!=2) { - cout << "usage: " << argv[0] << " " << endl; - return 0; - } - - ifstream ssainput(argv[1]); - ssa * _ssa = new ssa(ssainput); - ssainput.close(); - _ssa->print_bwt(); - delete _ssa; - - return 0; -} diff --git a/libcds/tutorial/ssa/ssa.cpp b/libcds/tutorial/ssa/ssa.cpp deleted file mode 100755 index 1e547740..00000000 --- a/libcds/tutorial/ssa/ssa.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/** - * ssa.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include "ssa.h" - -ssa::ssa(uchar *text, uint n, bool free_text) { - assert(n>0); - - // Initial values and default constructors - this->n=n; - this->n1=n+1; - this->_seq = text; - this->built = false; - this->free_text=free_text; - - // Default sampling values - samplepos = 64; - samplesuff = 64; - - #ifdef VERBOSE - cout << "ssa" << endl; - cout << " n=" << n << endl; - cout << " free_text=" << free_text << endl; - #endif - - // Structures that will be built after calling build_index() - _sa = NULL; - bwt = NULL; - _bwt = NULL; - sampled = NULL; - pos_sample = NULL; - suff_sample = NULL; -} - - -ssa::~ssa() { - if(_seq!=NULL && free_text) - delete [] _seq; - if(_bwt!=NULL) - delete [] _bwt; - if(bwt!=NULL) - delete bwt; - if(_sa!=NULL) - delete [] _sa; - if(pos_sample!=NULL) - delete [] pos_sample; - if(suff_sample!=NULL) - delete [] suff_sample; - if(sampled!=NULL) - delete sampled; - delete [] sbuff; -} - -#include -using namespace cds_utils; - -void ssa::save(ofstream & fp) { - saveValue(fp,n); - saveValue(fp,sigma); - saveValue(fp,maxV); - saveValue(fp,samplepos); - saveValue(fp,samplesuff); - bwt->save(fp); - sampled->save(fp); - saveValue(fp,pos_sample,2+n/samplepos); - saveValue(fp,suff_sample,1+n/samplesuff); - saveValue(fp,occ,maxV+1); -} - -void ssa::print_bwt() { - for(size_t i=0;i<=n;i++) { - uint symbol = bwt->access(i); - if(symbol>0) - cout << (uchar)symbol; - } -} - -uint ssa::length() { - return n; -} - - -ssa::ssa(ifstream & fp) { - built = true; - _sa = NULL; - bwt = NULL; - _bwt = NULL; - sampled = NULL; - pos_sample = NULL; - suff_sample = NULL; - - _seq=NULL; - - n = loadValue(fp); - sigma = loadValue(fp); - maxV = loadValue(fp); - samplepos = loadValue(fp); - samplesuff = loadValue(fp); - bwt = Sequence::load(fp); - sampled = BitSequence::load(fp); - pos_sample = loadValue(fp,2+n/samplepos); - suff_sample = loadValue(fp,1+n/samplesuff); - occ = loadValue(fp,maxV+1); - sbuff = new uchar[samplepos+1]; - spos = (uchar)-(samplepos+1); -} - - -uint ssa::size() { - uint size = bwt->getSize(); - size += sizeof(uint)*(2+n/samplepos); - size += sizeof(uint)*(1+n/samplesuff); - size += sizeof(ssa); - size += sizeof(uchar)*(1+samplepos); - size += (1+maxV)*sizeof(uint); - size += sampled->getSize(); - return size; -} - - -void ssa::print_stats() { - cout << "ssa stats:" << endl; - cout << "****************" << endl; - cout << "Total space : " << size() << endl; - cout << endl; - cout << " bwt : " << bwt->getSize() << endl; - cout << " pos sample : " << sizeof(uint)*(2+n/samplepos) << endl; - cout << " suff sample : " << sizeof(uint)*(1+n/samplesuff) << endl; - cout << " occ : " << (maxV+1)*sizeof(uint) << endl; - cout << endl; -} - - - -bool ssa::set_samplepos(uint sample) { - if(built) return false; - samplepos = sample; - return true; -} - - -bool ssa::set_samplesuff(uint sample) { - if(built) return false; - samplesuff = sample; - return true; -} - - -bool ssa::build_index(Array * v, BitSequence * b) { - built = true; - assert(_seq!=NULL); - if(bwt!=NULL) { - delete bwt; - bwt = NULL; - } - #ifdef VERBOSE - cout << "Building the SA" << endl; - #endif - build_sa(); - #ifdef VERBOSE - cout << "Done with the SA" << endl; - #endif - if(v!=NULL) - for(uint i=0;i<=n;i++) - v->setField(i,b->rank1(_sa[i])); - #ifdef VERBOSE - cout << "Building the BWT" << endl; - #endif - build_bwt(); - #ifdef VERBOSE - cout << "Done with the BWT" << endl; - #endif - if(free_text) { - delete [] _seq; - _seq = NULL; - } - #ifdef VERBOSE - cout << "Building the WT of the BWT" << endl; - #endif - bwt = new WaveletTree(_bwt, n+1, - new wt_coder_huff(_bwt, n+1, - new MapperNone()), - new BitSequenceBuilderRRR(32), - new MapperNone()); - - maxV = 0; - for(uint i=0;i0); - assert(pattern!=NULL); - assert(bwt!=NULL); - ulong i=m-1; - uint c = pattern[i]; - uint sp = occ[c]; - uint ep = occ[c+1]-1; - while (sp<=ep && i>=1) { - c = pattern[--i]; - //cout << "sp=" << sp << " ep=" << ep << endl; - sp = occ[c]+bwt->rank(c,sp-1); - ep = occ[c]+bwt->rank(c,ep)-1; - } - //cout << "*sp=" << sp << " *ep=" << ep << endl; - if(sp<=ep) { - uint matches = ep-sp+1; - *occs = new uint[matches]; - uint i = sp; - uint j,dist; - size_t rank_tmp; - while(i<=ep) { - j = i; - dist = 0; - while(!sampled->access(j)) { - c = bwt->access(j,rank_tmp); - rank_tmp--; - j = occ[c]+rank_tmp; - dist++; - } - (*occs)[i-sp] = suff_sample[sampled->rank1(j)-1]+dist; - i++; - } - return ep-sp+1; - } - else { - *occs = NULL; - return 0; - } -} - - -uint ssa::count(uchar * pattern, uint m) { - assert(m>0); - assert(pattern!=NULL); - assert(bwt!=NULL); - ulong i=m-1; - uint c = pattern[i]; - uint sp = occ[c]; - uint ep = occ[c+1]-1; - while (sp<=ep && i>=1) { - c = pattern[--i]; - //cout << "sp=" << sp << " ep=" << ep << endl; - sp = occ[c]+bwt->rank(c,sp-1); - ep = occ[c]+bwt->rank(c,ep)-1; - } - //cout << "*sp=" << sp << " *ep=" << ep << endl; - if (sp<=ep) { - return ep-sp+1; - } - else { - return 0; - } -} - - -uchar * ssa::rebuild() { - uchar * text = new uchar[n]; - for(uint i=0;i=i); - assert(jaccess(p,rank_tmp); - p = occ[c]+rank_tmp; - sbuff[len-dist-1] = (uchar)(c-1); - } -} - - -uchar ssa::extract_pos(uint k) { - uint block = k/samplepos; - if(block!=spos) - fill_buffer(samplepos*block,min(samplepos*block+(samplepos-1),n)); - spos = block; - return sbuff[samplepos-(samplepos*(block+1)-k)]; -} - - -uchar * ssa::extract(uint i, uint j) { - assert(j>=i); - assert(j=i;k--) - buff[k-i] = extract_pos(k); - return buff; -} - - -void ssa::sort_sa(uint ini, uint fin) { - if(ini>=fin || ini>=(fin+1)) return; - uint piv = ini; - piv = pivot(ini,fin,piv); - sort_sa(ini,piv-1); - sort_sa(piv+1,fin); -} - - -int ssa::cmp(uint i, uint j) { - while(i. - */ - - -#ifndef SSA_WORDS_H -#define SSA_WORDS_H - -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace cds_static; - -#define SSA_HDR 29 - -class ssa -{ - public: - ssa(uchar * seq, uint n, bool free_text=false); - ssa(ifstream & fp); - ~ssa(); - - bool set_samplepos(uint sample); - bool set_samplesuff(uint sample); - - bool build_index(Array * a=NULL, BitSequence * b=NULL); - - uint size(); - void print_stats(); - uint length(); - - uint locate(uchar * pattern, uint m, uint ** occ); - uint count(uchar * pattern, uint m); - uchar * extract(uint i, uint j); - uchar extract_pos(uint i); - - void print_bwt(); - - uchar * rebuild(); - void save(ofstream & fp); - - - protected: - uint n,n1; - uint sigma; - Sequence * bwt; - BitSequence * sampled; - uint samplepos; - uint samplesuff; - uint * pos_sample; - uint * suff_sample; - uchar * sbuff; - uint spos; - uint * occ; - uint maxV; - - bool built; - bool free_text; - uchar * _seq; - uint * _bwt; - uint * _sa; - - void build_bwt(); - void build_sa(); - void sort_sa(uint ini, uint fin); - int cmp(uint i, uint j); - void swap(uint i, uint j); - uint pivot(uint ini, uint fin, uint piv); - void fill_buffer(uint i, uint j); - -}; -#endif diff --git a/libcds/tutorial/ssa/test_count.cpp b/libcds/tutorial/ssa/test_count.cpp deleted file mode 100755 index 203aa4ac..00000000 --- a/libcds/tutorial/ssa/test_count.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/** - * test_count.cpp - * Copyright (C) 2011 Francisco Claude F. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#include "ssa.h" -#include -#include -#include - -using namespace std; - -uint brute_check(uchar * text, uint n, uchar * pattern, uint m) { - uint ret = 0; - for(uint i=0;i " << endl; - return 0; - } - - fstream input(argv[1],ios::in | ios::binary); - if(!input.is_open()) { - cerr << "Error opening file: " << argv[1] << endl; - return -1; - } - - input.seekg(0,ios::end); - uint n=input.tellg(); - uchar * text = new uchar[n+1]; - - input.seekg(0,ios::beg); - input.read((char*)text,sizeof(uchar)*n); - input.close(); - //for(uint i=0;iprint_stats(); - - uint m; - { - stringstream ss; - ss << argv[3]; - ss >> m; - } - - uint rep; - { - stringstream ss; - ss << argv[4]; - ss >> rep; - } - - uint total_occ = 0; - uchar * pattern = new uchar[m+1]; - for(uint i=0;icount(pattern,m); - uint real_occ = brute_check(text,n,pattern,m); - if(occ!=real_occ) { - cerr << "Error for pattern " << i+1 << endl; - cerr << "ssa->count() returned " << occ << endl; - cerr << "expected value is " << real_occ << endl; - break; - } - total_occ += occ; - } - - cerr << "Total occ: " << total_occ << endl; - - delete [] pattern; - delete _ssa; - delete [] text; - - return 0; -} diff --git a/libcds/tutorial/tutorial.pdf b/libcds/tutorial/tutorial.pdf deleted file mode 100755 index cfd1d80cf1948fb83bb6c8615abba0e542df1ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2202095 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
~x-*UgW&r?`^`bK)-a*fOk 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 z

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

9Bw|oq?U*Hkasavoe-omXy>!=pGGaF7y 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

+AEIaC3{?s=ri!J|Z9iQ6K|I2(IR4yvhm6oA>hx zsM9YeLB>92q<{B8v;8(`ZRRs2RJm5LwuzLI(_ut@Ox6P_`4o^|<07Qk^ljls>6mps z!;?14`OQ=z)BUq$TGlr%sI^K*wT8N!v#Gw4nx(0+xV4v?!QULUxP{!jg1{$TL{aYG z8U28<7seWluGucX*&u)2qWCzRL$O4LAXu~sM-~I`%isiU!cZc5gMRmuyyz^hKLcSk z7jd1vM_DL~)8nIR^yT*}yu2g{h&iLd%BI9HERu%Qk;dJ5x)1M;?%Q{;EBJVd!MbA9 zHpDPUseliT-0%5vUS8k~2)^zF;Ik>dLsFQtx^b5F3&20o{p=Vt7G;FUZz5(C*v-fj zPi#^$Hbp9u|LMKRI^dvk(<%ZUQe$}Q&vm~0#@&wu*ZivWL(9tqAa?+ixuPJB-?*h+ z zU~!PkjzYDSNmpHx=iR7zv74MKmoc?+FEX+f@Y_%aL#Yv!AVR%+YIq1a(K=vMfXxVy zoe4qu=pCmoZq7b7CAup)c~32s1H?c@3LK)*A(ZGjOX7mfcq{RgZ?^!$g3)mRw?Lhx zH9Eq!2QYuYNCHu4Ui?6GS8Np8XGs`a@_GLztivy02X@1-#utWt$(g9+fs1;Ej~ z)$7+^pw0m>5cu1*clh*)iHQe_6S_9rZ8Y_7z)!**!S6iZ-6J5Kfxk(=dsI$T;ici{ zD5GHgNN22gfEy61THl*UxmYw*#S45YYMtHOwi>OMfifgU_f<6wy+M1#3O)N?1PT&h z=7<|ciw`M#&wd}YbX6rPJ-d;6!h!rK@(Dwy!6IG^24EW@32CXJ^n{XX zexjzZfdK*kH>Ut{Rl?IRhDuF_OfbT76xiT*QM|T)5mz!lp-;xOth8LIkP`2|v_KXl z<_}-wB&7%flP-BVs45~?|KK#(LLP@$HR8w3`p`=+ZdZv&$oemkY*czN7^R&oY?361 zj``ltxe#^=4g3h^9C|FWSxwdNr$B92zrFY4pEd&l)eJ&Vt zND{q^O>1&Hb^bkNJYfCCRVr22ioO%HO1Q zjihzu+;vSV{`EkEA37R;hCEhbEN7^i2@SjpOT9OuW^;(=dY}G-m#R=%Ey+Xq95>C7 zM2M2S0|qLe?L^#fttdiq0{;cw2=OlpCi?a2cB{uOP3+lu57{32Bwmg&(*f;Qx7feu zmFdkCJ|ZEzGK;of816nghWqel*h^e;eWJ09i3uOSdWh#OJEap`|XG z4}fukPut$}#cJ*85wWxT+v#=J1>B3B4kp+G+t1f;Fw!#1k)eARMMNO*=ek5H;kRd} zz*LT^)b&7dt(Yk5XjDyf&VDlmGwW#&FA4?}Bxm2*Z1{f?4G^9Y%-3p-kpklhS6!C%{;v?} zTb~h!`gdDqeN!$V@;ci-=%tLVzmg&jsi%iTQ^mhCWygsni>Oa^o|Nn{o6fR9PS=X^ z;ww(BhJ)#ogg}@ule4p@L3V)pWIH31M7yrKoA3`-2IN`75ivePQCfr$6|9O)nidSY zvd?*Sr>J!cH{_ck=*vmm_!nk#>6g{VpsK1@dGsl+W1{H-U$r?eG($gz;p9`X)c$*u zu%I_8#BZ;VF?+yIg@P|Sq^PH*go43p?i5bVgU!y6_XwyTqk7)=M-2VYhIODs!N{lR z#gZole}b8wK0J%%5-SnVY1tN`TtQIF^!1F>I`e1RTn~$Pj?1dPIM$%9vbwy|+PqZ6 z3Y*gEEqLwAzY%;Dn(9oC(Uv6gD*0+Qx#Qaw4h_q0YN|_x1Rn-Xi-xENB&DRpv<3~2;MQ|Hs-xl4hwuo} zmqn?e)L(jMTF=&+=WR^;eqxJ~dAOShn4d#AECQ6&^FYNOc%*@D?5A+1Wy^}%x&b$o z<-f_Zf2W@oAb)-E{Yb&W)QS|NFh8H&?%p z{TF9sy#st284j)%hm|hHreT$?4;& znjov3$W@D#uJAi-S8lZ08CY)d^gp_L76bCTo(29Gskf4)otm)W#A0CqEg0gN%z!>BBNiwQ44Y8dx0F&)BZKh$5#~6tE1`35)p=Z->7!>3w%Eb>*<|a^* z1Izz#`;-ks5Xi)YQDCGXsqN`zzTEXg^wu7Y7zyd({ft9O>7YL(@JI4KJ`B}>Lhg;a zRobgBIqnF;l9;%-hdtZ&JP;-~8*AJ0Z)wf0WqVloc{?@-0@3yP*Z6;%9}tXUSX6v^ z{c!Tyyy2Q2BF5X#RwL=fV1n7IEK20z1H8Lp__)rj*<5(APfS?m)~nqXec&aV{eSzp z0EPXj1kkmAlmA6#3-y7j9JMnIMOe|qA=I2c11&fqYH z8ZS{?#@3iMN6%&P<9|nHcpVqK%%HY5?ezw-Up|xcFOYC&37choZ7dJbzELJ5i$fxg zUJm+3S>G}WHH|nsnOEJhFO>p}J#s??=eV8zoKEtJd996wxuvtvyhdj9e@B>LtoPRT zmN5Lv^Bi9U-NbUqo)Fu$)5oso#^?IlQE^GBM`Ic;%(A1|{d_F@JDXV^W=-ufT;{f_ zdHt^8g*Tpt%{hPhok&MJbNvz+b3EaguQN7AajI|g5?J-*SFWGOO~5(6+BhQ<1bpm* zdH@^u5-9lc)b{i!;N=;%eH=5QExiPV~W8u#8a3Q1L>#LZd))t zycfd9N!%ilk8P?vob{BUq&)l)Ra{rV>wbQ8l=l%xn=~~sae%jQY;Apzk)dDhFKmIR ztIK;@NlNLMyP0F6Yo-{esw)f4@QjQtClxHr?Qj&&hvgTRCL6YjJrt|!eS3kw;G}Le$sx6b6Nb0<}zgHT}E2`BRp*CYb zjFE-Sqy`!UCKBUsi3XvnIN@9*EWx|ryH-FGKO&&`Y|crP3ZsDVb(~6?=$^Y)mw&*h zZVVYlO;u@;4x5uv#N=y{Bu186(Q5T)i?6VGn)$31?jJsPAl)Dl9$d{MC!0 zmZ2Mk0Ke{K9xJB-~C?( zR_S-S+}6|ibZzRNV?-n*Wc9;t%?Mwo?uT!p_SORy)}IGL$}+mzo?|jvsumQbT+zN( z@%8vn7*^*q^($%YSC{d402Er?Fn*E=yXRubwUHYOzGWn@%zJXfTxqU20$ zACastFRm>Q@w2T!mo_!^RF>A24Ybu$GBe-*aof=$??bHkRCauvno86v5p4R;h55{8 zBQtaBvmt26O~t6Es>JuHWp>s$7@`}76doI@T$E>7dt!!zlK{hoFL}t$IbZMD23Y>u z8O9h;uTZSZta@v!V$SmdcGgcjLfRy|Ze4Yf7YpaE{BsROH#hZPU%lK1=f3!l0o8<` z;?9Al9336M`~F?m7w7poFN0h!IO4^ba3W*}e&|gC#9z@y;H0qPyn<8h zQH1b2h}6((yUBQt=X-QMUfaD=Nh}J$&aXkjR#CR6ug8h$64lSno+1^*7Z9-c#Su0= zR%akJIcd>v(iY=SieJji#iiCnxU&LH*I6XvN_aS!T@kcE*hpaF%dC8aMtz=9#A0~= zIVM6_Ju%#;6^}bDnw^COD;(;`m(xi~Hh~ALfnI>ckWH7ZI2rT9hySQf2WK6SOL3#A z(*73tn%kQ~>^%Z5RO-+X>4IwZ=EawrTd<$Op5KTct6^n0bZbv#MEY-lLd*EMd7;G^as6lCDvNYC{tCBqUdh%)Z%?rKPz$GYdv9 zk&CjV9Y3@xJTkRDJ3X|am^I5EDacg~8BDza;;-o@Yn|hFxKK*;RbhI_Mmle)HmTG8XX%wH}pzP+<&a;y& zz~X|c`J0)Un}r3h66yse8N}*?NO_Zswzi;(7&}T?T@yWj0|cwNxheeck=c=A?38c` z1gnbAI1S3_XKD9)I8gn1IQ937%`lk~l~+5Rx<#L!wcxJRY`nUkKYrM7S}Egq6k0vq zPqj}U4a{c@MJ(pt3MR{!N!mI*EJ7nS=ZQPaEFqCGC#c`L?Hb_@c5`g8 zn@%&oN9?{^H|WuQ@7Yn{c(^CjR=-AgBiLx^iMJX_@J0YnX=L z6J}%_@Uap~Am~BQbp$%ON`w*6J(58@AM3m=!$g30PjQ=;vNco()Hr00QrDy(7)kXK zTYZ_`5o!$dPnYXbWtCR#UTi)ZvPOoLUE+ucV$+V$zT4W$vb3{-83BzywCLqWa7h6lVD!j$z~3 zKsswwyPem&RT(&{jhU$cHYoU6IOn)l4;zZfLvCMnfArf=GUiRUXEioDuUr3DUiYJD zP_??MsGf-@kCCR4nxl<|tjWYwNL*{|ZtU9}oO2&ib~|Jc^hY0gE6q_{FBGZz>iq2L z;?k-j+;q51LA_LU77g}BQ56#FCF{lb|NmW)^OyCa{=0?VPkD_Qmov^LO^X{`8M@^TvkGM zs9g;E5^pQ)c)e%Ib=q#zqf9#@qHR+X*X?Z`=^N`TC^w!PTF#(X&l>-oX;?R1Gc2qX z{*(KY6Z$IQW5m>b^s|gO6|g-)-5}%r5p6t|pZ#ib_`7X>S?@!@KF~^DoWE^|ixd7+ zCc!_VO#Plm8(@K;3iuu1<G#S*JC>MetyPH#{1v^@lo=eu%{$k8|G2%tLm6ehP3uaurC3Nac@bB9 zGlb8dKL-Q`Ud~S^zZJyD$_`^b`~&3+g|dT(++T)33-z*0!rJl(-i!6?aUQu7t+3pL z8L?_#UDfi>BQPeSlm89zYCjERERCTAJ&^p;HrN)4&pI+Qn^92s^O=HvVvLqSLte4% zozL(vEuFf2UH-^r*oc($shRm&yP=}JtEr)t)7#PfUGuUbbrEf-wA=i>_4{RJ)<)ON zjJqYeC<-H54#>Wz({G>Z^=hX=ho`5jyMvV3zP5dXowi)za4fa5?XoPPA@UcK!X5k2 zlhxFOlMe$8v(CM|z|2P+Fw8k{9sGBw+>cWdb8?klb$htnG=~`f3FbF~zGgdMb#k-Q z)BDeFEExWSo_`SZ0zUAM<3aD#wVJA1O5h2O)z*=Rvyy~%AlksR!q?G!p%iqnp^@Q| z($fC!gNI=Sc{yaH*;XC@#sN_40*rdvo~`ept-RYVL0ES4zy3GpW5YkMha3JK#*Pt| zMSsIBCU~!9%*>9!Mf+Y*MmXH0BCV^%pLdv091s41AqeDi{`z#)R)MtS!#t$$=a@c( z9jQGqFhER9tXM3Cce1uIMCOVX_jBQ>MX>}YT6I?3l%{$I%f$4QywY~mahjW3it#y~ zIC};E?-v|CO6^b#+BdnTfjyyI86=18EPv z%2|GXW{@q6zI%W@w+xY9K}c}&1NAtD_tUokY9BbY;__l)j=0kwBOaqxsbu^zky5Ww z)j97aYtGJ=k^G_~boL7XQW#K_V`D+k?CY!GMOj&yzqWeEr&^uBcg?mYji$;hyb-a! z?Oh4^D&Ntlgb@SFY%xn|Y1P281HIZb>w9em6WXxn&6Gj(Y1Xe-+jUR$Rrd*h=fAG! zY0jXT|BLQp(ZP4#{qLUN#(~KytVN`5GbolqR>;^FnM>NSJVw@vviOZ$F@-rc^V4)6 zqV47N-sr!}s7S7d7I;tP!Tt*39};*w-yh&kqawqlBqill$kjv)xjH~ONaq|8I#_ts z&6yfOiHLxJF`|r-?R*h=S3pR)W?yirqF+`Pm7{U^p|=`CdI!T7kQ|M>xP=CeWCfa^JZ#*1qIEiTTQxEXY#5{l7diX#IY>60mq`p zIE<9V_3cc+&WaUB*?)GLfhtk7-SQw8iG`yFc{&&-Iqk!5+z+2N8*DJUCoD!(3oFV- z1_z5vEDsM3#)hcX2{4kAlN1*gl@!#He#c`rup(O8n9S_$B}B#<_x{rLC@+}L_v;`D}`wRN>Lp9joe zw@7E^r*p|Kt84*N2~d)BBXdH%-r#j`s(nqNIGny=d>SM%V{lkLIlZFt4+Z${N0mT9 zbDIGIdzAf`8`Z&nTd+XAsWbDVZK<>KdFYHQ6FqalFELvEBg)R@bNPAFx(MCQSMhUj zy#Io#%9Y%Q>Yc&dsWAddMx}4~?BA4hG?Fw7jHaNL-k_=vi@?$sWhs*TsIbBYRxps- zmGA=&AaR=bX1u-ZzXae8ChoDeEcyAVVC}%>9$$HG6^i)1G%-7y{&dVPnRkHF89hY0 z7eK%pO+jyDV=rB-CJP2s>e-{@8pcCS-NpO&^4a8pOD!d#4 z;fG17?%;52$dp}A9ZpT*2pu68?7mpPc*}=`=CLdr8tBu7ei70H5$zf2>4*frj>Pz> z5%yFB#TUtuY4ccq0{T3-eKDmq2m|sNjOI~j+`~)_g&UBP1YAbY48-Rbh z<5?#ZfCLSRfQlLs7LrFB`-cuzb&+ecLvx3hngo*_ZGNgFtBVBwq~Q(I3NEe!W@$$i zDu2jg1YPj8OMzS36$Lz$?_Ys+?!b?zDP>hKisy{eFyTG&(!(v-h9>jTo|@Kv9mBhAEKqHu#nRq`W*5WvcU~)0gfAKA#SFdDb=gzNg z6(TAtwk|9$H7mDXZZ~~SRwfi336%F?ThxqQScoU*LW$d{>(3FE>#$(BBVNB-a{!0#gk!cbC9=7E~ z)y>-6|HyRFSlQGOA`>e?o0ux2xcS5 zfBq(lsOTJ45K{la7|=cyrYTXKcIDvOiH+njV>Yw&PEs#)zTocR3C!&fBO#5Yecg}t zM_UW5lP4$IrcgH(-83|cgHL1DCDVc(x&DXucsV0m@-a}zO(I>T%@xG2Q1f7M@NS2* zaB@8YJ|_P^2MIqpb!i5sL?-SvFP6fXMS3LTZT6x0y!Aa1bt=dw$%OTV8W9= z7AcZbRLq;+dc5t|Ye^q(D$c0E{QkfXE(0beCU6+o87QvmxVX3gh(KAxS}_Wj&gbjg zytJmn{1iG|W%|QDOEA7AyXqnxj9O(&HfO z7l!D=d%NJE?wimP^4`9QM0UbWzzU4V&8fwSZiw)NPHA~wp)r@XPgscifp&9mwZy*K zoKN3E++rhYD{YKiZ0zj(L+f^UxjM8zG~SVxCKf9;Q-+t;U; zq|C}iR%#MkjpUbM)X(qLmxiD8K78&h%d*00T&QVpuvMn5Oo(mcrDHW)uKi$BkBFu1 z`MCRI@$I(47$^y;by5G_pnEqGmD^G zmL5w{S(IF>Xf-i2Db=NmgWGL+AcNqpO*o3{Nn8haDe?IMaZ={7eD}}DI2~ejT|+$% z9i0pohL(jcVYNrZX#XK|8J3AD_rRO(i&-OjPU#ZSzH2l+@d43yviGk72U zixjBwGY5I3@Fe>58LtzdOSpxmf1{8{qrTZ`$J@7Gs# z!NCZy*dvev+N<^28>ljqA7e@Ju&Hz4eNNwwhYG&SMaxCXlu8h@@K8$dY|(Ix152Az z5HxmuMP6G`Z7C^3MP0ekaevn-v4)2JH*K-UVVq<4G;$x=9)I%{4HXXdo7x6cr?N4f z1pi3HSt`!J1Pc=r1M%zO;bCg(FUBU${_;maA^t5EReWlLnt4aQ?-}F{>yfT{x zhxH0$BPM|`y(sjU%!FT)ucZ%z;Q{#}T2O}OJv2QT*>>8NY^zVaWTR!dE7m?@z-chEu*48BmK7ETlaNVAZbjmJ7#LLcV&9!rR^8$p+>_Px z23(q_cK5OR)1H(d_~r#i2UZRT=UOY@y_;Jl6>i@iTz`sm6?ysi*w~bqGavj! z70p^w3U0l%RZ*0S3BI)Bb0YAG6KQ!|o}=?UxUV~Me2S;etgU?y0S)r)a~r)gR|Zl^ zedC5i1#yGdktnUQgpg6ayu747J;T<#AIkVI?Lv47rcr=B^6%d^SJy{kd#kgn>S{Yx z0!mm|(YZM`*^D(Z3x8Hpqo z_pTku44E`$&t=MtZ^^8?fUcIpdFlU0I~k%BNU`n19i~{47-kn#J_W`q%6*+fLZuBP zW)3Ojyi7U!?VFfFdQ8sxZmF>cOB$L?_W8af94EJREFNu3#kbM1CS$ zLR+DLxEz$MpNW&0!;_)|OzZz8h&r#i{wMghPiyhDqavGh{El|>34Tde3I&o0Lyf(5 zwH{epdoA2-xwjpqi1QDF?~;X~{*;3$b&ZGSVgHcsVH4W#JB=Dd+JdE}M4vq<7837}|`-#j)1z4GtcVOaIOj9O&)M%QMWSDCnAjXgC^< zKghzU2c_(yx|q6=m$t9)G|dkcWu=^|tGcJVC8=8y&{XVIR^X?R;JX$X?Z?fcMO z7gIcTz{phJiAf~rpFpPq`V}ee0s>jkwR7(o7}EN4cN{CRtk$Oy{Vq#9iw@-d`qi^L z0P(+ACcwl;VuIMRYCg;d0YIULpZ+Pib~}e!X#RL5Wm1MEI`#XraIl5&4u2?qvEs+C zpDxVP@oSS(2@jv`uhlQw`3CbFW~2gE{o^w`Q8d4?U$L3H@Dy-nYAA|*q6jTls5`c; zm8VUxR9ntmA3l{kre0|ZbR3!JDxk|$m+|=I!2?Pox{_8o9P7heD2@OT3)$Vi-TC9( zH2w=7l;3T4i`NVL>Gzw@M2x4TFH*NrGUcVkaP!eJuPf^-KQxq+-eV;-eXh#SwrK3g zXeT;4)>76`R9CGm&ayJ8B=T7bzN^v8EXvC&*W29);xoZkgjA1?O<-b(a*jhx$T$EA zG{vPO5<0k_a9O<5-&&i(pmBfw3KW}ovRHd@^}yvQVI=6n7v;pA^Zh!4x^@`VbMx~II@%DyiUsodC@QwTL3&dJD{mO0bNeq$L4jf3}X{k%&iwtTkf@CbkI0M z&u}s$lO>IggyP2^vt4W{X)iX*R%s27p7*-npbL~cjU5Y%w&Wf$BZ8tfE zuHY)i;s=@VV^GQ!!+&z|(X$(68VJYYF#Bq_KWPmii|nc$8{<$i^L;CB0?t(*Pfx5cM zl4r0#{-!prc6JA_(b)(~K2W!59pfJ#m1rvLJ3Q^l;&xnqWOHMwcN|&W4Yr;=kZcrCgO;72dffZsDG+m6p-`+IV z*Lt`Xd*>*o2F&>jJ2+d7S3|t@MVqD1hf)pI_qRZcM{_Ux;_7C@oSk*NdF?>zy{Ej+ z<*-lQiTyUK5Q9#H>$gNx6QiLY&l{pZN8`Va*0LlKWMgd-A2>RKRM3nl#fhFz`102u z?dy*FI?qEi^xX;(()|iDgWGo9!jxD{|5i7t0nTRJDl;C7_wL>vY0?39$;twwOUlv5 zN6=dYFkrCRK`P;o+-2MT2JrVD_ zLtgKW$&1RyP9KCIE@1#^W96iJY1-H3yq(Rse$Yh@tua?zzAwy)ba>qR6!mhQg#%7I z9C9!wL)ppCrzk)w9QT9k{65>OP1oSJ@QL!3 zu##X`@32Z8qmCM>o#$`#yiUk}3aZT92#=f9=CFQ@EL9wa+8;uuR7`n!+_c!cx>R;O zitNcYH7HBL!@(JX?mdxT8}lp6vaqz7(t^5+q{~M9gr#U2IkG2hyANR zNevAR+1S{436Uaa;nU|+4L(~h1LcdM28*|rvgm%WB4D@ru4fZV`cS&L{`?} zPzulygeqIPV}MUk^ekUo6hs?$*6K&YNvpGVsoG%x`%0jj)&_R+IyL z9q0oP=Nz@>E^msGBN1aBF$4V`)tmSC-b%+zW9e7wtruY$%c$tkv*l>#S^`Kmx`Zla+~sBvF}ej?4d}XWR_C9U+|w}`x-0uO9(q=uK73UiUMu53JNu;{Bj*=cM)~mx5WQKc z&$Zh2B&?-pCG5=^<|&&NEn#j}g&#NB<04MJzh!2n*Tm?&4MfJBNNLao2qwl7K+i}t z-bmX0QMz!M9|gDjy>~Q6vTrNT4{_DN8F=ilm{i764GzN3%tWdL~qaKKR7>5JR&&wGWE{pcg3oB#gnzafZK(EeiNi zC}k}4Y_!Z!0>}a7jEXGc@N{UG_sD(|mDlU8_IO#5kme^-Q&lqsa^6=%l-~c2b&eft zi;rdT&HH3s(!i*}U$9u{-QMTJSqQrlYsRB7by9|8P|YiKEvN{qeGOzUzUs{;PrzMa zQ~1>B(s4Chl1J4B2A>nW!ulN-S0i8)x{Oct9q840i9mSScGTCq-Y|yNtKk5SMLl8= zFLx(S^er$z2K>r3QgTd<*eBJ4+kX5+?V7}{m5sP*@NZ`=poIblV9HYO3%5npin`Aa z+)^#T1REP0t47q&t>gH%`CF6Q_k=p-Ii!oD=^pTTRpcy&uNv~zFnEmdn$mNO;q1b0vkY}* zX1c!=YNJerP8GUWWJl?bI4wo^?)+XtP_x?&VIf~-&=>13IW6^94{YM>0w@N@+BNJv zY+uPu5xJ=Y%0?mx9@R-wc*~cR_CjKJNB*n>XB<1JjDNJiaAKLHT>iI|*ASM%0-1C;z$js<{V*axz)WYO@4&LdB}nVrNvBPK z@R%j|y|?sdOoIgNR$1M<>rQb)BOm0Q-JslHXlphz@*90_qwoF}t4W`#mOYpo|NWPL zz&6pn?qC3yi7v-|xPx!ih`I3-em>pfN+%VBIe|;?YOd&9soEFt z@7gkJ1s9lRiMSOi$qy(A38SDDH5zNlTK0ur0mk>^k~%DR$;ERGY70DD-7 z#zIr9)Q2~awotDKJB6@2+0;oI0V`X#Ce@;?LtHT?Tm0eZzi@7->a1VsZbwB0sdh-I zs8$eRjldVhDYRDJa`%+-=7tOmA#0bD(BA*8AwiU>@SDfO)UUVK!5O))*VDi=bvJx` z-gf{k8dsKaqk&nqAS~rGTzU{JQ{~8j1?G$5G7d2<$eD*q~mc6wwqOXiY=YE zP~Hrg*2n==P+1B|kZSef$kc4GV-_7A0qn)f^2(Ldq|}}cz-eorotx%|ZE11@@>jMh zyggq5;~h1#YYfCi?f$nCxw@N{#sWwQLZ|3ca2M{9!QZEQK_+xdz;CU2Y-@G?7m@Dq zTo&SkkMK4$z+$KfHJ#`7{0t9a4vL4Sx7TOy%P^fuytU+WzA)JY%Xf3iB@)B2x=!`- z_;Kytr_GVg&B@c#Kkt&0%^q8+&5?#_H{iI12+`lVvW{I^1 zhX5O{g~zJnd5ALIx9DoV^P}|`7o{BUD{EqZi@m|yg+I0K$G0?Y!)9(m8~t|Z^=O!j z2)L&Eba-#4s|j@84c$M*r*#7j_c7F+@3KmCwzjtiYDS~zUXjLXhtZ9X&(zna=CyS+ zey9OUoqSR9&wp*6>X;W4X3xz{W*&9RCKJu&so`Mnyjpj@UN=<%T}?ezj{C}L9@g-g zoE+fsIxdBh@_EmXem6Cnb}6akXEft)xpgB_+VFyP&wsJl-5{{E^FOa-2Y};&0dX_F z^#g69(+YjV+v#`afH)Gd`@8)J{1~2 zr&AN^1wue{mod+b>K+fs*3#rhaUg?5Z8B}r9Osw*=y>%3ZNmdNva;-iCOVm-QG@*} ztDtQY+=2zi1mK1{YeUXGKiBtXI-OeAa5C2lvYW00c*5gJ%|yEQtE&qFOBlyY@*fxX zk;clu!0^x-EK~X$vMql%GnOYnL%uerwY9W0J2(3$Y~uX%^z7fihFtcV6OsiU(3ZIG z-Z}MdiqE`1ss1YUJF7ahD2ps^JFZ_(Xopnh^*@H#wtcA?S8r^qAHg0HbKCz z;;aBWg96x_C)Qvr{VhBg(_f9*(bH(74h#Qw`!il1Tqggk4}Vo6u3{+9aNeB#Cjlqm z8@RNrjEA}y3)wd_6+PCJSBJ~zT2lP$_p>rZLEgw{oRmZN0T8CFqyNiFl?BW6jhR9nm<@3)C~^Q z+>8hds;pvZFQB?)X43&-3*N8S8C=@W`yHze+hZpUYaaM!)U^?0siz=h%x$ZR60-S^ zPHN|Czqz#+<7LnN`twGtT)te|(@-2Wk$o!D_RQlo9vp0-h=>S1=$R(0ncn^z4T5dI z{vS=dBvB6*8;jE(g=jT$ok-pDTGN?02B6l zx5Wju7yh$cdQ(~bM`1U0L8{YbU&q^ZMg{DWuHgwWzW4*^j9YI25L603u+KJao3%0WVJr9b%uXns(~}pz3DHSkI!O9Rzz8?icQK@@>c|Uih(MJ_BjiV3_ya z(g_%e9l^ARq7c7F|9TSzOr_J{$k1)LCyW=O#9+l_mmLd+K?MWi+)RJl6N_nX64PmJ z9Fd-o>1EF2tjOduAPMZuT!=jiQ?h$}V{3#ozj{JIMEWKzd3xvK>ERhYHeKwZRo^)H zzCZ`$A;x@#OolB~k1@0!r`?6#3`RpR-K-b~@~^ICQ9P}iU!az~?|Az)G>@7HtR5zlC={?PGqWa@pr6hS)tR|M&sY!fEfu zroV@^CbcvMLia4uwPndj?%ih5R7p9(H`}GHKh0H)x1Ch;|F=am$*E+PXZt3=ZWF#q zM+PJpv>wCwf}8J0KxJQFYD477n&dkgRx^XG3G?2%`7i;roefx0kh}-$-&;cGRaiyXCEzH>q26QEScW&4!P$r;yXPi!qI74QpW^j{I zVbYzf5+6egKCF&ftDRUCOr^cWAW`4QRIINq*0P#P0w##-5|X-r>2RlqIOVD8-=(#x z`7&Y%dw~QD#>h8N#Tzv1ts|@9=8FPAXj2+=npi*cd^nHloO!+7 znK_Z;zeSZ7r?ucAsO|+tj^N;AFunY>PDXjOiPto}XD#)6me^ zvP!+!1+~4aCza>r;HzsgGMZH9xQP8?mN;>x71wSLD;cy&?QhN30E^oA-fb`{rLXMI zed&Zo7i==ch(_YwN7#Ti-{4>5v)zKXv6J|y^|t1I?*Ah21pI;5DeIax(~^|e_EulU zJa@>&Q-Uk0?c*+Fk-IFwf-8!XCi+VS3O@DlLcuC_VJeEM!$iFDoDF+F-Kxx*InUn? zu9Q^mIHromN-7E(?yqd9i}07aR#NHy!|Wf{NL!(v9e5#UaWOF{DWRYk;(My(} zr?#}I2$?Hc${89r{J_n%1-7(JcgyA#|K0XhjgaKnsx8Nn9a#Z)l<-d1mOhB-Yz)>I~w!pXL|1O7A*-A-(3+jKSMD@X28^vX8;g*@1BUzUn1u zjdzii>}?kktfj{#*?R2-Vi)(Tj(2Kj zyt)X#*Fi9eeSuaR5)RKxtf_6I!$+s6r$ASJ+651%?nPf4xA-idEpAvDwl%sxhB2T_ zpJXN2+TY*8!y*me=^heQnyj(RG=Z~8&*9<#@ z8Z&6AjP_Obmww2ZZ+J5fV7Eb#HvY9WLboNrH?7{T=0`{?7ZSBlVthO~3Xx=A>o$E{ zLvdXlj%8ob%0a%-&s3T`f8MYCes$K^)ztPe3imxPfJB``mIKV`PgxenEoo1OmZyaD zWhELb^A%?&j*gFCoVQ27qBt`Kk~&Kw@TfRZYvj0}_)mDp%PxaML_>ZP-cl)P6zpl_ zIL*d(mpPO9D#qS_v>%gM)m_7;)@1$PrbT?(xV*eaiy*Gl=UqUk+YtGm|5oP2`2Usn zw)a~1yf>ZeM9=%%q!!%`hzxB|#=_v6nQ5s==^d`(1TwvPI5NFg1G-4Z7QCd#eoEsf z=hVHUISv)$NR|*3^kqJnUZ%m!-e8VVRm*t4EX6~2om`lfWC-j&Wl0Oa-f^FPtuCq= z-GOz**a`hvW&e}s?LVOV(rNQmEpmkt$<#_EU%xP!kyGC)uTr^C8>8)($R8h6Q$bA` zWxwLuPc&vd@@%x^^k2yFKM^e@vM8^U@bX^4ufxxHxy;J*|K<{9sm@%3S){a?NKx)* z_tZH)ck?WnWNOB2B_}Hj_|@k#sW@yA1xNe%hfrC}$dFB*1P2zaRJ|@#FjS~`4$^-9 zZ-j*qJ8Z#7MGCGkWdur;fU!6~;mIlfCjzL+@1pM93#hlZ6;|ib&^X*1rw!|otiujD zTRcdIw};|24nv$Czz$qrTgz#fyIMH_d^}Sq+opVae~lDY4k`GRVeg<4Jz~3F!O5nP zOjglR(kCIM(q;u$t>vEfB{Ao}7Ubn+RwvbIctY;ql4%%>sj@{uo!*fp_n64ZCxu&$kXXM1`Pksye5LY^#dSZIVxN!ua5CYpKL+Dm? zh9V`tP#pFb-``u?+A>)KM%cbdIbQGM^D}-mb&$mNLQ1(}J1SY{apBN(Tpl^%aVuUM z(Ibj>TbvvlQ^xK$&#rj{mrwNn7Bf}&k8VYOq}qjAsV13~+0}BYjr8tLr!dvYCoK!G zb9sS+kMPw$N3(lxbVTMWO|&uNZXg*$a?)bBc2C`g%55XW`ZVA3C~?B2Hoi-F)HwHX z=?500xcGQqU8%&q&%`!l^Yq?)7P64(0aU(eEIp@oINdJ=2=(U6yiHBV#(Re_NaHfUolF}c|xe3XGhaK9(n=ZokPUk7CGqlM9wf74?9omw%`tp0HwLtf#qv~!>cx1b3hQFk;!vGiAU*Q>BUxz0;!^IRr`h+j+j&PinaubT^yyPz^t-XNjIJv4$=#_ zhiWFNm<1@LF$CGqt@9T5p^&f!_mwk46F5V@jL3X5zU5UDnePED z7X;lC!I6=Xdz*)B@oxJFalRH(Y7+-=RWb0i+BqM!wSV&ec6U7pBgR)0l#p2Lf+uvk z=vwF5@Htm4^_8RN&FH^ORuPkqsVmr!PH~PmxG^%;BrHG zUa%~Rh5P;Tv>a?mHBmdTAaysyG@g6bwljW=^-KzfpYI)Z5T$}YGhGlLKO0KXbB+xt zp>92*SpgjuHYR4*F?64s%SPCM*toBWK>NgBx`tc`+0EDl6ty0e(3Dap8B{YYAFX;e z<-^;L@E)~On0bfx>3ig+YsYJ}Z|zT&111qGBY~~#{eUKa7DAamI6j{5-NhuvWD&cG z@&mYlqya2!a8MOs)T*b1R)BBifx!g*gjRhxL27r9L*dfEW%kv2Fo*`J8W#Q+Xwcwm zS}^`u)9b21iS0|y;6J{{E#&~`#&N&t=)6Q)^40(#;(;l!@E=nJxOo@Fe9Go@`?cUI z0sl$5-;f&o%>C{9h0TaxVQfSF)*~#o-2$j?0oKxAxbOnn^WO=x&WItlK~0nC1XKOg z;|%a6-P!U&)612T!eF|8N4pezs3V{tzzU0Xm8H~#fyY1*>2B6G5F;-JYGw+V#EaOB z7m-jORx;Y+-P@Y0>{zw6*3gi^wJ4P~QHW8G{cGx{%t!OCnfKkpEdH$1v)=@xyR(<$ z*@U6}Pv+v410P|BdCGpvM8+>_LE|{elTm%qMx48)zDAQG_}omRsp;6yMhPSXqyw~8k;2xri0#*QapWsR$fVk}H9*zg>9SIkpRUVCz7 zlKnRhOFM~@ORZLS6WlKL2PD5vYZlsNWY}F#+xGeRK5OEgn!9_Ygsm%dKeiK$xV|DK-SdZ(TAL3Zh( zY?zTABHjOJ)KkT)Pt`Z?m3;!Egs{~ee*}8I^j^$oZXBr#&Na?V*z2czcoiZMG0HDO zr}sL-gHw9GrM4-Qr?&Yl#|r!OgCsI*(2Oa)JN=#k00%% zq>#3lJfCjB`e=btF0#AY;^%GgHzTsEX4;3z-+<`LLUgEjn44U88#YPFNKZ#+A+Fhx z5-T{O;rX=#hIx>y}oO={q==Yv-_{p(v-6miZ)ewHDzfqF4bvj}QLI z$7-Ymw=qH95S1-fa_YWVk|t-#g#<2-IJOw=whE59sCkM}4+FKUNZzZ#|5luRcse3% z<6~<5$i>;sp~W@V+MS%w!^KA+xLNrYwH8|ShqAmHTeakrlY(zT0<$De6aGiqbE?~j zI|rB2FnyJ00au5#LQ)Rh)TjrpZ@8l={7~ZVCoT70&*$zwHYhO9XTI=+jc?A2O;iHc z>YoFopHFMfolWZhJwk~Pb}q-#oGV@_5DJBa`J^Id=fa$Kp6{)TjkE${;R9g-!LctdV z!AZSpvEm+)0|C{L5Y* zMtMt3O$9JLcml;eZfkLuI!X;;rkeT*w_j0TSNEHFz2kgSske)PR1Z*YCRx`(7UbZd zM7osIIpNTq)~uP8g@Tr2Q2p?}t%bEE^r#@0D5q1I)&S0H0Ed}FgL1m8;jpP>Bu!h{ z^qdULD(X&dAF+jz&%5n8#0_@+<(qRNxAy|I3!mJPt7~h&F54XG+e1{K6p8eQ_Z{}~ zeSP{RPH2A<^^JS8m-frs4A@b`$Hx>U``pm2q6p+@D9Z;si&Oq?XjLYEO$}_eARze> z@qSs*tcW+kGV*#}VmWa6a-C|ter6agTzo_HLrNfv*{G$yMY2!n(uWYzxwl6n`_lJW} zOzkFyQMn#u+n;1>f~SsCtjk7&x+Tz{X9y5`&UngwjjF`M#| zh|*WrNI-S-5kHxGIa47GNSRCu7#dxLG(9wBEWFn2w8b}y_J6RFR`e_!@O)vm4@sW( zY{jJH#gXE8YJ5#SzozkC$-XpN3)6O(5(S+jf-e-29TuY*I-&wzxo7QBk_zF{sz zTi+qXw0?NM*bU7x-NmsHh&wL={cDq~jE;8X%Y`V`C8ZC)_y)pUe$QXdiP2FQ??yzt z?d|PH4aR_hZ3N*BoLVW`2JT&1C^>`E1)+C~LeNm=s~J%Sb3aTdIbzI4$Lcx z*k(bKH$Q@T!pEB>mi2wEwe!lV-h5Dx|WuPN_BQqmElbP7?2iKP1$z&k|Z6frB-Owpshk*a+d2XjFodw zVMx0fgG&;OF4d)IoShnLM^FO$zsnkta%eR9TeNGoa2qbDlENZ>vOZFS6 zs(HK#BX4fdNSbJ(K@|G-K2e=apOb7;Q$A*Z!WsJh{Zx3Dm$Ra>i9FA1fc4()u5C6r5JcDk|9Y9xxvrIsMDn~w5TM66wX#oP#4u@gHA=MIcE!=YjG-K4O&^g1Cp;}Z> zD5Z>}+?$1I+)A!8dUuZENNR09TDo*;bab@8zdr<(ztv2^38<*JZiuTzUH*9KYYK5vrghdwS7Xe~J0~-eV;99-wI=eboujL57LF#xym7(V? z0JrGKDAY;1Og*R!U{bNQguzenNVO|#*y%^B+{g2c8!dQHSB~PP;LD#^*Kw-7) zY0|>DGiU&^(G=WYCOE#}lv&@pZL_ENuh%cv;;LkApux4w#2sX{V+TnfRB$A%GRtDg z{rh@)c}M=sJEkm6ZEbEt%}h;B3kgC)EC9i_ZQ0(}(+|FZX{e%*H`togRS-;O0UnzU zqKOjY6Zi@KD}VyuXdXc|lrFoo?&n&K>^U!ltQQil;fZAUq(s z!mMa{MP!(_o6&>a$TrRzrO$$k8c^9yg+AlVZx2g2{DpFe||(4>!iOqH?sNT3A@fh-Q|Tt*O@CI1z{8Tn_vKJ%utUUu&zo zspu*<9Brhvtny$Zqnm*yz-Q1Qhdc(PNI^pqLK?w2-?Ej78)^Z3F&IG)bQ#U>{FiY7 zxG^fZ$arU9DqW9ESiFlOZg?>B15x{kI`VViiL_DvgvU@VKbk_Gv3`DjAt52WPOrN; zs%6J&zz01maB)CVLL!5gp$7ypV0liS2b6%ZtX1KLOK|KcSw7PZb*l zw(}UkU}|y-uO{0R_XH?_ag{s<%mF2S9hLM4M_1yrkb7Bb}Xptx=`VH zJRTCV~8#<@9k_xP~TIMVj~=*}jH|Iy$0CSZ7JXkzq%#DJcO!jK!(P4F>gB ze1S2=h?5N#G-jZwbSx;xO;S=)pfOrcK5)F3} zKa?o)W$@4{D9N2(b20J^DPk1JG{hL;gfYlPAVtP!pa6ow&Ul1+f#=NEvZRT8$_Oci zQ9xSmZbCoV+re$nO!*=px+te$8p^3$1Vtcuczzu~Q>H$MqKcvOB+?>ft>SrPB!`@s zm0J~!ZFxfHTC)aAX*7C`*5hw^I}i+5(2{{@Dnpxd=n%gJgz~b$5x)Y_<*&RYUCi#J zD`tgrY_PS86_ttcNeOYlc(sgapxIbE zx8;V+GV}|-0{nu*F;UUnpWou`AdLVfKSASwa^9?uJHntw+)?;G+?ZB%%yI7PyA^DA zzL}b7-r9%|eT~pEZPDhEJsFn8?xek%-=i6s#W9pmKo%a$5@uN_)t+BurEmB4Wwl@* z7H8RFr9XlX3|MK7hHR35TVG&gF|_%b&_=y1YA0hpV8ytTb1z3w4qBzSMTMVRb!_o} zg-B?H&d2M|>uJnItx9lIRRZA#51{JIh$7g+vjL>2B#b*IZh(Tho*hO3Thl;5<{3N8 z?8~xq*d1$IRu<2!hhdZYDQ$&^RLk(w!cQchi?aIxGC%~cuSku#bLXNP=H=yS5t(P> zI^-=jI)?EM#sYDSQwA@O$7qFq07t+YxCG|#v~sl-bW0)9q{B}$Suo;cv{e2yQ4VKy zc*|Da4m9AU05^M0WffD{BUnmS5fvJ~}mX;N}%a2RSSlx)++&92JXHx{yK^%HOdwZLJ>As|MJ(KR%e<|A1V zmDu)k=YN-%+R6wY@pv=^4}%OyH+L3LJQhW-@?u0z14RC8s=i87%ac=e#%Ut0Qc0N- zfk*HVa+;9|7a6t;ei|>{;s|Eb-tF=Gzq4{7M>Q>UBIjc;oJ8&P{PJy9 z8d&fX-o^0en71q!!Ir>_4*(-*WQ-9oO}1#j1f~Js01y=R&QaC?@kt&}Ld*L?=T!ei zoKVQ7AT{Z0dy+SaqKtD~j0WmRJ(x*?EI z-%t~J$!E<6p)6cMG@wE7A9sb>}LD_SQ4pyd&&W2jHr>5+=~69rGq-By^`=?yuAlB+Oa00>pE>LE z^fV(hOr2=+ju9v0&x)X=mjMvqMdBgjgO(m->0-*0{f&>10lvvOfFM&pC;>!(ji7`U z0uT>*IH(eYL7Cy3`5g&ufEtE5eyQ$~%gA$_+!z)(DK%j^`DS>ZGKk?Cfm*3J}wRCi1V)`^d=1pr9bQR%d%h*P2d1 z3e*{5tN1TiH`Ld^X=uY1fXEH_0)@DPiV?`$gnKGq2Qz}4Pb|V$ah-DB zQP#hc>V#o&8_4f{pg>0&D2iLL%TwVdKHZCTXzGE6fkES01D<&q$Hr)sG z0i^UD6Tyx(P&cERtczTcPl!qwjOCCv`l8LG5^O|E(+a(yz+t)@a!#L$?ji>AlUEW; z`YSFjE-)|o$IZd!kUF%%-KKfmC3! z@_zWZF$;CI+QP&Qb|LLN7~jv$&E;K$uQV$OffpQ(LSzcjlw4u3IDOZW?Y{0m&3u&W3mX;9}=Fg}HZM5Xdf2FUP z=c;!xR5{W$-AM1|U1)8&i|>fYb1ikF%K=CmrL~zvm`aqM(YgPott(2)qavcSGjqVS zzMg*YZJZSZRU7~zofyyc-P{2{LmTC`rgehYv?N51=?RGA2zo;lVdGj><_jpQ@@)g( zcq(3>qjQHbtT8^zonGfs!I4~vXm&a`IXO8jER4BKZkF_m9K|)+DH#;!OcRhg5qKG1 zj0Bn?ZZ{%*wdOVJKEaxRNa2A>?_dj{K7k~Xd^(hw%a+SEE`*cfY;-r{4wTUSkJcJgerijU?zG5u&KBwer`u%y%BqtY0A<@`7+YWH|5tMZy9AWM3{MUaBuPA z#S8~vDla>ya9Lh`)ylfc>YDP(RV!;7YwFgo?%ck4>-J4swhwP+-#oaXd(B$DQ=DIb z3TFQB=1(Ofw$h4PRT}yJDTqv_b!m%wO;!F?M8=Kl@nkl}mQOtc*;0FDa_Ln}T zzVjlRkEsn%q9q|wPEfr204_%L78jO8N5-I&f@vU|qNv8vMxFW~>$+rT;|}y%d~959 z&N8}8G>o0=w2an9VP$+19HXO|#lSkbXIpU=dY0Fx@nMqE1-$hv%&PBILJizB%d358 z9E2({F)<`01hA6MVzq&oh2^%yT%foW*+mf~KR-X1ycSr!ZYSS3TD9ei9(Q@wz>92h zi;@!>V1@yooQ7lWiDm?c|>)~~dl57hMk>r?| z7?ekDJv^ufY3FzkZm4`O4+Bd2rYLa=k$@cny`276G^LcH=&#u*U-pj z*-Ce;rMk;@$R64RQVp-j$;w6`m28JO7yLoR&^jjnRb?g6hNE0_y+MxrsF)|O!!SgK zt;nyDPvz9LA`y!F=D%PRnY3m}j}0+)?-m%}{)qUu0;5|LAe@A*a8T z6F?h1sFfgoNU>wwmLnh0HT)H`0}o)qp8T{H(*-F)Az`vaR}-$%3-CjHS#i55DJh7$ zY^Pe*kr$$}H~1thvaw@^4jzWNRRt9IU5h4GETLXRN4Dvgl(QFY?m>wHVQmC0G;FD<{mY3~fck$X=v856WvQVumzw+oYr< zg_J_%pmx$#5hU}R6d^I=hDN` zr=ia_QV zJ2N<6R+NGKC@k%^!iBhrvW3W(3=YFl)_!;kV`Sb8*@{vrAp;8NExc24fr6|3JSrv>S|ZQ)8JjbJ?lZFtju)q4NMCS z30k;dUQpoTrArdwa$sO}RRtdbaUsEh?4TU@wsFH?{_@;_#eT6dQNSZ82dN7V3IOZ0 zB1{vhuBF=FX@}ZcWq0JUP4P6>=+O*ZjElyU`BCv-mcLZv(d$}ZtGfINtt1CFe%G7Q z$La{{3FQXNcX(8hVK$mw@hJ>&*c4YREwhZ|-W(dH%`wtxXTS|&EH5w3Ym9mkHiaPz z(>Reami7q=389zi8d(|zZi+y($}D!B{;-XyVC-__BO)D~Hz}by#W9?oejE_PgeZl+>B~E4~ zrr9+M)6_ydTLti1Q*} z8YE4rv{tuwpmi!Ug95tcR*KfvwRRofK{7R(^9&KSS|Aqcrjolwn+yLpe#57ex_X+(Eq2f{(nu zItu59@XVh-pQHSN4cts8mHMV~LcA25T&kZp#7q-6S9ln$G}#p|vPqcr;-;bS69AV_ zi~!dKu#5=qCbNc;)CtmMuaFmq%1LP1eW%DKv=p+5j*9+qXXXO9y8NqmBinzudxO~# z3EGo3q)9bdC@|Ap1QkLqKSOygA#awu(i=zM&G90<60gui$)Hfq{P6Jb;NW29;*^vW zSQ9A6xZn%ipF8kZDs&}xT#l*_$QNV>b1-M)u%Zr?>s3JkJMwY4>2L@82cU2*P0h+~ zEq7TF$EsfpXpJ*EKaZl$92PY_mR_368C-u3X!>8d&2z zd1+E}(<+cqDczJxqS)PdBp!?wGm>l;LJMj$XfmubyO649D%Qi+n!VqbOOJp^8Rrz` zs=^1L2imdH8qiAZ?xqx)be~eDc+ChRLV66oApKM>sak5WwQ}(yZ*o+c7isbL_eZ-_ z3R6pr&-?0c)qThkLWTN9PpNEy5jOJ#qs2sYEwaokytHeI5e%9<+ARarQhS&&#W zAJMiZUCPgc3^TIix#2Ud``G0)|8fV$4)>QBD``(`Y%H?JiGGgr(9lpsmoFf4V&FUj z3doKS&em3C@D|?MT3$z6J5}BP z{`97@ZXs7ZKa;N#dgxX@NjUj=5D7FxCv99+Uyz>{5grPrE%sjo6NAx#U?3Zi1()k+ zZ-u;ZMf^=z$KOUph682G^Oj|2WuTCvigH{2ithvUGD4~-v!0M{0%y$dRl?JGw%v1O&T=o0z9uT;v&| zO2oRY6*u%r9;k(NL;@WXAyI-R@gk+b;u(N?WC=k+uH?XPqH88EDVsco6nS|cc~{VU z^52?QlJaG#1w?TLeWH9et()ma;z6_UWgZoRjR?`C<7lJ0qW{VvQv%QL(#{M|Spckf z&~7KRu{Hz=VNlo_P=iPW1qFqLg())_D5uPamOhAXV!jrvnUm*e4_>>!e8ZUO_zAE} zMtexLG)h?{#E}XL3iz!ccjIA{Yf;_;^si-D^5!XZ7{%a_{LQqc&pCU~`fg>q;HZ>h zovYU&bbN^nwZi>jL= zySMD~N>9W`W`r^SK(i2TCK zuc^nI&eUtRwZ%tTPs*BB0A;%5J_^|oCAL6R11Nr-mkoC}h#7DZGqQ2cEXfJN#*4^m zXVJ=vixEJH3aV6xoM~+qFj8mDXv=D9Qa!dAVN5afhK_pIpk*20?EqTeYolLwgNmq(8X|$-ry*G2?c}>WI4eXeYqSrf7=p^Pqhl(#D8~mYnZQaLZNRISu+*~Y+6N^CMZ-sAKL)TKZ zenn(Y8m?j}80kDPqQ(3Rnc*BjQ|@%RA6p(j8K$&$FH@xOO|CnZC*O-~J2I1unC85- z1(keHMWro#%nN;H-qGJ$#{M{W1OLb2Y+6dz!l>flY-U$6;ZZLj z%m~A*S+hVbIoT?vQsh}iCwW1`vKB91OsguZ7>%rX*_3^+1M23Hii(C6$lL7MvzcBI zIZeUpzMXCgXMnJQsNgM#p){47{(ZBwx{$H*vK2)Ih2UFNMP+WzvcmiVbW%4kXS1UJ z6&2t<8)Z4(z# zVH#$fygY~3X=#I_4EQRT$Y4~suF~I06IV(oxtu8lfrh7Op$5@7BgpC?C`-1CeoDP= zPJkvD<^se6Yw<{~bh24lGF~keX_hvX`_VoM0Nj$YiQ4UP=};7P4t!OP)UhLt(5pXhj@P>tdzFB`Opml2%<= zWyL!bXRXxtO5N{7M7n}){w*>%^NY%8tvt6{Kjk%r@HRHhQe=6tthk9~ysWQ-%vFI) zOOg`8!$LT&tgZyCzAUoA(2^44K{jqUG}u49aY(y`or;Rc)TWA8S_oiLki#1&raAV?q9uS;$})@0 z@~%}W2aDqCmF`ahX)Cr~(}%sw=!j0EuNEj_$fk84&1=@trkswm@rTly)mGypzlH<1 zRgIoy%a%#brEH2(@Ur4>vLq|aSz3Vp3yB5UI9e7{3-I}-1a)rO`EJE(l~Ex(Gb<<{ zFd{6R21HtHc$(dkjd@UJYHmxLGhd)iGHNWbtulYAsl5hR%LYcrg@=dx`}@-=TJhwf zU~?>FQ(A1k!<>kgk(rsvGi)9yJ;NQO3`&`DltDKU$I7Z|l|5=}X?0T5xFL;7O`|9t z#jrabAS2dbP0(U!@;;J-z3fFQW+(agE-zZqY9BkZ4IfYos)hzSbH=n!XHL(_&eR&g zmqj*|)}>1l6BFW4QF$4$KK@YdVIY-k<}`x1qQFEXjoC+0t6Y>*t4M-C%=`LQ9aWwr zytVRtiojT>*s9ca^0eWK z#U_vbTOVZeX5rR7&8dSEKtonUqv96jH`e=Fl2R?YS!~+)-ZdHyysykV3a?g-yzFV+ z?xyv66^~Q#GOeQW{bYAj)-MCSWzyjCPx}`>gK3y z(uyCK3P~p-_Aoc59x*^IGVaJ&I70Qs`j~ncR!mRx=FNi{78e(bX7;Tnzy?E#nFqL@WhX7GJQ_{6dCow$>>lr2KiT z45eOn955H|$xbM1o6I}oTY=0;0AT~!n6GIfwT42#;PK5Vi3u&kK~&ps8*eX zSE^AWXIi>1EG#TAFfb)0MX8Mx>T6choo@O$@ja=)z>cOZjc7U0Y83MfU|Mry6Ff~h zZ|iDm8yi;1w@qwKN~knb)r*u!NZH}GXl=-ha+{m6#j;+Tp~gFcG>V0dHXM|{2n{qg zCQ5F)g$2u3l$GonXX|KhMH`KajaE1VDlNNX#2fLt_m)?%ac$1?TEb)8f!JEbwo-{+ zu<`~uT9B`zpNwveA9-y~t%@YFU#Fv$F3;=Q%6*g~o{Pd;0hc$>(g$q45TP<#LToMT z7_}BsnJvzT(b>y-lX3{ArpR}MUvxziuO`~!QHiuiUQ>86d`Y5Lcq{;@Y z45(%a90xI^aqF8rhU@_2)aTXr^|A`4;As;R6BQ|@{3lxdx9~;@7;nU|VgyA+Ma9O( z0&DW1^V&AQQFRa;dbYED)6jb zm46i=sj(@af7o4~yIF-4-VvpnheUBkVqsPQ7q|pr3k?YZnt(VEX&1E7)Rd)wo0Bs3^lFOyuZAjz2j)9GEHzdI+1<><+!bULVQern>~42yc|`? zz+chDmfKm+FwXmm8R`XP&5&ha9N5?Mn0qZfr65qG1$9Ol{LBiZg;6yWQVP3+8z5|& z7rfrNmSF!I#o4xvIu7;qJ4v@T4i^;^Muvu!m6UFB6YiOX&HQJ;F~mj*VYEUj-AA^4 zW?^O!pg`+5T9FqPnXy!+1LX@+G7Savsr$5+J&v7CWJ7_abS|__)(n1*+bVU8JQjF7 zm}h?8awor{yD*xOmd<~nZOZU0MYXlLMY+FFzzYitwR#8~aR)I&;1{q`nH7aVY5_$K zSMvCB>YKZ6y;gFaZ*m2t+uz+(X9|8bG}sS1wKO-DmK1?bK-?~HHvVc!QbJyC4i|^r zQg*1*ZkqnjH8oq*u-xoEG)xF4U7pdw5T@z8W;fGb1(=Fxv#cz#IgHO?G;-x3X3S08 z$uwD|Kcan2+}RaxKej=8au7tx#4A%`XaMkOzycec1ZWXk=4E$t1`V z+S29DWpEnr0 zilj5jR=FE8tRQ-&gheV41|~k)l#m2f@RY*?h@`~eOp(le2#>g>KwB=U+($Q*QQC5n z%jH8EgRQ8XWd_jFKM#fmiUcxp^##<%?I6MCVJ(vS`z?%#js&>4-szV21LXiN&gG!1 zB3}w6u*A`vGod5rFiB-X^A1n1>CcvEeY7yI*-Fr%A|opP#r=gy=3=V5IndQ2~5pBaz356h6bb+!}m}i=0t@LJ7+5E+7Gnu(eD<-Oz zqhqch-r~i^2`z&+-)GvgVEpm3aC?*F3#sHoE45;?n{3n8SRFuiE5%qnETz6wN_Ixa z^4vUCWQdE2jg5{83ke12U=GZ@G?!A5$ez60Z*8Z(-==XO11j#u>?V1TOMui*X_2;w z;7#sl4$|m-@v(7fDXGXjuvTAN2ZE`FFJnQe(o&WtL!6+6U|M2)0v*@Z(#l|gO08el zMdvCyV5hs6Gy+hJ1*J!j4l4wfeO1fo$^oco6gg8V$2d|aH)A0l*d^a@qc^5}sWge| zEGX5O3y%s9(7rbQ$9w> zg=rC)T`th5_8OaJr?nyoIv>ZrlbOks zWYXItliqvp$t26*-}kMr(7lKZ?+^@R z%0#KD_r!x*_h~n<((@@bA>01QCe!A727S<=L1<*@_O1x-h{7oDlh#8ve!_6DzM%A3 z@(i#_C90jj0F;BaLB_x|fDQx$rZ_n#D;uEG6GJex_%AH3!I!%XD!;71Lxv227YQBp zQXE*h571)*3uSJ6=+$V%?9C4$eHPlO}>kb_~gUXPdoo&Ga zPLMOCwj-;i1890^pjuYVn3kWHJ7{2kg9uPm0XO~yxba_5&R}PLYmgCW0|CfN4jQi_ zW8jj7N`pOy78$Mu>27smOQ@U?9%a%MaGndA=qx%`l!H#_{%6=4v<>Mqf+M0iqKsVz zWUHyG!)WO-vqEXL;JMsVRBepnS??a!A`~>eu1b`c;TD!~wFHJt*ch?&3Of!o>zd{T zDSExeH0bs5U-_Kt>Ju?`rs9lE^VoonN?5f8CX!n7NCE3ULgDIQel6r8RS|5zG6MNd2u2)aL)o$PVMG)*sFv!XVUgDcD_<~a`C$|x zh4xq=k2Z(7BZ^=OT#>tpXEcCOVbn8Cl{0(~L=vP1g)TooKPM-L4+c{pvj)qj91^Og zuUff$=Zz^+LX#{+9Gz4#v$<)sT3%tOuFy=w=0`-TMiK{+>DwF~h z_mlx=iGk5lCX{neE!|5YI7u840uY{u`i5D)&>TLhPPI8g6J%3+TCr?7!wr$J2&qFH zx>arY;{(q_=bKTMbdFJ$e9vRjQKtAXZZ3i}(=(UWq}6k5P%BKI?Qwogl8BOX_e4)2 zSGRCY5vGg+_P^;%!-4$M()S}`5oG>wBQrrs4r>D?lJ2tibgFSA6rqfDR2PYlXcC`WqMu;g)X7 zX?)8jBjVv>W5<*i&|kyzp>4dQnNFQD3An4-y^|Am?c5H^sl#$G1aeeO$|l>4^j}(! zwUu!oun1!m0f`Xo{cUkRj?xj#O=ns&*_t`TSdx^2mJDUBhs@S($l%NwRX|*NO_qO% z@5qR3+*-d}`HVxL*BtF3q~=-;>B*orYMH&SbzU=46swqz-S zAYo&967j&d(ZwZw-t1jbRt{A|frYaHZU?fnNe-ET5H>Kx3J8vJtn85tlV>rZD+lsk zT3TuiVwxRWggS@BVqGu8e=PkLb}{Inrmo^c*j2Q~xFUc&w9V)Y;~-RZYd8C9cCA>x zbn>JLrXd!qeEr!ghc-Sg;blSk>!SF433k{I!5j3#Rn!wUU&%RqZk zlzhrC4`~3GHLBeh(y;1FhErSHN%HV?g)!ZOE`vnZE65cl$5_YH-EqyFNk>^l%Zve< z)HIZ7N$@A>MZg=h@5R%FQ;Nf6!7_U?iYbJh&BV^u{$usG@?fgY^@4?fn`N3)0+kjz zk?sl8glri&Teu1^%E(b}ZZ5MrjBNE1s(5H{Gvi8XQ+4FX>>*h&=g7saPb`CC%5Ih( zATCu2E-9yCC2@ul&SqsaEo{77H*NnHlN>oMDJenBSp-8vjIFfrD6n*?m08SU;SQ-A ze`d^%T6p1km7XOdJ-EP>zd9sDlz~MPKrpUcP*8xLSX5MGw4mF^3Zv_VYr*_^a{#ft zp*bT*41=?wnWBnp-?pW!v;_Xf_q^n9rK5{cQAdp$rEUwRF&vr*oXN3cnC^uesU5ky zB?ysIpeeGbsoTarX{1}M7dh@S!O4bG=`xyP%ZZV}Kx0RiF$LUU8e2APmVStAf?I}p z$OYY`HkDa;ccf?A5OCb}HkWuHQf6&5-Nhx{|1InWnqgfa?9T|;x3si|dWTroM5TsK z$n53fv<6JoD9_-71LOyDMDYY^Ge z!&MkNL^V4(qSTICOZtICE)I#D-n`?+jqBaJcX??Ux+Jg$K=}a#gN%V%s4a{aD^YB1 zTW*+<1q`zW4;eCO@T3V7kr7KeHuz#kv6pzZy$pW%c zy90@4x^ct0NfXBdbWpXmYgWyfJ!@3qNbrq!7#$>#CB{t0e8ZMFebx11sjNF-#*y^0p4-MlPb`ZFc z`=PWaeC*TXjH2`pO$87@*Ko5>C!87fUh4&9McxwC?ety6089=3u}91!>l|x3U)K(| zI5XV0w&Zl3qin3R{0VY02Y7dGq!j$R?gF?LFIO_HtA z2JKy@tBv}$N&_Ct$J3~wykKjd(qZ_wHec=W(^qxxb51x9nBQ-wrJse z{tNE$p}4ph@U*owz`LYR@BJ(D9tcSyi@PeGr7+XITjNZDC2CYf?Gm0Bf-QMq<4bV^?W23pj12nMUj*;?_W+6R}VE-{a1aXM% z1AWoa{f#SO6k-!0=1+L`M)AS)$fop&iHQ7i_ljlLMVVf5Hw|t!b@CKsL@i#W29%pV zb(*V*-wjMpwh``+HVc?|uc<^94$IM{ro?b)^lpfQEp)xsAg1K}t z+M0o%Rz}Xw8jRw}_d9oNn>(i(=v%sE5tEqr3F9lRKPam)x2=^i)BPFJ`AKH`j}>aX zj$yoRryA^^UW+PykIx@k%ZV{!uvnF9QxGSto1t8^U?Gc_aA&z3&a5aar*m}u)zBB4 z6z&z$KjE~N*$i%VDoqODv&Pkk+pS4UXPUVtR|c+?E*IXB5!Cu&z89m^qik-v9iXNz zJhq-AaXn^b+9k_7*5-jp1Oe$lMo>j-neg6yARax*`cB7csot7I3B?|Y$ph=<18i{I z!&;c0^!Q&5+0rxYi51r7hLc!n1<_{xGQpR&I7k%8#+RB{HNU{M;8%YPh_NUWWlI{LJjh^A9=Bct+Sp;Vj*`l^uJ#$T1(e-*VRx47@0^M|lY3gf@irLxjN5s4p8LU`} zL_^i=E-hWDh{)}%n0tW(L#4p9{JdN=QvP|LU_B<*?PzBe0P#p%5%sj2A3gYpNz7NLukI+FO`x z_6{o;F|vQ(ep!Q4^`V#~&}>+}nHb${5>e$3VGzh*FH$6F9v5Lw(htF)_Mgm$;FF)8 zi#Q$9HTN+GKsM$)%{DDzy&TRB+WpdPVv!A!9xVRE#bE-lS8lmNcHB{*!<)$ z!9K92p6Hy3XhG{B@LS6PTZ2Z|h1wcM3CrO*QPqlz3P+9@wq)@_-8_IYKw;k8+57g^ ztX#2d?3i*mThtwPOHKwD8>97Hyx!5zDm?{Lq>p3$vcV>xGu?{GF+#_W04_Op^~_l; zH>^Pp^y-zX5X@Kp{_@NJ`S;#$yb0fCxIsDSx_c`Fl7sb;VbZ^Xo@DijLSQy5LlwEO z70}xz&(zM4p438X;X5Y7JP@+Q7E*fF(3nf~Jecgx;l-C-dCpKDORKHad{WpYBWGVaY8OitxBTkjJu?VeyS0{?qTJ?vHG-LmG8e z!m6NEO)Z9Lso$wN811o8SeWxn^6*$w8)e{fvvXi>v#Mq?QtG4@kV0qSC#?8dY@l$m zKCXbg7)HuxzF)RvDL;=Yjhc3mM3h8u25JPikzFW;CJzCKA}6pLqp_PG8OfroJOIL! zvu=wX|;0#X>wo0D{ z>FJ0KuB7ErpE}A|$n^B?U|cH4jD@^0MyYL`S=D*DLkINh4^`t!qkt`4trvx7{};?jVc@oZKIp{6ZM<_@_}D@Wfc$_EOJ_^Al-R2 zva!A6px3L480P&*PV4$5N7Y3+eC8n!YDRABu!_OZU~7H*ytQb-LS&NxHR~NimU6vL zV(v6X!Jnb}khlE&e4QwCy@+^(49IK}v&g%vf?#4^`aHnRM>_;NQhKVT^o>_LS=YX( z*g|hag)&nPI{(w-s_Nw=iHe8bg2!hqPL%^IC>%U+&|AIxpt+;PqurQ}2CQSY3u{Ko z>qVm?$rZS%NM(Mi4E9M2TUd%K{9FEYkgc9j1h}Q=BaQtshDon%ohu|Nmf#W4rcFUc zC$oIBxJ$-ZbOgP^kp;*CBM4iYKX;y+r?tLMbs27fGB;R_Nn{B_UZCro&rGhUs6fH7 z_GKjQHuFDo&+OARNvI~`X@Ng+j7g{yi~LjTnR$oIw}uF(8+(;CJ(`TZf8&ie(8|Fp z&#{b`rgbi^&y@x23_wt*)AuGeZdf<7YWnbDd8ndm*Q^r9SgQHcjFf1mbLUhS7L1rS zb@HBM9E2C{70i%MFsEfYvSpU&7`XH#uIZI%B2K}>EXoE5SeKc{NkunIpYi*res}q$ zmvv~@{D(Wu5u>m*U4IT+$ z-#_v_{m{e5CB_g=(;r15smOSo86h*<@zQr%YwAL4HBagJtWCA1E>kpra%<m0s31HvQ|_pBWuv`ur6Gs=HCjvR$(W zH4|hTU0gC_+H|OwE^UV1Scw45^e@l9(7$g#PJ^N8tO&&M+2!86AM$hl1+2Lr0cHYg z2!%Feuq!IY(hTMp>IuTAfnCQ)r=p&#{L0$69DFvjgj*8nMN!kuR#8{9xVV_92)KcV zQV8R-xGA#FOv$8vG4dL;VEA&`f7cpQ;~7S!oF; z%$qyACi&f*YST?YN z$N&4^|DN)JoG_8~ny#bATn?DzPy+A`8l2iPTe7s)1f4`-N8a+*ty{Nf(E`Zo*s(aTjVx$nW4TwQwzekiX422q7zdSffbm|F>|02%;^B_$=yE1eJ= zonu_ze;dU!7ME??wvA=mw(FN`dD*qh{w0P-NF6 zKQft{lF~GwF9mM8j1YP(&Jpr^9=~Up#oMjaidSilG}(kYdvu>y+F4UO=(W2)565Mv zGaI!zZbdZPtz3|sZ`RXCNuId5xta7x^+o17%mgPOK5)kw4+qZsN%fZC6D=5=u{rB< zBRRm|adFMs_E@xBF3ai1%dGEWts|t5d#es0X5<#80?g^Sl%~r7dR+s+WG5p@+2u zCKMq;Tdav{?8C~?nmaXv@eKh?fpP(#2X1OHY#Wu!zzf9bjM!-kPftq+1BUcPstbAn zs3{8i4A?naF0s3_1mK+BZrV^mVwkNVLS6cGu9K^*M+*603gGWSif!DL+4b~J?c#o6 z_^o8*%%G)m)gl$#Z$y;{SWzB@y;;Pxo*M4g+(*BLkt`&rxgQ%r)q(FXnWY2Fym5h{ zU;fsvS8YYuEw>e4K@PU!^S~^bqJo(fq&R8*GDNsT1JIR3l%e!5ePl3^9du2^+OOkU z-QTE5M)IA-{8(z_(;Y{MHgpT@=JrRWi39A%epuKoS0Cg`hB}t^#WuG0xQzT&@G8;< zu(uFOzRx|O4rLfw!7QvvHaX-v($%Ax^mFB)n`shV@b5eGqX1X+2;k3(b!TzfEmvyL zb968nv^P2Je`5AOt3B_a=%xt;cK!> zIR9d>!XJ+ilIhGv*sHE&1M->w*{jmtvDo9)7QffkW`l+Nhs5bq zZ@Rz8RlLxPH5iot0ij7TE>)z-RojS(J`s8}=g-#GRe~}+o3nBlqiSS#@~Q#gv(Yf< zed;Uu7o2<4-&E$W*TnUdc-hu?Sg0a*>=O5J<}j>Q9Jq25G@&TNFn^idO0q14f7n+W zbvUm5C;>)999H{QsYRpDzgjG{s?gz%h5eh~9PMR6(YU?G(|M3ZkZbYwb7(CQT;q|; zBSf$)OuBU{Wjpgf=78C?Pl2RgTj}C%K5xY+DA$5RprGFvO#-^f#K8hB#GWdss84^8 zP}^)fF2A|6z$5*5nOFBYf(# zIjSj@pQiMvkLIv~lONb7^Z)_3kpk|v6VYE~vB{I3;OjMN*6 zD2LP69XC#=-V~F$VAAuis6)!*y+Gh!Za1>q3=;f=UkCb&o&2kwrOHZ}UuwE1`P{o! z=i@5rGbJZU*2?k&+ocnTA}L4OPVx{)L{`0F*TB9wE2JdWfV+I-Y$f;+HB1LSyPq9ik&0r{g{`^q2P=*aU-sBMoeWCzI6`yI-AOmT|v* zG0fahdEMB~5-cz2?0$M?&e?pYXqv;CO5pi-sOH#xOLecwL&Vc&w&4keUV@opPSz&* z0RS8V_tEo>F-w0jyjVh-UiXHS`BsbmOynQ37i0;hp z6Ow5%S+ZNpM5c_=A&xhshz!1V-d1nZzPK})bCN}W5&iZ7t48Kij;q2+gf7B!*|dO@ zbv%_FYG9q)<@>MwqP8Q??}``b5c7Ho9Jm7DHe<|zw=uvkj!))kHx$LTCpBD`F$Ubi z-~!+)1qKSC?qXUE;|d1+X0|9m3swE^#t;N-b#QWG!m-7CP4#1agHLtzIc zISkBkBAqETTx~bzMIX|TMa?QYujL?kWi7|_z8ce3`ys}E$HnX1L z*W{86T6W&v&YLUP^k@>fj)`K_UJJ>teKU6V;Y@$O7?iZ4!-_D`+?`2GDR;(_l&$rc zNoA;UK0t-mxwS!q9NAoeUO6<-y@Zm2A(#ar+@cL`E0icbH_lQ1{!XYvu@rj~q6r${Yiy^|m ze+H~(n9gds6&A(?o$Jo(+jv2CEDr1bRmZhw)z`~x(csG969Cukl>tWeZdte(fJ_^e zdB8T6!RO{q1UIAI6*@jK;rDoj)S&Y+JIOA~8;XR~tv#gOV(iF}%788&d3arMaUC(Ti=WOC#&AFj}1+rfjfmdvN^K4*R&0_Xc6f|-DUP5y-#v2htFqR$LawL z0Pg}Ioti0^nmL8n2cN2+)&BEg(P~tRTzS*(9l+>zK>Zejaxko^gu~r!?|wEvBp*x8 z6$Z`{w%B+7EqGYgvIS@%&iVHU6xym=%+^(-oeOX@*wcz*GFP)1Hm%*HN1=ND=gAo+F$(?)*Sr&8#LZfIW|S;R6oaU zh9@o_dZBQ*9dqVpOnB zDJfDSzl48vUt)v&5E>ip5tqT(po7L6-K5LraqjMpwWfPOmd%gH zk=iUWz(W{SSB1O)cDfG&4+Z0+p;U=r`5WxDipL1$hfcnMci=yTM(zOk?Cj*ibrzNV z%(upu_E$QQWVv)(=d|K6(weudM|Ct`Q5+({CPo=-58J3 zv;*C58Tl)G%xr6+sfyfuCQ3$H(Ta!>a-HDGzE5Af3AfH;$8<}yM|{|ads1hEr*VZ* zb?cfJ+}xNZ)gl=#a}!_ogiLDNLBGf3@|-i>$XBNfnJ~CH{*u4RVG9NXkqanJgsVZl z{|SA7RY;O5JBsuTtO1O#9B=##aE~Eh{t@%~OMG^}!=MnP2y-}T8w&M~I;n}S$+mUn z3HsT7SU8Ke$iP*kL!*S~LN&BK_T~4dXJ<4mqe|-98S3x_TPAs_s)iR2usYVQN{&z^rBDq_r%DOmz`d6sJw)0SFYaRWNQUUMSM&`t{x>SaG1y zb}%T(Ny+VQ(UK)9Z8UaJANN?pdyzhZjpiS%u4GwZ{{&;EO;d0O=w}qse#Cbu;@__1 z4n;`*$^!+s(RMSoFW+hV{GG3Rv+$bY+V)`LvUyBX9;)C1f8#322N>lhU%{U7lACxI ztqE!-F%lGe$eHiYRi$aFD@L_~CKV7e3PmWA)m?)a2Z>oj_oL2g+ezmkeK0I%Oa0G}(( zhbJ|7BsKc7BHF@IZu>hrde0bFo5C$VMeXa($z=x2O%w2Dh93>r$-#tx8v~G0L@J02 z;6`cN|85GHrUcM}*vyv{0DMc?O5@fF2_wOeE>7+l6|Ca3Cy^Vhl{Kjt_7vzHcHbr+sqGvN^Js>c{ ze=Ts2aLmXad<9XPISJVb5MYvS6(aZnLs4i%W)LKI~)+)JgCxRvDpeQvso;w_QS76 zT5OAF*GPsEH8Mv^1xIig9ruR_3JW^P=do4ey#Trb!7`L>t7!4uF1`w7laf!;Gg8i> zrgme_Z<=&Ne`zDRyG$N!sOj?=@dX2K~0?kkILZ})a-7qk;MfWWwFVt*>Fpk8zQ9W4 zo$ES3#+XGMOt*eMTBIWH)684TdF{W@?1t^G;cV~yQD>u8%9PUsCLlp7*!C(rh0Kpg zAf!^VXZ^S!2rRGiI9*^)>&_Tu@b3NZ>7?)|}en6Hwcd9iXWr4zUcgpcO5KY(&=^kKS?kezifp=!^dYedFh`U8>(yHD1V3a}V;ovFkj zeGZhnVf~(yJzXz=4(#MBu>+GyoerQN@=Nt?rV|>}2B)RM5ip=l02^qt)~|_nFX87= za=m7I9}Jw2G3CI&T0JkAU4+jLY^&*}7b>%0H%Xf_0atEK=xnn1DtlY>_PGR2Nz`^5 zSiTEqtq1D_0r&MrFZ1bz@ln()_=pl}_{695$HPER?uf#Fv*M{OQD#{O@UUdi0l>^A zgeq&)W*Bq*2I-0e03PK<+2r8*_I4u79gI>IEcW@}^yxXpxxx~8W<-Zi9a~qBClSBnUM8__<4Di#yRCZh*iCgTc|ps>bZnA|NW<{o!syg- z*&>m8I$nOucMwa&y>*|N|8{64DM?vpSu!ex;t1h2mj)@pl!zI1El7`F_$ zy8Il`e1bos_3z5pXq#-A{f`!<$e2YHLJGG|L!nZxa~O0?)hK+NXyk?#RNQc zlhal^qiO$49J&C&{Q-DII|Dcip$regu}-NZ6_{-M01Pc!P2M6?iKQ|NWmu!x)&tSY zey5w9`+XnVDU!S4eoj3LRwL95q=6a>5V{foqCIW;e%of~Zs93$QdmsB>o~1KC?IbB zfVYHj;P(2%RKy#G(Hr)0cqT&RdkqX`Xz+ckR79WqAsnd};=N5p5uu8T28QGaa%=|w ztWe@6*zTMK#1M+6Kq`o%>g49?%CQA9a3l~}1<^XkIvLv)5RB7CjRc8u zeL&kX8n(juR}rvdZQV6%8A8wUfGZp*l;@5aaye}l3*+~W_WZ%k3qQUM#-C>qdWwC+ zhGIul31wH=9fq9}0?3C6vdDS;0Z>yyFWH&m+PJY{Ht~`thr3xH@-^QbCEByOos_g% zQ$|HjDd!+@PmKJ>8uqm*lFl}E#X9ko!X4Rc)o;^#-ZUh@!bF*RvGP!eh7eYh!d*F? z+#k2R1~A!A#<-=cY`6zcfFf);??v+P+GLG+OE4td!*~&=`JhXu&fDW)NZ5tWO!lfi zjwcv09Tk>yAOTw>8{5z;Gh;XUqiFszf_zT5)*l!=M7kJE(9es9pGSv#m3cDdZ{3bj zl5aAt@>Fs6On~S5<>q&k^(+(~Yv)fSzKRkUT#0ScJI8nytXMqX@2|Ui?u4Vmuxb#x zar+{!c$967rf z48XqW1tbVR7ZgU5!cg!g>qt|xvw}fEC2PP>I|B%(0+Ly=kD*uMj~m!&tAe)0I+FpF zO{VUreZ%zo&fU(t4ljPyAQWSyX-}IOLqJa0bDMc4`RuA*DbX_WSwhNhC+ge>{I7l& zGx{C>ccfmV>EUOZ;sRox7Ke#t%!#znKx5;jdt5EU+j^h}{PaJ-0ZPEBI7e(V5&XXF zSEO~A$hVtF;aCw-I-V0?BM+6$qMxsbs+)y3EyzaR!}!wLhc#(Yyk;~4=Br01raWKe z9zII-5}XMj;W&SH0HjQBZUm&2vKgDz=ac*(fCXd-poPnmX=rayKNMF75`*;U)~u>jzZy_KeCH#a-CyLLj#NTYRh zcvlP_WpPHoN;kPHf^%n3C`17KtnBF(!#;(g$hhu9CjZd!inS?MF)rB@vwat6%W5Sy zpwl0C{#$kr`Y7hs<^+s!x)&%pPoOKlFS!ka!2V{p4@KYx zOaeN?l{Q89?KUB(i74NM4W_Lq-sP5i$3L0XcDXu}4e}qVe&lL((^WTLhEK~1Bm`K*s%A8 zi}6(!)cGDWq$rjX#@5Q0O_OA=4Pj3k6^LJl_}p<<>p2Yl9PoEbSeesWYlWyHdoG3F3&%$zXJauKcOY(do6o$h~B3xB5#~G z`=+>zU>kY|r^cKt(dTu%JR&^ZQ*dym8cXDxOxcy6 ziCh8t-S_WuFo-zr3yS$R%hf(HSkif}<2C{$^n@4WfF1(L?mCNtBK%hOz4AdBJ&IL! z6C;X7fV<_?kP*L{C+DqW=l#lz_!S4q&Gb%iq7MKZ-pz`mbUp3I)SjKC(r$9j$`+N@ zzEF1|A-ZyA6;A)XbPC$YKP|z^VPwnC&;i{4vn)L|E&G_{t)LzNc;0MAUL(*?Ep!_V z{5?~yUFleUNe9@WA7{#+D9&bUe9wn!KEk(y$$>8m`PkSAL~IoJ&SojeiZ?+X=5Bj# z%8}?fV074(!rYtAkn_2JI+lDlTt&f7%7ou(<#CeZl+5~pN@-&q9b7B2;!+7W;$T%X zCRX<5VK*0T9Uy8-HU?$+{pSKM)3_f%#!~!dzL_YNGW%*d10djbwZJe~!b76P+8w8K zo2H-LPBJscw%>S4^cHJ%hCLS*|Q-NIdccb!$L z;iI~5!QlweG&HRBYa7ew6p$+yp%eUK`qgSXYk9tgX+bV@DJLIC`J17XJ}KhdUZ(8H zY$l2D4;iyf(Sk=Z5h9meLAC?dOC;o)a-0dW_`m&CdcUtu4ZSvRk(OO*6I5bx2lyHW z8KgMS=t6!BeJ{GiXh?7nY5?Vfw!8VE<#R-ok(6263&dHh+$ z#XQ#AX}3C?KVksq!#phxW0}h0@;g&W|gcFYFXPI=FIz8yP?)VJVN&RJ>XbYl_IsjzE$X&cQa7LbXZwf6w-n@F2f-C zbqJQ`#%W6Si}UL+L*ynJ5TfeUeZ^TsEv{$n+Ro9d-LxBw`YOVQ=Afj$K9G3^vN=m$ zZ76={VBqJ+Pk}32%XVyscfsPa3AL$`)a@>Q1RWDA5krxd*@$_jdD*z2rC^L5P_$mSz;x@2T)fLlTl?aP*6`c!H9lp?Y;3+F zxvW~RnJ<-tQ+BS-?V?3pXs`GbBj5X|mcT!;# z^zMNqAwZt9cR>8vinV*nTEgEe7b=V1KnN^704m`s+v#CXE>;*0@)~CUX)Uva zY3IZGy%%q{RPqH@_z66ug1W7?^UBp0d1>Vykk@uSfyb>EZzb5W5v@K&{(Ql6SIth) z>(Fo6x9f$u^G3`3K1 zX)PZq4zHgF7AeG zO{V6PUeyXAbkhr|zcUhToCsqlQ?k)_ulcP4occ0|TPhC8o$A!RE8wD~tHU$Y7=O7s zm%pmLq0{tfwo~-|1!aOz_ZyF`=}{{$yH$;0x9Lb)&Ci_apNLIYQJYt{Bg9%sWy&g- z`GGGs_gTQ~+5K->uf3HXVjRP4Fo+aBs*ztG+ra%RoXyJG)Bj`SBxZm{4mpul!y-vN zZ?;X%gqSK;R8dXv-?)!Kd{3CDi2ew$FYIN!e?YreU9Gvc3;-`miked4LL&JGf8d)$ zqQiVK?X2*P;$aTERo(~h3*!wEvk*o6J#88U-8r2sIWB^lX1fwDf3?0y+;ECkEP+tJ z>)}hMg%p>X0>~Z>o);zSD>}353cgEkistsE-bpAw#J$L9>AO=LSTuc|B^*Wm5IAf& zJYjLz9~YYv*J?Fa?95b0W9_pX{{+PYwlvE-M;IIRz!(-%3NELc z)Y9qxkIg?h!SAq$cr1x1G|0=$vj+aa+cMcsxbdw+eiD}HXLFjU$x`XmbQi#5?VF;K z`T}*a@{2euZG@Q19;cvEZ#0oq+_B@5tBg1x#2FkUq+2|0Bi8bsR3jd#6bgeh$F<*$ ze*=*nB6_Ra>g=MbIyRaV{;T_iPwv}aImH%$nhLwfb^@R+9$<#AUM_xVeYzrby`uqX)X_@F!CeqtlI%~d zHI07JmoL(Y_>QhPo1FZ7Vp;s3Y+s*-2@M{3tz%ts9slrA zawvA(K~t~^XAU#q;N!vB;c_Ksg{Ja&}0o)^1@z$>a-oT5>1b+oykX_@ddJOd{*?@^Fbzgk=tD#WwPvD~l?ozs~4A-y+Ainx~Ua zOr8s2Zae%D<@DoIf-hxMN8+_a5BR$J?1-zc|4sade&iS#Hgt7Y)2G&oWW2k5E=0z6C7x$^Vs&c-ku_q`sQ(4F@Y>^ zY3m&Ahceb0E0Mmj_!+H#m?5O`a5CzcK1;y-JH2X$Wr$IB2g{ z%e*Q;ZUq+_&7yMGnyg!>EF7)QG3LO37z%^hv@SC(N&dk{6{(=y52FvMVi~k=&Xax2 zBdxMQxMioA&vHr%*OVW)e5c~XZ3iJGlg=eh)F=4W1$2GJ_s^8{9Y{%am(VLzV-F<( zklEHP?Cu+AgR{*TZZ(~*{&++7#5mGK!hmbPokn_nGN-m9EJ$vi5yYH5)d8Lmw9WlB ztNbM~%r-Y9k~qOB#1Fsvm9y<8gF#NxK&<=vdDh=dIIQ!#*dnnN7KCJmX?qtXB0V1pjKp+f=^ZdM3z#`=Q0s0wzik#JHi=pD;?JOFaob1pABw56UaxzM zXyX5hD~`4ZHxT-m)3Y~ck@UmaDLTY*@tKMCl>>V)l~T?ouqT&C_~wy^!W`-JscDP* z@6yp!TAr{AA>i`8-?Ixpw#|G3Q?1keDbRDxE0Wn^6GF|53f$PgQ;OvEq7H|sdcFdB z_aD?8Dg1Hy32m~f(wS9Y#I%n~$1j2v<3d{DTO!USsD6#=G_1(7z<^>|Hs8{OuXlp1 zXqvout{@wDv+}W+S~8JElFzcjfQfVj%K-%5OFQwdguykM;)7o0U(ewk{XOhQeXNnPTJ` zQOfTrcd4SjH^z}cKl`cB2xPOk>_dT6L~!^#nNd#Q+(R^GH<|h5wkEVlWL#GSl{r6Z z10cPo*xdb-L$htAI~)Sb1SAx|5|2Q_pQ|;1HGCUS3AHRV>BQl=aI!u0dH=TpXf0BQ z$WkdhFd|*+1fHvV)xBE!E=Pio{vAd=;KPni>rF!hg~uB%Rg1=N6HFZnjg6+YQxre) zBwZ)e`xAARNc1Fip1)g6^l>CHhUUh#4K6XvoBZMZnSMB1u5r)MLpexl@gGu%%VB+g zD8@tm_!gR;9`O2jR}sFEc4C1q`k@NUwKC3ee$BB^{)%2s_(f)s9eQ#|!DT=~*3n!- z!)T%It`Nwi)tO3cOCADxDCo}+#dgyIq3vfZ*l#r@Udc!kEW#^jimWC56Fway@+*>2 zR`=A~XtAIbaB{lvaQqtjkmvx!Ha0i}L%i+~RS_nJwj@?&MyeQzby$Bx@jiv99HGyg(8U--*4nJWu?EyI_EW*0h#wFOUUuyc0^_LG2* z;}aloJ1w2#V9dik#t1x^X0_1PXtVqVq7T#B*G2Js?LaupH`e(VFfi-`=rcb+AF-Os zirZz~0CicE|o*OAIAUN3EUr_W;C97%;;D1?|X>fnR^*I$xxu9Aoxb(C-V@c&K-zWVOwA?F|ccEL{K)u;N| zF}aY+TVy#%wds3N<5?g-3CO18y!eSjPnH%I;C3y`6}1={Pn1FzIX0pkESJC}WlqYD z8*d^c1?GYPIjByIgV(*NkLp~uBY!A6D>Tqvif@SC0E|WfEFo>rj+z9FPK{PGz#U}s zZdN9JYybG6F%9JgVwG9tt>@d*ZG!NJcf;4&=O}XBpLckN6OvinPIGN;D}L8qPTQT( zK*&;ge68d!P5-|4NeIyW54*Pcn0})zM73=6k1BH`-eIH4YI=NXI=Btonz~7FTdv#R zu-TLn1Op(6E>>zo7ag?IzkNwW#=|OEAW75TX<7m&pLR=y2!v>Lp+Z-7R>RkjJtPQ> zN3$KHGoZD`>Df2(%{fv82Xjo5z%Kd9R9YoPtJc4#g5l*%E$)+KFEO@tcjw9=5i4jokfef2k92nTr6x6y zV(%*p@8vR&L^Ip5DD_*N3&&K8zF`WxkWV&eUM{4){{(ovKZ+8B#`*KFyB@dsuRHH*JFeP+ zHHi15@6h{cFER*N-5<^tq-mU&L~8Mq8fhi02Xkn<)X!qrE&}1O@Vc#hZRaxJ+BmtU zG(;j8avd?u-7@s~pJsm<2}jq;6QRJNoWuh|EFQaM>@z9Km$j$KKT~64CWAgr+Mw1C zo3h*oAV|xKl_2mJjsrAtO?fdaOLh!#nyp9&lH)3<9B#;s=`U3r(N;#51DkPFDE`BMrg*MoE!@or60I)+U z#+i0m4qLt1NME$XN$=I90j{KsB;u)P>#B|Jp$}uL@fX5(%FW%=<(ljW>slW`GPm~N zrm8Ki&Fi3$b_2hFm??*;!3fQKDbX(KOA*Sndg}8H$N}8Xret=cxsoEN-!$Me2iBsT zUwUT|yK+73lJ>w70O_s7Us-l>f1PF&Yq`xmh`ssW)mDd_7Z#l6`HG?6)M|M%(0BW! z+ib~seZlRh{oCaIyxHz483muatTL*9e$PIZiqP?}V;m0UC_Y1;G{LDo0|vz*z*oD? zPjbcP51{LYig7{aAhob@flG*0D>@E4;nGG-COSkAg#3BI1+@2sOGqJ{FayN~_pFL4g7JZ4G$e( zfu4b(392)bf}H=08#5OZ^uy3t-x7!xVN8b89idOzi!iHMJnFtZ~>!LvR9h$V|i+a_ubF@7g`!0d8|4 z;cC>%!DX2IC*lSa$=Wq5@NNvV_eol2G? z0x7h~3BvQoP#DBRx4x*PPG#A6d8RfA|K$XOBrWeg4ejzV7Fa|aFsZhaSHKJqVv`{+ z147vR36o=`Urzj4kTloIl!-40I{|se=<{V|t9kMJG-1sRn#I<=^6UVXgF5u)Tf6aB z)7m^7jYM<)*yFnyVP>|Av)f)slrZ?1e4ahd{&LH6ypsU4Y!b9rIOg-ZI2;3uM0Il} z$)Ac}(eWExhh(Dg#x71}i-jP#pBQtG(IrV+hQ+w}r-Gf8zvy=XZ$tBS=1dru|D~N# z^*dEj0+cE1j^s_&orkxdFVk?Tt@msJDXD@A^|NRT~PR#=>{DmAaP z`Q7jJHSK;8QW^OaEd>5LN{r;)6gv5#8Y2`RCCXJB;6P*|P5KrY{?F0{n`3TDp}Scv z*H;cGDGP~Xm1I4>BNa*7>Au)ADmd-Uy#I6Gw#5$ia@%3CxC}mm1W1X z=8sLC=S{Z4+Lhs9NX9Pg_1}HZlw9#0S}&YG^k==v4_1%gfF!74q~CseGl0?qSi0sC zS4LskX|=S+6%qdDyL~;InQ{Iqj`XMXJKCOHj!<|wziTI$YD%iWxjVF?kwKVyyupD8 z*ZhId*4a^GaS_f}4jATY6AQjhbkuHA??=o*b9*|lN_e3n!INYgAJRNer}h|D{Oj*8JslNB5*lMEn7yK<)34Tij3r&iSCZ( z813$7KY#Rxtss%7cpWGjt4UR}Yx{#dV$hf#4OtNRvoboxOy{lG*oF0)`3up}S}feo zjXJzazCYCJ1&-iYD~(KkbZ`DL$U%<3(uwRsS{}o;dRXdKf}Y{K&{Ys$I1l4!7H0< zZoBqCO#)bN+yys7PS0+((Wg|*v9$Zed@~?70co!4lcDr#y+%)`sXPb0mhLXEo#{({ z1((cqrLDT)jX76}D*&TxLg#tCz4en32*STSc0USos9@fd`|7Bx-vb`?Hxc&hCV6;b zIXSsR75bj4NLvGw;ymwtc$lF{%(sWqY)3Kd_%M4q66Bv9-Xy81#gmOwC?)|cf|sg! zXT!DIe@mH>HJ9EmmwE#==~Gs#G1FezKu%h;4MoLnr={{cp_ zA-Y5o{F|eKJHd-0m@lm8NMzjHT4%{W+K7vBm$h+{#+SyQ*vd9b8M6t~&Eol60!EOf ziTx(wFE+Q;_el$24M{x&S_v$XPF6Nm2_~J&+GP4z1 zr5L1%jfT@f7XcT{VyXR)j7d8wm_=Zu|4+3zHr?T^0}!%Z=(c>^xL9$38599CvRkni zxQj(`KVQ8p#TR}p6BZJ-JKii_Hm3^^+y#uoDV8Ii$0NejJ7CZ<+caV8P5Bq~?-@8g z9hsUcp~gx6UUCU&46blIpEE%pcR*-ezdkTr0Slkpz~*=8>R!R!A%}5o(Nn98 z=qj{Pcns%TKxhYVLtQ>a&#*P`@Cbi-4ElUbR^p4s53YwpkVC(2D)YMD{+W*}YOpdJ zaoPk+?4O9W4Jf#vnzg8km0s_0)WV;k z9?ERUL|=q!xMV1aF-~)nc0l1xXvp|E}h>~@wGfVk8Fo(veglm1B|ep^ zFkeX!fWRHfb@!{|$6>|NmUfn?@Np&Wz1e|=!|C4%=HK05xka>6zl<53j>i*YdGS@X z+Mubkz3^xXG_bf&t{4c2Usp$%0Lwu>8FEcEyttY8Z5I{=YfZa@%V{gbox?8BJNsZm zY?TBi>KlxC;&c0ybzex$8PybzcD`;58Lnth`8-YqCY1Hq& z^a;O&!l{sr@ro09BlZj8qhzla%248p1$(p1zxB$)fG#QRj2Sro#{P4_Yv?jUKS`0SjzxN4(cyf@8-F;3UvQ+U<;k=`hsQ$_SH z|NG)XZxh!@vrxx~&RZBt(%xn8^=6O%S;G(lwoNtH1Mv{zE# z9}{7R;DrSOxmswBu0sW{h-ws^d@{KMyFiHmm#AlP3hRFjqw zgPAVfahj|$8HfNf!uf82WJ3yINJ7iIyWmOs@_l%6W0kOe38w~K5;?=ZV6H9$BZv0> zrSfKwr#(S3X72ELLIHgDlMwNYKSE*abHZq_)9CY{ZLJin4c=$D7<@W^5YpP`x}$zJ%W8)bE*9A+F0aHKEk#6 zK1GM=@C+2D&A9TR&qox&+{rVHidw{&W%VkL-+cyViXy(ab5$=QQi(D9SZ(0s^c58( zH5OyWc!8L0qAE2Xcfv;9Kr*&Z5Q`hE&OvXmlTz5E7B9xi05Su<7;kteOcavSt7IsY zrsN4(;OA#v$J5UQ?IDyrOI6{(32x$^mn_yJO#L<6(BYV= z9NuK1LI;z}GW;R*(sn5@-KVvgz_hVRWhi>sA@5+o_X0qe;&O^Vt#2wi*Bv9fv+f5Z z(&;*Ftv214t97Vo+-BRLcV=yN@z=+JoZpP{sqMRh{;qv$9?T0Fgx!k1+Z3rYS1Wjo z5Sshy-W2LjPr`L_30xlK;alG8iL@VNFRpzyIm(73B%eL^)WDU&*)#u7@Bd`C? z9$)N?Ue`~AKYfZfc!UnI`yYVoPu+dDy{>nIqTtFD)vU`kcJq!^_`v$Ik@pkC6Fs&ZWB6`%miC*a`o1<+zMMnqT42(2n_K)plc2?An`m!4@vfv=P7GqaHE-+fLZ z^}k%k4p*t;QK7#^-wUjK4s&;de~@GU1t)r5)^m~+=l1-;)%vm!3}O^_vZNlq{kLKy zZBtUU)s~n!@Gc?`y6t|w^1Es~0p?b=$wS0Z7{Ltwplutg940}PD7HUGHkC`WgkvM8 z=zM!sM(=cr-ywqF*xIRg5sy3gapis^GQMe3(CH_yLGaH*pd?E-Lf+u3c2`?kkjM^N zgV8ELwql8+c>K4#Obb5hBWWr?X50+{e)qp6El7|s;N#^5efSVX9_cL?-sV%g-mQ~h zJZ~&ksLes+5SAw2FdaeO_&xj?J3KLxK@xWFp*3B2iU<^S({1&hJG08$qk^DEKKSv( z|AyTfZQrS|ZQ;Q0+#3-0n8I}~z=}t?h;PW`d;0rscEvHd z*ofr9PQOoe`ckoLiZg+w)3-TC|q0)x@ChM!#LYP(L>1z>o5 zw8Fu4w>qUG-1sX_y9yurfJH(4?d*cv{?JGsi?K9Z!BSW0&YCXndZ$PDoZ_;W_*9mg zAk!5T`*lr?gnX)ZjgpecL@qe3;Ip3|3CG>YqQtdb3QS~J$}b}d#PQVt<~fh zcF+XpEN@yiG!sW@In$wtO%+bhPS%}mfFYcYCa%_@-Je1DK)D=^Fn*Wqw9uB$jr!e= zqdJA0)J1j_mU_pU9}e}6=Vx*b5eJ5}$W2H(r}6abW$MK9>qBmYM&FN{+mA^Y;k1j@ zKZ~#hzE@9KY~<$Qc#Z zMy$BGtv4n)7<3CU{c(5k$tf&%|lJ{&l01=|XO1cPjJzrc&MxWnRL4X*8TmFMy z9>Za=fBn}F10lE{e7R3!os&_GpNFTt?qegco2c*4>1Q77RP;{VQF9%MODWr9hLK(- zzIqKpqeWp-%(7Yzz(7z?QIjnXumfLoxaRIi%=Lh471(rK%(Pfkd-mbW!HnGcX~71R z>xkDGY=$UW1H&O4eTV95m5?vFJWt5y)z=mHb}Me}p1(1sWV(hFP_fm?p-bU6Op%~o z6mAMFaNK!5Ky=Q%U_MypbM(ouD=8}vv@eAjpNtoMiXa+&Bshr+!2a`d{A2nAvLfuE z6QAOWi3l5^TH_D5t<~TV1}R(2gqBeI+;*2e9$GS?b>H1D?=;>-Qj^tllH8|qlAt&m z=?}sVe2$u}*Q;cffB5)5j;d>RXnNiP(K}0cTgb^vj#k_zkjQWeg}$QCA#i+Z%Bp}< z;3FXLOmb}O%15Nerb*5 z%;jutc)EvPbmxPpXXoT#Rme-MA`Z-3`*J7ucmBpio&7%e z)okYEuO~K6Q}$;s`YhYcotLLyM7IjzFD~cDFTO;x1>pg`pPrw@5}lNA!s1a7oOvV+ z#99ZWkEU=HS>1M_NNwFbrgQjM7PLlevkT!4q^Kf0L#-sVs~N3l3U;kRwt+&x!f}`U z!w9N@akqa0;kbPsNNyl|d$q5>YYjQoQb?|jKtmygU71U^M^m>*w1Y+$md{=E^eL0h zGj~Z@mJCNIdNUg45|UmN_eQjJ9hS;i)krTm8C{o`JCt|r?_J8?6_Vse7=Oespi1m5 z`Oi3=;j!g+fybSJeDR6__^03`XWwv+(VhVUL_2i$HYpkdW<|@=SqU zY+YPy*nQw0vo2`jR4+4`&9Vu27#IeOi55WQ!eZ?ac_d(fas;H$6Ei3yW{bz>qhBYp z#)83;%-Bbxs*DAJn2BZ8$@PX)-h!T!r4xX32Q5KzWRTzk0uZmf;Q ztr418am$Qrcj^7(Y+ceSV{g#=vvPB%q^o@G=rmqe)8LwkjQuICQ~$HS!i8{u5P>uP z)e`z9=eT%ISLVFzun8Hm%{04YweyxdD7C7$8}5eolo78k6aOoj!St(T&6*QFvInmXRWwkfQHYJng!7HlDsfK^H$|jIP?<9Q( z*DR%ihm24Ve0)ekv}kY`Col*A`t5=Aq}Nv$F;cWgsYsKq56I6n(Y)n7mU_!7jHD_m z;{5i5!vF^YxJdELjE7%=loV=4;;oLpj*eM%jY&l6l=74ybboyQ{#sUv?y+DFw@vIH zR@pYRl?2j9zuoC6*(AWRh2&40^>nHoO*xz}<^ zYMF21HC+|wf}7F1$j&1R@{k0VLarA!fykj&Pq+`iU9znekzDApUNbZ5jqUv3Umfl*>~?iio9~CdB-z>J_H_`KaQ733lp7ZO zLjNQi9^O{Qol|d$+E=H5aRp6|1RZVy?TCMYP}1hQ)n+|!iS_M<-7cTAH4K}kCCd6* zoRx!O9iihoY*1JAGqmCXgWh1|RssnK_k;!uzpBBG81-b&wO3SfXqEAqnM)v{bZCA@ zL7laXT<5F(GsGe%&w8O$5kWrcrvvPB zeN7ZWGAi>TU&O`y291AfvcP7@0nej8o5fEiv)<#5gX{P(YYK(yPiKeVkdBKdy+G-7 zz%q7?&dkgJ>mT@;?}LJx9=`!%H!RfM6yGA1r$n`iRC3fTK^yf>o{la zt){RMd(Ol5_=-KhbVt;V)=oX2j!W9K(Xn&ckJ(|v|Xr&$%~aL2QXe% z3F(G1p(1K)S(DIf=cc3*`Xm014xRspk}jpDYLEI3+66dr3_9E_hLH%nzAy>V>b%Sa z(rgyj*2W`5bO*)CUv6~UY^;n-Wvb?K{kMOpNJ;W&+ew#sap$-y`Lr7Zc6OwEmbBAY zlkzII@Mn}W;g^`dUO66=`#IX6ZKcuq%V|iQ3txBraLa=qqTG$~ z!9fuHpkwW|IPcYyiRlXkUAeHZ@b5kw4n?!D%4~`82qXE+jgPDcizQ1&6nA|sCZpUQ zJdw+fPMgn?_2rFdXq{y0Z7ac8{Na9iVfIRp7#$kQuKpZ<|D2%R0K-v3^9RklJczcf zN>ues{#)1AQS>W6KFcA$xnO;EGcNC&G(fbc`4xpeGchwoHfiO-x84u0T0NmHzaBhK zV+uiI&2=UPQ3Y@nG3-y{S*n`z|dfN%b@yt}H(Q8X1y^mqw5 zb?2xEjmF-%!-!x0Qz%(oGZLALoOzo@t9b|vsavV=)NnXtR3*&d= zsU+r%BtOZNYgV{#O$qg&BrHacequSqjSpkJPSCJTsJj}20^*g-R!IilK132tsu?<% zLTHZ4)GBI2RDxQ=cAsDO&PMa?mur3A0nV%~*-?8=zwa;jRJ>Q)F2O(}TO=S+Q5nsB zxtZYiC*~sT8up9tPUUaoyF3xzR#xuNlHcHvzm<*%K=?7H>g}{hqsH^$|3CKxgcZ~J zOF75_$RbHY*wl!fK_+cF41|iN6x~$;{wE5ZFT9;`$oo(X9LgBF%-f+Q044ZqLdL85 z$ZGQgAL%ldce?i9B@0*u-j3x>856&;`uvcUAO8hBnd61zcRLy;1QArdE}C}xU2bmhx`%R+#c4wF8VSnIhkBTxk(HS8z zn-*|d{=Fev%1NaP9$~a1L*?`mLI&#C<4Jf-)JlH}0&VBH&3VYy;8M%JkXkZ~w#cP7#NK$J6zglqv< z@|h%PMT0+z=hL8 zyRXpvSZ&zp4~3Ov!1`un6pGAEDyxO#pOx$7Da&(|164j*7~|}X#$T^3@a9k2xFWVU zH?*k`(Inzw&NZv<$2Y{VwRDgyNq+HPDPB*1?zjI7aJ)a2Y4(MvrX=%Zbf-30R@5g2*LQm9C&$slaIh3*G=H}*pfuZJj zh?lEQ`XcMFR>$~f`Zyk|H#w{cTuwajr7lEE=`Oc;zAB+Z7_D>poSo?3SMyG$0w+hslbXbLCiGt$ayr3SlB(_)+yFdGLudq+t-CqKt_sHBSRpMH$^7uWERTLNI(;lxmEWQal8#Ufu*JSVM%w@R*+|sNLHva z@ME1?@gr}|lk3XaCkRauN4!_1^+<`bY(}1E`C=@<2Z=ztqZM9x_Gc>E<`~C!R(ojw zbb67~D#I0eiB4WnbxT!%Kz5q^oxidl4~?yODY836yDy?WjTX_sqJ~v_gR*(KdNe?L z_an0~sJl8_sX)YRnpE1A^MAtDCW+BM5_V_Thk9S)_s&s{|K{q%}X!o&}iQRawRV__%Y zv4F2EO1G=8DmLfONw*3v&5T4@qKfTnA` z)!yh*>%Pp|wN=u(#-b>sv; zT4@RX)nvxL!V{HVV;QE5|NA6JWIQ)M!Vl+1%1=9rs+%3_cC?3z-?Fg=3CrTV)W!o* z<0K?|`^zpaoIYeiq^O6X0#mD(bqSr`>!NuUwBiDj{}P{|^{k#Y!55{sP<7>=nTh2m!$4s5?-6C{ zM7Zw_M$(6I#`ONlwq0$g@>C6`pfVP-GV0qbK7Ul1N^ z9HoaFyqypD8rSB@Y|Uw_A7ki#Behah>r5SOPsQ0TUiXPF;o5#H5VIJJ;IbMmd_Tb6 z&nr$j_+M&CbMpekpuwg27f;KpDr_?a+PB)OUxC1b%` z^E8H33!5N9s~X7Pwex%jAbYFb-^e-TZ9d-f+OWQS6+_D`9|9)SV>b!!1%fXRwPf#B znfU0ZgwC1@f0$FgL6jJC_-&T0`F$zFcawkFPbGcD@<+9m4~#~C@QfnkQ?d?{%YFKP zHMmH2fhE#8xxT_AQF0TXqmtBFrT?DllFUA}LOELheU{XOXSquy3iA~vhc)pkaUB1epon{M z2&!cM3u2^`1xmEicQ0%hm{2d}NDTKn(bf|O;Xl4vm^AR0LccFsMCjym`JEGmjmN}ki#ljlVr1WBB>FwMoVk}3j5I{4G`r@!$ z?Rhc_inJgzH-0Wj)yYlE+G?W&oir``nkdX~v$JvvuiU*sE=dWn_5#AaQ7O^Z|D5dq zM9#o~5D4^DcjwFBUw~E%h%FO^&l&wMfQ?K1N5_Gh;9dkU^!;0ohy~og0JHOJ8OMKT z{{&z!@|WpDS1NndD*J_>eeE|5V*I`5;5-YW`R91%jIP)i7!Z$Iga7{N0hP-KKub1X z2Szsr)f}1kMh}Y_t4l}MSbYn=pNCvHQas%$=@uHQ{3)CcOp8MJZY^E)jcZ=}e^H4^ z^uwiGiQ)5MtIM6(6D3{#ZSf^H*TXgZ%m4ky`Fn$*E(BbzT5Jt3yrJqEOQ~tgSwGcU zi;-xdT4Wka30mN|RU5+kNQnl55a6)UtRBC5nw&8gBvk9n@vtivbttY0;TC5ik0R4^eM$3Rc; zdcVP=6a0I;+$G_Q)F6D+RC1ET2&Q%#)n>JB&6)#SXRr%Ob9U?34lfoQj3gXVpyR*X zZLJJpYu`-4-|#!hw-<(T20qxdA1=LjD|vJAP-JWq@GnM1QjuUmLrkc7mOD6@#f2;f zM{<&sz;N<2tY;#yG)DppK&nW1?dGngq1m9(KWGzd$*)yMCwpm*;ycw$`*%P?yB&tN zMo)1@jhoJ~wb;oemZy0%Q<2;?!Mw$Rv~q>l|N4n8uqkm;+{wS;)N*q)1+2?=a_LAR zBuSS7aZdGB7M#NTz8lU02nVhd5Zv8eC-&=O?+*ljWDAN&je^ly|G7M!wk$+dD!i;0 z^OBE+1jaJwjA%(O)`4t(fL*O^%`&dP6<|j`ReFmDe-?Tqm;DMBXMS`9R~)PuS<8Rr zCg@RPV`8{Jtb?(xI3qVgM5ZFaXX)*JQ{u)BFWD#chbW~V75G!#DNd?JcVMB9i-$K) zRve+uG&GG=x2G0(vyt`Hz}OLY`S>J*ooTq{do0Ra#N#SuZWlA%(rq{A7JI-R3 zIE2_y^3zm5r1IPCw8dlz-z=MLu4Eyc85_(C41<0^rJc%eCQoS!`}xAQ)BpSzw-_a6 z(XXApLWUmcx?=uV&T-NDLTm_TS5d7O+qg5fS(`(Qt^4`IslVnl6#-4R)oA?uxYF}l z3)yi5+5KUqF3BZS_Lo3$#O+cUMaX8e*SsVh^NVbCQjMa&VtFQ8UAj zxm4-_>FN4lOvFc~VDrbHjCh~a&d8d#Xo_P2Dy#GYBdAf<3)^T!3bq$D?$xw~2+*8VRBZIz$ayl>xA=i)%Y-}?F=z@G|9A0-qEct&NNf)VKt=!{#VQ}3^oW^axjP2>L=nYa-DIi`n^{*A!Pnks%E)^OGv zOUYQ*_g|-mtmHQIu^yzR){x-g;cs!Dqq#ihWeL2`mnNLl*4xy^5JRF?8U@g`<0JbA zT|c;3vCCyJDkgSbG?L-+d^O1yIxH(vPoPwKuywQP(Q*2LwSDBLFgec2t-Qliv zOg;1ZLt6$H z11|phparH&oJ#_1^%@5FP%=u4Ji_?F=srsM|5SeFNDNWomu%Q^Mag+UXKFd`DiKz% z%;{_UCv1kZ4aMF;J(dNS8`7DL{iK-_SU9Zp7N5uEB2O^Cy<9@dU~-GW z19}oSl7{gemRm!LcVnM>SS+hwM!tujc+!u(L*8ZlAHgogqtogJ6Q}e0Tfr5_*<<{}(V(oy zb%{6t4H$&JO?uRFoQBEAv5uP`@cUO%h~2NL3T)v{rM;n?kT7|DzDp-1;9#tzU)81g z{-ijc-lu>TD)A;aTGM>2iYqc7<< zU+wSF+NH=vd}`Q`c*L@ama(ANEzvoXAVP~Z;MWw*%*Uo*`WH~ zH@e?Q%%uMkgMHfz^e*g9nlZx|;n2GlOuwHkerv18zKOK>%F9CKfj+)ZiN>4tME|UYhyn^aJT)-vw@?>7$eH#oByPX5NHU3WCjUmqEiWX(L2Ol|bcx44RM;RkHa5)|fe)d> zK_|KJzaH6KO?s?983s0=RSwROw5r3EBP`15OAR!T=&kY-_EsYad8*ChR*KUk=!w)- zMqeF{vac7Qi`!LMj-wV-n|WoQZizkJ;YfUGJ^Gj7-;+ruyO6P0)FXGV37{9m;6|=G z0(@yA*}G8BB%kNovnEY%44iGHWKbj+y3~#m~f% z`*NUQIP_*oN2e9_gPja{HNig2jFy$m5Jyg;(#LQ#cb709%MH8UeWL`SlDVD!z-PUS&yW&P%9g=m zJ;hI8tI{1N@7t|&a=WNrkyqEgZ8Ua_%#epQ;2nrT#9gXYrbOc0icR43Wm(VU3IIP# zhyR0jbN@#!47mJ4Fy0BoI-UoS1nRT7 zAgW^&8j&>QzoK+^U|((pSt@w=?0lW1c;PnQm+R^BpS>0oacx3yPJj_6pxfut#15

#NTB!IBLt*tvETbL~ZmtK2$jfjj{7;KOyasYOQ}SU?K!sX9 zV4=SilF)!q1YU*e?!QBz-1j}n_tmS>OL$kpWe@Ft1;7Wg>vbw!pJy=cY?kNqMSPEa zN^xn%g&xgSo&*>brM2$)34WQiH5BKc_;&ub@rv~L6bQNI{kY?)w>U4M-{m_3_uLP>JjoOGV zzG`p^ouE+pB)E?hwEp2Bf$8%quSCw^KXy(WdsnoBfq-W&tS=DG(zwpR7ou=<93+Ym ztIi0d1^#_~2sic6{7l`AdM{PsMt3QFl)w5h7=|e@He&AtSD+(bkBrkCIGaQpfyQ^C z(~HhkQe-YmCw>q*12E`_RjO7vo;*1InF=llU@CXM0?D)SLy}AV<5>7Rt z&F@Niz=FMojWQfM?GyTJWD^l_#i8m2JhX!mHe`@V0oQmRE@$P2(4@_JYW^!Idv`oM zZn+lDb9=1ynbYULu%0D*cj;ANPL6C(!DSf{p!bo)F9G815$1#)N}+B39E&M*h^1tn zM%4~_wSemp0=`62O7Pzou=t;%J|~Wq84!6epM1p-yVan=p0J<%6rjnx6(5TjviDN-H+Q5bEVF(lXoDyT<5{xtN{X8G1BvCqcRLwFx;)CfgJ$C6O$#oH>vux&;O@7l7PqJle*JFN8CM=&8i`+S;m7{D9!<)&Fq*f- z^QNg%MorCe3v79% zuB&1))GA7=l+Q49sVJ7@&iP_N>2|u~?kOdVz>sRt$4VLD2F=0tF&nr1uJo(r4UN&H z*BCl=ll}YG8pEdFH4O(VL~{6Q)y?w=yN#yg5V$F3r(h#S)v~n=YF2u|fsP#E-hJs~ z4)?S3^86k6YB9es$0rh07#wQ1q%Bz5E<&*S#!!yWdg3Hr0ax1G zRZC#DbG1?#G2gXxVK1N`kzQIz14&||AU2cRG4yr(bT`1I$Pa+Fd)96NXg*?UUYFsV z*acS(sJ6djH0orr;~1QhVf8yKwwa(^avg@mTBQ61JisCUV!p@HqbgXrCa2*EvdU8?8=x2VY~?S_CA~fL_HV&Z0(gp3-xv7Nf3|?% zFmzsT4Rwe`@EVXrBpd!N$VZ9}U-A!Ry}O{%kX5E?hFBM_qu#AG%(5sBMN9@*6esqJ zu5-mD(_iZDhH$-tRCYVrne?3&_+McTaEs?BS**^&5k?gR)6Yaj)a3_hDA}3|%H8<)24k!W zWbN(N0MJ6Fu%s9dwQR4qq4%CRp@B$^CS(KT2PNEbW8YRzO6z!0E>1C`KEsHiGQqE% z%;XYib|S(tjg1z80GW@ zc$UESWZJ!GD&N1DNoiFkBx5S{OON2WIWzKJvH@<+YXb_ z`twa1m>lfU%ACwf5)?H1zwb3 z7WSEZj8Fk&D%FUq{@acUschU_g`atCe}U;Ea+)@LA4b-X22SPZC<1=Ll?ud4e?mUMX>^FH9)C0}b&VBv^8gIsbOf5v zw=Ljq!SoyM8oY<=!}6p|%w$Qpc@8yuIv|;$V-Ba2g0Xo!#RjJw(6TID*I@Okf3Uuvv_sT^MMCa@TAe^bpC_+Fe6NvCf_z{;VViKi zuqWC~2fK>JP$AmrHsq&f4=PpGO|57U52;fBq*Tw0o`DD96N;*UoZ*hJ2tLq8cjirc zqu0m#l+)Piv`pmoI^i1Drbjce;gxaP5N3%>*Q_^MNdK3cLV>18Jja-6hhjX9D_|lm zGH2r!yS?8bo7 zwU@hU?YGRbnHyDfl+GM(4w`{6`8Da=AgQ1~29O-d@BR5FYZY_+f4oCG3@WJ01M{Q0 zjzG0b>}YX8e5)xbIRHW*skw4^;0ZZA;x(Qz)(pn49uGcwW^ePW>aW3+75y>Mt>DpH z-c0~yy}p5Z&lczaQ_&$2d>Hkgu3&ReN0c0)M4;@kG%+L=UTI8t4~b)=sd;Fb@O6ps zNbPU)$Tawwb*p6@PiH*oh4s)QdR<}5$HL)nMHjV1 zGiZ3TZ6#N`{D>3Y>q#=c;Ib1>Q46lbRbrM+33${Hn6d}rP{9?&q*M{6JQ0Go|KnO5 z;cUXfqZ()Az8)=k;FV;>@APc2L0RpDT@@Nl32oo@k6TblP}s^-&}ABPuoTM0Rfuv1 zJK@wet=gW%4(&c@QaF4+nr4RPnS2on1Ar&+E* zvt6hgGQIY&TbZ}d$7qW%d!h|mp?zG}>&fH|06)2uk)BUNL|y%{;t>p@Y3#OPF$B$1 zRr!l(IMs{czEhkbnau6Mv3v=;w4-Es^L>OEuBzD?Z_$ArO5e^3PxrBenktymm`HE< z1O*~t{;KeCpOT+z>`>1T!=iii)Q}d%zk#j{M+CthV10TKt_%Btfc1+5RGM6pVYQbd z6o=f~u3a5L?*V1^Gapl4dZ&o4s+&Aj&KSf-e%oomb-c%v>QMW!*4ptMLNSBeTf?3?4Kjhtl>vC6d^nQzVS+w`H1R zDjg4^X>sy|z4euw=uigx7%ffLsL-vs%X&EW)kJ8>d}kLb^`)*({~i5okDbySJQ6J@`=bWk(Wa;- zf~!-iP~|9?ryVbl?`>(4mb+VbdkDw>fx%2L*_Q-+2h^X2+!M$NPRBzUa$l{xH}WWR z2T3J~$HOsF!O>1I-1r4M9Y;-2GKj7@`?mte45$K0o1(|l9T82`&-1VeNNS`pi*Fbw z2j0jqnlyJ2qXp}Vr~byXHJ<;LuJ%Qlwu3w)B{TCcijp0qR7E25Ps{o{}V3>lW5n3hKld|!edcoUmUzY-_8E!)PE%X z^gLjVu_<+gjW8`?RXiL)*@bWS9~!6l^Jz&7l`*bkBpzC3yY_}vqR{Ae1PN3K*b=jc zJIbDx7|cBan-}i_LUc%jW!}wCpgr8K(q>qf&-NNgMQC8A5j&^RQ;b+xwINvC$4&qI z*$hlIRZ)Stm^e|*=B9=gfdOmPSbb9^|VGL zbabKmfM)QM0#dAn;QAP-qmsA@X2e)L72l|1hJ*1TgQ$B;Aqenesp{fP()=s80EVag zdzk(rR@kiXY7lidBrWD3!`MahV9b^)OJ^2xruYH4$t)|X%@UnVD4Qb@k=Lx?K zP;zWw-1KY_Y-64vRoa>0Tf8a^#{dnEslbL4Dy%P2sYG_`7@d^PTK4cELU7YhmHH&~ zAJEN3J2aWLS)oFb{4LPtwG;goNNCgsCXk4k30$QgD|IAr+)@vq^7*#qvoT{+fybiP z1Li0QnB=4jc!^_aXk|GW7N>Lq6%t955unk;kakWh6g?qAS2g)g-Da$z+U5@c{Mil z!yVv$of+V~=Ebe}e%8^GsH9(%s#A*pht^e^nDr1E zEQnD=okb|O{{W*r*QQsuP70ER@t7|jx_2bG+jqd69^|vsLFc}GvB=#?CubMg@0ZZf zi~IXm^|i1H>!%47$(NBUfg6TSCh7X51eXyXJ#v#_B~6vz~d({r&ir5m8bUTv?k%OxRXbLmvI5Cl7FoGWxcaGCJmYQL&5}79&Bu$4-nIT_S-5j-XknPiCXWr0FeH)K8*7 zOcRFZTCrSaaZC$y(LzB)=$syzSGWTmc?ssQO!Tui+hxzMS#2h8Ffvk&_Q4>)OZ}&k z%THEm&Ptpn;<_E?e|JvdcWCCjZlC$~_3YbKYhBy3*yHF^C?a{_X%Su#9GI_f00Lnk zxCQ#rO;*T)(yxLSOek|F+`zmEUl0WMj<5GB+5R+(cB;>Ed$jA2teI^571ttl!zhrl zOGUZGeJY#=OWNSqWFCwAWZRW$1mYLgS+O{2g^ETlh{}+9Hzw2&X$2PjiK-PyvAh#7l#GXgEH{rw!VbIp89>ScVUrpL)STT#Ntzj zwf}p9n#u2=db_sI=v))X80xaVqk;MP?C9SEhWu{^_ZR9CJS`Kb)n?I{sQ{mJ z_Ts2(&<07z?{K^au=9u{!iz%ffjM;*>`4QVVXSDl z#^bQ>d6XmxpRO@FMrOHD)a#Q}#XROD5h2y@7D3?k7d(C*-pNbptOO(8!H9}@a+M+XQ=lf5ajN zoEB&i7z;MICL^(UL)N>e>tAZVmT#1*-F~Nz=0zg0#qtmgH~+}XFv(O3$~4=ixsH%V zKIio%Y}(m~iQT0Ns(i3(h%X>zhDz)Oho=c9p5z*q+9H!ExD2ZQP}Y1Ug?xzpl@-#s zA6u0*F{F`aSn-ISxBqlvwrQK|EZGLe-NC^rdXFHK_%~Q8s0Zgd9XntzazUPq5S6vYnXUE$vd`zIo>|=5 z#%pSQ!&c?*x)b}S$Up2tQ{=zvL!Lo%kN1iOY5|W(r%{a&VeF5WAOfvaWGV0?sL-r0 zM6m43?qYE>ZT}W}LUWm-vzrS6RwE;pjWgI%hfp7H@tJ$ZIV~+hR9qrpY~pj$XQS}( z@lE~Dj-b}>H)upRF55Q9p~xB$GIK?I#ZOOySSPEmyV6a!ABq~UYth-?-lgx!_SgKi z;?r`CzCQON4-}MRmTURz(&jrr@d4l%dCFG5JaG`^WiXoZBajicS$3aW&L+Y_g!v0i z%AVH8z;5SQmSzqRO2^}rg^-a7*pf&#?@}!nJQ_sa5gp9nSe@ZKKSa|c&WR9oD(V{t z%QC`DprI&zL>S?(8Y#0!BwbDZ#mUd+-QkYm>ILgUq&4)g9xq7M@b=j>utF; zJxsx1eYRY~0n-E4OF2RPnoidACc|$&9Ngc%CCoZ!H*Z4Bma}sTw=B2QucASCHno=^ zW>|PG`wc;JK3e{_!_r(g-_3eAAKe09S<%g=F#%3E>MMkgp?FR5a4K=_0xO9)}7A%J6?cz(?Uq@;^E$l9{3lm4!3Y%AFU$KGucH{*L~(zw?re z4pAAW=>Bp{3h^o?jxAT-yx^K(W0y#ObYOwtn;aj1;6>3{lckk7okJFsHEv{BC+QHDFXRC*R9_*Gbdiyls5gilPqlOVQc9Ck0!g0Yr-UFZE40 zRC3>$n&**1a>EYQn`Q+V#^r``WV7316ZUkvF)|vHZ5(HPz+HwC4lkzco5^9e?JVBN zICF`kJh+(r&mjdKZG#VKcsrPSuru)uh}(YfSgUum);9ZY7Y0R$V)L8`LOMsn{CguM z_db|y8wK*G(h3O65i0%QiXB!$_K0@El5NSXMYZ;P>APJ}HtDb20h>gAh&6a=!BW?C zzBm%r>~KE&*xy;i)M{~v?H&$?gdblll4F(y5uNz3+E`2hlpZ#vgsOWl$!Q_n&?rJ# ztsp7@LuY|iuF0n577E>alBpuAc8xb>^NpdBlb^koT2ex0bFQ_SrN{|K&sEq8O6^*$ zW7c7^((LZHEP=yPQ1`3}GMea!UwSuoDy z{h|ZuiK8N&bvN;tpmSl_<@dP~zT+4VTvQc6wkytfLZguvCK!T%Wq<1uc#w^j{757=D%n0A_SMZ6c6=gGU9sq z$mJglAUL8jzr`LrhM!c&NM>vE9XK3Y)7Q3hmnpX~K&-q2iaOK4>k&qG!SvK3gvRWf zEw4Z$M8#A#GRSTaOi3?-WHUEfM59fQhbc{NmA&{B>Dp4XSgYChkCNcJ@;x~^8u7^k z^kw_S4cD(*s){OluGyxE~Pg61hfB&KLoW4+Nt+Hw|g5pkBJ2& z54<0}sL;$=stNR3KJYgmI*!`+u^^uOKN9LI9y!A6&-kA9+{(3ufEd~W);2_}YE zXR#9*1M~LBkT+gDl&?@W81_?bzUkde^DanuL;og>@gg!g?(RSXY{403K6^8V>hghh zX7SYnY-eOrxXxlN^c^=3j5*NNOJ8>0V?1Qto^iCETJD0~g$BmNL)k`I)V^(&=H-b+Mq#F)}GpJ=3ID zZ_*i#A$$s|bvNYr#b-N;v$9s^eIJiO$gS*$P}t49E2MjHLVU#FlO?w^6BEXN0$M4X!Af1T?xC(r89J1iw>3#`bW!lX2U$5~&oB(at?@Ibc0&3<5B3 zCKz&Q=H1(^j@=SE=}wb*q*-CHl+G>?Mg?QPG1;!GwvaIu*9k_MWCwo})nQNY?TbIr zs=;;C`5OAvo2S1a{yf!(A^5z-57>JZ?5sGU7=9dhbdTZd&NNAif_SM_T=YvsoUGK3S*f}#WY>=AJ_=6(e&9{AgHsr z9>{LwvK2+Dy~p~NB4w5R?qgl_jz=8igee#KE$;O@G0=O$L*AjPk4MjQ?!w49@D4q=zN_!5!qc^)V{X#!+9Xq<3w{J$6J z-6^%pyhV5)_6m6eozOEFS^isbtgbru$lZu4a8MCb#v7tPJYQ+_sJU+eAo0z%w=}g&_#nx}%>Hc;!j$h4e)jpy*c?oGR^^V>I~%rsnCN z``^Wmb7(Wc($ZBVSLA4MnL9{FcFjfGvOa-V80KgjNIU~#?OwodlQ9hhEcfl-8Iaq*oA8Qy(bsnd@F)& zg>jsdbXxq-v-=J?lC|9cHKosy>&mp?zzt-nsmZsT@O$;&iGdhrq9UqNdCCo0jG`I{ zUH@f$qv5+@Z*ICq*OZ3r`*f;FUT2w;3Ht9^b?@D&)FrS@zmXfSEg_ydqN?M%<#)|#(nv5_F8WzzJ zM80y3ljaj;F(>zmfRQClMGTLF1zGqeBN|m_2QhEVhwN&_cwFUNwnHkYkrA#RDlHT`U%aHy9&4iCQeUDpZTNJdiwr zu2F03LeUklkH7s|M;f7ojx`F(EifO3&OMcdG{k2z`Z00RW^^AIp7DmPS%|e6D6>;E zyS6Vl^BLoJrK>TU2h!*w=%IM}MMV-?&ohqo|6|~ zM1iFjVm!J5O4{P9AEcqtKGbBSyXxlLaqGVbeGL@eg*yHtm$)wxn&k?=pt+bwP7_5W za62_{}IMF-5bilMud@EDd>UdHVGPg3-s`l?w_xiMe zcN#K%Le=^XQxnGfpvCsS%ViRqfO7H?{A{ z&oRE<75%RV)i#IlC6YFoN2Ljl>O;s1yBVpkX$(u3POAlv+3^}c1gDC%coPzV zR{VgKG%eAUT7MW;VsTL|>bwD2?QApZAEV9^Z(s0;=8n8I?E)udgf87q&aUl*&Z8rP zh4GW%a(!Pl(r&(o1N()x|Jcv{sKBj?T9Fcq%&LEuZz{KBBpdb(5yJyBAFQSIT=nRF zLxZ<9(SkzZZF1qXbSjjITv;bnc=$*=IWX_gFu-$V5~TdJb>zQ5&&6ZXxA^RgNiN8@ z-y>%E-=b(^`R&`5dldt09S1$OUaz9Tr0{p3I+9h7QgdHUzq}}PZ}gybRau~&QDq96 z**)@+D$*R%T@tP>(y0uLKu;u-!zv{D2(j?#)|PjPnL1ja4T%a!eL6bgqBPti)jas9 zzl3XH)6Fpc@jT9SL$d>Bq1ltCRaK4XXKky6N17gA$u1*{XAonPEOv8pm^YDUnKD_f zyws~MC@hqS2cyOOk`cSs)bKs@u$C9mh}Bx@+cjLbLi3~Dr$xgLSW5-~vxQnFLnY@7 zK~Echsad(LKZ#K5rAiR;l~GUcHw-{@;o@UocR7xgY`ZL+{)$Qc22*m#{(b-s=QxND za@0HDlpUht8MU3}85`Cu^IK{*mP{C5{m*FrW38pZQ7=bnUp%g0ZbO`91rzkkAtbe3 zhxnbl1-ncWv2 zSeRJ?hu>N!6_81WlsP9c(@PI8Z8f5CBi)e&^11B{0MzUa2y+0+yw~S)rbG#HENU}G zn5ERb0nQ!H^U=HMQT3+Q>0wP`&6l`~J@V2hBR#!Zdd|B26sODkVNu$?DI-uf=akce zBwnAdOHge~`>Ym8gE>p)%TAm9)?{UP6FGVvG==p1DEtUg{OwgIQyBfUgIOvL0ZdVW z_*7kmY4$-hl6d9^1sAq8O4^28_hxZomlzP+<2j^3zn zYBu|{fh~+xo#g+nZPKaBUL3i`M4vSU2^O`9hCXzin2_*^l_-K_n@&)$!8?Q~%AGnU z%8=sutuH^bi^4?tJyUF4uGQ2Bz6l&O)*<_`Q8||^O%+z6NE-i7OG&k3wC^+I*NNOo zE~E{YR9HfskR||Rq5)V1&sUodL3Yl6X!F2Q1E|xTpfv^qWWbdt+vJGTc#3t5hR{!` z1=8@@J8|l(qq$^bljtM$aXK>(UT7&SN)sJOTZs9Th_JI?g6Z`d81Kc}0X=SRjnpJ) zo@UXa8c=NAHD*{P$gJrLkt@@Rk%|36_MN{;wVJB=xSI8aBG+9Uv#PR{jE!KGVQ=(t zEPZs_{c#3A+0ScEgUB^NUdh>N=23EA+xW|phBY+{KdNDqi4c}I*#k~!nVL>ZZ=k7L zYtsWgldy?1Dx~2rinW<27$gHjBL@;frNm^ZN^VqE>A?j|WR1j~%eEB!^*9SnYwn}3pk;b5y^{DFdH0eD#S4P?u_@^c zB^s_DW$HzNYEa?+Zqfmd$6q~lGISNKD;N_sA`oaHs?c*2CQh%Y(2n2qAl{v+}+$ntTRtkHj-%T6MpZ$1Y zi%OuJ#o_kYK>h94zvj&>~;iHXrJ<(+q}29NXH;(~5&Y;+U&pxt zJkdk5$ru~ANPre$ksoy3Zi7L<;sSO@yp9V4kobpS`Mx~K)uhN>$R4V=_6!Usr<;)pW}j3N5#5TH4?orEK~n>VaMf59roN~ zDPb^Ak=A)OcOU>%e6# zqn1(UhCP@V1T{$W731nfXH4E=Ecb~9djsocfT#8?=(!`T9RfwFz8c%Z*`rkAr6YJN z78E!@8JsRu9TWRRCvaDoT6o+6J3jO`BR+s_qbSBA-fBXDc^adUVHmnYq&8fBN>)T2 zLw~0)5CFY2U!r-a!)kDMvFr%qo%+KuNH`$^c^v##Ro2(|Q(B?PLo6zl)~K_8!7uO@ z+R{9Ru(;lKVu!Sk{=`|l>GmiB^6rxjhb_3RLPlWYj-Te5>CG)M-Pi^`M!5UM5v4A6 zd1d>5e(c*z4J|&u-VB6rIt@gd`TpnHhYUW!;74MXlS=E*h_5u+*Ak!fkFju-uMfrx zY%ys=QeyfGtfbh-%6h7ez+%UcJSve8M|&{R*h@pFw3@X}oft+uy%mn0etlsj%JlgQ z4EJp^lNmwALXn}*)Yo3r&m$SFl2d0WO4u#0wlw^ zu$dww!iatJ3xea^vEX4Uy>iyTM-~MT%$f)<@_9f;1NEmlrO)XCx*zv&cv|T=w894f z>s0OM_`t(J2)hPH zP_gV1@16sBU!Ky%R^a+c%lIv2-Rv!r*QiP0u>0;tibu4DGNZvU+IUz_;y!zQX_xC6 zz?hDP(*s9JWhx1kD_q#Lg*9JkxZ9-GU9J1s$)It9L=XktkgGgp`1ao>M+hYu*8x=% z@8N*9e69aar1QMp2RKfk5qOXqSj@-fP^nv~D+nJwih7l@mHf-45q3|n(`qu>^;f(LZi7JtIJvVY%J!~hpUlV+K z)^(Yc4r(axuaZ!b8$_e84Su!q2uT)q#Y zq&M6(mBs8={6@b9UzaK!!fMRt?CJj%gADPGB2YYSY=t58A$U^nzP(XA()1N8#6 zAT0UgPC8BYukeh*?+sD*n~hG*lj&@y>-DaxSvumPE@J~C-68f#PA_k zuQfUtkNl)$3#JK{)zhgO1FqFFDF>==+}L5%qLrk&EMsN4vNK!d#GB+lkn~<{ z+6r3KbHEzxCCIP0a9SERLwGHgTniw}NhJw%t}y|+e-BCVor0-{w0`^)Cr*wqwrLkg zV0A^K%;o5UQd<5PicR|WF&kSIRh9X9!LAvd@b~IFiw6>#;B5}Osr*PB1_zfm-Ey@m?yrpp|X*vGNdXn>ZG-vbg-A^30LFf3H?GyS@~zPCV8BEK6q$P=FyOU}#p&^uoxUmTv)4ky zO#TMn@-U8YbMHhRmBT!+t<>rJhg`rlzqP7C>h@bCgfrW0M-%7vDIZ z5wr4kUCx!y0uCA4$P{bZSi{pS4gRql{_?PubJ9{@U!PlM|J)BhKnxi~PmNL{Xp(y@ zf*6uZKjWvDz{Z@fHj%t@og&C%e{moDDOhh44S6bY?%w_{I*OzFBh3N$joVIpP?l7$=Dw zMB|10eRH(b)gSr`UdT*2=-!gPzq;$mVjo3RGhrNW6O2zmEOD4rPvZtjLKS3qp+E}p zOn*fa|1b>RulwDoxmFW$ZeORYspXQz{N3r|o8F#2r{y|pASMNm+BI+|{BrU4_up$! znDoa{%BJDZ`iZOQxp##{Ndkv#)sLGi=3|0VXV2AQ&B4z5;c5%Kyal!%r?xmhpg0|F zk8g<`n1W03uH1WFa=@Zq!^rog80 zToFX8BE_1YTM+7OtYeb6&8=?K}%&_;Z3lKl`#$m@?4nMGi~ z_|me!ko~>=Iq2^N;+m-6OGs1IDrG}f1)aZr!^feKw7%u{eXvp)fU1MBeN#CI)D<(f zm_0cFWhw8nHYk3Um9`JH7Rbd0MW@E*O0`u1ge~B_Qi%Eqz-Ot4_D7P7CtU_@g3485 z4@#tK`zxnDMqBD+aB#3H7vkg&sn!578DJp>Hhq}3Rf+FQtix`C7n3Emm%b7}B0;xC zY005neMzcC^K*kKeJ#fiVpP-F|Gsm5^PB#{sV8CcAQ8=t$7d6?0~}WO(n+ztZ^W`m zCV+u;?;IFAwt^4=^yT&^b2X2{+z|-IYQ6l=z>ECj%{l+(w?B8n@nVm9=K&(ayudOk z8>WO7Ufn%I3BNg0#UVR&|7%yKsqUQWHUMfl$^+{bx^AR1_lQ%qOUth@T=2>Al&68@ z!N<~vSlgpl1GaN>3V(F!3AAq<+h%7))R^f44Tvl9kQO30+h^%(%wJb_)Ic|{ro zSHSk}=?f}8i$TlHwKWsD7^@M19vx1xZT8;?tv989F~xs4xv}j}EGO5N>{hqFrwnWS zxvb9_j><{ygv`A0h?;@P*KBrPH{-p)AwI=G8{c=G4vMsDRPcgG_T(F`od#nBstny) z4js%?5^uxC=g)!{+2iwL&oeA>z*?EhrRcjXwq2Kzx{@bW1YiI6=C`{|0&9Ie;nugu z^X-P|-*37Mn2cH!0?L!WNtVegt&5w{!pYk5)Kxr;8QafX>SxlJ%1jf0D1TZ|nf$a?4eBLPj~;X%G4T#kg{PJu~k?>cN(u3GXq z?mY1?E~Zq@r<0oGknbAni5*#%guzm61>q?@f&rAxWWdtOw z&NyN8Rj@xUT6W9B;??1i`xXgUT68U&LN8koU}s4hzKP&Y7`v%yTW{b*PnwoY>7M@G z;4xdOto~kB&Mv3TXJc<9xj@7W3(kJCCEBzQ*m|gRb8F zG;Lf-nRf2(yN8idX8ifzft$%ppfI&RSF_TCHb%Sby>cMo5BDv-{KWUtq{k-f1nz)C zfRMk9SXwr2zEJ+sM5E&qCh?6CAfM}{!d1qzo6j}_%p`gTfISJEv$IHs|2{qaVi0}0 zDk_i)2RKvfseCF>OCv7S$fy4K1=$vpiLO_TWvy za!>@&lL14nk!rcr8%(HQo^`LSEnh&4prx@dM(Lo1LRZk|Mu%zlu_HhKxBB9LmJ8vd z#SByKaXi+(&g|z9I)he;c&T~7p3mGbC>u*!@m#N9>!q2jmJnh= z{PfjjPqTdY)*3V!@ZvG5CAv%Y?*EL6{1;fba&fRl&oqSmLuIzEQ6A02h}fj7X_!8y z0!FL6HoiZsXlyubOhfO<@`IC`xj9x70H1YI*<^g36#e@I)`=#~7bHL&V!zrXk_VE< z7kn>2_wZgHvU{4K;Y%zEw+`i-tu?xAK8L&!6=&imT#sTbp*JxLd(r!v91N+2EtOJW z(BNvBa~yD}GA1aAB0p|*vV4PTO52)z+a}u-!MHmOhE-o~yf4=D1JZ4XtM;4)wtpuv zn5CQNN>~CgV3OgIbl7>)KdHmAR~=UCA?-lllN~$ zDqWNf2rszCXEmy^qr&{LSvZ&ne~G!XLGVQS&jM8!_5FHhZ$syxeD*aGw^XERj;u3l5;kVa)+#C~)Y z$GSupNW8n~fh+wuJ{xyZpi^tzq2n+xR>^9+Yiyw;ym_jd(EQRroVHe@z?EE}>Us1> zDcv8K&b}@cvv=P71b`8DpiKpOFpBGXFUJoOf1TGq#gJz5TPsp63RKyswV|#GO27~~ zQUEjoIM$(LDO~}12ITZT=k&^r^i0@xfzoHxROZPYUqYyxh!hno|C2iJg6yA?>nieA zuD$H&UcG7gJv^hcO067e~yAO;S&5{U=9|a&;{xUdz=`tBp^l+c8op;2Fj&Hkx1}_ebn{ zn`cSV+>{!QD;jgg+Y#0WY_2zPugcwapgI6?BAq~l`^o@9QUELC0$1lIYq)4R>;*U} zl(Y4AenN~1H5`U)_xWcqAnd`P)fF`B2?P&4(ZmmiGqLiM@!w z{Na!L{?C7tFHe&?hE9!ON9dvA;RID?dSPogSl(y>zi!as_khwypm_rXpbv*)mw)ef zhiGJDX8OZgqm+BBk=Tnd6r_r%5|BEwliOgTU8bt0_~4{2KMNt^ERP9g=d9>e&2JTQ zXgXw=NBYvlHx$$1oBpt=9$^h>6_p9cPiKSq-RVAxUPo3NtrLT_0@pbuRHU+Hxnv4f z(j3bCS!BO^puq4|xZ9%n6$k6Bqj?0QNdG20@sU?ea4!}sxYf-fetn5E* z*JxH$GMG$#D$j*QGXg0%E8qRp#gn;@?tP&On1ysoX~5o-$1e64f=mEH5Nywuelc>@ zp!RBZo?uVUhj8_+^-x-emfBtxP#6mlpRlh_mR2a!oPspC*FDc`RS5_hQg1{WfQ4Ef zsoyqxtQUDDfgL~wUej#afWsO5?p#AUaK%U(_hW%B@# zCE;~6MY)Nz&`e)*NoD3qF1-G7L_-F8>ud=ZuG-1T|U|!M6XBG*wIzZd0JWJ=DXcye{U!u|tXH#~w2< zr%?H?A+@-L?x`x}8&M@)%da1Q2)`~Rjc429PBn+UWxdHJLEc8X&fi5D@w-SFVsKTB8(QS+o>)_Fn@tzO}>7N;p%K40kp8?0#Rc{CNYl7(N5 z=FbO*hJ|-+Php%w!trhFc_w2VdH=s@ff%Gvr~R3dyf+l0zkmJ61BQ%%5Su5|EOWbH zn@q~0k3cK_{B+HJq-+OkLV4j-L+f-DCFTe+GMdM8ug^4p`w6BCvOy>3v^Mo@o$c+ zIYKZsEuD9mtOR$;$c?^S+S{UEHBQiGF5gYeOI6VB1$}xA{FA9as29yewuLSI@Yn&5 zwks3O9YhhF%{`6qb0U+M#0qvHjs36Rap5G&Q0yg03+Ev5^@|p~OUWzDA(ObA`nF|w z)}XT8L97>x94MXnwG2c*ZViFvJMg9$igvbcf9kptm7vDG-8J#8VKEP;?PdNr)jYsl zhIJqJ#oo{-9;?v!G$J-b(giV%RdEB+2~!=}{;<}7hMsq-(eV$E7af5+w)Y9{2c^9$ z-!oSn4`g!CC?sdL>PW|GW*BbqHsep~<>_Men{uVdN6h6LCiU-|Pw%aE)d&fhvLSUN zvLsGgwHAXw^7jYG?!Ih6WVb z6^i1jkjE?R$L|@%ziFv{)pd#xtARG`jb*qSZaFg0Qi4?qv?`bvsGX)&(c{1G88hN= z@mGMl>Vv1uPK3~5QAXouK{B69>RZs>!68F8)1eYb+zB;ZLhaD?lNaLXMnfhjTi!In zuI(caoed6@dEk#ILl&{>B5U8JlrH$vbB=~VzPbGCWOU0XvfM;bnObRZ&42Txn0phK(W?rds_J;c?>qXX&K$!A1 z(brX-rw6_?PXx1%xqlk7E=J!FFO(&)KnK9Th>v{|SndsyxB=J&Q=rG}@p|~ZZ%I;V zWl{&6R)oa~Y-1x}x+=hLu;a;?OEN#A^V`LS9ihxp!A>6m%G^0;EKdZ{>};cvfb8lbg_se4axj^>1OhCP8>&~Ks$*e6SjExT_^i&CB?_vvU)nu z!77X5z*rc6HhW{l2q=`g*?LpvAwnk`orjk3^X0nL{@BY~5KO*-Tz2lUsy(RLKz72c zQ$%x9Pkzc>mIvTA)U+5()ks7yclG=#%qY!=s6t61|7AXsv5ov^nQ<>`QyZ+k<6K!S zK<8Mb_3gJ<0~fyo2*WtLRR}^;eH)l!;x(^rBs&6y>h%||QhiE$S7uY#@+(mIgY?!s zi9i5?`~bwbUhQRjY$J}fqbB%P+`f|yPGgBf=Tcm&%w#D_xdU^mf1hrhmpkAYureu74Z)2$W%G$u$B|g*XmG?bRysyE>oG#5TA)noTgo*Fu8-Cr->}3gxBE&efaK_^adfv=~$y-9t>V0&sTjQ zYc2M`!j$h|kpH->rvGGK$8mBS>k1Qo3A}v&PKS=nhC!YA1zQ@gbd0jBJT`=@%2}vR z=73ILpOPevrjkCb|Hlof>K`SB{luP?Mn?~kP~}5IVBaG%Rgt&1Xjw4H8>y~uQ}k(= zU$`CE5(3Ve)CXlCO^;@6LKd?fu@(3@b=z4+10DGZ72g=#|v838b413Z0(PF0f zr?N_RhW3hdZGW#zM#cHAssc9s$-uO7DFAAZHBA*i{X#hp4Z{e2d8?l>{pcv-E>duZ z{pDr%D`vXKc<^zMH#y*&oT82~rK2zJeK)Zz-2_1fEX%;ILrh;4&Z^PqBHr|J25l(y zG1x#QFpflb>YFx61_>j-<k1QAEsV-|>6VYDWg zyANh=U7N{Cu2uIe2XiZ#d2+tu(OgN;G%O9)Sf?@fji^?2nY($2xJ*^DIBKQZ??4|g z`1l{M?OhK1H8juc=N9S>v!*1>h%eC`X0_tNUPnl_usdro{a)46^&>m7kLu8oTkxGLgfNjc|Ke0EnoPd7AO%@dWXT7opY|oB-SRK!&K7cLNU7koF zFEO58wtyR#0KzIUm(|j$%OY?hDVdmvhQ_iR|AuJ+8JVkE^Ft?62ha`Qjoa^zreT{F z02d8>PfL^nt2pER@gH1;_wgBY{QteTnk9&}A3@$nQmpNe6b#a!w#o7xigFb=1_TsC zcg}pOB5uPkT=r~SZZ_-n`xJjBJQCYYhy}8tu>qu%D6bUq)-o-dWf-CKbE`$k2ws6X zW)ql7nrX)}6N-5mYa3#A;srlinWUf@JnsQ)f>2f%~`x44@GW2V( zL}|31YBf&y;)s!tWmz`ua`2sGsD2ui@RY&d^zOeC`u+({2V?* zaZG~G(Rm|m>DCLj?jJ~->0(B<2POUER6+l?jVHR@!gpiDo+`O`6TdwDq3|RF=d2>Z z%zibv$F`c98h~g4)3+-n_RhI_TUDA#V}&-^!v_F(Tqms1`W$eb+)W`PM8mpC_4~=G z`yWN~s&hCnSd(Kk0phQWs7Y0m-r_DXv(Lz$zOW6(5;48W{5S1Hg@06Rm+n^Z)vk#} zR5xh{Ck%3h+^M3AXXY8Sui!IvIWp}ozmLv{VpuD{D8E%V%Jv#0nGZder=_2}LUI62BxZ?y#O zmMmXK*-VUrwm$?t+vy#b1%kBnqLe6_zD zWj1{V|GZn)(0E;FZu`iwHJlS0w3uO8LB5pZ|K9iGJ!nvq8!qy&>;Su}*mfw+&s1hP z%ioV3>#xwi1%2C2&?U>aEAM?Wxkmp~D1wdJb~{h_RH;%B4V26eK#}P7YLun&FvB4O zq+sB2ODUeK>IdJ3)ZQ%L;qgtr(g()maAK?|jZz)YKaSO%_#d?-{|yH6+N|dIzgr1p z{txw6nO<$-vRl>HNCMJnCGPNBXz^fL2ILTw=}yY=F*D3W!Jh!>bMvaB|Nh!1mq#l) zU7QJ`9gtK}9$nrwwleF`Cdh0(#vOypl0w!aDW3XRInL=W^0m3>4_D(2h}^1;bC@ z)~kFHbula`Z@pNviB$gke5VhkjCLq%mgAd<-=nhtw*k}i@#9A!!Vvc9L3w*1ngA-0 z*CyPDjhxF0$zlq84Zx$oz2KvUC|b1#YP7LP*qrO`r+s!PnYKLEA|YGVT%lV)O8 z{?}u|mY>QP`pG#-P`m(iy;+Y(-MqTlP|l_U&l6oK<1+xh@^z(`N0#w+I}(k@VVJNu z9vDt3`fIA&FN9>iI9zpsT=baRd$tyF_xq70J~r4@U|Y85FtQBdVv;s06em|!ou0c9 zeoOwrr%%bph%2|8F&98eq*>kSHR&}aKZAIC%5N1ecGPY?n4Vo)r_j>i*l`C|uP#>> zY|q7#W@E{lrHU7WrxTFa{u7VFD^k2;Ckqn)9S59t=RiJGMq*ZyaQzc$9!!R{*E$Fa zL1#shs zu`r{4p^=MYVMDKL#A;~DXUtC?ou5X!;z4wu3EW9ef~GUcA^t5;o1RFgYYMDP^2#*G zPrpTc+}L@GNhgfa4-GXz^n4B{5Y&IwEl&5AW1%SOn~QD#U~O^*d}l=pfD)x}*sG0? z@m_J)G;tXtm~jRsCKrQDDDZIPtP3~#s)CIvVWscp117(Qf~ETrZum=DCahlI5BI)Z z6_H!5rRqrLbLZ>hNcF-sheXzy1H}LScA=eQJGVvJ6!^W(4~8lUa(*jC75uF&dlGbJ zph+25sNETxINlzP<=w6QitW7sU>WaUh|ld!9R<|*2a%ORQiRd^W$iv44*+dLORlMoBG?BzL^3ERJ8}fl^a}K zR2dq5?8Z8(?AEO)CH@~+f~g{(FhA4!saHDIVWPJmjYA9%;YeRS$4$%3mwi(yu3Zp2^~eT z9ZamiX}<#~+W1wOcVS^l03L~u3s5_IXbO8l&`6$^Gh8WGx`lDiylTgmnJWf5TLG({VC){Q0m2IuYo%7XWo&0ewlGiR_b?_O(q zvp+y*I?jLlk{PCTrFJzgaU%I{W2N_$T1SO47L&V$Cm~{7GS@g;btI7d1*UI_g^NyT zCH21WhU~tNOcH^n1;L4%ypl#nef^JlTz_NJMpyd4mmBt`({xcXKt2>>jqS8Qh z=yF91FRp<((F*%p0tA>2o+Q3%>=UBk!y#8Re75L7y@~>X>05c4Sg4W1&ezQ_{&<$p z@mwod>`5WM86gpL0E>bIbbNjw@0#LE81LlPNKnp2eZI2$Cj&(3PEAa;(sNZdjEx70 zMQE*6y4B?C(u-w*cHWc*H$?;%R1e^EJl&Z9J34eI=r-fx#Agx^qxSb2W>xyp+%&P# z{Tirr-jD@paonNrK^2)Hc}9`b!fKTwZU$>?|Nf{V4#l>? z=s^jaPZ3reDsdzgLMf(2k^y5v_+L)o!$EcQt>dT68`VA>(&0Hd-(+Ynz|f`EIv}2z za!tGk0|jVNF#tnx;^qgZNnZF99?o9l%?5V`ts3TP5OgRg|9!MQg~wreMfnG#_KnYHKi+Pk{rH%d~V z8O?T1i@iYgf#TC^{tek4x6p!}6%R2%I~rn1{CJ$;D_j@pxsXSDhpnqQyZGqN3#IND z-u;isIC>UwySS9e%tXa6lL#F>IxP}QBE=Aloz@0e7r8GIx{N+&iB);Z<0Xo(#!UbO z9%oHKc7{#m5j~*wk-^tdODu)m(K5kB%?Q_})%QrZyvBV@$)ok+;VL8yYeJ){k%?!_ zlgCh&Qx4=c!Qn_zk(QkW10*B*Nns7`@6w*JxR1vMsTr|c_IqG-x^rVOHvNG>Qs(8v z!__iwncH^!(et410ksPVU6I1hBi)4jj%w6tWPz&`!dpmbt)kc^z5UMMFIHny6L18J zZ3V(oe#h#er(59s4d5*WPP}NhpE*-%DtVW3kEeXo(3d?IzKBMdvGPPDl?oL#PRAqZ zu>@m6wMOe$<5EIAIWd3O?LPt!>W}px_z|ln4=YQ6gp+~rkQ_^p(Tf_Z?901Rppez) zqklQg`>H4}>SPge^xfwGL;oL`iyH}~ zMvnd*7|qV0v8t?bKv7xt#0mPg4yh97^buWR>$2@Wf)WzeLPkdBNH|dbN4uuX%{p+r zRS}?e%rN@{8gE+{LhRX4@))&q)#t^ zDO@o4fmhK++G8ISjy8o}#;OM1xDofiP#RJzAXdYma^9Q2X_J1Ix+Pl-86s{vkq+Gk zf0qobtPS4D83Ov6|0rwoQoPE-QEQ1?&gjBbtm=7M%kZWQl`G6RBn~+QpNN z%&FE$wfjgj)z-jvWp+#3zvQxo(EWSmkil2lx{*Vsk83S%H{~^yQU1oCraloC55K%f z{#e|s)O(g05sk@QGu^}sKvf0P>$QyO2ae|HqTf9t;?=aa{@zwNQT8Tg$s3b)X?Q?G zZwOKEOCX|Qw1ZF=HvlGy-%Nd-b#}B3G@F_bt6`I;5gc}#tsI{fD*Ry$_D3P_v$A8{ zlU?wUH})VoaIJ9D7f>QtP|~bG!z9P#oWFI;>f1=E=S(?r*4=N9)(njh;3QrTTBn`F z3TVldu$_tykr$O^uW0Y}K4GDe)FQ+P(;hw1?y6C2Wn@(lRiJpnGmf&zi(H1CM`tdeFN!^HyU8-Szk_D3?>q8i~oHDAAILbZCyZ!ze%(z@`U0$f`^f z{!E8;odE=FrD2af87+G5C{8X{Tr1jU99D1YHC_+_aa7vZ?hj?kp8=R^MDQU7?o2%&@ed&2rVfXgcn<7>29U&3^Dv;N^7`|4iHI@d z6J-g3cVj3di~Y*TcPvuU9%25S}sc=i!}qxi}6tG$Mq; zA~Fl8C=wr19sn<5fGVSa4Rr!b@C-Lu=yx5UC^Y4ms(Lj&t^r5^g2Avoki$6~K6YK< zH?*p|0+G)k0gk(DOf%C8)@<5e<=c>5yIV4hu0w~;f@_1 z&m4UR>K4T>)*-_t`&s%N+LZN zvT5GLwkXT1tzJ%38_g-@$DvqyuCLU6IYvX&bJy(shncqjP5S_9*H?2Nc|q#%`u`dz zp-9!Z9+8Z3EHI(UC?G%scp<(QqNrBu$-klfY%`g|>pZ4+)Tbb7LBeo-5VF!2PCoox}9t#_7K}cHY z`t19s)D0(8Pv7R>`pFk)um$@;e79xT4ODb9qY<(1GfD6gT4NMvo;hn#Cu3M}B;~dg zT6hPXXwUbORS_6@_Kr6RO#RezzhiHk6ghq5W#Y7v1Y6Cim5vW!*&bw(PXYx(s}P=L zK36OU;nEC&MVGt1@DZ5I_}sMOW6QsHwkAX+0a@>wom%o0Wx=rg$$qKE@{r(f@}X#&0LE2zAJ!=eb4dwAPL1I z=EVf~#ZW|UGaGJO(iZ{}Qmi4l`=q4Jgi-iZJPRn9KT2n{9Ziiq#(Ad%1)x%WmgV7; zR%w2*s9bcv_z#u;GP_ZcuK2kC*9`dufe|LKV?EK~B5S~@Oq}In${AtN=%ByP=e%zp z3nC-CH?txe%FQtf{Tgk5MU)9^HFU(MDWdno%$zaEH)CT$Up@z1V?(iqQfSZwxP(gx z|Db{^WmzD5Y1|V6A?|1eU%xeUoa2;t=4@!l?^R&QUrX&o#OQGnaD(tEV9`R5EDnfi zME2`f%_wAZs#(`ai0y8zKQxPq8>fJ+#8b&^8?xTIk)&LWS8L)MzWclBGM*pT(Sr3~ z!TjaG>1$Il=p}^aWm%>Q%rpDy!17SwfX9c?kgb!nK#DT)pEjjtLMSY^T#frg84%%s zQfQ)1hET9N(oD^ekW!c2XU)yK^DfchbK?&%28w-3H^_1S$%Hke@BrqJF!(edTJ^r=5)R{gEJR3SFEjS$|B!cXHLxl&g{X?;aVn5Kl%KJX zn``|yTNEgcT~Rd&KseP^4szn|b79bz-xZmaVeVqNiDzV%;@oiCRsc>Ue`iL-n@nOk z0oZ>`r%>BQjSd0_WCuzy)8DUTzJDG`uVLYkBMO`B|B!5tm=7IMTe~Uy&1@LTS~e&R z5}v5QSyTzI70-u zcq&RGwU{J)L68zh*lwoPlea~cv9j{c_|>XmeD*WNBcNK0^)97AUwlR47w~u0N!d3J z<12Mo2ED5kSNaOUjT3C|lc?hA5UdxsvM_M;DYA?ZmZ?=1^HUitPf|-8Sn%2)Kn)GxS^v+` zS#VX=Zc&&9>F!3PySqcWyFGMwNOvmTDlOgJ@kw`sl$3O%lyG0}A7BhPhrQRDYtCm{ z$0;C>Ck5;%RhLv~VDt6M@XjK^)rA-<3_m!y6Z{?1%JRh@UjD~Go)Sp?m4gN!kCV%P z*Pc^T6JU}|{SIkwTxC^Pm#ON1WVY&SRvGYE%L!e8%0x_~^P4)8VVfJoqko_yvtT2O zG$Zu`4VCONUfA4+C2{m^>hgk-yJ&IV8Eic+QyWwt1^1sE^;zWB_p_Er4)RX6jq1O3 z`yYEKN!&P2h@LT$+?1n;1k~+_I3dwAm7C0Sj+NENX2cM8VKT#qJmkWpgyZnbx9<&v zQde?aTkLNgrIa`HA#qI%{%kVxKjg(>1^N=H|23gA6!bOF<+{N9wqJNzKM(xwbKVt> zdp;Qw8jJtAHtdwRzHGSlPL{NIr@1SBwONhw3_CWHFsCwC1GgTYqqS6KWzVH9j>RF0 zuh}#$6+$h;W_(6uDANHD!jAFT!MSCLP%`m}*hB-h4KpIuI|J?FMM*26Y^{}H@5pA+ zW_nxGcK78ucl@{mHL$!;eev;v&QO#XX70DLSEq4^yj)PlYyH`mhwIY#+ISvp!9&A5 ztFn^W8WJ^(|DOGXWK<}w1SR~a&G2Xv{U3vFb?$6-wfQmi@mU>Ur3S4c8@qFhv&T@oy2hQa1D!~4yL1@I`}m9m8cPg=Qi$seUX#BJ8$ zA&+}(Eqm5+9xmJN^SE0xgeLk|0IZ9g{` zWdGir=04bbdTyt`kxMvY3SI6qsQ`8`GEPCq6jJ!=q7AYGY2N7NKY&SzkPgoU$CUXh zL%sywa=$adGbQa(wLV7+mUd9sBT)$x{VD&^WfEA9C{i&y%&LhMToq34V+uyhH+5#w zEh$P6w0kdH_Tv{=Zd?;tn#nEL=WGf)`PJyig#46dh<@?nNjA?X->k6u1hAjKKeln9 zkSa>!bb-|uZ0;x81q<(e2DfYBr+nfR1Jv>AnT6@eXq=eZq=NX^uV(Wxyf4_a3Mb6< zBLOPkWZlx`{tg4$a6 z-MU7dg!F9#{g}SQn`+Ag`v`1gS~6+l_0%_A=yUnp{g1$JNRpM(gSE12AuDy9Vz?}r zK&SW|^AhT!w`_6I_Qk$5kPJ9+bH`Ei06FY@LD!UrC;V(^EkXiz<<3*Ry!`^O2SVU` z(cXrOC?CMB0U5js=qnG<_?Fi0+E>1}{d*?JQ6>CHiO%3=A$BPEgW2V>bWWPWzaUtl zOay7_1_>*FYdqF1cW?(VY|-wnK47nq7Oyl|hdFFZ&BrqlJ{2UgXvgL1N>CNa#L<2F zmN+>1&h==D7u>_=722D&ZtwRU5r3MzS6Pv$#z+{fVcb+bG&_r_A^7&E~f#uoaQ6{e_P!8xDSf zi($^4a7qExW%saICFcFo#BTT@dOs7eW*zwRo-P7#I_BP*z5i#PMd=AK=-f z7TgLI&O^m_*fq+aWWBQasd!~Qp`t5`M(TNzoZp61>zklkv?foI%TSR7#b~8(&}KDp zmi>`cYC+Ppq4wd!(IUL~rPftA;JyK!G}!-h?%ONlh#j@XPD~8IJ#$4HqKj5Y5=tS1 ziSUyVylU5rL;I%Qq#Ez!R(YtR4gv(!TH=Yob8i6Y08)Q_0 z>v688F7XA_!>zusb?Y{u)PK?6047wQG@2K@uTM!;lf~1ni`$H(hfqW&QrH-7B~0r4 z?;=u?aYVp*Sxeosjrq)~CIxAlCybvHO*LG5D48ZXL_M&im{Aabu7bM_!7z zoeSYHi57t(7VkSTRPF${KHC$APgNwOg3U90(*G@&?&$*nD4@T;05GI({oWFA3oB`8 zF=u>F_G(t+9dI#s{IrXn+WVts>kX$Nu8ab8PRVU_K2x~E`!L^N!%RvGO`5I z)8ip@IgC{i3TBDXCd!YZ;e3GW>NIrAK2Z_9hwPzoWx588QLb`mW7rCzl6@4acZHvR zFUaw94Qea?tQ4}Q75MO*x|(e>d$a>bhSpzO_rG1>P$VJGT4-BP(LZzrf-CH%-=tBB zmA?osK(UT6U(uJRj%@8m%A8w3@;BtH)e1yq#i|W!tpAd~wC+p}1l`&vqUk-} zs|I=f*b9Q0OJ_6Y4La-OsnAiK${7@*Uh6-dkcQ6d1B|umFW|kspBV)k4}-AIOWrq; z3b1*}DeAGshJWYteh$Y{EL*OQLzW z4+~QtV{7n8BUbA#O-GZ0Vebt}5)UHnssDSuhY@iQ0}Rd!Q+x*>ZfN@FclP1Jn=Q_! zcbDNfDlT-PA3Qk9xEra^jl|a#kfKIhzOVgkntA^BXm5_QmT7}?9Dx}64|Pn>hj^gj zY|_S5a%x-SR}D5*uZ(X1zjyB3cU1}^(+@kqU@-^q`e6_7+;r-7%7VI_`QM!UZLD|j zUn`nbc=AkN1e@$$Gf|6(6wgN)QTd55_Vh)xillLp4~GwE!?wXB{Uk&5MS^Dr1cZXQ z?B@MVOC~vk$5KZ1FRR%eBeFKBqP}___|ko^#cfGvP%85bw133+h{-43|DGvuDmifM z4TK0M-p)g}@%JYSZH*YE{+TA!>rJh(N_u!BS5ejoS7)WMcTprXrPO4HZYQ zf*Y1kvHwGmt&`^CLGK5@E`Y{vWk`JY-KiCNcxhku19c`YH!d8z)t`ssnx(75`UCnO zTQ-w0h|hOJVs?`Y{HDOf6KD7S8y3vC47e3oze5gNYiMX#U;UK0QR~ZTBfs9G%=0Dj zS0RW#3C<+@Wv&fmY36ccBrlU>mf41WGIr^Mk2KF7Lbc;w$b7uYKm4d%6}=c3OBm8c zyy7GH^`^X{S`v?kDsp7gLtc%HeWHF04x>887I+?Wtt`CUbA)fErTiioFzhp!kXIls z3npit_j?%~SR=SD6M!I}a=3q9>qz*|Vs35=<>2Yng7Yl=l+?2cRKvQT{BF{da!tn` zhx5Kiy9{(+T()0GUA82|p0JP^Fm*3yhOSBiLmAtBeihKhA(vax{E#>`!ld8&WCS-W zcvzG&dy*iC6dFdk)xTP)&s8k6#32{){ zS^Ke)#nf6pG2pfvFsAYI)co-JF4c#}s8i_!=#peWsTfWGPIs>hoFDnfCH#^Y76d}f z?0*ueINK6GnnxtE(EmB^CN(40{R*PQt~ZCqF!M{5WGNOuEu?s1&4US8b22i9>VL?` z$|T!>01IwocpSG^^M%iw5F!{Whb)Uy^bxdevAtByuYN}iHX6h(Gv3bG`mnUYWbVpL zF(Tk1cV;iQm?TfvZwd@FO-L8tTR^8+lMWI^N|Wqo=7dK75haPYYNFRpl_Ej50FCUK zVL_CTC-W;Q%VKY~-m!mUI@1Fq_z4wD<8kXjo`$|WJ>J_?>RrNaH9#5hq8w~|a`*(R zI!bv^@L`vKZbDiWM3GM2IdB?=5wB0ow50dFPJ4%tqAmF_htOaltR%{akC&N7aG`vC^;myF=jH^+ND#se zAx|G{_K3j{_Q>8tA?>_!oj*I>dHC+BT_!FlBdLB1kxsk@Ehd1k^@Z^dFqcAMPI*h^ zegzq1!OnQ4pK(V4I|+RClboFq&DGpLv`W=}sRljF0e{yhgaOK@Y`Cs>Rjb)S|2ph& z#!j0dyahP>Ibo7;`1$xU@?Qzris{VvPuEj&_}g6sE2#3j+epHeqp7YjF_LDlrK}mO z#uo1_5X_%|$MC;$dOv(B19swcdgZ}*dO&n3JFd5A_7xoPkg`QA&d!n{lC}B+Uh?U~ z>wK@_G=)-q^mvP%#)e73v0)?HQy52!({`+Z$R6XTV}+N9xAEyA_%@^9{gkpa`gOQhb~W z$bd-xKwUnDXedEA>@1vJV9*-f`g1ZtPl39bm{<_RyNVo|mP9q-AL4O5b-)*3; zp$So1k^CUy9(gki1&}wcva_gI*Yc{AZ_~}*&D&{uj2M-@c6xDkg>}@GcuyayBcV+# zgY6gkyHQF~on&GpWdpmw`Je^TdMLsWXm+(|EnrQ9jyL#DbJ4eJu-{iW@S3HI^=#i7brpZ;PqSVZP`i&66q8-F3fE7emmM#n zV9AI>KFh=)Hv3Ml-2ZG?(tVJ~`rum$Y$WMK0qg?D62Q@Se!9^JIedaNxdG%Z;kcVaa^}O%3V)+6Op5%+pQ2VIC14&OSBRMcqI5N za!ASco>GtJKkFswGpG8{g!po%CA?T{2+ZB&$V<@kW4oX9mQ3NF$z%#GMx^%WBn>yO zbGV^YKwI!|l7LWv>5CN@00~Bn{aNBIjNU`k!%(5%jNOUQ{!1(6ASMcdSa+lT4svXk zxiv)*F8T;k9q&h!=0KSQZt-ZNTPvbnvM+l%&_S}2C242!F z<7#g#3Z4dehEpHhj-dX-#WLrJkuV<2<&~wpvWdpAQ!-NPNYLp}Lr%SDdsk20((n)& zp@k~6us)gp>AyRp3lRQVUu$zOWKNPU7~}9JAWh|_mX%FK|Bl-v{JTF9?fHkiET)ZK z7H$Qq05`IfX+RC8IX_kz*%cJUFD&=zwil9_Z7&+^4t-68B*J?g6P+2ZStDx%q+aYg ze+F813ua_ne^|5kI;_Xs3|*~3xOI|l1%dhONCk!Xcn`hhj+_ffdOLlz&CAp;OFhpZ zQp|QJoJ)u@=sULPX}^e0&VLa0*S^_yfq2j3w(NcaX06N{ z1c`oLctL_+i(qyC#96!h)~7v+@gel-hjDy4fZa#N|?593$=eZ zPNc3OF)9Jq=@ihjG$RscM;yuybmxnwK<|Klf%N-Cw0sg5uDwIm7QRbmUA;L!m)_L} zaH!+6UmUOe{+{iumcyV2gO@|5Sw?X7KeantmrG#$9?G8VL0y<1h0Y|TDEA81h`(Sy z>1d$b`99J&W~o2JENmyA(eW*h`zkm~(zv!WyIQTb7c5)JN1TG9ZK`eH!W-YmeA^oZYr1Kil$*|)2+@*GT z@!u^h+Z~2;;Oh*U?3nphv$?YjY_*ItVfTqw2yYbzM2|g*A6(&g7gf~4og#8_E2Ml% zsS`Ru_YS^GU9(xGPVAT2Qy^ah)t`d$L-;=~PDFglKi^4u9a`BOzA8&niYSVf_nBrKl{z&=1&a0oh>>@AVmu7Am}fr#p|BlBoai29dW1yh2}H(3lGo@aNS7;y%jXB_?xo zb6<=9^nm?zQO(L3Bs{Wt>?2ogR6Xcig!@_mC&pzGFbtxr!?p0OSc9XTt6R5`Jz~>Y z3^`Bs2i1?HtpH_Vc}iKFR-t=j@ZVyrO15}Z zbfRvNWhU6{(8<&);Ijl|*&i)FDwZ_=Az>@dijL_3MO1p72hDk-9!4Mq2CMlG+li#L#6>`hyFUAQ&h4~pWAi8R)_$q1SoBW({(4g2?}h0<;w&_m$Lnt| z{tMc=eR2S~SC3D)R3~V%Yxv1{hTCuf%y|Pcq8-@KNtX)qV4sv9P z`S$AJH#bAsJWofJGPxzREd@SCtDn4(ff&BEl+OR|YdH#NwV=?pS9Cp^WyAZ=44${{pci&c3+a_1q7rU3 z+k)-9g)23BS*N)@F+!|&8L$Jcu+oBnVQ!LP6$dhyc~`q_2vNSNSEANDY!1W}kU|!^ zz!^hBR5&!hna0dOjZ>Lw8xcVn*4}L69^NkwZlYBbFNbO3e&Le8tbiHo`=eG<+bzqU z#F@N{B_V4r7Nayaf@{Ya!6cK7%;2{=WFY>#Dmne;jB8p76AA*HR(0yP3}|~5Xjwx_ zf8HPtBjLs0sZE@RIHPE=_@jCp1w$2B)T5;D`SIk?NnsaNNct|Let1(hcvN7pPAfBk zYiseF#gvqhLZ#RuX>%ivquBhWc>aFSQe5Kuo)9(lIbHx4MTTqS* zG^&qWo@BPw_vcrHLS6j@t^X?)&a%xN%O2wSmwje5yp-h1nq{m!zfi^0tdeWV_ni9x zaUG#wCoFrWnV9eS*LaPR%;dDvm_^Y4b99dh;pW&BY(L5*d=lYORuvBhX)P693-!Kn zi!6o#7l9L?Gp5F{#i?D8{)pRgmAgKfx{Yd}LXPQUk?$_Jl6UMuxS3YvTJ@yg{i=P- zKde!*p_x0-Tkw{;lZpg`m>bFEc&1PetN=deDRxj~I}|hA)%JDr9HLKT!l{Fq5?1(m zvLQ`d%oHEKi(W~{*uu&Xq@dEQ7WZ95n-%{w64w4uArC>J;c~AQtoKw5K|~t0t&jYu zXX>f-Dd5lB9qCqS&Wf1YN`o&R1N7xDziP|9^-I~QpyWjMTv9E~3h&^>>6A-mygmpI z%&ePDmD=E|4ocBwDkwWl=sK*Vz%)U@nr4RCx#aED^iL}51|lq0(sh; zEw(S?FIl?_C)V$Pjo^TP6r>`w#ls(oo?pCXf9PVdDriPXWxHuWNp8{v5Bd6v@1n7qy6z7LaVig?nRt2Cm5Lb>u1;vPyg@83!X=E48uq@PyY37BQc z4{19gACQ|FbPSteoT44=b*eVneaCc7{oBkoo+*2uW{=UHU zR(vCjq-82C4XKY--F0tBp^`Yf%~)e~HG^d}5+Bg!RQ`dV#eHS)-rs68MRe&>V3?(EJTM{LlmsQ{SiPR_V2wulsFS0}t4T)f?J4eAod0 z@I7Y|hG@Al1fJp=)TK5a$3h6`+gzrr#bErsZOM5r~ z7N5?hD3{elu29fMtTt0djZvM;CG}aHG+H**nCJT@@MaA)plXVYpU4P=SjP;+hCkM1LMrk}_(7BU(J zpBzHWg;h=Yt^RUfN`!jXEnc-@D5cwV^NPrllR~xpd#_n5ly=5@g*AhO74dls3MPkK zCvOfKk<6|v|89*Lq>eIW9V+==PQ6*F-6J=kuOqJmF0?HJcXf>4wgi+ z1wsm`m}~#hEeUehVzudz{g|~ObbCz7yPMIYm14#3Cnpluzo#NvHJrvPE#TWtOg3)7 zgI)DYHlO?cNn7wvCp?pGb$Z~8V$YWtBE2AE>H>8H3QffE(3Ay2lW%BK5E3s(GuWIWN35NXpXRm%srUq*ZLE_2r2Mt})3iE?M3fbfvMj^$^Za@ovX7M=V|2B3Bd^T?xx zHx}CW{OiZFkU11Q{I&dXE9iQFe*%~iXdi~qOnU=hu8?lCEp-ODTfL?Koe^b&Hq>Iuk>SX=2iLcSx(mJ0S|dxW$B4T~QU zWcMV$(@+N7UHnR{Mi(n58KHmV9>(uOB7*$x44Jx!XIi|Fk1y7&`=Qy7bOg$~c!axl`xZ;*Ttx!+Au zOk;%KhV};JpIy4?H!>PM-emEhxyEYtEuUKd;bh`9Kz@n<*AkMaALq+9LC+TJCI~Z) zrL)9Y59QF3~ouHuE~iUkFRn6x=Lst-5&of7vtf~hozH(#QLjLS-EK=!s= zCm_K|_O?!vybH*s>#3%XQ1x$!&zxYDF+^?>yQhagAXrlB6PcJ71t--G z-ns+}`U0N2Zn@U`Z$v3lvXjMd?5AOIE{=PTKPaxjTrx1$W0P$~~5+$M!AN`#)_l|bhM-I!yTt1-lW|05e z<8WBMaI9OY-?QGY1O5T5cxqPMe>>b)QntdNHCjy&1Mu9<^_0l%l_FbxyvmpC7Q2P) z+hgc!7O-=E6Y>rOPcyKsQMYxyJR=&nd*pCgZyYVygZhJ<(8jvTwhay>N{^9cEJdk; z%ZhZ_Bo<|Eos!cLWOUpLYyMmq7mhUX^phPE5(;&358eH7@L;UR|9d!xD9LGiO&;gq zS9QWQZ1wDDtc=RTY3c+r;}u$EFwd`k#(fQ0SeZm2KvAmhycz|v!(R|ew6^-CDI(*k zA5&1>E_>l*!CmbO9^Sdn(4hj+zOe6@mu#wBqtq??5OzW%; zM|ljEr^QfAm~=1dV*}>iC6Ir-`Q^RoYrh@tn&LLZW4l%h1P7!K;wzoLDEm{Ut!91H z8#97G+Ck22p=PtzZh;T<0dx9Z&1;GKV{;q1U^DPfNA~ zO)F{?N><{YNmH46%{&a91tdy3VI$Q5H(7JtF(c**M}p%cQoW4YFVSF!E8|fz3t|6^ z9+B#z()$FzIMjZS`AHP-{-mPbUfr6ACP3tJyj)l4dnF-2Mw7u}+GVk4keIMkzF;rI ztL6<5ZiuF0YQTORPJ4@n3tL?^LIG+2LWokDHFJL;)T{xTleSq{^ z8w!r&^DR>W%!gE%RA3rVdbb9E%Z=(tvh}~Z6*H<}*23TQ*}?BNd#r%ncS`Kh=(c5( zn9pvvQ=iM)pVL#VrxJf6=g-N;hliW2Trq3({(Ts99~PMnLo_Vb--J!vY|ef=gUZk? z06i|V@f||`h?KQvKGh@Ik6qj6T1iP?1m2s+#BZZ|tg6Q>^1YO?j+Xh%E)>MDzEOP5pv{fv97;>V<+$^nY_%!q@}3}@*CCP5 z7kikO$J^rD*Y#{3yG#+A3y`$V;oM6BvnnXGZ~(A9k8jS6Z2-YXA(Ivd#)>kp)6cS> z$w`Lsd&y^le$A$v1fqy-_#ngW+`MVza>Q^5#*@_jJ^5v#7vZr`y4AIIVE-$_T$RMK z-8y(BvWv(-Ae`YZV$pBw#B)LvAdjDa{);`H@u80V2WrhZIwT)lKba~YBxPhEuD1Rl z>g!J;sB2A}kQdRK`6}`e;GY)j*F8S|xZ;T;U_o3Arg>W(dOE3H0fzU5+KnM+owC(@ zcXA9e|HEkSiSvvVjKkR=2 z;Q+Hy%RQCJA=Mp?U8i1kD`xpQ_C`k-3;9QPh{Gxuv|R)9Aihg>&s+O!m*8Z65V2SM zCZy1J_aoZjY$3Fu(oby(6p*4$nKt;r4kJ{C*v1jCftTdJNY7(yrJRjCr>-RvKO%@> zyGvhzfct6-IOVOkJp4IogUnc{>??U_Nb|t)!f}~^Iel`HeD%9(k3?8KB0A~QevUJ! zaVi8BP8pF5P84_{y5sI*inG)=8X~Z(q9kg>n{Omn#T9n!|Nlx+1N(W*l3BIwa)D9(14D z)KiMnpNz6!1=dmK1iy&@H}O^Bl*)iLzk!DdMSOy2JF`_loL#C}uRWYgn7c0FabDZK z|NhN(vmKAq5d7V5MW1SAb`aWj2CI#_B?B}&){<$*z(aTpMFdyfakhwoas#}5cXl&E^KyUU*lSKW=q9ya7*dl2$;Eh;aygz$HUq5DE78x-<%JBME}?7! zx2a@$7xE1A`IX++LwBq&B!RFJOSY033jUKC@(9r}_qbv;j0=4NAaD_?AUTz-aNfgG zC{vHF1%4r925-oPI&vQ7FsjSXR#&crMyH9@(1+V=f{Sj;x&6aAQQNtKJ$F@+l``X> z90D{)oiBl>#5|E01Jdo&~TV~->WYZX!dDbICZ(G+>@&<#ym}BBAs(DMT%&-YH0&LHal%_ z*1iM-9U-1Vs9OBWv<=w;?6V2JC>d_@LoLSMI}GIxSXx6LDWGifIFWJ9wP#hbyM9N%z}bTR^xQJieZ~>KWcl z*X=A#Pf583;D*c-LI_$`#&9(O-E zfO(XU*^s-(eh8gSuZcdQa|l%*~)uNhwZyJ zBJG|Oq8@~5gBHMnLyZo{mp4u@^zUM|3Jzb0x|0kXFPS_)bHvT1PLDLLtZoGzEfAS8&wuth;Oj>2~0&8b5{)<4s z;Oq~@%xu*q=dHHxrzaG0{K_3@f&BoIX}p=<1uzg!<_d5HeY7gtI#^a+%eCpCG~9Qd zDpPsU$5dC;hkN{c%oXS{Io`=|Z9S#e?y^yC8Rz?r$I&i|mxZEA?RiAuvzOhH-%WHr z$m5_8jL$_RTh-Bh)~2A8fkJFV^fdsd|1Q5<;FmAbm*!zQe9N>Z^Gih&y<{r#i!|?| zQ!q#9HW=Fx?KsROl=rctF3l4+L_T_+u0`BpEkdpIa&+&~aQ=+797|fU=-lmv znq6C4EB%-w-F$A~@Dnykxh8X%&q=l5L>DSrLKO=Yk72tC35V#%J+>%lDzyiK7BQcb zQH2hO@CKYEl-Ddh*XpFmCj4x)Tj#65_&n$yaQh3{}9M7>Qz z=lrW;2D3q%#Y#a0kR@`$IuUDwwMHFCFI)r5q3sLSqOoX1pYL{bstl--q4PDtq5;MM zXkyk@jgQZNI?Jqlb)E!gF+OD5Fhd4e4tJU&F* zMVKVwXYPv<%za6-OPc3^@T%W*G~1tMapqXb8e0@7HQ%DKEarXdd}5umMMRld9kD3= zH4St*SQ`*_bK2|{iIb1Bn)umd`?D?}3X~cx*8II3@;nZ4W>!+fXVDSZgZ71xla5s7 z8A+;3f&MQee~>lRk%}WmiwG4j9NwCo_0>{W(n)14m8-SsyRrSYt3oOk2vX(13WG`^ zXt#?bicY~>q(1QA+;eM{F-a!TTxG~xrPu9omK&M?1=~d3`uQ`wXa@>DR9ZZv^eYsN zx!wv1@l2^$@xz2nmH1x|mQUKD+tS3w)&N7z?Hs$6@@#$pSAtY#8A*=CvJW zX<9O|$cAv7@LHfRW3Z#yR+;t$Dp1A?P&ab*S1M0_NnNPm+tRshVg$UmJtCf(I`+#< zc~{$$*zy+29P(9lJ+%owWY{bxK7FPO!&%?xAQQ&7e6o8DRXIyl#>Qsj#$DJe4*%MD zqI2k{+^wb@ewHlAdD?}z?o|(r{PSq-uMLWQJ8reMCl89QM z?rQ`K0xFokz$97O^I#{7w^ZQw_2w{vTL1rl1Qs~hzf9(QEO;sJ_9ruW$<}drZ8w|A z?szR{cO$L|#JxwIyZLpjxWXoi-lzEeIaw*w{GOXjT8$$>KHx~%dfS7xBH6}86`9Sj zhDP6)mc(WgP%bmB;xL%Sg*I;P0~m8*^r4f(L0JrU#D9#MAq;F632#q@DpWZ_DI#x-=}?m)H=sFJV+Vra)&v5JlQCHd+LSZ(2x6DB@@Y8 zZxbz5szw5pP{a+l6ZTU;dmyYJ`d#mv3#{LiisB?-fj(TWqp7vJIHub3kGD4|GaD9~7~H9eA!}b%Uccw0$s%CJ1o!b%bRNbJeyTu3Ct3^G?$c zOixl9zQu^yu8nVPqEirRqkWG97w&qHcuJ$yI5RX8{Wn2{=^t<5&U^@S}(o*{x4AmmL8A9J3AI^XI^YLX*Iuu~~PG^rNyiR*G1bUO6AJ&4Au z<=`Gr#Fv^qbHE885_M9RP&_dQybf~p8YJ9XCNTO!Lq== zMPquU3GT8-OEsUr5(?F}5B)b;LeIhwD>;b4nThJQE$+WymwLVP|_p4YVj z%STfg-Z7r`m~+nW>iwaXM*;iC4V1X&U{Nzy?g4rx_@u$8r}%tgEhh8|5fM761s*a0 zNS^8exR_UtG%)6)66G-2M4*4Hj8o^Ai-Ig^6S3JW^quP0c$Q_+WlLt5rJS(SJQw-W-e7zCf9f-b@^6URd@7f?b}M_cuw(UBn@S4V%V6(9&@8 z#E!+7&Q~No*eo$N(1}SvP_Li1;QJRE5rf=+QsB4$%j4$D9$V0Th3UT|IMjXbi8E4I#W&f!4Wye~`=s<$0sr8;l}W|&1G_$Vc%9X| zJj1Y~CFP8uy|gD5ufN08*j3Yvpc$cLqe}2reZAVy@YID%us^VZ89l zmg;RwV&h+J2u{t zo~&F`yxa{*Ad-2Ea}2SAPy6z7)x+ERHn%i3)32AGBi@S_eyfdV9uW%Ve)BKX(J(*$=>X>$Ki} z3k+=I&``7WmWsQB@07DIlDt3Qhwi6&&EBb;toq32W;`$qq@|>AL54Af&alyt29mba zF7rXYiL+Vk=}&bGaRB}aPM3ya}#x~k0ws|Q;tjvALc zFzTQ})Fapf^#k1d_;Jif9HPc48?63A9M;+TqXt*sW}XdvEr4NNkBDaFyWNLk#hdh< zz6duWh#0k^4_N|9nhcZ|9c?VveMs8GJjo|z569CN)B8_A^G-0}kVza*!1CVoD_>A|j3tGBfGHcB{gD521uJI&ES zF-dE>NfYyz)jaA(dMJ?$Ux3c-M#@P&jp24Ow zN-6D9pke2N$ZB@^@4N{#4W*Gp7V}X0YWxB_M3|+;Pb9_)+BHzA`>8DW1bZZXATwQ- ziNj#-Q~pw~#G>Z1<8UMbV|_rD+ZY=w#Jw7=K5|DzU=Q~#_aZYsjoB#>TfecJ!}L35 zjMNqZk+5P1E5bp@VrsfMUVn?=$HkM-=P zY}J(d0FCAm)d(s|ct9+z2>kaTn^YRq=6U>w)il%!XsB@iK*8xc=q((hSNzyfD+wel zv(*8!Z;+;Thjm?e7o$lwvM2T{ps70lwF3QZvpeyMkW>?8K(ti0CoWWUx zSIYA9%d+nwPQ+Qs#lGSptAl;gZ^rrAg2oweZhAdU0dN{$HZk=?%lmY_&f(XdRovN{ zewm)kKjHyiK0WG%va9%dotc}!p1i7{D(Iu9JTg4Zu1u%79$6Kc1avzw7;IEa24wl+ z6S#KPq8V9&@tn`OyiViG=@W*Hb~D)b2@Fi)S8ynFj~H%NmX;y5;0+z(>-pB}F;6Z0 z9ocl8(l_(oL}xF7qjGwPVUPKaY*B6M_`4E@PMK|f=Ztspzq)jdM<@$%PzIZEX-f^b|D944Z&X6a?9lCcF3hmW4YLnW!#t{}4mvTtt^@y8* z)4B4RXanFA8`554#^8Y;3TWLR1puP7Fj5Sqx-}cX+AT>rzDXWSm~F-^(wUPNrj76w zX0CCBzC|c3qMm+8gY^@j7f~tF z0J)styGHA@qXhGro*E5zQ;@_rebz&gWD@(jscw{dZ}njW*NDbu+v`Obf}JT88xfG;rXqdT3s&$Kb`7|r_q`?=xkKhTE zneY_QqF*Z%nyt;3XyDv^Zx!B1@wA2b>Nei9dBu&w8R$TIP2oPQ@dpnArE#5UL0lj@ zYUTqwm9yt~Q4<$$GWF_Gf`b;`Tkhx3aRi3gx+L9c7{?JZM7)$x<0UvRTWiGvBMq6` zrB+Ej#{S|4`rV%0WX0+Ez$7~Wr1S8J@&7*DtnB`t>L-A&OE=#fvU!!4b&RZoC$f39 zgmV>IrCgvY7kn%)_j+BjMnJEDjb5VkKqT6)cX_gx?EZ!D=uQop+)WfPwp)i}R)d!^3f6#xr|7tq0LbJN9b*<+tSS0k9 zAg>WB>WfS>%eSE0TY@pDnkrNOCV`hRoHx3%T@v5b?BQk`tw^LP0Al>SG(E!?aW1SURIG%nK;i1{_H zP!YI=>rJK1vLOz_NW+oK&C2VnqL1YRD21=)`RKiD4O>B&wg`yo8Z77hFztJ)SXzeA zZ8FuO(AR|ntbl{^jLj2STtjGkp-7_zU83U6Ni=Tlo`3=p8ll#jYPHa250{@Jw9%i%)J|#|G3Eo;VTf(zRq2}}QKKvzBNLjrjGX57<$I4hvxt~+ zxqaDOqIC0Xb$T}&j�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Ä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

Q@g7#^27#q=ZJUgns}cd^oM; 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

^g&DAf836P)Lk=2ZV~f6qmzZap0-}W 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 MKwzS+^51QV_JDz5uS1fR% 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⁡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

+txYPu)sy-gRu%->}r@noN}hVbjm;ougP` z99?uB-TZOS@7H|ktH_c(xdZu>cbw_cm!POr^}!&6A7`o`!9_fTD`tlw_-Av&<*<~q z(O>@Kugrs4pUmrX*cElW!n1SYkj$t!Rcj{FDOaHEv2iqQP)4vc$~<3sUST;NS`j|< z;7`=OL|4xesz(p=wGJu=Xj#2B>_(%T1J~X7%?Ai!pXs2vV&`+vMJ~TB12Voe!)Di6 zSW{sRK5$_)4wrm*v1DiS=D!B-_#@~LoXW~fRrO($iQ*W_8*Y#iILxbGlY$3{nf`*W z+c8(sc@8F28Rue`d}yV2U90i~`>v;4VS}3MeQ<5GcNNP?n9&lY%ICCyB(}!jveI-P z{&va*YA-vKy8G4oahLLLT_wMg6)(^z5$4Vd#_k^d>@1i^kE}r0G$c9y*mQq?l4=yVAN#u3*m)9LE zxMyWZU*^bgG7%PYiapOVaFBU75dpK1&jk9le9y#KBTu}ZS=rS$5C4=b1=%Bd7q~S} zclc#!D!H{g);Po&o9h8B+J=lHc#B|?+burv6MPjm`q2%yIOhK&Tjq{#4y?ZdOxx#y zK+MJg!B$A)tWOWK>IB4)J zfmix^TkUpz5%W3M#LdjMFCpY%qCMMGdolUBBekKbhRxMq|C0B=DtNU6U9=?DOG&!LUvNqM#dl%qrmoZq0Sua?qPJbXGPY0Z;YgA4i9@>t9Y19V?)-Y+nyXWW$c zh$&8VxoET-#n2J6K7<+HL2ailm`=q>*C zW{^vIo&Xe4;>vs^Hy2bsc|u(_k(tDS`#U9Kk?j0O~lLxi`^<<#++QbhfBCaPTn z+ara7qHUu2=39P2=Wg7_NP+P>Oum`!A>xpy9zdu?&fLjr$eSrV~=^YkQ0kS0Dt(LzHi>= z&F>%Cjps4nvo#y257VE0L0SkQRRl5MefB8>QrSWHpvjD~T&XI6M-#A=H7C>ben(td zjSTo35AR~)++HrHd-S`z*BpEa4#p&dr@W=xaYukRDjE-4W;jLOrm|uhT1>K!%A89# z0_~5c1)|m!c)lLnQhA4)P10b6V6jb#7*@AFWeI)lU+pRL`%{~?KB5zCPra<^$X5$cV^%swrQ79Ei`FIiM>i7m0pP9zPzIvmFf2=G}g|%@F~pk&Si|6rKt& @_Y1PHn*xy}r4K4ZJ7hvoZ&do`$ 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%0Dl&`)hRgj25SIfRuscG;Grx4%7%vGnFQ0Db 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

QR(V<5E~dPiOy8v)v6JcnnR_Zt)k64QSeB1? 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

VmT@jnbf-yQ)Mj$c{OmCP|iQcN%GtL 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